void KCalResourceSlox::createIncidenceAttributes( QDomDocument &doc, QDomElement &parent, Incidence *incidence ) { WebdavHandler::addSloxElement( this, doc, parent, fieldName( IncidenceTitle ), incidence->summary() ); WebdavHandler::addSloxElement( this, doc, parent, fieldName( Description ), incidence->description() ); if ( incidence->attendeeCount() > 0 ) { QDomElement members = WebdavHandler::addSloxElement( this, doc, parent, fieldName( Participants ) ); Attendee::List attendees = incidence->attendees(); Attendee::List::ConstIterator it; for( it = attendees.constBegin(); it != attendees.constEnd(); ++it ) { if ( mAccounts ) { QString userId = mAccounts->lookupId( (*it)->email() ); QString status; switch ( (*it)->status() ) { case Attendee::Accepted: status = "accept"; break; case Attendee::Declined: status = "decline"; break; default: status = "none"; break; } QDomElement el = WebdavHandler::addSloxElement( this, doc, members, fieldName( Participant ), userId ); el.setAttribute( "confirm", status ); } else { kError() << "KCalResourceSlox: No accounts set."; } } } // set read attributes - if SecrecyPublic, set it to users // TODO OX support if ( incidence->secrecy() == Incidence::SecrecyPublic && type() != "ox" ) { QDomElement rights = WebdavHandler::addSloxElement( this, doc, parent, "readrights" ); WebdavHandler::addSloxElement( this, doc, rights, "group", "users" ); } // set reminder as the number of minutes to the start of the event KCal::Alarm::List alarms = incidence->alarms(); if ( !alarms.isEmpty() && alarms.first()->hasStartOffset() && alarms.first()->enabled() ) WebdavHandler::addSloxElement( this, doc, parent, fieldName( Reminder ), QString::number( (-1) * alarms.first()->startOffset().asSeconds() / 60 ) ); else WebdavHandler::addSloxElement( this, doc, parent, fieldName( Reminder ), "0" ); // categories WebdavHandler::addSloxElement( this, doc, parent, fieldName( Categories ), incidence->categories().join( ", " ) ); }
void HtmlExport::formatAttendees(QTextStream *ts, const Incidence::Ptr &incidence) { Attendee::List attendees = incidence->attendees(); if (attendees.count()) { *ts << "<em>"; *ts << incidence->organizer()->fullName(); *ts << "</em><br />"; Attendee::List::ConstIterator it; for (it = attendees.constBegin(); it != attendees.constEnd(); ++it) { Attendee::Ptr a(*it); if (!a->email().isEmpty()) { *ts << "<a href=\"mailto:" << a->email(); *ts << "\">" << cleanChars(a->name()) << "</a>"; } else { *ts << " " << cleanChars(a->name()); } *ts << "<br />" << endl; } } else { *ts << " " << endl; } }
void KOAttendeeEditor::readIncidence( KCal::Incidence *incidence ) { qDeleteAll( mDelAttendees ); mDelAttendees.clear(); if ( KOPrefs::instance()->thatIsMe( incidence->organizer().email() ) || incidence->organizer().isEmpty() ) { //TODO: make a new private method for creating the mOrganizerCombo //and use it here and initOrganizerWidgets() above. if ( !mOrganizerCombo ) { mOrganizerCombo = new KComboBox( mOrganizerHBox ); mOrganizerCombo->setToolTip( i18nc( "@info:tooltip", "Select the organizer" ) ); mOrganizerCombo->setWhatsThis( i18nc( "@info:whatsthis", "Select the identity to use as the organizer for this incidence." ) ); fillOrganizerCombo(); } mOrganizerLabel->setText( i18nc( "@label", "Identity as organizer:" ) ); int found = -1; QString fullOrganizer = incidence->organizer().fullName(); for ( int i = 0; i < mOrganizerCombo->count(); ++i ) { if ( mOrganizerCombo->itemText( i ) == fullOrganizer ) { found = i; mOrganizerCombo->setCurrentIndex( i ); break; } } if ( found < 0 ) { mOrganizerCombo->addItem( fullOrganizer, 0 ); mOrganizerCombo->setCurrentIndex( 0 ); } } else { // someone else is the organizer if ( mOrganizerCombo ) { delete mOrganizerCombo; mOrganizerCombo = 0; } mOrganizerLabel->setText( i18nc( "@label", "Organizer: %1", incidence->organizer().fullName() ) ); } Attendee::List al = incidence->attendees(); Attendee::List::ConstIterator it; Attendee *first = 0; for ( it = al.constBegin(); it != al.constEnd(); ++it ) { Attendee *a = new Attendee( **it ); if ( !first ) { first = a; } insertAttendee( a, true ); } // Set the initial editing values to the first attendee in the list. if ( first ) { // Don't update the item here, the user didn't edit it, so it's not needed. // Also, AttendeeEditor's subclasses didn't set the current Item at this point // so if updateAttendee is called now what will happen is that a random item // will get the text of "first". mDisableItemUpdate = true; mNameEdit->setText( first->fullName() ); mUid = first->uid(); mRoleCombo->setCurrentIndex( first->role() ); if ( first->status() != KCal::Attendee::None ) { mStatusCombo->setCurrentIndex( first->status() ); } else { mStatusCombo->setCurrentIndex( KCal::Attendee::NeedsAction ); } mRsvpButton->setChecked( first->RSVP() ); mRsvpButton->setEnabled( true ); mDisableItemUpdate = false; } }
CallId Scheduler::acceptReply( const IncidenceBase::Ptr &incidence, ScheduleMessage::Status status, iTIPMethod method ) { Q_UNUSED( status ); if ( incidence->type() == IncidenceBase::TypeFreeBusy ) { return acceptFreeBusy( incidence, method ); } const CallId callId = ++d->mLatestCallId; ResultCode resultCode = ResultCodeIncidenceOrAttendeeNotFound; QString errorMessage; Event::Ptr ev = d->mCalendar->event( incidence->uid() ); Todo::Ptr to = d->mCalendar->todo( incidence->uid() ); // try harder to find the correct incidence if ( !ev && !to ) { const Incidence::List list = d->mCalendar->incidences(); for ( Incidence::List::ConstIterator it=list.constBegin(), end=list.constEnd(); it != end; ++it ) { if ( (*it)->schedulingID() == incidence->uid() ) { ev = ( *it ).dynamicCast<Event>(); to = ( *it ).dynamicCast<Todo>(); break; } } } if ( ev || to ) { //get matching attendee in calendar kDebug() << "match found!"; 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.constBegin(); inIt != attendeesIn.constEnd(); ++inIt ) { Attendee::Ptr attIn = *inIt; bool found = false; for ( evIt = attendeesEv.constBegin(); evIt != attendeesEv.constEnd(); ++evIt ) { Attendee::Ptr attEv = *evIt; if ( attIn->email().toLower() == attEv->email().toLower() ) { //update attendee-info kDebug() << "update attendee"; attEv->setStatus( attIn->status() ); attEv->setDelegate( attIn->delegate() ); attEv->setDelegator( attIn->delegator() ); resultCode = ResultCodeSuccess; 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::Ptr attNew = *it; QString msg = i18nc( "@info", "%1 wants to attend %2 but was not invited.", attNew->fullName(), ( ev ? ev->summary() : to->summary() ) ); if ( !attNew->delegator().isEmpty() ) { msg = i18nc( "@info", "%1 wants to attend %2 on behalf of %3.", attNew->fullName(), ( ev ? ev->summary() : to->summary() ), attNew->delegator() ); } if ( KMessageBox::questionYesNo( 0, msg, i18nc( "@title", "Uninvited attendee" ), KGuiItem( i18nc( "@option", "Accept Attendance" ) ), KGuiItem( i18nc( "@option", "Reject Attendance" ) ) ) != KMessageBox::Yes ) { Incidence::Ptr cancel = incidence.dynamicCast<Incidence>(); if ( cancel ) { cancel->addComment( i18nc( "@info", "The organizer rejected your attendance at this meeting." ) ); } performTransaction( incidence, iTIPCancel, attNew->fullName() ); // ### can't delete cancel here because it is aliased to incidence which // is accessed in the next loop iteration (CID 4232) // delete cancel; continue; } Attendee::Ptr 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 ); } resultCode = ResultCodeSuccess; attendeeAdded = true; } // send update about new participants if ( attendeeAdded ) { bool sendMail = false; if ( ev || to ) { if ( KMessageBox::questionYesNo( 0, i18nc( "@info", "An attendee was added to the incidence. " "Do you want to email the attendees an update message?" ), i18nc( "@title", "Attendee Added" ), KGuiItem( i18nc( "@option", "Send Messages" ) ), KGuiItem( i18nc( "@option", "Do Not Send" ) ) ) == KMessageBox::Yes ) { sendMail = true; } } if ( ev ) { ev->setRevision( ev->revision() + 1 ); if ( sendMail ) { performTransaction( ev, iTIPRequest ); } } if ( to ) { to->setRevision( to->revision() + 1 ); if ( sendMail ) { performTransaction( to, iTIPRequest ); } } } if ( resultCode == ResultCodeSuccess ) { // 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 to-do. see RFC2446 3.4.3 Todo::Ptr update = incidence.dynamicCast<Todo>(); Q_ASSERT( update ); if ( update && ( to->percentComplete() != update->percentComplete() ) ) { to->setPercentComplete( update->percentComplete() ); to->updated(); } } } else { kError() << "No incidence for scheduling."; } if ( resultCode == ResultCodeSuccess ) { deleteTransaction( incidence->uid() ); } emitOperationFinished( callId, resultCode, errorMessage ); return callId; }
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; }