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; }
void KOrganizerPlugin::processDropEvent( QDropEvent *event ) { const QMimeData *md = event->mimeData(); if ( KPIM::KVCardDrag::canDecode( md ) ) { KABC::Addressee::List contacts; KPIM::KVCardDrag::fromMimeData( md, contacts ); KABC::Addressee::List::Iterator it; QStringList attendees; for ( it = contacts.begin(); it != contacts.end(); ++it ) { QString email = (*it).fullEmail(); if ( email.isEmpty() ) { attendees.append( (*it).realName() + "<>" ); } else { attendees.append( email ); } } interface()->openEventEditor( i18nc( "@item", "Meeting" ), QString(), QStringList(), attendees ); return; } if ( KCal::ICalDrag::canDecode( event->mimeData() ) ) { KCal::CalendarLocal cal( KSystemTimeZones::local() ); if ( KCal::ICalDrag::fromMimeData( event->mimeData(), &cal ) ) { KCal::Incidence::List incidences = cal.incidences(); Q_ASSERT( incidences.count() ); if ( !incidences.isEmpty() ) { event->accept(); KCal::Incidence *i = incidences.first(); QString summary; if ( dynamic_cast<KCal::Journal*>( i ) ) { summary = i18nc( "@item", "Note: %1", i->summary() ); } else { summary = i->summary(); } interface()->openEventEditor( summary, i->description(), QStringList() ); return; } // else fall through to text decoding } } if ( md->hasText() ) { QString text = md->text(); kDebug() << "DROP:" << text; interface()->openEventEditor( text ); return; } if ( KPIM::MailList::canDecode( md ) ) { KPIM::MailList mails = KPIM::MailList::fromMimeData( md ); event->accept(); if ( mails.count() != 1 ) { KMessageBox::sorry( core(), i18nc( "@info", "Dropping multiple mails is not supported." ) ); } else { KPIM::MailSummary mail = mails.first(); QString txt = i18nc( "@item", "From: %1\nTo: %2\nSubject: %3", mail.from(), mail.to(), mail.subject() ); KTemporaryFile tf; tf.setAutoRemove( true ); tf.open(); QString uri = KDEPIMPROTOCOL_EMAIL + QString::number( mail.serialNumber() ); tf.write( event->encodedData( "message/rfc822" ) ); interface()->openEventEditor( i18nc( "@item", "Mail: %1", mail.subject() ), txt, uri, tf.fileName(), QStringList(), "message/rfc822" ); tf.close(); } return; } kWarning() << QString( "Cannot handle drop events of type '%1'." ).arg( event->format() ); }
bool Scheduler::acceptReply(IncidenceBase *incidence,ScheduleMessage::Status /* status */, Method method) { if(incidence->type()=="FreeBusy") { return acceptFreeBusy(incidence, method); } bool ret = false; Event *ev = mCalendar->event(incidence->uid()); Todo *to = mCalendar->todo(incidence->uid()); // try harder to find the correct incidence if ( !ev && !to ) { const Incidence::List list = mCalendar->incidences(); for ( Incidence::List::ConstIterator it = list.begin(), end = list.end(); it != end; ++it ) { if ( (*it)->schedulingID() == incidence->uid() ) { ev = dynamic_cast<Event*>( *it ); to = dynamic_cast<Todo*>( *it ); break; } } } if (ev || to) { //get matching attendee in calendar kdDebug(5800) << "Scheduler::acceptTransaction match found!" << endl; Attendee::List attendeesIn = incidence->attendees(); Attendee::List attendeesEv; Attendee::List attendeesNew; if (ev) attendeesEv = ev->attendees(); if (to) attendeesEv = to->attendees(); Attendee::List::ConstIterator inIt; Attendee::List::ConstIterator evIt; for ( inIt = attendeesIn.begin(); inIt != attendeesIn.end(); ++inIt ) { Attendee *attIn = *inIt; bool found = false; for ( evIt = attendeesEv.begin(); evIt != attendeesEv.end(); ++evIt ) { Attendee *attEv = *evIt; if (attIn->email().lower()==attEv->email().lower()) { //update attendee-info kdDebug(5800) << "Scheduler::acceptTransaction update attendee" << endl; attEv->setStatus(attIn->status()); attEv->setDelegate(attIn->delegate()); attEv->setDelegator(attIn->delegator()); ret = true; found = true; } } if ( !found && attIn->status() != Attendee::Declined ) attendeesNew.append( attIn ); } bool attendeeAdded = false; for ( Attendee::List::ConstIterator it = attendeesNew.constBegin(); it != attendeesNew.constEnd(); ++it ) { Attendee* attNew = *it; QString msg = i18n("%1 wants to attend %2 but was not invited.").arg( attNew->fullName() ) .arg( ev ? ev->summary() : to->summary() ); if ( !attNew->delegator().isEmpty() ) msg = i18n("%1 wants to attend %2 on behalf of %3.").arg( attNew->fullName() ) .arg( ev ? ev->summary() : to->summary() ) .arg( attNew->delegator() ); if ( KMessageBox::questionYesNo( 0, msg, i18n("Uninvited attendee"), KGuiItem(i18n("Accept Attendance")), KGuiItem(i18n("Reject Attendance")) ) != KMessageBox::Yes ) { KCal::Incidence *cancel = dynamic_cast<Incidence*>( incidence ); if ( cancel ) cancel->addComment( i18n( "The organizer rejected your attendance at this meeting." ) ); performTransaction( cancel ? cancel : incidence, Scheduler::Cancel, attNew->fullName() ); delete cancel; continue; } Attendee *a = new Attendee( attNew->name(), attNew->email(), attNew->RSVP(), attNew->status(), attNew->role(), attNew->uid() ); a->setDelegate( attNew->delegate() ); a->setDelegator( attNew->delegator() ); if ( ev ) ev->addAttendee( a ); else if ( to ) to->addAttendee( a ); ret = true; attendeeAdded = true; } // send update about new participants if ( attendeeAdded ) { if ( ev ) { ev->setRevision( ev->revision() + 1 ); performTransaction( ev, Scheduler::Request ); } if ( to ) { to->setRevision( ev->revision() + 1 ); performTransaction( to, Scheduler::Request ); } } if ( ret ) { // We set at least one of the attendees, so the incidence changed // Note: This should not result in a sequence number bump if ( ev ) ev->updated(); else if ( to ) to->updated(); } if ( to ) { // for VTODO a REPLY can be used to update the completion status of // a task. see RFC2446 3.4.3 Todo *update = dynamic_cast<Todo*> ( incidence ); Q_ASSERT( update ); if ( update && ( to->percentComplete() != update->percentComplete() ) ) { to->setPercentComplete( update->percentComplete() ); to->updated(); } } } else kdError(5800) << "No incidence for scheduling\n"; if (ret) deleteTransaction(incidence); return ret; }