bool KCal::operator==(const Attendee &a1, const Attendee &a2) { return (operator==((const Person &)a1, (const Person &) a2) && a1.RSVP() == a2.RSVP() && a1.role() == a2.role() && a1.status() == a2.status() && a1.uid() == a2.uid() && a1.delegate() == a2.delegate() && a1.delegator() == a2.delegator()); }
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; } }
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; }
bool KOMailClient::mailAttendees( IncidenceBase *incidence, const Identity &identity, bool bccMe, const QString &attachment, bool useSendmail ) { Attendee::List attendees = incidence->attendees(); if ( attendees.count() == 0 ) { return false; } const QString from = incidence->organizer().fullName(); const QString organizerEmail = incidence->organizer().email(); QStringList toList; QStringList ccList; for ( int i=0; i<attendees.count(); ++i ) { Attendee *a = attendees.at(i); const QString email = a->email(); if ( email.isEmpty() ) { continue; } // In case we (as one of our identities) are the organizer we are sending // this mail. We could also have added ourselves as an attendee, in which // case we don't want to send ourselves a notification mail. if ( organizerEmail == email ) { continue; } // Build a nice address for this attendee including the CN. QString tname, temail; const QString username = KPIMUtils::quoteNameIfNecessary( a->name() ); // ignore the return value from extractEmailAddressAndName() because // it will always be false since tusername does not contain "@domain". KPIMUtils::extractEmailAddressAndName( username, temail, tname ); tname += " <" + email + '>'; // Optional Participants and Non-Participants are copied on the email if ( a->role() == Attendee::OptParticipant || a->role() == Attendee::NonParticipant ) { ccList << tname; } else { toList << tname; } } if( toList.count() == 0 && ccList.count() == 0 ) { // Not really to be called a groupware meeting, eh return false; } QString to; if ( toList.count() > 0 ) { to = toList.join( ", " ); } QString cc; if ( ccList.count() > 0 ) { cc = ccList.join( ", " ); } QString subject; if ( incidence->type() != "FreeBusy" ) { Incidence *inc = static_cast<Incidence *>( incidence ); subject = inc->summary(); } else { subject = "Free Busy Object"; } QString body = IncidenceFormatter::mailBodyStr( incidence, KSystemTimeZones::local() ); return send( identity, from, to, cc, subject, body, false, bccMe, attachment, useSendmail ); }