summaryrefslogtreecommitdiffabout
authorzautrix <zautrix>2004-10-25 15:27:39 (UTC)
committer zautrix <zautrix>2004-10-25 15:27:39 (UTC)
commit03ca6830a9e6742b8873aee04d77b3e094b65d30 (patch) (unidiff)
tree170ab278ffeb371aae783815101f64275cd30c53
parent62e92aa86b6281b4e4c2a2bdb57f3ceb5a87f4e3 (diff)
downloadkdepimpi-03ca6830a9e6742b8873aee04d77b3e094b65d30.zip
kdepimpi-03ca6830a9e6742b8873aee04d77b3e094b65d30.tar.gz
kdepimpi-03ca6830a9e6742b8873aee04d77b3e094b65d30.tar.bz2
fix of vcal crash
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--libkcal/vcalformat.cpp39
-rw-r--r--libkcal/vcalformat.h3
-rw-r--r--libkcal/versit/vcc.c3
3 files changed, 37 insertions, 8 deletions
diff --git a/libkcal/vcalformat.cpp b/libkcal/vcalformat.cpp
index df93209..223aa5a 100644
--- a/libkcal/vcalformat.cpp
+++ b/libkcal/vcalformat.cpp
@@ -100,1076 +100,1085 @@ bool VCalFormat::save(Calendar *calendar, const QString &fileName)
100 100
101 vcal = newVObject(VCCalProp); 101 vcal = newVObject(VCCalProp);
102 102
103 // addPropValue(vcal,VCLocationProp, "0.0"); 103 // addPropValue(vcal,VCLocationProp, "0.0");
104 addPropValue(vcal,VCProdIdProp, productId()); 104 addPropValue(vcal,VCProdIdProp, productId());
105 tmpStr = mCalendar->getTimeZoneStr(); 105 tmpStr = mCalendar->getTimeZoneStr();
106 //qDebug("mCalendar->getTimeZoneStr() %s",tmpStr.latin1() ); 106 //qDebug("mCalendar->getTimeZoneStr() %s",tmpStr.latin1() );
107 addPropValue(vcal,VCTimeZoneProp, tmpStr.local8Bit()); 107 addPropValue(vcal,VCTimeZoneProp, tmpStr.local8Bit());
108 addPropValue(vcal,VCVersionProp, _VCAL_VERSION); 108 addPropValue(vcal,VCVersionProp, _VCAL_VERSION);
109 109
110 // TODO STUFF 110 // TODO STUFF
111 QPtrList<Todo> todoList = mCalendar->rawTodos(); 111 QPtrList<Todo> todoList = mCalendar->rawTodos();
112 QPtrListIterator<Todo> qlt(todoList); 112 QPtrListIterator<Todo> qlt(todoList);
113 for (; qlt.current(); ++qlt) { 113 for (; qlt.current(); ++qlt) {
114 vo = eventToVTodo(qlt.current()); 114 vo = eventToVTodo(qlt.current());
115 addVObjectProp(vcal, vo); 115 addVObjectProp(vcal, vo);
116 } 116 }
117 117
118 // EVENT STUFF 118 // EVENT STUFF
119 QPtrList<Event> events = mCalendar->rawEvents(); 119 QPtrList<Event> events = mCalendar->rawEvents();
120 Event *ev; 120 Event *ev;
121 for(ev=events.first();ev;ev=events.next()) { 121 for(ev=events.first();ev;ev=events.next()) {
122 vo = eventToVEvent(ev); 122 vo = eventToVEvent(ev);
123 addVObjectProp(vcal, vo); 123 addVObjectProp(vcal, vo);
124 } 124 }
125 125
126 writeVObjectToFile(QFile::encodeName(fileName).data() ,vcal); 126 writeVObjectToFile(QFile::encodeName(fileName).data() ,vcal);
127 cleanVObjects(vcal); 127 cleanVObjects(vcal);
128 cleanStrTbl(); 128 cleanStrTbl();
129 129
130 if (QFile::exists(fileName)) { 130 if (QFile::exists(fileName)) {
131 return true; 131 return true;
132 } else { 132 } else {
133 return false; // error 133 return false; // error
134 } 134 }
135} 135}
136 136
137bool VCalFormat::fromString( Calendar *calendar, const QString &text ) 137bool VCalFormat::fromString( Calendar *calendar, const QString &text )
138{ 138{
139 // TODO: Factor out VCalFormat::fromString() 139 // TODO: Factor out VCalFormat::fromString()
140 140
141 QCString data = text.utf8(); 141 QCString data = text.utf8();
142 142
143 if ( !data.size() ) return false; 143 if ( !data.size() ) return false;
144 144
145 VObject *vcal = Parse_MIME( data.data(), data.size()); 145 VObject *vcal = Parse_MIME( data.data(), data.size());
146 if ( !vcal ) return false; 146 if ( !vcal ) return false;
147 147
148 VObjectIterator i; 148 VObjectIterator i;
149 VObject *curvo; 149 VObject *curvo;
150 initPropIterator( &i, vcal ); 150 initPropIterator( &i, vcal );
151 151
152 // we only take the first object. TODO: parse all incidences. 152 // we only take the first object. TODO: parse all incidences.
153 do { 153 do {
154 curvo = nextVObject( &i ); 154 curvo = nextVObject( &i );
155 } while ( strcmp( vObjectName( curvo ), VCEventProp ) && 155 } while ( strcmp( vObjectName( curvo ), VCEventProp ) &&
156 strcmp( vObjectName( curvo ), VCTodoProp ) ); 156 strcmp( vObjectName( curvo ), VCTodoProp ) );
157 157
158 if ( strcmp( vObjectName( curvo ), VCEventProp ) == 0 ) { 158 if ( strcmp( vObjectName( curvo ), VCEventProp ) == 0 ) {
159 Event *event = VEventToEvent( curvo ); 159 Event *event = VEventToEvent( curvo );
160 calendar->addEvent( event ); 160 calendar->addEvent( event );
161 } else { 161 } else {
162 qDebug("VCalFormat::fromString(): Unknown object type. "); 162 qDebug("VCalFormat::fromString(): Unknown object type. ");
163 deleteVObject( vcal ); 163 deleteVObject( vcal );
164 return false; 164 return false;
165 } 165 }
166 166
167 deleteVObject( vcal ); 167 deleteVObject( vcal );
168 168
169 return true; 169 return true;
170} 170}
171 171
172QString VCalFormat::eventToString( Event * event, Calendar *calendar, bool useLocal) 172QString VCalFormat::eventToString( Event * event, Calendar *calendar, bool useLocal)
173{ 173{
174 174
175 if ( !event ) return QString::null; 175 if ( !event ) return QString::null;
176 bool useL = useLocalTime; 176 bool useL = useLocalTime;
177 useLocalTime = useLocal; 177 useLocalTime = useLocal;
178 mCalendar = calendar; 178 mCalendar = calendar;
179 VObject *vevent = eventToVEvent( event ); 179 VObject *vevent = eventToVEvent( event );
180 char *buf = writeMemVObject( 0, 0, vevent ); 180 char *buf = writeMemVObject( 0, 0, vevent );
181 QString result( buf ); 181 QString result( buf );
182 cleanVObject( vevent ); 182 cleanVObject( vevent );
183 useLocalTime = useL; 183 useLocalTime = useL;
184 return result; 184 return result;
185} 185}
186QString VCalFormat::todoToString( Todo * todo, Calendar *calendar, bool useLocal ) 186QString VCalFormat::todoToString( Todo * todo, Calendar *calendar, bool useLocal )
187{ 187{
188 188
189 if ( !todo ) return QString::null; 189 if ( !todo ) return QString::null;
190 bool useL = useLocalTime; 190 bool useL = useLocalTime;
191 useLocalTime = useLocal; 191 useLocalTime = useLocal;
192 mCalendar = calendar; 192 mCalendar = calendar;
193 VObject *vevent = eventToVTodo( todo ); 193 VObject *vevent = eventToVTodo( todo );
194 char *buf = writeMemVObject( 0, 0, vevent ); 194 char *buf = writeMemVObject( 0, 0, vevent );
195 QString result( buf ); 195 QString result( buf );
196 cleanVObject( vevent ); 196 cleanVObject( vevent );
197 useLocalTime = useL; 197 useLocalTime = useL;
198 return result; 198 return result;
199} 199}
200 200
201QString VCalFormat::toString( Calendar *calendar ) 201QString VCalFormat::toString( Calendar *calendar )
202{ 202{
203 // TODO: Factor out VCalFormat::asString() 203 // TODO: Factor out VCalFormat::asString()
204 204
205 VObject *vcal = newVObject(VCCalProp); 205 VObject *vcal = newVObject(VCCalProp);
206 206
207 addPropValue( vcal, VCProdIdProp, CalFormat::productId() ); 207 addPropValue( vcal, VCProdIdProp, CalFormat::productId() );
208 QString tmpStr = mCalendar->getTimeZoneStr(); 208 QString tmpStr = mCalendar->getTimeZoneStr();
209 addPropValue( vcal, VCTimeZoneProp, tmpStr.local8Bit() ); 209 addPropValue( vcal, VCTimeZoneProp, tmpStr.local8Bit() );
210 addPropValue( vcal, VCVersionProp, _VCAL_VERSION ); 210 addPropValue( vcal, VCVersionProp, _VCAL_VERSION );
211 211
212 // TODO: Use all data. 212 // TODO: Use all data.
213 QPtrList<Event> events = calendar->events(); 213 QPtrList<Event> events = calendar->events();
214 Event *event = events.first(); 214 Event *event = events.first();
215 if ( !event ) return QString::null; 215 if ( !event ) return QString::null;
216 216
217 VObject *vevent = eventToVEvent( event ); 217 VObject *vevent = eventToVEvent( event );
218 218
219 addVObjectProp( vcal, vevent ); 219 addVObjectProp( vcal, vevent );
220 220
221 char *buf = writeMemVObject( 0, 0, vcal ); 221 char *buf = writeMemVObject( 0, 0, vcal );
222 222
223 QString result( buf ); 223 QString result( buf );
224 224
225 cleanVObject( vcal ); 225 cleanVObject( vcal );
226 226
227 return result; 227 return result;
228} 228}
229 229
230VObject *VCalFormat::eventToVTodo(const Todo *anEvent) 230VObject *VCalFormat::eventToVTodo(const Todo *anEvent)
231{ 231{
232 VObject *vtodo; 232 VObject *vtodo;
233 QString tmpStr; 233 QString tmpStr;
234 QStringList tmpStrList; 234 QStringList tmpStrList;
235 235
236 vtodo = newVObject(VCTodoProp); 236 vtodo = newVObject(VCTodoProp);
237 237
238 // due date 238 // due date
239 if (anEvent->hasDueDate()) { 239 if (anEvent->hasDueDate()) {
240 tmpStr = qDateTimeToISO(anEvent->dtDue(), 240 tmpStr = qDateTimeToISO(anEvent->dtDue(),
241 !anEvent->doesFloat()); 241 !anEvent->doesFloat());
242 addPropValue(vtodo, VCDueProp, tmpStr.local8Bit()); 242 addPropValue(vtodo, VCDueProp, tmpStr.local8Bit());
243 } 243 }
244 244
245 // start date 245 // start date
246 if (anEvent->hasStartDate()) { 246 if (anEvent->hasStartDate()) {
247 tmpStr = qDateTimeToISO(anEvent->dtStart(), 247 tmpStr = qDateTimeToISO(anEvent->dtStart(),
248 !anEvent->doesFloat()); 248 !anEvent->doesFloat());
249 addPropValue(vtodo, VCDTstartProp, tmpStr.local8Bit()); 249 addPropValue(vtodo, VCDTstartProp, tmpStr.local8Bit());
250 } 250 }
251 251
252 // creation date 252 // creation date
253 tmpStr = qDateTimeToISO(anEvent->created()); 253 tmpStr = qDateTimeToISO(anEvent->created());
254 addPropValue(vtodo, VCDCreatedProp, tmpStr.local8Bit()); 254 addPropValue(vtodo, VCDCreatedProp, tmpStr.local8Bit());
255 255
256 // unique id 256 // unique id
257 addPropValue(vtodo, VCUniqueStringProp, 257 addPropValue(vtodo, VCUniqueStringProp,
258 anEvent->uid().local8Bit()); 258 anEvent->uid().local8Bit());
259 259
260 // revision 260 // revision
261 tmpStr.sprintf("%i", anEvent->revision()); 261 tmpStr.sprintf("%i", anEvent->revision());
262 addPropValue(vtodo, VCSequenceProp, tmpStr.local8Bit()); 262 addPropValue(vtodo, VCSequenceProp, tmpStr.local8Bit());
263 263
264 // last modification date 264 // last modification date
265 tmpStr = qDateTimeToISO(anEvent->lastModified()); 265 tmpStr = qDateTimeToISO(anEvent->lastModified());
266 addPropValue(vtodo, VCLastModifiedProp, tmpStr.local8Bit()); 266 addPropValue(vtodo, VCLastModifiedProp, tmpStr.local8Bit());
267 267
268 // organizer stuff 268 // organizer stuff
269 tmpStr = "MAILTO:" + anEvent->organizer(); 269 tmpStr = "MAILTO:" + anEvent->organizer();
270 addPropValue(vtodo, ICOrganizerProp, tmpStr.local8Bit()); 270 addPropValue(vtodo, ICOrganizerProp, tmpStr.local8Bit());
271 271
272 // attendees 272 // attendees
273 if (anEvent->attendeeCount() != 0) { 273 if (anEvent->attendeeCount() != 0) {
274 QPtrList<Attendee> al = anEvent->attendees(); 274 QPtrList<Attendee> al = anEvent->attendees();
275 QPtrListIterator<Attendee> ai(al); 275 QPtrListIterator<Attendee> ai(al);
276 Attendee *curAttendee; 276 Attendee *curAttendee;
277 277
278 for (; ai.current(); ++ai) { 278 for (; ai.current(); ++ai) {
279 curAttendee = ai.current(); 279 curAttendee = ai.current();
280 if (!curAttendee->email().isEmpty() && 280 if (!curAttendee->email().isEmpty() &&
281 !curAttendee->name().isEmpty()) 281 !curAttendee->name().isEmpty())
282 tmpStr = "MAILTO:" + curAttendee->name() + " <" + 282 tmpStr = "MAILTO:" + curAttendee->name() + " <" +
283 curAttendee->email() + ">"; 283 curAttendee->email() + ">";
284 else if (curAttendee->name().isEmpty()) 284 else if (curAttendee->name().isEmpty())
285 tmpStr = "MAILTO: " + curAttendee->email(); 285 tmpStr = "MAILTO: " + curAttendee->email();
286 else if (curAttendee->email().isEmpty()) 286 else if (curAttendee->email().isEmpty())
287 tmpStr = "MAILTO: " + curAttendee->name(); 287 tmpStr = "MAILTO: " + curAttendee->name();
288 else if (curAttendee->name().isEmpty() && 288 else if (curAttendee->name().isEmpty() &&
289 curAttendee->email().isEmpty()) 289 curAttendee->email().isEmpty())
290 kdDebug(5800) << "warning! this Event has an attendee w/o name or email!" << endl; 290 kdDebug(5800) << "warning! this Event has an attendee w/o name or email!" << endl;
291 VObject *aProp = addPropValue(vtodo, VCAttendeeProp, tmpStr.local8Bit()); 291 VObject *aProp = addPropValue(vtodo, VCAttendeeProp, tmpStr.local8Bit());
292 addPropValue(aProp, VCRoleProp, writeRole(curAttendee->role()));
292 addPropValue(aProp, VCRSVPProp, curAttendee->RSVP() ? "TRUE" : "FALSE"); 293 addPropValue(aProp, VCRSVPProp, curAttendee->RSVP() ? "TRUE" : "FALSE");
293 addPropValue(aProp, VCStatusProp, writeStatus(curAttendee->status())); 294 addPropValue(aProp, VCStatusProp, writeStatus(curAttendee->status()));
294 } 295 }
295 } 296 }
296 297
297 // description BL: 298 // description BL:
298 if (!anEvent->description().isEmpty()) { 299 if (!anEvent->description().isEmpty()) {
299 VObject *d = addPropValue(vtodo, VCDescriptionProp, 300 VObject *d = addPropValue(vtodo, VCDescriptionProp,
300 anEvent->description().local8Bit()); 301 anEvent->description().local8Bit());
301 if (anEvent->description().find('\n') != -1) 302 if (anEvent->description().find('\n') != -1)
302 addProp(d, VCQuotedPrintableProp); 303 addProp(d, VCQuotedPrintableProp);
303 } 304 }
304 305
305 // summary 306 // summary
306 if (!anEvent->summary().isEmpty()) 307 if (!anEvent->summary().isEmpty())
307 addPropValue(vtodo, VCSummaryProp, anEvent->summary().local8Bit()); 308 addPropValue(vtodo, VCSummaryProp, anEvent->summary().local8Bit());
308 309
309 if (!anEvent->location().isEmpty()) 310 if (!anEvent->location().isEmpty())
310 addPropValue(vtodo, VCLocationProp, anEvent->location().local8Bit()); 311 addPropValue(vtodo, VCLocationProp, anEvent->location().local8Bit());
311 312
312 // completed 313 // completed
313 // status 314 // status
314 // backward compatibility, KOrganizer used to interpret only these two values 315 // backward compatibility, KOrganizer used to interpret only these two values
315 addPropValue(vtodo, VCStatusProp, anEvent->isCompleted() ? "COMPLETED" : 316 addPropValue(vtodo, VCStatusProp, anEvent->isCompleted() ? "COMPLETED" :
316 "NEEDS_ACTION"); 317 "NEEDS_ACTION");
317 // completion date 318 // completion date
318 if (anEvent->hasCompletedDate()) { 319 if (anEvent->hasCompletedDate()) {
319 tmpStr = qDateTimeToISO(anEvent->completed()); 320 tmpStr = qDateTimeToISO(anEvent->completed());
320 addPropValue(vtodo, VCCompletedProp, tmpStr.local8Bit()); 321 addPropValue(vtodo, VCCompletedProp, tmpStr.local8Bit());
321 } 322 }
322 323
323 // priority 324 // priority
324 tmpStr.sprintf("%i",anEvent->priority()); 325 tmpStr.sprintf("%i",anEvent->priority());
325 addPropValue(vtodo, VCPriorityProp, tmpStr.local8Bit()); 326 addPropValue(vtodo, VCPriorityProp, tmpStr.local8Bit());
326 327
327 // related event 328 // related event
328 if (anEvent->relatedTo()) { 329 if (anEvent->relatedTo()) {
329 addPropValue(vtodo, VCRelatedToProp, 330 addPropValue(vtodo, VCRelatedToProp,
330 anEvent->relatedTo()->uid().local8Bit()); 331 anEvent->relatedTo()->uid().local8Bit());
331 } 332 }
332 333
333 // categories 334 // categories
334 tmpStrList = anEvent->categories(); 335 tmpStrList = anEvent->categories();
335 tmpStr = ""; 336 tmpStr = "";
336 QString catStr; 337 QString catStr;
337 for ( QStringList::Iterator it = tmpStrList.begin(); 338 for ( QStringList::Iterator it = tmpStrList.begin();
338 it != tmpStrList.end(); 339 it != tmpStrList.end();
339 ++it ) { 340 ++it ) {
340 catStr = *it; 341 catStr = *it;
341 if (catStr[0] == ' ') 342 if (catStr[0] == ' ')
342 tmpStr += catStr.mid(1); 343 tmpStr += catStr.mid(1);
343 else 344 else
344 tmpStr += catStr; 345 tmpStr += catStr;
345 // this must be a ';' character as the vCalendar specification requires! 346 // this must be a ';' character as the vCalendar specification requires!
346 // vcc.y has been hacked to translate the ';' to a ',' when the vcal is 347 // vcc.y has been hacked to translate the ';' to a ',' when the vcal is
347 // read in. 348 // read in.
348 tmpStr += ";"; 349 tmpStr += ";";
349 } 350 }
350 if (!tmpStr.isEmpty()) { 351 if (!tmpStr.isEmpty()) {
351 tmpStr.truncate(tmpStr.length()-1); 352 tmpStr.truncate(tmpStr.length()-1);
352 addPropValue(vtodo, VCCategoriesProp, tmpStr.local8Bit()); 353 addPropValue(vtodo, VCCategoriesProp, tmpStr.local8Bit());
353 } 354 }
354 355
355 // alarm stuff 356 // alarm stuff
356 kdDebug(5800) << "vcalformat::eventToVTodo was called" << endl; 357 kdDebug(5800) << "vcalformat::eventToVTodo was called" << endl;
357 QPtrList<Alarm> alarms = anEvent->alarms(); 358 QPtrList<Alarm> alarms = anEvent->alarms();
358 Alarm* alarm; 359 Alarm* alarm;
359 for (alarm = alarms.first(); alarm; alarm = alarms.next()) { 360 for (alarm = alarms.first(); alarm; alarm = alarms.next()) {
360 if (alarm->enabled()) { 361 if (alarm->enabled()) {
361 VObject *a; 362 VObject *a;
362 tmpStr = qDateTimeToISO(alarm->time()); 363 tmpStr = qDateTimeToISO(alarm->time());
363 if (alarm->type() == Alarm::Audio) { 364 if (alarm->type() == Alarm::Audio) {
364 a = addProp(vtodo, VCAAlarmProp); 365 a = addProp(vtodo, VCAAlarmProp);
365 addPropValue(a, VCRunTimeProp, tmpStr.local8Bit()); 366 addPropValue(a, VCRunTimeProp, tmpStr.local8Bit());
366 addPropValue(a, VCRepeatCountProp, "1"); 367 addPropValue(a, VCRepeatCountProp, "1");
367 addPropValue(a, VCAudioContentProp, QFile::encodeName(alarm->audioFile())); 368 addPropValue(a, VCAudioContentProp, QFile::encodeName(alarm->audioFile()));
368 } 369 }
369 else if (alarm->type() == Alarm::Procedure) { 370 else if (alarm->type() == Alarm::Procedure) {
370 a = addProp(vtodo, VCPAlarmProp); 371 a = addProp(vtodo, VCPAlarmProp);
371 addPropValue(a, VCRunTimeProp, tmpStr.local8Bit()); 372 addPropValue(a, VCRunTimeProp, tmpStr.local8Bit());
372 addPropValue(a, VCRepeatCountProp, "1"); 373 addPropValue(a, VCRepeatCountProp, "1");
373 addPropValue(a, VCProcedureNameProp, QFile::encodeName(alarm->programFile())); 374 addPropValue(a, VCProcedureNameProp, QFile::encodeName(alarm->programFile()));
374 } else { 375 } else {
375 a = addProp(vtodo, VCDAlarmProp); 376 a = addProp(vtodo, VCDAlarmProp);
376 addPropValue(a, VCRunTimeProp, tmpStr.local8Bit()); 377 addPropValue(a, VCRunTimeProp, tmpStr.local8Bit());
377 addPropValue(a, VCRepeatCountProp, "1"); 378 addPropValue(a, VCRepeatCountProp, "1");
378 addPropValue(a, VCDisplayStringProp, "beep!"); 379 addPropValue(a, VCDisplayStringProp, "beep!");
379 } 380 }
380 } 381 }
381 } 382 }
382 383
383 if (anEvent->pilotId()) { 384 if (anEvent->pilotId()) {
384 // pilot sync stuff 385 // pilot sync stuff
385 tmpStr.sprintf("%i",anEvent->pilotId()); 386 tmpStr.sprintf("%i",anEvent->pilotId());
386 addPropValue(vtodo, XPilotIdProp, tmpStr.local8Bit()); 387 addPropValue(vtodo, XPilotIdProp, tmpStr.local8Bit());
387 tmpStr.sprintf("%i",anEvent->syncStatus()); 388 tmpStr.sprintf("%i",anEvent->syncStatus());
388 addPropValue(vtodo, XPilotStatusProp, tmpStr.local8Bit()); 389 addPropValue(vtodo, XPilotStatusProp, tmpStr.local8Bit());
389 } 390 }
390 391
391 return vtodo; 392 return vtodo;
392} 393}
393 394
394VObject* VCalFormat::eventToVEvent(const Event *anEvent) 395VObject* VCalFormat::eventToVEvent(const Event *anEvent)
395{ 396{
396 VObject *vevent; 397 VObject *vevent;
397 QString tmpStr; 398 QString tmpStr;
398 QStringList tmpStrList; 399 QStringList tmpStrList;
399 400
400 vevent = newVObject(VCEventProp); 401 vevent = newVObject(VCEventProp);
401 402
402 // start and end time 403 // start and end time
403 tmpStr = qDateTimeToISO(anEvent->dtStart(), 404 tmpStr = qDateTimeToISO(anEvent->dtStart(),
404 !anEvent->doesFloat()); 405 !anEvent->doesFloat());
405 addPropValue(vevent, VCDTstartProp, tmpStr.local8Bit()); 406 addPropValue(vevent, VCDTstartProp, tmpStr.local8Bit());
406 407
407 // events that have time associated but take up no time should 408 // events that have time associated but take up no time should
408 // not have both DTSTART and DTEND. 409 // not have both DTSTART and DTEND.
409 if (anEvent->dtStart() != anEvent->dtEnd()) { 410 if (anEvent->dtStart() != anEvent->dtEnd()) {
410 tmpStr = qDateTimeToISO(anEvent->dtEnd(), 411 tmpStr = qDateTimeToISO(anEvent->dtEnd(),
411 !anEvent->doesFloat()); 412 !anEvent->doesFloat());
412 addPropValue(vevent, VCDTendProp, tmpStr.local8Bit()); 413 addPropValue(vevent, VCDTendProp, tmpStr.local8Bit());
413 } 414 }
414 415
415 // creation date 416 // creation date
416 tmpStr = qDateTimeToISO(anEvent->created()); 417 tmpStr = qDateTimeToISO(anEvent->created());
417 addPropValue(vevent, VCDCreatedProp, tmpStr.local8Bit()); 418 addPropValue(vevent, VCDCreatedProp, tmpStr.local8Bit());
418 419
419 // unique id 420 // unique id
420 addPropValue(vevent, VCUniqueStringProp, 421 addPropValue(vevent, VCUniqueStringProp,
421 anEvent->uid().local8Bit()); 422 anEvent->uid().local8Bit());
422 423
423 // revision 424 // revision
424 tmpStr.sprintf("%i", anEvent->revision()); 425 tmpStr.sprintf("%i", anEvent->revision());
425 addPropValue(vevent, VCSequenceProp, tmpStr.local8Bit()); 426 addPropValue(vevent, VCSequenceProp, tmpStr.local8Bit());
426 427
427 // last modification date 428 // last modification date
428 tmpStr = qDateTimeToISO(anEvent->lastModified()); 429 tmpStr = qDateTimeToISO(anEvent->lastModified());
429 addPropValue(vevent, VCLastModifiedProp, tmpStr.local8Bit()); 430 addPropValue(vevent, VCLastModifiedProp, tmpStr.local8Bit());
430 431
431 // attendee and organizer stuff 432 // attendee and organizer stuff
432 tmpStr = "MAILTO:" + anEvent->organizer(); 433 tmpStr = "MAILTO:" + anEvent->organizer();
433 addPropValue(vevent, ICOrganizerProp, tmpStr.local8Bit()); 434 addPropValue(vevent, ICOrganizerProp, tmpStr.local8Bit());
434 435
435 if (anEvent->attendeeCount() != 0) { 436 if (anEvent->attendeeCount() != 0) {
436 QPtrList<Attendee> al = anEvent->attendees(); 437 QPtrList<Attendee> al = anEvent->attendees();
437 QPtrListIterator<Attendee> ai(al); 438 QPtrListIterator<Attendee> ai(al);
438 Attendee *curAttendee; 439 Attendee *curAttendee;
439 440
440 // TODO: Put this functionality into Attendee class 441 // TODO: Put this functionality into Attendee class
441 for (; ai.current(); ++ai) { 442 for (; ai.current(); ++ai) {
442 curAttendee = ai.current(); 443 curAttendee = ai.current();
443 if (!curAttendee->email().isEmpty() && 444 if (!curAttendee->email().isEmpty() &&
444 !curAttendee->name().isEmpty()) 445 !curAttendee->name().isEmpty())
445 tmpStr = "MAILTO:" + curAttendee->name() + " <" + 446 tmpStr = "MAILTO:" + curAttendee->name() + " <" +
446 curAttendee->email() + ">"; 447 curAttendee->email() + ">";
447 else if (curAttendee->name().isEmpty()) 448 else if (curAttendee->name().isEmpty())
448 tmpStr = "MAILTO: " + curAttendee->email(); 449 tmpStr = "MAILTO: " + curAttendee->email();
449 else if (curAttendee->email().isEmpty()) 450 else if (curAttendee->email().isEmpty())
450 tmpStr = "MAILTO: " + curAttendee->name(); 451 tmpStr = "MAILTO: " + curAttendee->name();
451 else if (curAttendee->name().isEmpty() && 452 else if (curAttendee->name().isEmpty() &&
452 curAttendee->email().isEmpty()) 453 curAttendee->email().isEmpty())
453 kdDebug(5800) << "warning! this Event has an attendee w/o name or email!" << endl; 454 kdDebug(5800) << "warning! this Event has an attendee w/o name or email!" << endl;
454 VObject *aProp = addPropValue(vevent, VCAttendeeProp, tmpStr.local8Bit()); 455 VObject *aProp = addPropValue(vevent, VCAttendeeProp, tmpStr.local8Bit());
455 addPropValue(aProp, VCRSVPProp, curAttendee->RSVP() ? "TRUE" : "FALSE");; 456 addPropValue(aProp, VCRoleProp, writeRole(curAttendee->role()));
457 addPropValue(aProp, VCRSVPProp, curAttendee->RSVP() ? "TRUE" : "FALSE");
456 addPropValue(aProp, VCStatusProp, writeStatus(curAttendee->status())); 458 addPropValue(aProp, VCStatusProp, writeStatus(curAttendee->status()));
457 } 459 }
458 } 460 }
459 461
460 // recurrence rule stuff 462 // recurrence rule stuff
461 if (anEvent->recurrence()->doesRecur()) { 463 if (anEvent->recurrence()->doesRecur()) {
462 // some more variables 464 // some more variables
463 QPtrList<Recurrence::rMonthPos> tmpPositions; 465 QPtrList<Recurrence::rMonthPos> tmpPositions;
464 QPtrList<int> tmpDays; 466 QPtrList<int> tmpDays;
465 int *tmpDay; 467 int *tmpDay;
466 Recurrence::rMonthPos *tmpPos; 468 Recurrence::rMonthPos *tmpPos;
467 QString tmpStr2; 469 QString tmpStr2;
468 int i; 470 int i;
469 471
470 switch(anEvent->recurrence()->doesRecur()) { 472 switch(anEvent->recurrence()->doesRecur()) {
471 case Recurrence::rDaily: 473 case Recurrence::rDaily:
472 tmpStr.sprintf("D%i ",anEvent->recurrence()->frequency()); 474 tmpStr.sprintf("D%i ",anEvent->recurrence()->frequency());
473// if (anEvent->rDuration > 0) 475// if (anEvent->rDuration > 0)
474 //tmpStr += "#"; 476 //tmpStr += "#";
475 break; 477 break;
476 case Recurrence::rWeekly: 478 case Recurrence::rWeekly:
477 tmpStr.sprintf("W%i ",anEvent->recurrence()->frequency()); 479 tmpStr.sprintf("W%i ",anEvent->recurrence()->frequency());
478 for (i = 0; i < 7; i++) { 480 for (i = 0; i < 7; i++) {
479 if (anEvent->recurrence()->days().testBit(i)) 481 if (anEvent->recurrence()->days().testBit(i))
480 tmpStr += dayFromNum(i); 482 tmpStr += dayFromNum(i);
481 } 483 }
482 break; 484 break;
483 case Recurrence::rMonthlyPos: 485 case Recurrence::rMonthlyPos:
484 tmpStr.sprintf("MP%i ", anEvent->recurrence()->frequency()); 486 tmpStr.sprintf("MP%i ", anEvent->recurrence()->frequency());
485 // write out all rMonthPos's 487 // write out all rMonthPos's
486 tmpPositions = anEvent->recurrence()->monthPositions(); 488 tmpPositions = anEvent->recurrence()->monthPositions();
487 for (tmpPos = tmpPositions.first(); 489 for (tmpPos = tmpPositions.first();
488 tmpPos; 490 tmpPos;
489 tmpPos = tmpPositions.next()) { 491 tmpPos = tmpPositions.next()) {
490 492
491 tmpStr2.sprintf("%i", tmpPos->rPos); 493 tmpStr2.sprintf("%i", tmpPos->rPos);
492 if (tmpPos->negative) 494 if (tmpPos->negative)
493 tmpStr2 += "- "; 495 tmpStr2 += "- ";
494 else 496 else
495 tmpStr2 += "+ "; 497 tmpStr2 += "+ ";
496 tmpStr += tmpStr2; 498 tmpStr += tmpStr2;
497 for (i = 0; i < 7; i++) { 499 for (i = 0; i < 7; i++) {
498 if (tmpPos->rDays.testBit(i)) 500 if (tmpPos->rDays.testBit(i))
499 tmpStr += dayFromNum(i); 501 tmpStr += dayFromNum(i);
500 } 502 }
501 } // loop for all rMonthPos's 503 } // loop for all rMonthPos's
502 break; 504 break;
503 case Recurrence::rMonthlyDay: 505 case Recurrence::rMonthlyDay:
504 tmpStr.sprintf("MD%i ", anEvent->recurrence()->frequency()); 506 tmpStr.sprintf("MD%i ", anEvent->recurrence()->frequency());
505 // write out all rMonthDays; 507 // write out all rMonthDays;
506 tmpDays = anEvent->recurrence()->monthDays(); 508 tmpDays = anEvent->recurrence()->monthDays();
507 for (tmpDay = tmpDays.first(); 509 for (tmpDay = tmpDays.first();
508 tmpDay; 510 tmpDay;
509 tmpDay = tmpDays.next()) { 511 tmpDay = tmpDays.next()) {
510 tmpStr2.sprintf("%i ", *tmpDay); 512 tmpStr2.sprintf("%i ", *tmpDay);
511 tmpStr += tmpStr2; 513 tmpStr += tmpStr2;
512 } 514 }
513 break; 515 break;
514 case Recurrence::rYearlyMonth: 516 case Recurrence::rYearlyMonth:
515 tmpStr.sprintf("YM%i ", anEvent->recurrence()->frequency()); 517 tmpStr.sprintf("YM%i ", anEvent->recurrence()->frequency());
516 // write out all the rYearNums; 518 // write out all the rYearNums;
517 tmpDays = anEvent->recurrence()->yearNums(); 519 tmpDays = anEvent->recurrence()->yearNums();
518 for (tmpDay = tmpDays.first(); 520 for (tmpDay = tmpDays.first();
519 tmpDay; 521 tmpDay;
520 tmpDay = tmpDays.next()) { 522 tmpDay = tmpDays.next()) {
521 tmpStr2.sprintf("%i ", *tmpDay); 523 tmpStr2.sprintf("%i ", *tmpDay);
522 tmpStr += tmpStr2; 524 tmpStr += tmpStr2;
523 } 525 }
524 break; 526 break;
525 case Recurrence::rYearlyDay: 527 case Recurrence::rYearlyDay:
526 tmpStr.sprintf("YD%i ", anEvent->recurrence()->frequency()); 528 tmpStr.sprintf("YD%i ", anEvent->recurrence()->frequency());
527 // write out all the rYearNums; 529 // write out all the rYearNums;
528 tmpDays = anEvent->recurrence()->yearNums(); 530 tmpDays = anEvent->recurrence()->yearNums();
529 for (tmpDay = tmpDays.first(); 531 for (tmpDay = tmpDays.first();
530 tmpDay; 532 tmpDay;
531 tmpDay = tmpDays.next()) { 533 tmpDay = tmpDays.next()) {
532 tmpStr2.sprintf("%i ", *tmpDay); 534 tmpStr2.sprintf("%i ", *tmpDay);
533 tmpStr += tmpStr2; 535 tmpStr += tmpStr2;
534 } 536 }
535 break; 537 break;
536 default: 538 default:
537 kdDebug(5800) << "ERROR, it should never get here in eventToVEvent!" << endl; 539 kdDebug(5800) << "ERROR, it should never get here in eventToVEvent!" << endl;
538 break; 540 break;
539 } // switch 541 } // switch
540 542
541 if (anEvent->recurrence()->duration() > 0) { 543 if (anEvent->recurrence()->duration() > 0) {
542 tmpStr2.sprintf("#%i",anEvent->recurrence()->duration()); 544 tmpStr2.sprintf("#%i",anEvent->recurrence()->duration());
543 tmpStr += tmpStr2; 545 tmpStr += tmpStr2;
544 } else if (anEvent->recurrence()->duration() == -1) { 546 } else if (anEvent->recurrence()->duration() == -1) {
545 tmpStr += "#0"; // defined as repeat forever 547 tmpStr += "#0"; // defined as repeat forever
546 } else { 548 } else {
547 tmpStr += qDateTimeToISO(anEvent->recurrence()->endDate(), FALSE); 549 tmpStr += qDateTimeToISO(anEvent->recurrence()->endDate(), FALSE);
548 } 550 }
549 addPropValue(vevent,VCRRuleProp, tmpStr.local8Bit()); 551 addPropValue(vevent,VCRRuleProp, tmpStr.local8Bit());
550 552
551 } // event repeats 553 } // event repeats
552 554
553 // exceptions to recurrence 555 // exceptions to recurrence
554 DateList dateList = anEvent->exDates(); 556 DateList dateList = anEvent->exDates();
555 DateList::ConstIterator it; 557 DateList::ConstIterator it;
556 QString tmpStr2; 558 QString tmpStr2;
557 559
558 for (it = dateList.begin(); it != dateList.end(); ++it) { 560 for (it = dateList.begin(); it != dateList.end(); ++it) {
559 tmpStr = qDateToISO(*it) + ";"; 561 tmpStr = qDateToISO(*it) + ";";
560 tmpStr2 += tmpStr; 562 tmpStr2 += tmpStr;
561 } 563 }
562 if (!tmpStr2.isEmpty()) { 564 if (!tmpStr2.isEmpty()) {
563 tmpStr2.truncate(tmpStr2.length()-1); 565 tmpStr2.truncate(tmpStr2.length()-1);
564 addPropValue(vevent, VCExpDateProp, tmpStr2.local8Bit()); 566 addPropValue(vevent, VCExpDateProp, tmpStr2.local8Bit());
565 } 567 }
566 568
567 // description 569 // description
568 if (!anEvent->description().isEmpty()) { 570 if (!anEvent->description().isEmpty()) {
569 VObject *d = addPropValue(vevent, VCDescriptionProp, 571 VObject *d = addPropValue(vevent, VCDescriptionProp,
570 anEvent->description().local8Bit()); 572 anEvent->description().local8Bit());
571 if (anEvent->description().find('\n') != -1) 573 if (anEvent->description().find('\n') != -1)
572 addProp(d, VCQuotedPrintableProp); 574 addProp(d, VCQuotedPrintableProp);
573 } 575 }
574 576
575 // summary 577 // summary
576 if (!anEvent->summary().isEmpty()) 578 if (!anEvent->summary().isEmpty())
577 addPropValue(vevent, VCSummaryProp, anEvent->summary().local8Bit()); 579 addPropValue(vevent, VCSummaryProp, anEvent->summary().local8Bit());
578 580
579 if (!anEvent->location().isEmpty()) 581 if (!anEvent->location().isEmpty())
580 addPropValue(vevent, VCLocationProp, anEvent->location().local8Bit()); 582 addPropValue(vevent, VCLocationProp, anEvent->location().local8Bit());
581 583
582 // status 584 // status
583// TODO: define Event status 585// TODO: define Event status
584// addPropValue(vevent, VCStatusProp, anEvent->statusStr().local8Bit()); 586// addPropValue(vevent, VCStatusProp, anEvent->statusStr().local8Bit());
585 587
586 // secrecy 588 // secrecy
587 const char *text = 0; 589 const char *text = 0;
588 switch (anEvent->secrecy()) { 590 switch (anEvent->secrecy()) {
589 case Incidence::SecrecyPublic: 591 case Incidence::SecrecyPublic:
590 text = "PUBLIC"; 592 text = "PUBLIC";
591 break; 593 break;
592 case Incidence::SecrecyPrivate: 594 case Incidence::SecrecyPrivate:
593 text = "PRIVATE"; 595 text = "PRIVATE";
594 break; 596 break;
595 case Incidence::SecrecyConfidential: 597 case Incidence::SecrecyConfidential:
596 text = "CONFIDENTIAL"; 598 text = "CONFIDENTIAL";
597 break; 599 break;
598 } 600 }
599 if (text) { 601 if (text) {
600 addPropValue(vevent, VCClassProp, text); 602 addPropValue(vevent, VCClassProp, text);
601 } 603 }
602 604
603 // categories 605 // categories
604 tmpStrList = anEvent->categories(); 606 tmpStrList = anEvent->categories();
605 tmpStr = ""; 607 tmpStr = "";
606 QString catStr; 608 QString catStr;
607 for ( QStringList::Iterator it = tmpStrList.begin(); 609 for ( QStringList::Iterator it = tmpStrList.begin();
608 it != tmpStrList.end(); 610 it != tmpStrList.end();
609 ++it ) { 611 ++it ) {
610 catStr = *it; 612 catStr = *it;
611 if (catStr[0] == ' ') 613 if (catStr[0] == ' ')
612 tmpStr += catStr.mid(1); 614 tmpStr += catStr.mid(1);
613 else 615 else
614 tmpStr += catStr; 616 tmpStr += catStr;
615 // this must be a ';' character as the vCalendar specification requires! 617 // this must be a ';' character as the vCalendar specification requires!
616 // vcc.y has been hacked to translate the ';' to a ',' when the vcal is 618 // vcc.y has been hacked to translate the ';' to a ',' when the vcal is
617 // read in. 619 // read in.
618 tmpStr += ";"; 620 tmpStr += ";";
619 } 621 }
620 if (!tmpStr.isEmpty()) { 622 if (!tmpStr.isEmpty()) {
621 tmpStr.truncate(tmpStr.length()-1); 623 tmpStr.truncate(tmpStr.length()-1);
622 addPropValue(vevent, VCCategoriesProp, tmpStr.local8Bit()); 624 addPropValue(vevent, VCCategoriesProp, tmpStr.local8Bit());
623 } 625 }
624 626
625 // attachments 627 // attachments
626 // TODO: handle binary attachments! 628 // TODO: handle binary attachments!
627 QPtrList<Attachment> attachments = anEvent->attachments(); 629 QPtrList<Attachment> attachments = anEvent->attachments();
628 for ( Attachment *at = attachments.first(); at; at = attachments.next() ) 630 for ( Attachment *at = attachments.first(); at; at = attachments.next() )
629 addPropValue(vevent, VCAttachProp, at->uri().local8Bit()); 631 addPropValue(vevent, VCAttachProp, at->uri().local8Bit());
630 632
631 // resources 633 // resources
632 tmpStrList = anEvent->resources(); 634 tmpStrList = anEvent->resources();
633 tmpStr = tmpStrList.join(";"); 635 tmpStr = tmpStrList.join(";");
634 if (!tmpStr.isEmpty()) 636 if (!tmpStr.isEmpty())
635 addPropValue(vevent, VCResourcesProp, tmpStr.local8Bit()); 637 addPropValue(vevent, VCResourcesProp, tmpStr.local8Bit());
636 638
637 // alarm stuff 639 // alarm stuff
638 QPtrList<Alarm> alarms = anEvent->alarms(); 640 QPtrList<Alarm> alarms = anEvent->alarms();
639 Alarm* alarm; 641 Alarm* alarm;
640 for (alarm = alarms.first(); alarm; alarm = alarms.next()) { 642 for (alarm = alarms.first(); alarm; alarm = alarms.next()) {
641 if (alarm->enabled()) { 643 if (alarm->enabled()) {
642 VObject *a ; 644 VObject *a ;
643 tmpStr = qDateTimeToISO(alarm->time()); 645 tmpStr = qDateTimeToISO(alarm->time());
644 if (alarm->type() == Alarm::Audio) { 646 if (alarm->type() == Alarm::Audio) {
645 a = addProp(vevent, VCAAlarmProp); 647 a = addProp(vevent, VCAAlarmProp);
646 addPropValue(a, VCRunTimeProp, tmpStr.local8Bit()); 648 addPropValue(a, VCRunTimeProp, tmpStr.local8Bit());
647 addPropValue(a, VCRepeatCountProp, "1"); 649 addPropValue(a, VCRepeatCountProp, "1");
648 addPropValue(a, VCAudioContentProp, QFile::encodeName(alarm->audioFile())); 650 addPropValue(a, VCAudioContentProp, QFile::encodeName(alarm->audioFile()));
649 } 651 }
650 if (alarm->type() == Alarm::Procedure) { 652 if (alarm->type() == Alarm::Procedure) {
651 a = addProp(vevent, VCPAlarmProp); 653 a = addProp(vevent, VCPAlarmProp);
652 addPropValue(a, VCRunTimeProp, tmpStr.local8Bit()); 654 addPropValue(a, VCRunTimeProp, tmpStr.local8Bit());
653 addPropValue(a, VCRepeatCountProp, "1"); 655 addPropValue(a, VCRepeatCountProp, "1");
654 addPropValue(a, VCProcedureNameProp, QFile::encodeName(alarm->programFile())); 656 addPropValue(a, VCProcedureNameProp, QFile::encodeName(alarm->programFile()));
655 } else { 657 } else {
656 a = addProp(vevent, VCDAlarmProp); 658 a = addProp(vevent, VCDAlarmProp);
657 addPropValue(a, VCRunTimeProp, tmpStr.local8Bit()); 659 addPropValue(a, VCRunTimeProp, tmpStr.local8Bit());
658 addPropValue(a, VCRepeatCountProp, "1"); 660 addPropValue(a, VCRepeatCountProp, "1");
659 addPropValue(a, VCDisplayStringProp, "beep!"); 661 addPropValue(a, VCDisplayStringProp, "beep!");
660 662
661 } 663 }
662 } 664 }
663 } 665 }
664 666
665 // priority 667 // priority
666 tmpStr.sprintf("%i",anEvent->priority()); 668 tmpStr.sprintf("%i",anEvent->priority());
667 addPropValue(vevent, VCPriorityProp, tmpStr.local8Bit()); 669 addPropValue(vevent, VCPriorityProp, tmpStr.local8Bit());
668 670
669 // transparency 671 // transparency
670 tmpStr.sprintf("%i",anEvent->transparency()); 672 tmpStr.sprintf("%i",anEvent->transparency());
671 addPropValue(vevent, VCTranspProp, tmpStr.local8Bit()); 673 addPropValue(vevent, VCTranspProp, tmpStr.local8Bit());
672 674
673 // related event 675 // related event
674 if (anEvent->relatedTo()) { 676 if (anEvent->relatedTo()) {
675 addPropValue(vevent, VCRelatedToProp, 677 addPropValue(vevent, VCRelatedToProp,
676 anEvent->relatedTo()->uid().local8Bit()); 678 anEvent->relatedTo()->uid().local8Bit());
677 } 679 }
678 680
679 if (anEvent->pilotId()) { 681 if (anEvent->pilotId()) {
680 // pilot sync stuff 682 // pilot sync stuff
681 tmpStr.sprintf("%i",anEvent->pilotId()); 683 tmpStr.sprintf("%i",anEvent->pilotId());
682 addPropValue(vevent, XPilotIdProp, tmpStr.local8Bit()); 684 addPropValue(vevent, XPilotIdProp, tmpStr.local8Bit());
683 tmpStr.sprintf("%i",anEvent->syncStatus()); 685 tmpStr.sprintf("%i",anEvent->syncStatus());
684 addPropValue(vevent, XPilotStatusProp, tmpStr.local8Bit()); 686 addPropValue(vevent, XPilotStatusProp, tmpStr.local8Bit());
685 } 687 }
686 688
687 return vevent; 689 return vevent;
688} 690}
689 691
690Todo *VCalFormat::VTodoToEvent(VObject *vtodo) 692Todo *VCalFormat::VTodoToEvent(VObject *vtodo)
691{ 693{
692 VObject *vo; 694 VObject *vo;
693 VObjectIterator voi; 695 VObjectIterator voi;
694 char *s; 696 char *s;
695 697
696 Todo *anEvent = new Todo; 698 Todo *anEvent = new Todo;
697 699
698 // creation date 700 // creation date
699 if ((vo = isAPropertyOf(vtodo, VCDCreatedProp)) != 0) { 701 if ((vo = isAPropertyOf(vtodo, VCDCreatedProp)) != 0) {
700 anEvent->setCreated(ISOToQDateTime(s = fakeCString(vObjectUStringZValue(vo)))); 702 anEvent->setCreated(ISOToQDateTime(s = fakeCString(vObjectUStringZValue(vo))));
701 deleteStr(s); 703 deleteStr(s);
702 } 704 }
703 705
704 // unique id 706 // unique id
705 vo = isAPropertyOf(vtodo, VCUniqueStringProp); 707 vo = isAPropertyOf(vtodo, VCUniqueStringProp);
706 // while the UID property is preferred, it is not required. We'll use the 708 // while the UID property is preferred, it is not required. We'll use the
707 // default Event UID if none is given. 709 // default Event UID if none is given.
708 if (vo) { 710 if (vo) {
709 anEvent->setUid(s = fakeCString(vObjectUStringZValue(vo))); 711 anEvent->setUid(s = fakeCString(vObjectUStringZValue(vo)));
710 deleteStr(s); 712 deleteStr(s);
711 } 713 }
712 714
713 // last modification date 715 // last modification date
714 if ((vo = isAPropertyOf(vtodo, VCLastModifiedProp)) != 0) { 716 if ((vo = isAPropertyOf(vtodo, VCLastModifiedProp)) != 0) {
715 anEvent->setLastModified(ISOToQDateTime(s = fakeCString(vObjectUStringZValue(vo)))); 717 anEvent->setLastModified(ISOToQDateTime(s = fakeCString(vObjectUStringZValue(vo))));
716 deleteStr(s); 718 deleteStr(s);
717 } 719 }
718 else 720 else
719 anEvent->setLastModified(QDateTime(QDate::currentDate(), 721 anEvent->setLastModified(QDateTime(QDate::currentDate(),
720 QTime::currentTime())); 722 QTime::currentTime()));
721 723
722 // organizer 724 // organizer
723 // if our extension property for the event's ORGANIZER exists, add it. 725 // if our extension property for the event's ORGANIZER exists, add it.
724 if ((vo = isAPropertyOf(vtodo, ICOrganizerProp)) != 0) { 726 if ((vo = isAPropertyOf(vtodo, ICOrganizerProp)) != 0) {
725 anEvent->setOrganizer(s = fakeCString(vObjectUStringZValue(vo))); 727 anEvent->setOrganizer(s = fakeCString(vObjectUStringZValue(vo)));
726 deleteStr(s); 728 deleteStr(s);
727 } else { 729 } else {
728 anEvent->setOrganizer(mCalendar->getEmail()); 730 anEvent->setOrganizer(mCalendar->getEmail());
729 } 731 }
730 732
731 // attendees. 733 // attendees.
732 initPropIterator(&voi, vtodo); 734 initPropIterator(&voi, vtodo);
733 while (moreIteration(&voi)) { 735 while (moreIteration(&voi)) {
734 vo = nextVObject(&voi); 736 vo = nextVObject(&voi);
735 if (strcmp(vObjectName(vo), VCAttendeeProp) == 0) { 737 if (strcmp(vObjectName(vo), VCAttendeeProp) == 0) {
736 Attendee *a; 738 Attendee *a;
737 VObject *vp; 739 VObject *vp;
738 s = fakeCString(vObjectUStringZValue(vo)); 740 s = fakeCString(vObjectUStringZValue(vo));
739 QString tmpStr = QString::fromLocal8Bit(s); 741 QString tmpStr = QString::fromLocal8Bit(s);
740 deleteStr(s); 742 deleteStr(s);
741 tmpStr = tmpStr.simplifyWhiteSpace(); 743 tmpStr = tmpStr.simplifyWhiteSpace();
742 int emailPos1, emailPos2; 744 int emailPos1, emailPos2;
743 if ((emailPos1 = tmpStr.find('<')) > 0) { 745 if ((emailPos1 = tmpStr.find('<')) > 0) {
744 // both email address and name 746 // both email address and name
745 emailPos2 = tmpStr.findRev('>'); 747 emailPos2 = tmpStr.findRev('>');
746 a = new Attendee(tmpStr.left(emailPos1 - 1), 748 a = new Attendee(tmpStr.left(emailPos1 - 1),
747 tmpStr.mid(emailPos1 + 1, 749 tmpStr.mid(emailPos1 + 1,
748 emailPos2 - (emailPos1 + 1))); 750 emailPos2 - (emailPos1 + 1)));
749 } else if (tmpStr.find('@') > 0) { 751 } else if (tmpStr.find('@') > 0) {
750 // just an email address 752 // just an email address
751 a = new Attendee(0, tmpStr); 753 a = new Attendee(0, tmpStr);
752 } else { 754 } else {
753 // just a name 755 // just a name
754 QString email = tmpStr.replace( QRegExp(" "), "." ); 756 // QString email = tmpStr.replace( QRegExp(" "), "." );
755 a = new Attendee(tmpStr,email); 757 a = new Attendee(tmpStr,0);
756 } 758 }
757 759 // is there a Role property?
760 if ((vp = isAPropertyOf(vo, VCRoleProp)) != 0)
761 a->setRole(readRole(vObjectStringZValue(vp)));
758 // is there an RSVP property? 762 // is there an RSVP property?
759 if ((vp = isAPropertyOf(vo, VCRSVPProp)) != 0) 763 if ((vp = isAPropertyOf(vo, VCRSVPProp)) != 0)
760 a->setRSVP(vObjectStringZValue(vp)); 764 a->setRSVP(vObjectStringZValue(vp));
761 // is there a status property? 765 // is there a status property?
762 if ((vp = isAPropertyOf(vo, VCStatusProp)) != 0) 766 if ((vp = isAPropertyOf(vo, VCStatusProp)) != 0)
763 a->setStatus(readStatus(vObjectStringZValue(vp))); 767 a->setStatus(readStatus(vObjectStringZValue(vp)));
764 // add the attendee 768 // add the attendee
765 anEvent->addAttendee(a); 769 anEvent->addAttendee(a);
766 } 770 }
767 } 771 }
768 772
769 // description for todo 773 // description for todo
770 if ((vo = isAPropertyOf(vtodo, VCDescriptionProp)) != 0) { 774 if ((vo = isAPropertyOf(vtodo, VCDescriptionProp)) != 0) {
771 s = fakeCString(vObjectUStringZValue(vo)); 775 s = fakeCString(vObjectUStringZValue(vo));
772 anEvent->setDescription(QString::fromLocal8Bit(s)); 776 anEvent->setDescription(QString::fromLocal8Bit(s));
773 deleteStr(s); 777 deleteStr(s);
774 } 778 }
775 779
776 // summary 780 // summary
777 if ((vo = isAPropertyOf(vtodo, VCSummaryProp))) { 781 if ((vo = isAPropertyOf(vtodo, VCSummaryProp))) {
778 s = fakeCString(vObjectUStringZValue(vo)); 782 s = fakeCString(vObjectUStringZValue(vo));
779 anEvent->setSummary(QString::fromLocal8Bit(s)); 783 anEvent->setSummary(QString::fromLocal8Bit(s));
780 deleteStr(s); 784 deleteStr(s);
781 } 785 }
782 if ((vo = isAPropertyOf(vtodo, VCLocationProp))) { 786 if ((vo = isAPropertyOf(vtodo, VCLocationProp))) {
783 s = fakeCString(vObjectUStringZValue(vo)); 787 s = fakeCString(vObjectUStringZValue(vo));
784 anEvent->setLocation(QString::fromLocal8Bit(s)); 788 anEvent->setLocation(QString::fromLocal8Bit(s));
785 deleteStr(s); 789 deleteStr(s);
786 } 790 }
787 791
788 792
789 // completed 793 // completed
790 // was: status 794 // was: status
791 if ((vo = isAPropertyOf(vtodo, VCStatusProp)) != 0) { 795 if ((vo = isAPropertyOf(vtodo, VCStatusProp)) != 0) {
792 s = fakeCString(vObjectUStringZValue(vo)); 796 s = fakeCString(vObjectUStringZValue(vo));
793 if (strcmp(s,"COMPLETED") == 0) { 797 if (strcmp(s,"COMPLETED") == 0) {
794 anEvent->setCompleted(true); 798 anEvent->setCompleted(true);
795 } else { 799 } else {
796 anEvent->setCompleted(false); 800 anEvent->setCompleted(false);
797 } 801 }
798 deleteStr(s); 802 deleteStr(s);
799 } 803 }
800 else 804 else
801 anEvent->setCompleted(false); 805 anEvent->setCompleted(false);
802 806
803 // completion date 807 // completion date
804 if ((vo = isAPropertyOf(vtodo, VCCompletedProp)) != 0) { 808 if ((vo = isAPropertyOf(vtodo, VCCompletedProp)) != 0) {
805 anEvent->setCompleted(ISOToQDateTime(s = fakeCString(vObjectUStringZValue(vo)))); 809 anEvent->setCompleted(ISOToQDateTime(s = fakeCString(vObjectUStringZValue(vo))));
806 deleteStr(s); 810 deleteStr(s);
807 } 811 }
808 812
809 // priority 813 // priority
810 if ((vo = isAPropertyOf(vtodo, VCPriorityProp))) { 814 if ((vo = isAPropertyOf(vtodo, VCPriorityProp))) {
811 anEvent->setPriority(atoi(s = fakeCString(vObjectUStringZValue(vo)))); 815 anEvent->setPriority(atoi(s = fakeCString(vObjectUStringZValue(vo))));
812 deleteStr(s); 816 deleteStr(s);
813 } 817 }
814 818
815 // due date 819 // due date
816 if ((vo = isAPropertyOf(vtodo, VCDueProp)) != 0) { 820 if ((vo = isAPropertyOf(vtodo, VCDueProp)) != 0) {
817 anEvent->setDtDue(ISOToQDateTime(s = fakeCString(vObjectUStringZValue(vo)))); 821 anEvent->setDtDue(ISOToQDateTime(s = fakeCString(vObjectUStringZValue(vo))));
818 deleteStr(s); 822 deleteStr(s);
819 anEvent->setHasDueDate(true); 823 anEvent->setHasDueDate(true);
820 } else { 824 } else {
821 anEvent->setHasDueDate(false); 825 anEvent->setHasDueDate(false);
822 } 826 }
823 827
824 // start time 828 // start time
825 if ((vo = isAPropertyOf(vtodo, VCDTstartProp)) != 0) { 829 if ((vo = isAPropertyOf(vtodo, VCDTstartProp)) != 0) {
826 anEvent->setDtStart(ISOToQDateTime(s = fakeCString(vObjectUStringZValue(vo)))); 830 anEvent->setDtStart(ISOToQDateTime(s = fakeCString(vObjectUStringZValue(vo))));
827 // kdDebug(5800) << "s is " << // s << ", ISO is " << ISOToQDateTime(s = fakeCString(vObjectUStringZValue(vo))).toString() << endl; 831 // kdDebug(5800) << "s is " << // s << ", ISO is " << ISOToQDateTime(s = fakeCString(vObjectUStringZValue(vo))).toString() << endl;
828 deleteStr(s); 832 deleteStr(s);
829 anEvent->setHasStartDate(true); 833 anEvent->setHasStartDate(true);
830 } else { 834 } else {
831 anEvent->setHasStartDate(false); 835 anEvent->setHasStartDate(false);
832 } 836 }
833 837
834 /* alarm stuff */ 838 /* alarm stuff */
835 //kdDebug(5800) << "vcalformat::VTodoToEvent called" << endl; 839 //kdDebug(5800) << "vcalformat::VTodoToEvent called" << endl;
836 if ((vo = isAPropertyOf(vtodo, VCDAlarmProp))) { 840 if ((vo = isAPropertyOf(vtodo, VCDAlarmProp))) {
837 Alarm* alarm = anEvent->newAlarm(); 841 Alarm* alarm = anEvent->newAlarm();
838 VObject *a; 842 VObject *a;
839 if ((a = isAPropertyOf(vo, VCRunTimeProp))) { 843 if ((a = isAPropertyOf(vo, VCRunTimeProp))) {
840 alarm->setTime(ISOToQDateTime(s = fakeCString(vObjectUStringZValue(a)))); 844 alarm->setTime(ISOToQDateTime(s = fakeCString(vObjectUStringZValue(a))));
841 deleteStr(s); 845 deleteStr(s);
842 } 846 }
843 alarm->setEnabled(true); 847 alarm->setEnabled(true);
844 if ((vo = isAPropertyOf(vtodo, VCPAlarmProp))) { 848 if ((vo = isAPropertyOf(vtodo, VCPAlarmProp))) {
845 if ((a = isAPropertyOf(vo, VCProcedureNameProp))) { 849 if ((a = isAPropertyOf(vo, VCProcedureNameProp))) {
846 s = fakeCString(vObjectUStringZValue(a)); 850 s = fakeCString(vObjectUStringZValue(a));
847 alarm->setProcedureAlarm(QFile::decodeName(s)); 851 alarm->setProcedureAlarm(QFile::decodeName(s));
848 deleteStr(s); 852 deleteStr(s);
849 } 853 }
850 } 854 }
851 if ((vo = isAPropertyOf(vtodo, VCAAlarmProp))) { 855 if ((vo = isAPropertyOf(vtodo, VCAAlarmProp))) {
852 if ((a = isAPropertyOf(vo, VCAudioContentProp))) { 856 if ((a = isAPropertyOf(vo, VCAudioContentProp))) {
853 s = fakeCString(vObjectUStringZValue(a)); 857 s = fakeCString(vObjectUStringZValue(a));
854 alarm->setAudioAlarm(QFile::decodeName(s)); 858 alarm->setAudioAlarm(QFile::decodeName(s));
855 deleteStr(s); 859 deleteStr(s);
856 } 860 }
857 } 861 }
858 } 862 }
859 863
860 // related todo 864 // related todo
861 if ((vo = isAPropertyOf(vtodo, VCRelatedToProp)) != 0) { 865 if ((vo = isAPropertyOf(vtodo, VCRelatedToProp)) != 0) {
862 anEvent->setRelatedToUid(s = fakeCString(vObjectUStringZValue(vo))); 866 anEvent->setRelatedToUid(s = fakeCString(vObjectUStringZValue(vo)));
863 deleteStr(s); 867 deleteStr(s);
864 mTodosRelate.append(anEvent); 868 mTodosRelate.append(anEvent);
865 } 869 }
866 870
867 // categories 871 // categories
868 QStringList tmpStrList; 872 QStringList tmpStrList;
869 int index1 = 0; 873 int index1 = 0;
870 int index2 = 0; 874 int index2 = 0;
871 if ((vo = isAPropertyOf(vtodo, VCCategoriesProp)) != 0) { 875 if ((vo = isAPropertyOf(vtodo, VCCategoriesProp)) != 0) {
872 s = fakeCString(vObjectUStringZValue(vo)); 876 s = fakeCString(vObjectUStringZValue(vo));
873 QString categories = QString::fromLocal8Bit(s); 877 QString categories = QString::fromLocal8Bit(s);
874 deleteStr(s); 878 deleteStr(s);
875 //const char* category; 879 //const char* category;
876 QString category; 880 QString category;
877 while ((index2 = categories.find(',', index1)) != -1) { 881 while ((index2 = categories.find(',', index1)) != -1) {
878 //category = (const char *) categories.mid(index1, (index2 - index1)); 882 //category = (const char *) categories.mid(index1, (index2 - index1));
879 category = categories.mid(index1, (index2 - index1)); 883 category = categories.mid(index1, (index2 - index1));
880 tmpStrList.append(category); 884 tmpStrList.append(category);
881 index1 = index2+1; 885 index1 = index2+1;
882 } 886 }
883 // get last category 887 // get last category
884 category = categories.mid(index1, (categories.length()-index1)); 888 category = categories.mid(index1, (categories.length()-index1));
885 tmpStrList.append(category); 889 tmpStrList.append(category);
886 anEvent->setCategories(tmpStrList); 890 anEvent->setCategories(tmpStrList);
887 } 891 }
888 892
889 /* PILOT SYNC STUFF */ 893 /* PILOT SYNC STUFF */
890 if ((vo = isAPropertyOf(vtodo, XPilotIdProp))) { 894 if ((vo = isAPropertyOf(vtodo, XPilotIdProp))) {
891 anEvent->setPilotId(atoi(s = fakeCString(vObjectUStringZValue(vo)))); 895 anEvent->setPilotId(atoi(s = fakeCString(vObjectUStringZValue(vo))));
892 deleteStr(s); 896 deleteStr(s);
893 } 897 }
894 else 898 else
895 anEvent->setPilotId(0); 899 anEvent->setPilotId(0);
896 900
897 if ((vo = isAPropertyOf(vtodo, XPilotStatusProp))) { 901 if ((vo = isAPropertyOf(vtodo, XPilotStatusProp))) {
898 anEvent->setSyncStatus(atoi(s = fakeCString(vObjectUStringZValue(vo)))); 902 anEvent->setSyncStatus(atoi(s = fakeCString(vObjectUStringZValue(vo))));
899 deleteStr(s); 903 deleteStr(s);
900 } 904 }
901 else 905 else
902 anEvent->setSyncStatus(Event::SYNCMOD); 906 anEvent->setSyncStatus(Event::SYNCMOD);
903 907
904 return anEvent; 908 return anEvent;
905} 909}
906 910
907Event* VCalFormat::VEventToEvent(VObject *vevent) 911Event* VCalFormat::VEventToEvent(VObject *vevent)
908{ 912{
909 VObject *vo; 913 VObject *vo;
910 VObjectIterator voi; 914 VObjectIterator voi;
911 char *s; 915 char *s;
912 916
913 Event *anEvent = new Event; 917 Event *anEvent = new Event;
914 918
915 // creation date 919 // creation date
916 if ((vo = isAPropertyOf(vevent, VCDCreatedProp)) != 0) { 920 if ((vo = isAPropertyOf(vevent, VCDCreatedProp)) != 0) {
917 anEvent->setCreated(ISOToQDateTime(s = fakeCString(vObjectUStringZValue(vo)))); 921 anEvent->setCreated(ISOToQDateTime(s = fakeCString(vObjectUStringZValue(vo))));
918 deleteStr(s); 922 deleteStr(s);
919 } 923 }
920 924
921 // unique id 925 // unique id
922 vo = isAPropertyOf(vevent, VCUniqueStringProp); 926 vo = isAPropertyOf(vevent, VCUniqueStringProp);
923 // while the UID property is preferred, it is not required. We'll use the 927 // while the UID property is preferred, it is not required. We'll use the
924 // default Event UID if none is given. 928 // default Event UID if none is given.
925 if (vo) { 929 if (vo) {
926 anEvent->setUid(s = fakeCString(vObjectUStringZValue(vo))); 930 anEvent->setUid(s = fakeCString(vObjectUStringZValue(vo)));
927 deleteStr(s); 931 deleteStr(s);
928 } 932 }
929 933
930 // revision 934 // revision
931 // again NSCAL doesn't give us much to work with, so we improvise... 935 // again NSCAL doesn't give us much to work with, so we improvise...
932 if ((vo = isAPropertyOf(vevent, VCSequenceProp)) != 0) { 936 if ((vo = isAPropertyOf(vevent, VCSequenceProp)) != 0) {
933 anEvent->setRevision(atoi(s = fakeCString(vObjectUStringZValue(vo)))); 937 anEvent->setRevision(atoi(s = fakeCString(vObjectUStringZValue(vo))));
934 deleteStr(s); 938 deleteStr(s);
935 } 939 }
936 else 940 else
937 anEvent->setRevision(0); 941 anEvent->setRevision(0);
938 942
939 // last modification date 943 // last modification date
940 if ((vo = isAPropertyOf(vevent, VCLastModifiedProp)) != 0) { 944 if ((vo = isAPropertyOf(vevent, VCLastModifiedProp)) != 0) {
941 anEvent->setLastModified(ISOToQDateTime(s = fakeCString(vObjectUStringZValue(vo)))); 945 anEvent->setLastModified(ISOToQDateTime(s = fakeCString(vObjectUStringZValue(vo))));
942 deleteStr(s); 946 deleteStr(s);
943 } 947 }
944 else 948 else
945 anEvent->setLastModified(QDateTime(QDate::currentDate(), 949 anEvent->setLastModified(QDateTime(QDate::currentDate(),
946 QTime::currentTime())); 950 QTime::currentTime()));
947 951
948 // organizer 952 // organizer
949 // if our extension property for the event's ORGANIZER exists, add it. 953 // if our extension property for the event's ORGANIZER exists, add it.
950 if ((vo = isAPropertyOf(vevent, ICOrganizerProp)) != 0) { 954 if ((vo = isAPropertyOf(vevent, ICOrganizerProp)) != 0) {
951 anEvent->setOrganizer(s = fakeCString(vObjectUStringZValue(vo))); 955 anEvent->setOrganizer(s = fakeCString(vObjectUStringZValue(vo)));
952 deleteStr(s); 956 deleteStr(s);
953 } else { 957 } else {
954 anEvent->setOrganizer(mCalendar->getEmail()); 958 anEvent->setOrganizer(mCalendar->getEmail());
955 } 959 }
956 960
957 // deal with attendees. 961 // deal with attendees.
958 initPropIterator(&voi, vevent); 962 initPropIterator(&voi, vevent);
959 while (moreIteration(&voi)) { 963 while (moreIteration(&voi)) {
960 vo = nextVObject(&voi); 964 vo = nextVObject(&voi);
961 if (strcmp(vObjectName(vo), VCAttendeeProp) == 0) { 965 if (strcmp(vObjectName(vo), VCAttendeeProp) == 0) {
962 Attendee *a; 966 Attendee *a;
963 VObject *vp; 967 VObject *vp;
964 s = fakeCString(vObjectUStringZValue(vo)); 968 s = fakeCString(vObjectUStringZValue(vo));
965 QString tmpStr = QString::fromLocal8Bit(s); 969 QString tmpStr = QString::fromLocal8Bit(s);
966 deleteStr(s); 970 deleteStr(s);
967 tmpStr = tmpStr.simplifyWhiteSpace(); 971 tmpStr = tmpStr.simplifyWhiteSpace();
968 int emailPos1, emailPos2; 972 int emailPos1, emailPos2;
969 if ((emailPos1 = tmpStr.find('<')) > 0) { 973 if ((emailPos1 = tmpStr.find('<')) > 0) {
970 // both email address and name 974 // both email address and name
971 emailPos2 = tmpStr.findRev('>'); 975 emailPos2 = tmpStr.findRev('>');
972 a = new Attendee(tmpStr.left(emailPos1 - 1), 976 a = new Attendee(tmpStr.left(emailPos1 - 1),
973 tmpStr.mid(emailPos1 + 1, 977 tmpStr.mid(emailPos1 + 1,
974 emailPos2 - (emailPos1 + 1))); 978 emailPos2 - (emailPos1 + 1)));
975 } else if (tmpStr.find('@') > 0) { 979 } else if (tmpStr.find('@') > 0) {
976 // just an email address 980 // just an email address
977 a = new Attendee(0, tmpStr); 981 a = new Attendee(0, tmpStr);
978 } else { 982 } else {
979 // just a name 983 // just a name
980 QString email = tmpStr.replace( QRegExp(" "), "." ); 984 //QString email = tmpStr.replace( QRegExp(" "), "." );
981 a = new Attendee(tmpStr,email); 985 a = new Attendee(tmpStr,0);
982 } 986 }
983 987
988
989 // is there a Role property?
990 if ((vp = isAPropertyOf(vo, VCRoleProp)) != 0)
991 a->setRole(readRole(vObjectStringZValue(vp)));
992
984 // is there an RSVP property? 993 // is there an RSVP property?
985 if ((vp = isAPropertyOf(vo, VCRSVPProp)) != 0) 994 if ((vp = isAPropertyOf(vo, VCRSVPProp)) != 0)
986 a->setRSVP(vObjectStringZValue(vp)); 995 a->setRSVP(vObjectStringZValue(vp));
987 // is there a status property? 996 // is there a status property?
988 if ((vp = isAPropertyOf(vo, VCStatusProp)) != 0) 997 if ((vp = isAPropertyOf(vo, VCStatusProp)) != 0)
989 a->setStatus(readStatus(vObjectStringZValue(vp))); 998 a->setStatus(readStatus(vObjectStringZValue(vp)));
990 // add the attendee 999 // add the attendee
991 anEvent->addAttendee(a); 1000 anEvent->addAttendee(a);
992 } 1001 }
993 } 1002 }
994 1003
995 // This isn't strictly true. An event that doesn't have a start time 1004 // This isn't strictly true. An event that doesn't have a start time
996 // or an end time doesn't "float", it has an anchor in time but it doesn't 1005 // or an end time doesn't "float", it has an anchor in time but it doesn't
997 // "take up" any time. 1006 // "take up" any time.
998 /*if ((isAPropertyOf(vevent, VCDTstartProp) == 0) || 1007 /*if ((isAPropertyOf(vevent, VCDTstartProp) == 0) ||
999 (isAPropertyOf(vevent, VCDTendProp) == 0)) { 1008 (isAPropertyOf(vevent, VCDTendProp) == 0)) {
1000 anEvent->setFloats(TRUE); 1009 anEvent->setFloats(TRUE);
1001 } else { 1010 } else {
1002 }*/ 1011 }*/
1003 1012
1004 anEvent->setFloats(FALSE); 1013 anEvent->setFloats(FALSE);
1005 1014
1006 // start time 1015 // start time
1007 if ((vo = isAPropertyOf(vevent, VCDTstartProp)) != 0) { 1016 if ((vo = isAPropertyOf(vevent, VCDTstartProp)) != 0) {
1008 anEvent->setDtStart(ISOToQDateTime(s = fakeCString(vObjectUStringZValue(vo)))); 1017 anEvent->setDtStart(ISOToQDateTime(s = fakeCString(vObjectUStringZValue(vo))));
1009 // kdDebug(5800) << "s is " << // s << ", ISO is " << ISOToQDateTime(s = fakeCString(vObjectUStringZValue(vo))).toString() << endl; 1018 // kdDebug(5800) << "s is " << // s << ", ISO is " << ISOToQDateTime(s = fakeCString(vObjectUStringZValue(vo))).toString() << endl;
1010 deleteStr(s); 1019 deleteStr(s);
1011 if (anEvent->dtStart().time().isNull()) 1020 if (anEvent->dtStart().time().isNull())
1012 anEvent->setFloats(TRUE); 1021 anEvent->setFloats(TRUE);
1013 } 1022 }
1014 1023
1015 // stop time 1024 // stop time
1016 if ((vo = isAPropertyOf(vevent, VCDTendProp)) != 0) { 1025 if ((vo = isAPropertyOf(vevent, VCDTendProp)) != 0) {
1017 anEvent->setDtEnd(ISOToQDateTime(s = fakeCString(vObjectUStringZValue(vo)))); 1026 anEvent->setDtEnd(ISOToQDateTime(s = fakeCString(vObjectUStringZValue(vo))));
1018 deleteStr(s); 1027 deleteStr(s);
1019 if (anEvent->dtEnd().time().isNull()) 1028 if (anEvent->dtEnd().time().isNull())
1020 anEvent->setFloats(TRUE); 1029 anEvent->setFloats(TRUE);
1021 } 1030 }
1022 1031
1023 // at this point, there should be at least a start or end time. 1032 // at this point, there should be at least a start or end time.
1024 // fix up for events that take up no time but have a time associated 1033 // fix up for events that take up no time but have a time associated
1025 if (!(vo = isAPropertyOf(vevent, VCDTstartProp))) 1034 if (!(vo = isAPropertyOf(vevent, VCDTstartProp)))
1026 anEvent->setDtStart(anEvent->dtEnd()); 1035 anEvent->setDtStart(anEvent->dtEnd());
1027 if (!(vo = isAPropertyOf(vevent, VCDTendProp))) 1036 if (!(vo = isAPropertyOf(vevent, VCDTendProp)))
1028 anEvent->setDtEnd(anEvent->dtStart()); 1037 anEvent->setDtEnd(anEvent->dtStart());
1029 1038
1030 /////////////////////////////////////////////////////////////////////////// 1039 ///////////////////////////////////////////////////////////////////////////
1031 1040
1032 // repeat stuff 1041 // repeat stuff
1033 if ((vo = isAPropertyOf(vevent, VCRRuleProp)) != 0) { 1042 if ((vo = isAPropertyOf(vevent, VCRRuleProp)) != 0) {
1034 QString tmpStr = (s = fakeCString(vObjectUStringZValue(vo))); 1043 QString tmpStr = (s = fakeCString(vObjectUStringZValue(vo)));
1035 deleteStr(s); 1044 deleteStr(s);
1036 tmpStr.simplifyWhiteSpace(); 1045 tmpStr.simplifyWhiteSpace();
1037 tmpStr = tmpStr.upper(); 1046 tmpStr = tmpStr.upper();
1038 1047
1039 /********************************* DAILY ******************************/ 1048 /********************************* DAILY ******************************/
1040 if (tmpStr.left(1) == "D") { 1049 if (tmpStr.left(1) == "D") {
1041 int index = tmpStr.find(' '); 1050 int index = tmpStr.find(' ');
1042 int rFreq = tmpStr.mid(1, (index-1)).toInt(); 1051 int rFreq = tmpStr.mid(1, (index-1)).toInt();
1043 index = tmpStr.findRev(' ') + 1; // advance to last field 1052 index = tmpStr.findRev(' ') + 1; // advance to last field
1044 if (tmpStr.mid(index,1) == "#") index++; 1053 if (tmpStr.mid(index,1) == "#") index++;
1045 if (tmpStr.find('T', index) != -1) { 1054 if (tmpStr.find('T', index) != -1) {
1046 QDate rEndDate = (ISOToQDateTime(tmpStr.mid(index, tmpStr.length()-index))).date(); 1055 QDate rEndDate = (ISOToQDateTime(tmpStr.mid(index, tmpStr.length()-index))).date();
1047 anEvent->recurrence()->setDaily(rFreq, rEndDate); 1056 anEvent->recurrence()->setDaily(rFreq, rEndDate);
1048 } else { 1057 } else {
1049 int rDuration = tmpStr.mid(index, tmpStr.length()-index).toInt(); 1058 int rDuration = tmpStr.mid(index, tmpStr.length()-index).toInt();
1050 if (rDuration == 0) // VEvents set this to 0 forever, we use -1 1059 if (rDuration == 0) // VEvents set this to 0 forever, we use -1
1051 anEvent->recurrence()->setDaily(rFreq, -1); 1060 anEvent->recurrence()->setDaily(rFreq, -1);
1052 else 1061 else
1053 anEvent->recurrence()->setDaily(rFreq, rDuration); 1062 anEvent->recurrence()->setDaily(rFreq, rDuration);
1054 } 1063 }
1055 } 1064 }
1056 /********************************* WEEKLY ******************************/ 1065 /********************************* WEEKLY ******************************/
1057 else if (tmpStr.left(1) == "W") { 1066 else if (tmpStr.left(1) == "W") {
1058 int index = tmpStr.find(' '); 1067 int index = tmpStr.find(' ');
1059 int last = tmpStr.findRev(' ') + 1; 1068 int last = tmpStr.findRev(' ') + 1;
1060 int rFreq = tmpStr.mid(1, (index-1)).toInt(); 1069 int rFreq = tmpStr.mid(1, (index-1)).toInt();
1061 index += 1; // advance to beginning of stuff after freq 1070 index += 1; // advance to beginning of stuff after freq
1062 QBitArray qba(7); 1071 QBitArray qba(7);
1063 QString dayStr; 1072 QString dayStr;
1064 if( index == last ) { 1073 if( index == last ) {
1065 // e.g. W1 #0 1074 // e.g. W1 #0
1066 qba.setBit(anEvent->dtStart().date().dayOfWeek() - 1); 1075 qba.setBit(anEvent->dtStart().date().dayOfWeek() - 1);
1067 } 1076 }
1068 else { 1077 else {
1069 // e.g. W1 SU #0 1078 // e.g. W1 SU #0
1070 while (index < last) { 1079 while (index < last) {
1071 dayStr = tmpStr.mid(index, 3); 1080 dayStr = tmpStr.mid(index, 3);
1072 int dayNum = numFromDay(dayStr); 1081 int dayNum = numFromDay(dayStr);
1073 qba.setBit(dayNum); 1082 qba.setBit(dayNum);
1074 index += 3; // advance to next day, or possibly "#" 1083 index += 3; // advance to next day, or possibly "#"
1075 } 1084 }
1076 } 1085 }
1077 index = last; if (tmpStr.mid(index,1) == "#") index++; 1086 index = last; if (tmpStr.mid(index,1) == "#") index++;
1078 if (tmpStr.find('T', index) != -1) { 1087 if (tmpStr.find('T', index) != -1) {
1079 QDate rEndDate = (ISOToQDateTime(tmpStr.mid(index, tmpStr.length()-index))).date(); 1088 QDate rEndDate = (ISOToQDateTime(tmpStr.mid(index, tmpStr.length()-index))).date();
1080 anEvent->recurrence()->setWeekly(rFreq, qba, rEndDate); 1089 anEvent->recurrence()->setWeekly(rFreq, qba, rEndDate);
1081 } else { 1090 } else {
1082 int rDuration = tmpStr.mid(index, tmpStr.length()-index).toInt(); 1091 int rDuration = tmpStr.mid(index, tmpStr.length()-index).toInt();
1083 if (rDuration == 0) 1092 if (rDuration == 0)
1084 anEvent->recurrence()->setWeekly(rFreq, qba, -1); 1093 anEvent->recurrence()->setWeekly(rFreq, qba, -1);
1085 else 1094 else
1086 anEvent->recurrence()->setWeekly(rFreq, qba, rDuration); 1095 anEvent->recurrence()->setWeekly(rFreq, qba, rDuration);
1087 } 1096 }
1088 } 1097 }
1089 /**************************** MONTHLY-BY-POS ***************************/ 1098 /**************************** MONTHLY-BY-POS ***************************/
1090 else if (tmpStr.left(2) == "MP") { 1099 else if (tmpStr.left(2) == "MP") {
1091 int index = tmpStr.find(' '); 1100 int index = tmpStr.find(' ');
1092 int last = tmpStr.findRev(' ') + 1; 1101 int last = tmpStr.findRev(' ') + 1;
1093 int rFreq = tmpStr.mid(2, (index-1)).toInt(); 1102 int rFreq = tmpStr.mid(2, (index-1)).toInt();
1094 index += 1; // advance to beginning of stuff after freq 1103 index += 1; // advance to beginning of stuff after freq
1095 QBitArray qba(7); 1104 QBitArray qba(7);
1096 short tmpPos; 1105 short tmpPos;
1097 if( index == last ) { 1106 if( index == last ) {
1098 // e.g. MP1 #0 1107 // e.g. MP1 #0
1099 tmpPos = anEvent->dtStart().date().day()/7 + 1; 1108 tmpPos = anEvent->dtStart().date().day()/7 + 1;
1100 if( tmpPos == 5 ) 1109 if( tmpPos == 5 )
1101 tmpPos = -1; 1110 tmpPos = -1;
1102 qba.setBit(anEvent->dtStart().date().dayOfWeek() - 1); 1111 qba.setBit(anEvent->dtStart().date().dayOfWeek() - 1);
1103 anEvent->recurrence()->addMonthlyPos(tmpPos, qba); 1112 anEvent->recurrence()->addMonthlyPos(tmpPos, qba);
1104 } 1113 }
1105 else { 1114 else {
1106 // e.g. MP1 1+ SU #0 1115 // e.g. MP1 1+ SU #0
1107 while (index < last) { 1116 while (index < last) {
1108 tmpPos = tmpStr.mid(index,1).toShort(); 1117 tmpPos = tmpStr.mid(index,1).toShort();
1109 index += 1; 1118 index += 1;
1110 if (tmpStr.mid(index,1) == "-") 1119 if (tmpStr.mid(index,1) == "-")
1111 // convert tmpPos to negative 1120 // convert tmpPos to negative
1112 tmpPos = 0 - tmpPos; 1121 tmpPos = 0 - tmpPos;
1113 index += 2; // advance to day(s) 1122 index += 2; // advance to day(s)
1114 while (numFromDay(tmpStr.mid(index,3)) >= 0) { 1123 while (numFromDay(tmpStr.mid(index,3)) >= 0) {
1115 int dayNum = numFromDay(tmpStr.mid(index,3)); 1124 int dayNum = numFromDay(tmpStr.mid(index,3));
1116 qba.setBit(dayNum); 1125 qba.setBit(dayNum);
1117 index += 3; // advance to next day, or possibly pos or "#" 1126 index += 3; // advance to next day, or possibly pos or "#"
1118 } 1127 }
1119 anEvent->recurrence()->addMonthlyPos(tmpPos, qba); 1128 anEvent->recurrence()->addMonthlyPos(tmpPos, qba);
1120 qba.detach(); 1129 qba.detach();
1121 qba.fill(FALSE); // clear out 1130 qba.fill(FALSE); // clear out
1122 } // while != "#" 1131 } // while != "#"
1123 } 1132 }
1124 index = last; if (tmpStr.mid(index,1) == "#") index++; 1133 index = last; if (tmpStr.mid(index,1) == "#") index++;
1125 if (tmpStr.find('T', index) != -1) { 1134 if (tmpStr.find('T', index) != -1) {
1126 QDate rEndDate = (ISOToQDateTime(tmpStr.mid(index, tmpStr.length() - 1135 QDate rEndDate = (ISOToQDateTime(tmpStr.mid(index, tmpStr.length() -
1127 index))).date(); 1136 index))).date();
1128 anEvent->recurrence()->setMonthly(Recurrence::rMonthlyPos, rFreq, rEndDate); 1137 anEvent->recurrence()->setMonthly(Recurrence::rMonthlyPos, rFreq, rEndDate);
1129 } else { 1138 } else {
1130 int rDuration = tmpStr.mid(index, tmpStr.length()-index).toInt(); 1139 int rDuration = tmpStr.mid(index, tmpStr.length()-index).toInt();
1131 if (rDuration == 0) 1140 if (rDuration == 0)
1132 anEvent->recurrence()->setMonthly(Recurrence::rMonthlyPos, rFreq, -1); 1141 anEvent->recurrence()->setMonthly(Recurrence::rMonthlyPos, rFreq, -1);
1133 else 1142 else
1134 anEvent->recurrence()->setMonthly(Recurrence::rMonthlyPos, rFreq, rDuration); 1143 anEvent->recurrence()->setMonthly(Recurrence::rMonthlyPos, rFreq, rDuration);
1135 } 1144 }
1136 } 1145 }
1137 1146
1138 /**************************** MONTHLY-BY-DAY ***************************/ 1147 /**************************** MONTHLY-BY-DAY ***************************/
1139 else if (tmpStr.left(2) == "MD") { 1148 else if (tmpStr.left(2) == "MD") {
1140 int index = tmpStr.find(' '); 1149 int index = tmpStr.find(' ');
1141 int last = tmpStr.findRev(' ') + 1; 1150 int last = tmpStr.findRev(' ') + 1;
1142 int rFreq = tmpStr.mid(2, (index-1)).toInt(); 1151 int rFreq = tmpStr.mid(2, (index-1)).toInt();
1143 index += 1; 1152 index += 1;
1144 short tmpDay; 1153 short tmpDay;
1145 if( index == last ) { 1154 if( index == last ) {
1146 // e.g. MD1 #0 1155 // e.g. MD1 #0
1147 tmpDay = anEvent->dtStart().date().day(); 1156 tmpDay = anEvent->dtStart().date().day();
1148 anEvent->recurrence()->addMonthlyDay(tmpDay); 1157 anEvent->recurrence()->addMonthlyDay(tmpDay);
1149 } 1158 }
1150 else { 1159 else {
1151 // e.g. MD1 3 #0 1160 // e.g. MD1 3 #0
1152 while (index < last) { 1161 while (index < last) {
1153 int index2 = tmpStr.find(' ', index); 1162 int index2 = tmpStr.find(' ', index);
1154 tmpDay = tmpStr.mid(index, (index2-index)).toShort(); 1163 tmpDay = tmpStr.mid(index, (index2-index)).toShort();
1155 index = index2-1; 1164 index = index2-1;
1156 if (tmpStr.mid(index, 1) == "-") 1165 if (tmpStr.mid(index, 1) == "-")
1157 tmpDay = 0 - tmpDay; 1166 tmpDay = 0 - tmpDay;
1158 index += 2; // advance the index; 1167 index += 2; // advance the index;
1159 anEvent->recurrence()->addMonthlyDay(tmpDay); 1168 anEvent->recurrence()->addMonthlyDay(tmpDay);
1160 } // while != # 1169 } // while != #
1161 } 1170 }
1162 index = last; if (tmpStr.mid(index,1) == "#") index++; 1171 index = last; if (tmpStr.mid(index,1) == "#") index++;
1163 if (tmpStr.find('T', index) != -1) { 1172 if (tmpStr.find('T', index) != -1) {
1164 QDate rEndDate = (ISOToQDateTime(tmpStr.mid(index, tmpStr.length()-index))).date(); 1173 QDate rEndDate = (ISOToQDateTime(tmpStr.mid(index, tmpStr.length()-index))).date();
1165 anEvent->recurrence()->setMonthly(Recurrence::rMonthlyDay, rFreq, rEndDate); 1174 anEvent->recurrence()->setMonthly(Recurrence::rMonthlyDay, rFreq, rEndDate);
1166 } else { 1175 } else {
1167 int rDuration = tmpStr.mid(index, tmpStr.length()-index).toInt(); 1176 int rDuration = tmpStr.mid(index, tmpStr.length()-index).toInt();
1168 if (rDuration == 0) 1177 if (rDuration == 0)
1169 anEvent->recurrence()->setMonthly(Recurrence::rMonthlyDay, rFreq, -1); 1178 anEvent->recurrence()->setMonthly(Recurrence::rMonthlyDay, rFreq, -1);
1170 else 1179 else
1171 anEvent->recurrence()->setMonthly(Recurrence::rMonthlyDay, rFreq, rDuration); 1180 anEvent->recurrence()->setMonthly(Recurrence::rMonthlyDay, rFreq, rDuration);
1172 } 1181 }
1173 } 1182 }
1174 1183
1175 /*********************** YEARLY-BY-MONTH *******************************/ 1184 /*********************** YEARLY-BY-MONTH *******************************/
@@ -1469,252 +1478,270 @@ QDateTime VCalFormat::ISOToQDateTime(const QString & dtStr)
1469 QDate tmpDate; 1478 QDate tmpDate;
1470 QTime tmpTime; 1479 QTime tmpTime;
1471 QString tmpStr; 1480 QString tmpStr;
1472 int year, month, day, hour, minute, second; 1481 int year, month, day, hour, minute, second;
1473 1482
1474 tmpStr = dtStr; 1483 tmpStr = dtStr;
1475 year = tmpStr.left(4).toInt(); 1484 year = tmpStr.left(4).toInt();
1476 month = tmpStr.mid(4,2).toInt(); 1485 month = tmpStr.mid(4,2).toInt();
1477 day = tmpStr.mid(6,2).toInt(); 1486 day = tmpStr.mid(6,2).toInt();
1478 hour = tmpStr.mid(9,2).toInt(); 1487 hour = tmpStr.mid(9,2).toInt();
1479 minute = tmpStr.mid(11,2).toInt(); 1488 minute = tmpStr.mid(11,2).toInt();
1480 second = tmpStr.mid(13,2).toInt(); 1489 second = tmpStr.mid(13,2).toInt();
1481 tmpDate.setYMD(year, month, day); 1490 tmpDate.setYMD(year, month, day);
1482 tmpTime.setHMS(hour, minute, second); 1491 tmpTime.setHMS(hour, minute, second);
1483 1492
1484 ASSERT(tmpDate.isValid()); 1493 ASSERT(tmpDate.isValid());
1485 ASSERT(tmpTime.isValid()); 1494 ASSERT(tmpTime.isValid());
1486 QDateTime tmpDT(tmpDate, tmpTime); 1495 QDateTime tmpDT(tmpDate, tmpTime);
1487 // correct for GMT if string is in Zulu format 1496 // correct for GMT if string is in Zulu format
1488 if (dtStr.at(dtStr.length()-1) == 'Z') 1497 if (dtStr.at(dtStr.length()-1) == 'Z')
1489 tmpDT = tmpDT.addSecs (KGlobal::locale()->localTimeOffset( tmpDT )*60); 1498 tmpDT = tmpDT.addSecs (KGlobal::locale()->localTimeOffset( tmpDT )*60);
1490 return tmpDT; 1499 return tmpDT;
1491} 1500}
1492 1501
1493QDate VCalFormat::ISOToQDate(const QString &dateStr) 1502QDate VCalFormat::ISOToQDate(const QString &dateStr)
1494{ 1503{
1495 int year, month, day; 1504 int year, month, day;
1496 1505
1497 year = dateStr.left(4).toInt(); 1506 year = dateStr.left(4).toInt();
1498 month = dateStr.mid(4,2).toInt(); 1507 month = dateStr.mid(4,2).toInt();
1499 day = dateStr.mid(6,2).toInt(); 1508 day = dateStr.mid(6,2).toInt();
1500 1509
1501 return(QDate(year, month, day)); 1510 return(QDate(year, month, day));
1502} 1511}
1503 1512
1504// take a raw vcalendar (i.e. from a file on disk, clipboard, etc. etc. 1513// take a raw vcalendar (i.e. from a file on disk, clipboard, etc. etc.
1505// and break it down from it's tree-like format into the dictionary format 1514// and break it down from it's tree-like format into the dictionary format
1506// that is used internally in the VCalFormat. 1515// that is used internally in the VCalFormat.
1507void VCalFormat::populate(VObject *vcal) 1516void VCalFormat::populate(VObject *vcal)
1508{ 1517{
1509 // this function will populate the caldict dictionary and other event 1518 // this function will populate the caldict dictionary and other event
1510 // lists. It turns vevents into Events and then inserts them. 1519 // lists. It turns vevents into Events and then inserts them.
1511 1520
1512 VObjectIterator i; 1521 VObjectIterator i;
1513 VObject *curVO, *curVOProp; 1522 VObject *curVO, *curVOProp;
1514 Event *anEvent; 1523 Event *anEvent;
1515 1524
1516 if ((curVO = isAPropertyOf(vcal, ICMethodProp)) != 0) { 1525 if ((curVO = isAPropertyOf(vcal, ICMethodProp)) != 0) {
1517 char *methodType = 0; 1526 char *methodType = 0;
1518 methodType = fakeCString(vObjectUStringZValue(curVO)); 1527 methodType = fakeCString(vObjectUStringZValue(curVO));
1519 kdDebug() << "This calendar is an iTIP transaction of type '" 1528 kdDebug() << "This calendar is an iTIP transaction of type '"
1520 << methodType << "'" << endl; 1529 << methodType << "'" << endl;
1521 delete methodType; 1530 delete methodType;
1522 } 1531 }
1523 1532
1524 // warn the user that we might have trouble reading non-known calendar. 1533 // warn the user that we might have trouble reading non-known calendar.
1525 if ((curVO = isAPropertyOf(vcal, VCProdIdProp)) != 0) { 1534 if ((curVO = isAPropertyOf(vcal, VCProdIdProp)) != 0) {
1526 char *s = fakeCString(vObjectUStringZValue(curVO)); 1535 char *s = fakeCString(vObjectUStringZValue(curVO));
1527 if (strcmp(productId().local8Bit(), s) != 0) 1536 if (strcmp(productId().local8Bit(), s) != 0)
1528 kdDebug() << "This vCalendar file was not created by KOrganizer " 1537 kdDebug() << "This vCalendar file was not created by KOrganizer "
1529 "or any other product we support. Loading anyway..." << endl; 1538 "or any other product we support. Loading anyway..." << endl;
1530 mLoadedProductId = s; 1539 mLoadedProductId = s;
1531 deleteStr(s); 1540 deleteStr(s);
1532 } 1541 }
1533 1542
1534 // warn the user we might have trouble reading this unknown version. 1543 // warn the user we might have trouble reading this unknown version.
1535 if ((curVO = isAPropertyOf(vcal, VCVersionProp)) != 0) { 1544 if ((curVO = isAPropertyOf(vcal, VCVersionProp)) != 0) {
1536 char *s = fakeCString(vObjectUStringZValue(curVO)); 1545 char *s = fakeCString(vObjectUStringZValue(curVO));
1537 if (strcmp(_VCAL_VERSION, s) != 0) 1546 if (strcmp(_VCAL_VERSION, s) != 0)
1538 kdDebug() << "This vCalendar file has version " << s 1547 kdDebug() << "This vCalendar file has version " << s
1539 << "We only support " << _VCAL_VERSION << endl; 1548 << "We only support " << _VCAL_VERSION << endl;
1540 deleteStr(s); 1549 deleteStr(s);
1541 } 1550 }
1542 1551
1543 // set the time zone 1552 // set the time zone
1544 if ((curVO = isAPropertyOf(vcal, VCTimeZoneProp)) != 0) { 1553 if ((curVO = isAPropertyOf(vcal, VCTimeZoneProp)) != 0) {
1545 if ( vObjectUStringZValue(curVO) != 0 ) { 1554 if ( vObjectUStringZValue(curVO) != 0 ) {
1546 char *s = fakeCString(vObjectUStringZValue(curVO)); 1555 char *s = fakeCString(vObjectUStringZValue(curVO));
1547 mCalendar->setTimeZone(s); 1556 mCalendar->setTimeZone(s);
1548 deleteStr(s); 1557 deleteStr(s);
1549 } 1558 }
1550 } 1559 }
1551 1560
1552 // Store all events with a relatedTo property in a list for post-processing 1561 // Store all events with a relatedTo property in a list for post-processing
1553 mEventsRelate.clear(); 1562 mEventsRelate.clear();
1554 mTodosRelate.clear(); 1563 mTodosRelate.clear();
1555 1564
1556 initPropIterator(&i, vcal); 1565 initPropIterator(&i, vcal);
1557 1566
1558 // go through all the vobjects in the vcal 1567 // go through all the vobjects in the vcal
1559 while (moreIteration(&i)) { 1568 while (moreIteration(&i)) {
1560 curVO = nextVObject(&i); 1569 curVO = nextVObject(&i);
1561 1570
1562 /************************************************************************/ 1571 /************************************************************************/
1563 1572
1564 // now, check to see that the object is an event or todo. 1573 // now, check to see that the object is an event or todo.
1565 if (strcmp(vObjectName(curVO), VCEventProp) == 0) { 1574 if (strcmp(vObjectName(curVO), VCEventProp) == 0) {
1566 1575
1567 if ((curVOProp = isAPropertyOf(curVO, XPilotStatusProp)) != 0) { 1576 if ((curVOProp = isAPropertyOf(curVO, XPilotStatusProp)) != 0) {
1568 char *s; 1577 char *s;
1569 s = fakeCString(vObjectUStringZValue(curVOProp)); 1578 s = fakeCString(vObjectUStringZValue(curVOProp));
1570 // check to see if event was deleted by the kpilot conduit 1579 // check to see if event was deleted by the kpilot conduit
1571 if (atoi(s) == Event::SYNCDEL) { 1580 if (atoi(s) == Event::SYNCDEL) {
1572 deleteStr(s); 1581 deleteStr(s);
1573 kdDebug(5800) << "skipping pilot-deleted event" << endl; 1582 kdDebug(5800) << "skipping pilot-deleted event" << endl;
1574 goto SKIP; 1583 goto SKIP;
1575 } 1584 }
1576 deleteStr(s); 1585 deleteStr(s);
1577 } 1586 }
1578 1587
1579 // this code checks to see if we are trying to read in an event 1588 // this code checks to see if we are trying to read in an event
1580 // that we already find to be in the calendar. If we find this 1589 // that we already find to be in the calendar. If we find this
1581 // to be the case, we skip the event. 1590 // to be the case, we skip the event.
1582 if ((curVOProp = isAPropertyOf(curVO, VCUniqueStringProp)) != 0) { 1591 if ((curVOProp = isAPropertyOf(curVO, VCUniqueStringProp)) != 0) {
1583 char *s = fakeCString(vObjectUStringZValue(curVOProp)); 1592 char *s = fakeCString(vObjectUStringZValue(curVOProp));
1584 QString tmpStr(s); 1593 QString tmpStr(s);
1585 deleteStr(s); 1594 deleteStr(s);
1586 1595
1587 if (mCalendar->event(tmpStr)) { 1596 if (mCalendar->event(tmpStr)) {
1588 goto SKIP; 1597 goto SKIP;
1589 } 1598 }
1590 if (mCalendar->todo(tmpStr)) { 1599 if (mCalendar->todo(tmpStr)) {
1591 goto SKIP; 1600 goto SKIP;
1592 } 1601 }
1593 } 1602 }
1594 1603
1595 if ((!(curVOProp = isAPropertyOf(curVO, VCDTstartProp))) && 1604 if ((!(curVOProp = isAPropertyOf(curVO, VCDTstartProp))) &&
1596 (!(curVOProp = isAPropertyOf(curVO, VCDTendProp)))) { 1605 (!(curVOProp = isAPropertyOf(curVO, VCDTendProp)))) {
1597 kdDebug(5800) << "found a VEvent with no DTSTART and no DTEND! Skipping..." << endl; 1606 kdDebug(5800) << "found a VEvent with no DTSTART and no DTEND! Skipping..." << endl;
1598 goto SKIP; 1607 goto SKIP;
1599 } 1608 }
1600 1609
1601 anEvent = VEventToEvent(curVO); 1610 anEvent = VEventToEvent(curVO);
1602 // we now use addEvent instead of insertEvent so that the 1611 // we now use addEvent instead of insertEvent so that the
1603 // signal/slot get connected. 1612 // signal/slot get connected.
1604 if (anEvent) { 1613 if (anEvent) {
1605 if ( !anEvent->dtStart().isValid() || !anEvent->dtEnd().isValid() ) { 1614 if ( !anEvent->dtStart().isValid() || !anEvent->dtEnd().isValid() ) {
1606 kdDebug() << "VCalFormat::populate(): Event has invalid dates." 1615 kdDebug() << "VCalFormat::populate(): Event has invalid dates."
1607 << endl; 1616 << endl;
1608 } else { 1617 } else {
1609 mCalendar->addEvent(anEvent); 1618 mCalendar->addEvent(anEvent);
1610 } 1619 }
1611 } else { 1620 } else {
1612 // some sort of error must have occurred while in translation. 1621 // some sort of error must have occurred while in translation.
1613 goto SKIP; 1622 goto SKIP;
1614 } 1623 }
1615 } else if (strcmp(vObjectName(curVO), VCTodoProp) == 0) { 1624 } else if (strcmp(vObjectName(curVO), VCTodoProp) == 0) {
1616 Todo *aTodo = VTodoToEvent(curVO); 1625 Todo *aTodo = VTodoToEvent(curVO);
1617 mCalendar->addTodo(aTodo); 1626 mCalendar->addTodo(aTodo);
1618 } else if ((strcmp(vObjectName(curVO), VCVersionProp) == 0) || 1627 } else if ((strcmp(vObjectName(curVO), VCVersionProp) == 0) ||
1619 (strcmp(vObjectName(curVO), VCProdIdProp) == 0) || 1628 (strcmp(vObjectName(curVO), VCProdIdProp) == 0) ||
1620 (strcmp(vObjectName(curVO), VCTimeZoneProp) == 0)) { 1629 (strcmp(vObjectName(curVO), VCTimeZoneProp) == 0)) {
1621 // do nothing, we know these properties and we want to skip them. 1630 // do nothing, we know these properties and we want to skip them.
1622 // we have either already processed them or are ignoring them. 1631 // we have either already processed them or are ignoring them.
1623 ; 1632 ;
1624 } else { 1633 } else {
1625 kdDebug(5800) << "Ignoring unknown vObject \"" << vObjectName(curVO) << "\"" << endl; 1634 kdDebug(5800) << "Ignoring unknown vObject \"" << vObjectName(curVO) << "\"" << endl;
1626 } 1635 }
1627 SKIP: 1636 SKIP:
1628 ; 1637 ;
1629 } // while 1638 } // while
1630 1639
1631 // Post-Process list of events with relations, put Event objects in relation 1640 // Post-Process list of events with relations, put Event objects in relation
1632 Event *ev; 1641 Event *ev;
1633 for ( ev=mEventsRelate.first(); ev != 0; ev=mEventsRelate.next() ) { 1642 for ( ev=mEventsRelate.first(); ev != 0; ev=mEventsRelate.next() ) {
1634 ev->setRelatedTo(mCalendar->event(ev->relatedToUid())); 1643 ev->setRelatedTo(mCalendar->event(ev->relatedToUid()));
1635 } 1644 }
1636 Todo *todo; 1645 Todo *todo;
1637 for ( todo=mTodosRelate.first(); todo != 0; todo=mTodosRelate.next() ) { 1646 for ( todo=mTodosRelate.first(); todo != 0; todo=mTodosRelate.next() ) {
1638 todo->setRelatedTo(mCalendar->todo(todo->relatedToUid())); 1647 todo->setRelatedTo(mCalendar->todo(todo->relatedToUid()));
1639 } 1648 }
1640} 1649}
1641 1650
1642const char *VCalFormat::dayFromNum(int day) 1651const char *VCalFormat::dayFromNum(int day)
1643{ 1652{
1644 const char *days[7] = { "MO ", "TU ", "WE ", "TH ", "FR ", "SA ", "SU " }; 1653 const char *days[7] = { "MO ", "TU ", "WE ", "TH ", "FR ", "SA ", "SU " };
1645 1654
1646 return days[day]; 1655 return days[day];
1647} 1656}
1648 1657
1649int VCalFormat::numFromDay(const QString &day) 1658int VCalFormat::numFromDay(const QString &day)
1650{ 1659{
1651 if (day == "MO ") return 0; 1660 if (day == "MO ") return 0;
1652 if (day == "TU ") return 1; 1661 if (day == "TU ") return 1;
1653 if (day == "WE ") return 2; 1662 if (day == "WE ") return 2;
1654 if (day == "TH ") return 3; 1663 if (day == "TH ") return 3;
1655 if (day == "FR ") return 4; 1664 if (day == "FR ") return 4;
1656 if (day == "SA ") return 5; 1665 if (day == "SA ") return 5;
1657 if (day == "SU ") return 6; 1666 if (day == "SU ") return 6;
1658 1667
1659 return -1; // something bad happened. :) 1668 return -1; // something bad happened. :)
1660} 1669}
1670Attendee::Role VCalFormat::readRole(const char *s) const
1671{
1672 QString statStr = s;
1673 statStr = statStr.upper();
1674 Attendee::Role role = Attendee::ReqParticipant;
1675
1676 if ( statStr == "OWNER")
1677 role = Attendee::Chair;
1678 // enum Role { ReqParticipant, OptParticipant, NonParticipant, Chair };
1679
1680 return role;
1681}
1661 1682
1683QCString VCalFormat::writeRole(Attendee::Role role) const
1684{
1685 if ( role == Attendee::Chair )
1686 return "OWNER";
1687 return "ATTENDEE";
1688}
1662Attendee::PartStat VCalFormat::readStatus(const char *s) const 1689Attendee::PartStat VCalFormat::readStatus(const char *s) const
1663{ 1690{
1664 QString statStr = s; 1691 QString statStr = s;
1665 statStr = statStr.upper(); 1692 statStr = statStr.upper();
1666 Attendee::PartStat status; 1693 Attendee::PartStat status;
1667 1694
1668 if (statStr == "X-ACTION") 1695 if (statStr == "X-ACTION")
1669 status = Attendee::NeedsAction; 1696 status = Attendee::NeedsAction;
1670 else if (statStr == "NEEDS ACTION") 1697 else if (statStr == "NEEDS ACTION")
1671 status = Attendee::NeedsAction; 1698 status = Attendee::NeedsAction;
1672 else if (statStr== "ACCEPTED") 1699 else if (statStr== "ACCEPTED")
1673 status = Attendee::Accepted; 1700 status = Attendee::Accepted;
1674 else if (statStr== "SENT") 1701 else if (statStr== "SENT")
1675 status = Attendee::NeedsAction; 1702 status = Attendee::NeedsAction;
1676 else if (statStr== "TENTATIVE") 1703 else if (statStr== "TENTATIVE")
1677 status = Attendee::Tentative; 1704 status = Attendee::Tentative;
1678 else if (statStr== "CONFIRMED") 1705 else if (statStr== "CONFIRMED")
1679 status = Attendee::Accepted; 1706 status = Attendee::Accepted;
1680 else if (statStr== "DECLINED") 1707 else if (statStr== "DECLINED")
1681 status = Attendee::Declined; 1708 status = Attendee::Declined;
1682 else if (statStr== "COMPLETED") 1709 else if (statStr== "COMPLETED")
1683 status = Attendee::Completed; 1710 status = Attendee::Completed;
1684 else if (statStr== "DELEGATED") 1711 else if (statStr== "DELEGATED")
1685 status = Attendee::Delegated; 1712 status = Attendee::Delegated;
1686 else { 1713 else {
1687 kdDebug(5800) << "error setting attendee mStatus, unknown mStatus!" << endl; 1714 kdDebug(5800) << "error setting attendee mStatus, unknown mStatus!" << endl;
1688 status = Attendee::NeedsAction; 1715 status = Attendee::NeedsAction;
1689 } 1716 }
1690 1717
1691 return status; 1718 return status;
1692} 1719}
1693 1720
1694QCString VCalFormat::writeStatus(Attendee::PartStat status) const 1721QCString VCalFormat::writeStatus(Attendee::PartStat status) const
1695{ 1722{
1696 switch(status) { 1723 switch(status) {
1697 default: 1724 default:
1698 case Attendee::NeedsAction: 1725 case Attendee::NeedsAction:
1699 return "NEEDS ACTION"; 1726 return "NEEDS ACTION";
1700 break; 1727 break;
1701 case Attendee::Accepted: 1728 case Attendee::Accepted:
1702 return "ACCEPTED"; 1729 return "ACCEPTED";
1703 break; 1730 break;
1704 case Attendee::Declined: 1731 case Attendee::Declined:
1705 return "DECLINED"; 1732 return "DECLINED";
1706 break; 1733 break;
1707 case Attendee::Tentative: 1734 case Attendee::Tentative:
1708 return "TENTATIVE"; 1735 return "TENTATIVE";
1709 break; 1736 break;
1710 case Attendee::Delegated: 1737 case Attendee::Delegated:
1711 return "DELEGATED"; 1738 return "DELEGATED";
1712 break; 1739 break;
1713 case Attendee::Completed: 1740 case Attendee::Completed:
1714 return "COMPLETED"; 1741 return "COMPLETED";
1715 break; 1742 break;
1716 case Attendee::InProcess: 1743 case Attendee::InProcess:
1717 return "NEEDS ACTION"; 1744 return "NEEDS ACTION";
1718 break; 1745 break;
1719 } 1746 }
1720} 1747}
diff --git a/libkcal/vcalformat.h b/libkcal/vcalformat.h
index 5bef7ed..c7df017 100644
--- a/libkcal/vcalformat.h
+++ b/libkcal/vcalformat.h
@@ -1,112 +1,113 @@
1/* 1/*
2 This file is part of libkcal. 2 This file is part of libkcal.
3 Copyright (c) 1998 Preston Brown 3 Copyright (c) 1998 Preston Brown
4 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org> 4 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org>
5 5
6 This library is free software; you can redistribute it and/or 6 This library is free software; you can redistribute it and/or
7 modify it under the terms of the GNU Library General Public 7 modify it under the terms of the GNU Library General Public
8 License as published by the Free Software Foundation; either 8 License as published by the Free Software Foundation; either
9 version 2 of the License, or (at your option) any later version. 9 version 2 of the License, or (at your option) any later version.
10 10
11 This library is distributed in the hope that it will be useful, 11 This library is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 Library General Public License for more details. 14 Library General Public License for more details.
15 15
16 You should have received a copy of the GNU Library General Public License 16 You should have received a copy of the GNU Library General Public License
17 along with this library; see the file COPYING.LIB. If not, write to 17 along with this library; see the file COPYING.LIB. If not, write to
18 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 18 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA. 19 Boston, MA 02111-1307, USA.
20*/ 20*/
21 21
22#ifndef _VCALFORMAT_H 22#ifndef _VCALFORMAT_H
23#define _VCALFORMAT_H 23#define _VCALFORMAT_H
24 24
25#include "calformat.h" 25#include "calformat.h"
26 26
27#define _VCAL_VERSION "1.0" 27#define _VCAL_VERSION "1.0"
28 28
29class VObject; 29class VObject;
30 30
31namespace KCal { 31namespace KCal {
32 32
33/** 33/**
34 This class implements the vCalendar format. It provides methods for 34 This class implements the vCalendar format. It provides methods for
35 loading/saving/converting vCalendar format data into the internal KOrganizer 35 loading/saving/converting vCalendar format data into the internal KOrganizer
36 representation as Calendar and Events. 36 representation as Calendar and Events.
37 37
38 @short vCalendar format implementation 38 @short vCalendar format implementation
39*/ 39*/
40class VCalFormat : public CalFormat { 40class VCalFormat : public CalFormat {
41 public: 41 public:
42 VCalFormat(); 42 VCalFormat();
43 virtual ~VCalFormat(); 43 virtual ~VCalFormat();
44 44
45 /** loads a calendar on disk in vCalendar format into the current calendar. 45 /** loads a calendar on disk in vCalendar format into the current calendar.
46 * any information already present is lost. Returns TRUE if successful, 46 * any information already present is lost. Returns TRUE if successful,
47 * else returns FALSE. 47 * else returns FALSE.
48 * @param fileName the name of the calendar on disk. 48 * @param fileName the name of the calendar on disk.
49 */ 49 */
50 bool load(Calendar *,const QString &fileName ); 50 bool load(Calendar *,const QString &fileName );
51 /** writes out the calendar to disk in vCalendar format. Returns true if 51 /** writes out the calendar to disk in vCalendar format. Returns true if
52 * successful and false on error. 52 * successful and false on error.
53 * @param fileName the name of the file 53 * @param fileName the name of the file
54 */ 54 */
55 bool save(Calendar *,const QString &fileName ); 55 bool save(Calendar *,const QString &fileName );
56 56
57 /** 57 /**
58 Parse string and populate calendar with that information. 58 Parse string and populate calendar with that information.
59 */ 59 */
60 bool fromString( Calendar *, const QString & ); 60 bool fromString( Calendar *, const QString & );
61 /** 61 /**
62 Return calendar information as string. 62 Return calendar information as string.
63 */ 63 */
64 void setLocalTime ( bool ); 64 void setLocalTime ( bool );
65 QString toString( Calendar * ); 65 QString toString( Calendar * );
66 QString eventToString( Event *, Calendar *calendar, bool useLocalTime = true ); 66 QString eventToString( Event *, Calendar *calendar, bool useLocalTime = true );
67 QString todoToString( Todo * ,Calendar *calendar, bool useLocalTime = true ); 67 QString todoToString( Todo * ,Calendar *calendar, bool useLocalTime = true );
68 68
69 protected: 69 protected:
70 /** translates a VObject of the TODO type into a Event */ 70 /** translates a VObject of the TODO type into a Event */
71 Todo *VTodoToEvent(VObject *vtodo); 71 Todo *VTodoToEvent(VObject *vtodo);
72 /** translates a VObject into a Event and returns a pointer to it. */ 72 /** translates a VObject into a Event and returns a pointer to it. */
73 Event *VEventToEvent(VObject *vevent); 73 Event *VEventToEvent(VObject *vevent);
74 /** translate a Event into a VTodo-type VObject and return pointer */ 74 /** translate a Event into a VTodo-type VObject and return pointer */
75 VObject *eventToVTodo(const Todo *anEvent); 75 VObject *eventToVTodo(const Todo *anEvent);
76 /** translate a Event into a VObject and returns a pointer to it. */ 76 /** translate a Event into a VObject and returns a pointer to it. */
77 VObject* eventToVEvent(const Event *anEvent); 77 VObject* eventToVEvent(const Event *anEvent);
78 78
79 /** takes a QDate and returns a string in the format YYYYMMDDTHHMMSS */ 79 /** takes a QDate and returns a string in the format YYYYMMDDTHHMMSS */
80 QString qDateToISO(const QDate &); 80 QString qDateToISO(const QDate &);
81 /** takes a QDateTime and returns a string in format YYYYMMDDTHHMMSS */ 81 /** takes a QDateTime and returns a string in format YYYYMMDDTHHMMSS */
82 QString qDateTimeToISO(const QDateTime &, bool zulu=TRUE); 82 QString qDateTimeToISO(const QDateTime &, bool zulu=TRUE);
83 /** takes a string in the format YYYYMMDDTHHMMSS and returns a 83 /** takes a string in the format YYYYMMDDTHHMMSS and returns a
84 * valid QDateTime. */ 84 * valid QDateTime. */
85 QDateTime ISOToQDateTime(const QString & dtStr); 85 QDateTime ISOToQDateTime(const QString & dtStr);
86 /** takes a string in the format YYYYMMDD and returns a 86 /** takes a string in the format YYYYMMDD and returns a
87 * valid QDate. */ 87 * valid QDate. */
88 QDate ISOToQDate(const QString & dtStr); 88 QDate ISOToQDate(const QString & dtStr);
89 /** takes a vCalendar tree of VObjects, and puts all of them that have 89 /** takes a vCalendar tree of VObjects, and puts all of them that have
90 * the "event" property into the dictionary, todos in the todo-list, etc. */ 90 * the "event" property into the dictionary, todos in the todo-list, etc. */
91 void populate(VObject *vcal); 91 void populate(VObject *vcal);
92 92
93 /** takes a number 0 - 6 and returns the two letter string of that day, 93 /** takes a number 0 - 6 and returns the two letter string of that day,
94 * i.e. MO, TU, WE, etc. */ 94 * i.e. MO, TU, WE, etc. */
95 const char *dayFromNum(int day); 95 const char *dayFromNum(int day);
96 /** the reverse of the above function. */ 96 /** the reverse of the above function. */
97 int numFromDay(const QString &day); 97 int numFromDay(const QString &day);
98 98 Attendee::Role VCalFormat::readRole(const char *s) const;
99 QCString writeRole(Attendee::Role role) const;
99 Attendee::PartStat readStatus(const char *s) const; 100 Attendee::PartStat readStatus(const char *s) const;
100 QCString writeStatus(Attendee::PartStat status) const; 101 QCString writeStatus(Attendee::PartStat status) const;
101 102
102 private: 103 private:
103 Calendar *mCalendar; 104 Calendar *mCalendar;
104 bool useLocalTime; 105 bool useLocalTime;
105 106
106 QPtrList<Event> mEventsRelate; // events with relations 107 QPtrList<Event> mEventsRelate; // events with relations
107 QPtrList<Todo> mTodosRelate; // todos with relations 108 QPtrList<Todo> mTodosRelate; // todos with relations
108}; 109};
109 110
110} 111}
111 112
112#endif 113#endif
diff --git a/libkcal/versit/vcc.c b/libkcal/versit/vcc.c
index 9be752d..5413813 100644
--- a/libkcal/versit/vcc.c
+++ b/libkcal/versit/vcc.c
@@ -1573,385 +1573,386 @@ static void enterAttr(const char *s1, const char *s2)
1573 { 1573 {
1574 const char *p1, *p2; 1574 const char *p1, *p2;
1575 p1 = lookupProp_(s1); 1575 p1 = lookupProp_(s1);
1576 if (s2) { 1576 if (s2) {
1577 VObject *a; 1577 VObject *a;
1578 p2 = lookupProp_(s2); 1578 p2 = lookupProp_(s2);
1579 a = addProp(curProp,p1); 1579 a = addProp(curProp,p1);
1580 setVObjectStringZValue(a,p2); 1580 setVObjectStringZValue(a,p2);
1581 } 1581 }
1582 else 1582 else
1583 addProp(curProp,p1); 1583 addProp(curProp,p1);
1584 if (stricmp(p1,VCBase64Prop) == 0 || (s2 && stricmp(p2,VCBase64Prop)==0)) 1584 if (stricmp(p1,VCBase64Prop) == 0 || (s2 && stricmp(p2,VCBase64Prop)==0))
1585 lexPushMode(L_BASE64); 1585 lexPushMode(L_BASE64);
1586 else if (stricmp(p1,VCQuotedPrintableProp) == 0 1586 else if (stricmp(p1,VCQuotedPrintableProp) == 0
1587 || (s2 && stricmp(p2,VCQuotedPrintableProp)==0)) 1587 || (s2 && stricmp(p2,VCQuotedPrintableProp)==0))
1588 lexPushMode(L_QUOTED_PRINTABLE); 1588 lexPushMode(L_QUOTED_PRINTABLE);
1589 deleteStr(s1); deleteStr(s2); 1589 deleteStr(s1); deleteStr(s2);
1590 } 1590 }
1591 1591
1592 1592
1593#define MAX_LEX_LOOKAHEAD_0 32 1593#define MAX_LEX_LOOKAHEAD_0 32
1594#define MAX_LEX_LOOKAHEAD 64 1594#define MAX_LEX_LOOKAHEAD 64
1595#define MAX_LEX_MODE_STACK_SIZE 10 1595#define MAX_LEX_MODE_STACK_SIZE 10
1596#define LEXMODE() (lexBuf.lexModeStack[lexBuf.lexModeStackTop]) 1596#define LEXMODE() (lexBuf.lexModeStack[lexBuf.lexModeStackTop])
1597 1597
1598struct LexBuf { 1598struct LexBuf {
1599 /* input */ 1599 /* input */
1600#ifdef INCLUDEMFC 1600#ifdef INCLUDEMFC
1601 CFile *inputFile; 1601 CFile *inputFile;
1602#else 1602#else
1603 FILE *inputFile; 1603 FILE *inputFile;
1604#endif 1604#endif
1605 char *inputString; 1605 char *inputString;
1606 unsigned long curPos; 1606 unsigned long curPos;
1607 unsigned long inputLen; 1607 unsigned long inputLen;
1608 /* lookahead buffer */ 1608 /* lookahead buffer */
1609 /* -- lookahead buffer is short instead of char so that EOF 1609 /* -- lookahead buffer is short instead of char so that EOF
1610 / can be represented correctly. 1610 / can be represented correctly.
1611 */ 1611 */
1612 unsigned long len; 1612 unsigned long len;
1613 short buf[MAX_LEX_LOOKAHEAD]; 1613 short buf[MAX_LEX_LOOKAHEAD];
1614 unsigned long getPtr; 1614 unsigned long getPtr;
1615 /* context stack */ 1615 /* context stack */
1616 unsigned long lexModeStackTop; 1616 unsigned long lexModeStackTop;
1617 enum LexMode lexModeStack[MAX_LEX_MODE_STACK_SIZE]; 1617 enum LexMode lexModeStack[MAX_LEX_MODE_STACK_SIZE];
1618 /* token buffer */ 1618 /* token buffer */
1619 unsigned long maxToken; 1619 unsigned long maxToken;
1620 char *strs; 1620 char *strs;
1621 unsigned long strsLen; 1621 unsigned long strsLen;
1622 } lexBuf; 1622 } lexBuf;
1623 1623
1624static void lexPushMode(enum LexMode mode) 1624static void lexPushMode(enum LexMode mode)
1625 { 1625 {
1626 if (lexBuf.lexModeStackTop == (MAX_LEX_MODE_STACK_SIZE-1)) 1626 if (lexBuf.lexModeStackTop == (MAX_LEX_MODE_STACK_SIZE-1))
1627 yyerror("lexical context stack overflow"); 1627 yyerror("lexical context stack overflow");
1628 else { 1628 else {
1629 lexBuf.lexModeStack[++lexBuf.lexModeStackTop] = mode; 1629 lexBuf.lexModeStack[++lexBuf.lexModeStackTop] = mode;
1630 } 1630 }
1631 } 1631 }
1632 1632
1633static void lexPopMode(int top) 1633static void lexPopMode(int top)
1634 { 1634 {
1635 /* special case of pop for ease of error recovery -- this 1635 /* special case of pop for ease of error recovery -- this
1636 version will never underflow */ 1636 version will never underflow */
1637 if (top) 1637 if (top)
1638 lexBuf.lexModeStackTop = 0; 1638 lexBuf.lexModeStackTop = 0;
1639 else 1639 else
1640 if (lexBuf.lexModeStackTop > 0) lexBuf.lexModeStackTop--; 1640 if (lexBuf.lexModeStackTop > 0) lexBuf.lexModeStackTop--;
1641 } 1641 }
1642 1642
1643static int lexWithinMode(enum LexMode mode) { 1643static int lexWithinMode(enum LexMode mode) {
1644 unsigned long i; 1644 unsigned long i;
1645 for (i=0;i<lexBuf.lexModeStackTop;i++) 1645 for (i=0;i<lexBuf.lexModeStackTop;i++)
1646 if (mode == lexBuf.lexModeStack[i]) return 1; 1646 if (mode == lexBuf.lexModeStack[i]) return 1;
1647 return 0; 1647 return 0;
1648 } 1648 }
1649 1649
1650static char lexGetc_() 1650static char lexGetc_()
1651 { 1651 {
1652 /* get next char from input, no buffering. */ 1652 /* get next char from input, no buffering. */
1653 if (lexBuf.curPos == lexBuf.inputLen) 1653 if (lexBuf.curPos == lexBuf.inputLen)
1654 return EOF; 1654 return EOF;
1655 else if (lexBuf.inputString) 1655 else if (lexBuf.inputString)
1656 return *(lexBuf.inputString + lexBuf.curPos++); 1656 return *(lexBuf.inputString + lexBuf.curPos++);
1657 else { 1657 else {
1658#ifdef INCLUDEMFC 1658#ifdef INCLUDEMFC
1659 char result; 1659 char result;
1660 return lexBuf.inputFile->Read(&result, 1) == 1 ? result : EOF; 1660 return lexBuf.inputFile->Read(&result, 1) == 1 ? result : EOF;
1661#else 1661#else
1662 return fgetc(lexBuf.inputFile); 1662 return fgetc(lexBuf.inputFile);
1663#endif 1663#endif
1664 } 1664 }
1665 } 1665 }
1666 1666
1667static int lexGeta() 1667static int lexGeta()
1668 { 1668 {
1669 ++lexBuf.len; 1669 ++lexBuf.len;
1670 return (lexBuf.buf[lexBuf.getPtr] = lexGetc_()); 1670 return (lexBuf.buf[lexBuf.getPtr] = lexGetc_());
1671 } 1671 }
1672 1672
1673static int lexGeta_(int i) 1673static int lexGeta_(int i)
1674 { 1674 {
1675 ++lexBuf.len; 1675 ++lexBuf.len;
1676 return (lexBuf.buf[(lexBuf.getPtr+i)%MAX_LEX_LOOKAHEAD] = lexGetc_()); 1676 return (lexBuf.buf[(lexBuf.getPtr+i)%MAX_LEX_LOOKAHEAD] = lexGetc_());
1677 } 1677 }
1678 1678
1679static void lexSkipLookahead() { 1679static void lexSkipLookahead() {
1680 if (lexBuf.len > 0 && lexBuf.buf[lexBuf.getPtr]!=EOF) { 1680 if (lexBuf.len > 0 && lexBuf.buf[lexBuf.getPtr]!=EOF) {
1681 /* don't skip EOF. */ 1681 /* don't skip EOF. */
1682 lexBuf.getPtr = (lexBuf.getPtr + 1) % MAX_LEX_LOOKAHEAD; 1682 lexBuf.getPtr = (lexBuf.getPtr + 1) % MAX_LEX_LOOKAHEAD;
1683 lexBuf.len--; 1683 lexBuf.len--;
1684 } 1684 }
1685 } 1685 }
1686 1686
1687static int lexLookahead() { 1687static int lexLookahead() {
1688 int c = (lexBuf.len)? 1688 int c = (lexBuf.len)?
1689 lexBuf.buf[lexBuf.getPtr]: 1689 lexBuf.buf[lexBuf.getPtr]:
1690 lexGeta(); 1690 lexGeta();
1691 /* do the \r\n -> \n or \r -> \n translation here */ 1691 /* do the \r\n -> \n or \r -> \n translation here */
1692 if (c == '\r') { 1692 if (c == '\r') {
1693 int a = (lexBuf.len>1)? 1693 int a = (lexBuf.len>1)?
1694 lexBuf.buf[(lexBuf.getPtr+1)%MAX_LEX_LOOKAHEAD]: 1694 lexBuf.buf[(lexBuf.getPtr+1)%MAX_LEX_LOOKAHEAD]:
1695 lexGeta_(1); 1695 lexGeta_(1);
1696 if (a == '\n') { 1696 if (a == '\n') {
1697 lexSkipLookahead(); 1697 lexSkipLookahead();
1698 } 1698 }
1699 lexBuf.buf[lexBuf.getPtr] = c = '\n'; 1699 lexBuf.buf[lexBuf.getPtr] = c = '\n';
1700 } 1700 }
1701 else if (c == '\n') { 1701 else if (c == '\n') {
1702 int a = (lexBuf.len>1)? 1702 int a = (lexBuf.len>1)?
1703 lexBuf.buf[lexBuf.getPtr+1]: 1703 lexBuf.buf[lexBuf.getPtr+1]:
1704 lexGeta_(1); 1704 lexGeta_(1);
1705 if (a == '\r') { 1705 if (a == '\r') {
1706 lexSkipLookahead(); 1706 lexSkipLookahead();
1707 } 1707 }
1708 lexBuf.buf[lexBuf.getPtr] = '\n'; 1708 lexBuf.buf[lexBuf.getPtr] = '\n';
1709 } 1709 }
1710 return c; 1710 return c;
1711 } 1711 }
1712 1712
1713static int lexGetc() { 1713static int lexGetc() {
1714 int c = lexLookahead(); 1714 int c = lexLookahead();
1715 if (lexBuf.len > 0 && lexBuf.buf[lexBuf.getPtr]!=EOF) { 1715 if (lexBuf.len > 0 && lexBuf.buf[lexBuf.getPtr]!=EOF) {
1716 /* EOF will remain in lookahead buffer */ 1716 /* EOF will remain in lookahead buffer */
1717 lexBuf.getPtr = (lexBuf.getPtr + 1) % MAX_LEX_LOOKAHEAD; 1717 lexBuf.getPtr = (lexBuf.getPtr + 1) % MAX_LEX_LOOKAHEAD;
1718 lexBuf.len--; 1718 lexBuf.len--;
1719 } 1719 }
1720 return c; 1720 return c;
1721 } 1721 }
1722 1722
1723static void lexSkipLookaheadWord() { 1723static void lexSkipLookaheadWord() {
1724 if (lexBuf.strsLen <= lexBuf.len) { 1724 if (lexBuf.strsLen <= lexBuf.len) {
1725 lexBuf.len -= lexBuf.strsLen; 1725 lexBuf.len -= lexBuf.strsLen;
1726 lexBuf.getPtr = (lexBuf.getPtr + lexBuf.strsLen) % MAX_LEX_LOOKAHEAD; 1726 lexBuf.getPtr = (lexBuf.getPtr + lexBuf.strsLen) % MAX_LEX_LOOKAHEAD;
1727 } 1727 }
1728 } 1728 }
1729 1729
1730static void lexClearToken() 1730static void lexClearToken()
1731 { 1731 {
1732 lexBuf.strsLen = 0; 1732 lexBuf.strsLen = 0;
1733 } 1733 }
1734 1734
1735static void lexAppendc(int c) 1735static void lexAppendc(int c)
1736 { 1736 {
1737 lexBuf.strs[lexBuf.strsLen] = c; 1737 lexBuf.strs[lexBuf.strsLen] = c;
1738 /* append up to zero termination */ 1738 /* append up to zero termination */
1739 if (c == 0) return; 1739 if (c == 0) return;
1740 lexBuf.strsLen++; 1740 lexBuf.strsLen++;
1741 if (lexBuf.strsLen > lexBuf.maxToken) { 1741 if (lexBuf.strsLen > lexBuf.maxToken) {
1742 /* double the token string size */ 1742 /* double the token string size */
1743 lexBuf.maxToken <<= 1; 1743 lexBuf.maxToken <<= 1;
1744 lexBuf.strs = (char*) realloc(lexBuf.strs,(size_t)lexBuf.maxToken); 1744 lexBuf.strs = (char*) realloc(lexBuf.strs,(size_t)lexBuf.maxToken);
1745 } 1745 }
1746 } 1746 }
1747 1747
1748static char* lexStr() { 1748static char* lexStr() {
1749 return dupStr(lexBuf.strs,(size_t)lexBuf.strsLen+1); 1749 return dupStr(lexBuf.strs,(size_t)lexBuf.strsLen+1);
1750 } 1750 }
1751 1751
1752static void lexSkipWhite() { 1752static void lexSkipWhite() {
1753 int c = lexLookahead(); 1753 int c = lexLookahead();
1754 while (c == ' ' || c == '\t') { 1754 while (c == ' ' || c == '\t') {
1755 lexSkipLookahead(); 1755 lexSkipLookahead();
1756 c = lexLookahead(); 1756 c = lexLookahead();
1757 } 1757 }
1758 } 1758 }
1759 1759
1760static char* lexGetWord() { 1760static char* lexGetWord() {
1761 int c; 1761 int c;
1762 lexSkipWhite(); 1762 lexSkipWhite();
1763 lexClearToken(); 1763 lexClearToken();
1764 c = lexLookahead(); 1764 c = lexLookahead();
1765 while (c != EOF && !strchr("\t\n ;:=",c)) { 1765 // LR while (c != EOF && !strchr("\t\n ;:=",c)) {
1766 while (c != EOF && !strchr("\t\n;:=",c)) {
1766 lexAppendc(c); 1767 lexAppendc(c);
1767 lexSkipLookahead(); 1768 lexSkipLookahead();
1768 c = lexLookahead(); 1769 c = lexLookahead();
1769 } 1770 }
1770 lexAppendc(0); 1771 lexAppendc(0);
1771 return lexStr(); 1772 return lexStr();
1772 } 1773 }
1773 1774
1774static void lexPushLookaheadc(int c) { 1775static void lexPushLookaheadc(int c) {
1775 int putptr; 1776 int putptr;
1776 /* can't putback EOF, because it never leaves lookahead buffer */ 1777 /* can't putback EOF, because it never leaves lookahead buffer */
1777 if (c == EOF) return; 1778 if (c == EOF) return;
1778 putptr = (int)lexBuf.getPtr - 1; 1779 putptr = (int)lexBuf.getPtr - 1;
1779 if (putptr < 0) putptr += MAX_LEX_LOOKAHEAD; 1780 if (putptr < 0) putptr += MAX_LEX_LOOKAHEAD;
1780 lexBuf.getPtr = putptr; 1781 lexBuf.getPtr = putptr;
1781 lexBuf.buf[putptr] = c; 1782 lexBuf.buf[putptr] = c;
1782 lexBuf.len += 1; 1783 lexBuf.len += 1;
1783 } 1784 }
1784 1785
1785static char* lexLookaheadWord() { 1786static char* lexLookaheadWord() {
1786 /* this function can lookahead word with max size of MAX_LEX_LOOKAHEAD_0 1787 /* this function can lookahead word with max size of MAX_LEX_LOOKAHEAD_0
1787 / and thing bigger than that will stop the lookahead and return 0; 1788 / and thing bigger than that will stop the lookahead and return 0;
1788 / leading white spaces are not recoverable. 1789 / leading white spaces are not recoverable.
1789 */ 1790 */
1790 int c; 1791 int c;
1791 int len = 0; 1792 int len = 0;
1792 int curgetptr = 0; 1793 int curgetptr = 0;
1793 lexSkipWhite(); 1794 lexSkipWhite();
1794 lexClearToken(); 1795 lexClearToken();
1795 curgetptr = (int)lexBuf.getPtr;/* remember! */ 1796 curgetptr = (int)lexBuf.getPtr;/* remember! */
1796 while (len < (MAX_LEX_LOOKAHEAD_0)) { 1797 while (len < (MAX_LEX_LOOKAHEAD_0)) {
1797 c = lexGetc(); 1798 c = lexGetc();
1798 len++; 1799 len++;
1799 if (c == EOF || strchr("\t\n ;:=", c)) { 1800 if (c == EOF || strchr("\t\n ;:=", c)) {
1800 lexAppendc(0); 1801 lexAppendc(0);
1801 /* restore lookahead buf. */ 1802 /* restore lookahead buf. */
1802 lexBuf.len += len; 1803 lexBuf.len += len;
1803 lexBuf.getPtr = curgetptr; 1804 lexBuf.getPtr = curgetptr;
1804 return lexStr(); 1805 return lexStr();
1805 } 1806 }
1806 else 1807 else
1807 lexAppendc(c); 1808 lexAppendc(c);
1808 } 1809 }
1809 lexBuf.len += len;/* char that has been moved to lookahead buffer */ 1810 lexBuf.len += len;/* char that has been moved to lookahead buffer */
1810 lexBuf.getPtr = curgetptr; 1811 lexBuf.getPtr = curgetptr;
1811 return 0; 1812 return 0;
1812 } 1813 }
1813 1814
1814#ifdef _SUPPORT_LINE_FOLDING 1815#ifdef _SUPPORT_LINE_FOLDING
1815static void handleMoreRFC822LineBreak(int c) { 1816static void handleMoreRFC822LineBreak(int c) {
1816 /* suport RFC 822 line break in cases like 1817 /* suport RFC 822 line break in cases like
1817 *ADR: foo; 1818 *ADR: foo;
1818 * morefoo; 1819 * morefoo;
1819 * more foo; 1820 * more foo;
1820 */ 1821 */
1821 if (c == ';') { 1822 if (c == ';') {
1822 int a; 1823 int a;
1823 lexSkipLookahead(); 1824 lexSkipLookahead();
1824 /* skip white spaces */ 1825 /* skip white spaces */
1825 a = lexLookahead(); 1826 a = lexLookahead();
1826 while (a == ' ' || a == '\t') { 1827 while (a == ' ' || a == '\t') {
1827 lexSkipLookahead(); 1828 lexSkipLookahead();
1828 a = lexLookahead(); 1829 a = lexLookahead();
1829 } 1830 }
1830 if (a == '\n') { 1831 if (a == '\n') {
1831 lexSkipLookahead(); 1832 lexSkipLookahead();
1832 a = lexLookahead(); 1833 a = lexLookahead();
1833 if (a == ' ' || a == '\t') { 1834 if (a == ' ' || a == '\t') {
1834 /* continuation, throw away all the \n and spaces read so 1835 /* continuation, throw away all the \n and spaces read so
1835 * far 1836 * far
1836 */ 1837 */
1837 lexSkipWhite(); 1838 lexSkipWhite();
1838 lexPushLookaheadc(';'); 1839 lexPushLookaheadc(';');
1839 } 1840 }
1840 else { 1841 else {
1841 lexPushLookaheadc('\n'); 1842 lexPushLookaheadc('\n');
1842 lexPushLookaheadc(';'); 1843 lexPushLookaheadc(';');
1843 } 1844 }
1844 } 1845 }
1845 else { 1846 else {
1846 lexPushLookaheadc(';'); 1847 lexPushLookaheadc(';');
1847 } 1848 }
1848 } 1849 }
1849 } 1850 }
1850 1851
1851static char* lexGet1Value() { 1852static char* lexGet1Value() {
1852 int c; 1853 int c;
1853 lexSkipWhite(); 1854 lexSkipWhite();
1854 c = lexLookahead(); 1855 c = lexLookahead();
1855 lexClearToken(); 1856 lexClearToken();
1856 while (c != EOF && c != ';') { 1857 while (c != EOF && c != ';') {
1857 if (c == '\n') { 1858 if (c == '\n') {
1858 int a; 1859 int a;
1859 lexSkipLookahead(); 1860 lexSkipLookahead();
1860 a = lexLookahead(); 1861 a = lexLookahead();
1861 if (a == ' ' || a == '\t') { 1862 if (a == ' ' || a == '\t') {
1862 lexAppendc(' '); 1863 lexAppendc(' ');
1863 lexSkipLookahead(); 1864 lexSkipLookahead();
1864 } 1865 }
1865 else { 1866 else {
1866 lexPushLookaheadc('\n'); 1867 lexPushLookaheadc('\n');
1867 break; 1868 break;
1868 } 1869 }
1869 } 1870 }
1870 else { 1871 else {
1871 lexAppendc(c); 1872 lexAppendc(c);
1872 lexSkipLookahead(); 1873 lexSkipLookahead();
1873 } 1874 }
1874 c = lexLookahead(); 1875 c = lexLookahead();
1875 } 1876 }
1876 lexAppendc(0); 1877 lexAppendc(0);
1877 handleMoreRFC822LineBreak(c); 1878 handleMoreRFC822LineBreak(c);
1878 return c==EOF?0:lexStr(); 1879 return c==EOF?0:lexStr();
1879 } 1880 }
1880#endif 1881#endif
1881 1882
1882 1883
1883static int match_begin_name(int end) { 1884static int match_begin_name(int end) {
1884 char *n = lexLookaheadWord(); 1885 char *n = lexLookaheadWord();
1885 int token = ID; 1886 int token = ID;
1886 if (n) { 1887 if (n) {
1887 if (!stricmp(n,"vcard")) token = end?END_VCARD:BEGIN_VCARD; 1888 if (!stricmp(n,"vcard")) token = end?END_VCARD:BEGIN_VCARD;
1888 else if (!stricmp(n,"vcalendar")) token = end?END_VCAL:BEGIN_VCAL; 1889 else if (!stricmp(n,"vcalendar")) token = end?END_VCAL:BEGIN_VCAL;
1889 else if (!stricmp(n,"vevent")) token = end?END_VEVENT:BEGIN_VEVENT; 1890 else if (!stricmp(n,"vevent")) token = end?END_VEVENT:BEGIN_VEVENT;
1890 else if (!stricmp(n,"vtodo")) token = end?END_VTODO:BEGIN_VTODO; 1891 else if (!stricmp(n,"vtodo")) token = end?END_VTODO:BEGIN_VTODO;
1891 deleteStr(n); 1892 deleteStr(n);
1892 return token; 1893 return token;
1893 } 1894 }
1894 return 0; 1895 return 0;
1895 } 1896 }
1896 1897
1897 1898
1898#ifdef INCLUDEMFC 1899#ifdef INCLUDEMFC
1899void initLex(const char *inputstring, unsigned long inputlen, CFile *inputfile) 1900void initLex(const char *inputstring, unsigned long inputlen, CFile *inputfile)
1900#else 1901#else
1901void initLex(const char *inputstring, unsigned long inputlen, FILE *inputfile) 1902void initLex(const char *inputstring, unsigned long inputlen, FILE *inputfile)
1902#endif 1903#endif
1903 { 1904 {
1904 /* initialize lex mode stack */ 1905 /* initialize lex mode stack */
1905 lexBuf.lexModeStack[lexBuf.lexModeStackTop=0] = L_NORMAL; 1906 lexBuf.lexModeStack[lexBuf.lexModeStackTop=0] = L_NORMAL;
1906 1907
1907 /* iniatialize lex buffer. */ 1908 /* iniatialize lex buffer. */
1908 lexBuf.inputString = (char*) inputstring; 1909 lexBuf.inputString = (char*) inputstring;
1909 lexBuf.inputLen = inputlen; 1910 lexBuf.inputLen = inputlen;
1910 lexBuf.curPos = 0; 1911 lexBuf.curPos = 0;
1911 lexBuf.inputFile = inputfile; 1912 lexBuf.inputFile = inputfile;
1912 1913
1913 lexBuf.len = 0; 1914 lexBuf.len = 0;
1914 lexBuf.getPtr = 0; 1915 lexBuf.getPtr = 0;
1915 1916
1916 lexBuf.maxToken = MAXTOKEN; 1917 lexBuf.maxToken = MAXTOKEN;
1917 lexBuf.strs = (char*)malloc(MAXTOKEN); 1918 lexBuf.strs = (char*)malloc(MAXTOKEN);
1918 lexBuf.strsLen = 0; 1919 lexBuf.strsLen = 0;
1919 1920
1920 } 1921 }
1921 1922
1922static void finiLex() { 1923static void finiLex() {
1923 free(lexBuf.strs); 1924 free(lexBuf.strs);
1924 } 1925 }
1925 1926
1926 1927
1927/* This parses and converts the base64 format for binary encoding into 1928/* This parses and converts the base64 format for binary encoding into
1928 * a decoded buffer (allocated with new). See RFC 1521. 1929 * a decoded buffer (allocated with new). See RFC 1521.
1929 */ 1930 */
1930static char * lexGetDataFromBase64() 1931static char * lexGetDataFromBase64()
1931 { 1932 {
1932 unsigned long bytesLen = 0, bytesMax = 0; 1933 unsigned long bytesLen = 0, bytesMax = 0;
1933 int quadIx = 0, pad = 0; 1934 int quadIx = 0, pad = 0;
1934 unsigned long trip = 0; 1935 unsigned long trip = 0;
1935 unsigned char b; 1936 unsigned char b;
1936 int c; 1937 int c;
1937 unsigned char *bytes = NULL; 1938 unsigned char *bytes = NULL;
1938 unsigned char *oldBytes = NULL; 1939 unsigned char *oldBytes = NULL;
1939 1940
1940 DBG_(("db: lexGetDataFromBase64\n")); 1941 DBG_(("db: lexGetDataFromBase64\n"));
1941 while (1) { 1942 while (1) {
1942 c = lexGetc(); 1943 c = lexGetc();
1943 if (c == '\n') { 1944 if (c == '\n') {
1944 ++mime_lineNum; 1945 ++mime_lineNum;
1945 if (lexLookahead() == '\n') { 1946 if (lexLookahead() == '\n') {
1946 /* a '\n' character by itself means end of data */ 1947 /* a '\n' character by itself means end of data */
1947 break; 1948 break;
1948 } 1949 }
1949 else continue; /* ignore '\n' */ 1950 else continue; /* ignore '\n' */
1950 } 1951 }
1951 else { 1952 else {
1952 if ((c >= 'A') && (c <= 'Z')) 1953 if ((c >= 'A') && (c <= 'Z'))
1953 b = (unsigned char)(c - 'A'); 1954 b = (unsigned char)(c - 'A');
1954 else if ((c >= 'a') && (c <= 'z')) 1955 else if ((c >= 'a') && (c <= 'z'))
1955 b = (unsigned char)(c - 'a') + 26; 1956 b = (unsigned char)(c - 'a') + 26;
1956 else if ((c >= '0') && (c <= '9')) 1957 else if ((c >= '0') && (c <= '9'))
1957 b = (unsigned char)(c - '0') + 52; 1958 b = (unsigned char)(c - '0') + 52;