bool GroupDavGlobals::interpretCalendarDownloadItemsJob( KCal::CalendarAdaptor *adaptor, KIO::Job *job, const QString &jobData ) { kdDebug(5800) << "GroupDavGlobals::interpretCalendarDownloadItemsJob, iCalendar=" << endl; kdDebug(5800) << jobData << endl; if ( !adaptor || !job ) return false; KCal::CalendarLocal calendar( QString::fromLatin1("UTC") ); KCal::ICalFormat ical; calendar.setTimeZoneId( adaptor->resource()->timeZoneId() ); KCal::Incidence::List incidences; if ( ical.fromString( &calendar, jobData ) ) { KCal::Incidence::List raw = calendar.rawIncidences(); KCal::Incidence::List::Iterator it = raw.begin(); if ( raw.count() != 1 ) { kdError() << "Parsed iCalendar does not contain exactly one event." << endl; return false; } KCal::Incidence *inc = (raw.front())->clone(); if ( !inc ) return false; KIO::SimpleJob *sjob = dynamic_cast<KIO::SimpleJob *>(job); KURL remoteId; if ( sjob ) remoteId = sjob->url(); QString fingerprint = extractFingerprint( job, jobData ); adaptor->calendarItemDownloaded( inc, inc->uid(), remoteId, fingerprint, remoteId.prettyURL() ); return true; } else { kdError() << "Unable to parse iCalendar" << endl; } return false; }
/** Add or change an incidence on the calendar. This function * is used for events and to-dos */ bool KCalSharedResource::commit(OSyncDataSource *dsobj, OSyncContext *ctx, OSyncChange *chg) { OSyncChangeType type = osync_change_get_changetype(chg); switch (type) { case OSYNC_CHANGE_TYPE_DELETED: { KCal::Incidence *e = calendar->incidence(QString::fromUtf8(osync_change_get_uid(chg))); if (!e) { osync_context_report_error(ctx, OSYNC_ERROR_FILE_NOT_FOUND, "Event not found while deleting"); return false; } calendar->deleteIncidence(e); break; } case OSYNC_CHANGE_TYPE_ADDED: case OSYNC_CHANGE_TYPE_MODIFIED: { KCal::ICalFormat format; OSyncData *odata = osync_change_get_data(chg); char *databuf; //size_t databuf_size; // osync_data_get_data requires an unsigned int which is not compatible with size_t on 64bit machines unsigned int databuf_size = 0; osync_data_get_data(odata, &databuf, &databuf_size); /* First, parse to a temporary calendar, because * we should set the uid on the events */ KCal::CalendarLocal cal(QString::fromLatin1( "UTC" )); QString data = QString::fromUtf8(databuf, databuf_size); if (!format.fromString(&cal, data)) { osync_context_report_error(ctx, OSYNC_ERROR_CONVERT, "Couldn't import calendar data"); return false; } KCal::Incidence *oldevt = calendar->incidence(QString::fromUtf8(osync_change_get_uid(chg))); if (oldevt) { calendar->deleteIncidence(oldevt); } /* Add the events from the temporary calendar, setting the UID * * We iterate over the list, but it should have only one event. */ KCal::Incidence::List evts = cal.incidences(); for (KCal::Incidence::List::ConstIterator i = evts.begin(); i != evts.end(); i++) { KCal::Incidence *e = (*i)->clone(); if (type == OSYNC_CHANGE_TYPE_MODIFIED) e->setUid(QString::fromUtf8(osync_change_get_uid(chg))); // if we run with a configured category filter, but the received added incidence does // not contain that category, add the filter-categories so that the incidence will be // found again on the next sync if ( ! dsobj->has_category(e->categories()) ) { QStringList cats = e->categories(); for (QStringList::const_iterator it = dsobj->categories.constBegin(); it != dsobj->categories.constEnd(); ++it ) cats.append(*it); e->setCategories(cats); } osync_change_set_uid(chg, e->uid().utf8()); QString hash = calc_hash(*i); osync_change_set_hash(chg, hash.utf8()); calendar->addIncidence(e); } break; } default: { osync_context_report_error(ctx, OSYNC_ERROR_NOT_SUPPORTED, "Invalid or unsupported change type"); return false; } } return true; }