00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include <qlistview.h>
00021 #include <qfile.h>
00022 #include <qdir.h>
00023 #include <qmap.h>
00024
00025 #include <kglobal.h>
00026 #include <klocale.h>
00027 #include <kdebug.h>
00028 #include <kstandarddirs.h>
00029 #include <kmessagebox.h>
00030
00031 #include <libkcal/incidence.h>
00032 #include <libkcal/event.h>
00033 #include <libkcal/calendar.h>
00034 #include <libkcal/freebusy.h>
00035 #include <libkcal/attendee.h>
00036
00037 #ifndef KORG_NOMAIL
00038 #include "mailscheduler.h"
00039 #else
00040 #include <libkcal/dummyscheduler.h>
00041 #endif
00042
00043 #ifndef KORG_NOKABC
00044 #include <kabc/stdaddressbook.h>
00045 #endif
00046
00047 #include "incomingdialog.h"
00048 #include "koeventviewerdialog.h"
00049 #include "kocounterdialog.h"
00050 #include "koprefs.h"
00051
00052
00053 ScheduleItemIn::ScheduleItemIn(QListView *parent,IncidenceBase *ev,
00054 Scheduler::Method method,ScheduleMessage::Status status)
00055 : QListViewItem(parent)
00056 {
00057 mIncidence = ev;
00058 mMethod = method;
00059 mStatus = status;
00060 setText(6,Scheduler::methodName(mMethod)+" ");
00061 setText(7,ScheduleMessage::statusName(status));
00062 }
00063
00064
00065
00066 ScheduleItemVisitor::ScheduleItemVisitor(ScheduleItemIn *item)
00067 {
00068 mItem = item;
00069 }
00070
00071 ScheduleItemVisitor::~ScheduleItemVisitor()
00072 {
00073 }
00074
00075 bool ScheduleItemVisitor::visit(Event *e)
00076 {
00077 mItem->setText(0,e->summary());
00078 mItem->setText(1,e->dtStartDateStr());
00079 if (e->doesFloat()) {
00080 mItem->setText(2,i18n("no time "));
00081 mItem->setText(4,i18n("no time "));
00082 }
00083 else {
00084 mItem->setText(2,e->dtStartTimeStr());
00085 mItem->setText(4,e->dtEndTimeStr());
00086 }
00087 if (e->hasEndDate()) {
00088 mItem->setText(3,e->dtEndDateStr());
00089 }
00090 else {
00091 mItem->setText(3,"");
00092 }
00093 mItem->setText(5,e->organizer()+" ");
00094
00095 return true;
00096 }
00097
00098 bool ScheduleItemVisitor::visit(Todo *e)
00099 {
00100 mItem->setText(0,e->summary());
00101 if (e->hasStartDate()) {
00102 mItem->setText(1,e->dtStartDateStr());
00103 if (!e->doesFloat()) {
00104 mItem->setText(2,e->dtStartTimeStr());
00105 }
00106 }
00107 if (e->hasDueDate()) {
00108 mItem->setText(1,e->dtDueDateStr());
00109 if (!e->doesFloat()) {
00110 mItem->setText(2,e->dtDueTimeStr());
00111 }
00112 }
00113 mItem->setText(5,e->organizer()+" ");
00114
00115 return true;
00116 }
00117
00118 bool ScheduleItemVisitor::visit(Journal *)
00119 {
00120 return false;
00121 }
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131 IncomingDialog::IncomingDialog(Calendar *calendar,OutgoingDialog *outgoing,
00132 QWidget* parent,const char* name,bool modal,WFlags fl) :
00133 IncomingDialog_base(parent,name,modal,fl)
00134 {
00135 mCalendar = calendar;
00136 mOutgoing = outgoing;
00137 #ifndef KORG_NOMAIL
00138 mScheduler = new MailScheduler(mCalendar);
00139 #else
00140 mScheduler = new DummyScheduler(mCalendar);
00141 #endif
00142 mMessageListView->setColumnAlignment(1,AlignHCenter);
00143 mMessageListView->setColumnAlignment(2,AlignHCenter);
00144 mMessageListView->setColumnAlignment(3,AlignHCenter);
00145 mMessageListView->setColumnAlignment(4,AlignHCenter);
00146 QObject::connect(mMessageListView,SIGNAL(doubleClicked(QListViewItem *)),
00147 this,SLOT(showEvent(QListViewItem *)));
00148 retrieve();
00149 }
00150
00151
00152
00153
00154 IncomingDialog::~IncomingDialog()
00155 {
00156
00157 }
00158
00159 void IncomingDialog::setOutgoingDialog(OutgoingDialog *outgoing)
00160 {
00161 mOutgoing = outgoing;
00162 }
00163
00164 void IncomingDialog::retrieve()
00165 {
00166 QPtrList <ScheduleMessage> messages = mScheduler->retrieveTransactions();
00167
00168 ScheduleMessage *message;
00169 for(message = messages.first();message;message = messages.next()) {
00170 IncidenceBase *inc = message->event();
00171 Scheduler::Method method = (Scheduler::Method)message->method();
00172 ScheduleMessage::Status status = message->status();
00173
00174 ScheduleItemIn *item = new ScheduleItemIn(mMessageListView,inc,method,status);
00175 if(inc->type()!="FreeBusy") {
00176 Incidence *incidence = static_cast<Incidence *>(inc);
00177 ScheduleItemVisitor v(item);
00178 if (!incidence->accept(v)) delete item;
00179 } else {
00180 FreeBusy *fb = static_cast<FreeBusy *>(item->event());
00181 item->setText(0, "FreeBusy");
00182 item->setText(1, KGlobal::locale()->formatDate( fb->dtStart().date() ) );
00183 item->setText(2, KGlobal::locale()->formatTime( fb->dtStart().time() ) );
00184 item->setText(3, KGlobal::locale()->formatDate( fb->dtEnd().date() ) );
00185 item->setText(4, KGlobal::locale()->formatTime( fb->dtEnd().time() ) );
00186 item->setText(5, fb->organizer());
00187 }
00188 automaticAction(item);
00189 }
00190 emit numMessagesChanged(mMessageListView->childCount());
00191 }
00192
00193 void IncomingDialog::acceptAllMessages()
00194 {
00195 bool success = false;
00196
00197 ScheduleItemIn *item = (ScheduleItemIn *)mMessageListView->firstChild();
00198 while(item) {
00199 ScheduleItemIn *nextitem = (ScheduleItemIn *)(item->nextSibling());
00200 if (acceptMessage(item)) success = true;
00201 item = nextitem;
00202 }
00203
00204 if (success) emit calendarUpdated();
00205 }
00206
00207 void IncomingDialog::acceptMessage()
00208 {
00209 ScheduleItemIn *item = (ScheduleItemIn *)mMessageListView->selectedItem();
00210 if (item) {
00211 if (acceptMessage(item)) emit calendarUpdated();
00212 }
00213 }
00214
00215 bool IncomingDialog::acceptMessage(ScheduleItemIn *item)
00216 {
00217 switch (item->method()) {
00218 case Scheduler::Refresh:
00219 return incomeRefresh(item);
00220 break;
00221 case Scheduler::Counter:
00222 return incomeCounter(item);
00223 break;
00224 case Scheduler::Declinecounter:
00225 return incomeDeclineCounter(item);
00226 break;
00227 case Scheduler::Add:
00228 return incomeAdd(item);
00229 break;
00230 case Scheduler::Request:
00231 return incomeRequest(item);
00232 break;
00233 default:
00234 return incomeDefault(item);
00235 }
00236 return false;
00237 }
00238
00239 void IncomingDialog::rejectMessage()
00240 {
00241 ScheduleItemIn *item = (ScheduleItemIn *)mMessageListView->selectedItem();
00242 if (item) {
00243 mScheduler->deleteTransaction(item->event());
00244 delete item;
00245 emit numMessagesChanged(mMessageListView->childCount());
00246 }
00247 }
00248
00249 void IncomingDialog::showEvent(QListViewItem *item)
00250 {
00251 IncidenceBase *incidence = ((ScheduleItemIn *)item)->event();
00252 if( incidence && incidence->type() == "Event" ) {
00253 Event *event = static_cast<Event *>(incidence);
00254 KOEventViewerDialog *eventViewer = new KOEventViewerDialog(this);
00255 eventViewer->setEvent(event);
00256 eventViewer->show();
00257 }
00258 }
00259
00260 bool IncomingDialog::incomeRefresh(ScheduleItemIn *item)
00261 {
00262 Event *ev = mCalendar->event(item->event()->uid());
00263 if (ev) {
00264
00265 Attendee *att;
00266 QPtrList<Attendee> attlist = ev->attendees();
00267 for (att=attlist.first(); att; att=attlist.next()) {
00268 Event *event = new Event(*ev);
00269 mOutgoing->addMessage(event,Scheduler::Request,att->email());
00270 delete(event);
00271 }
00272 mScheduler->deleteTransaction(item->event());
00273 delete item;
00274 emit numMessagesChanged(mMessageListView->childCount());
00275 return true;
00276 }
00277 mScheduler->deleteTransaction(item->event());
00278 delete item;
00279 emit numMessagesChanged(mMessageListView->childCount());
00280 return false;
00281 }
00282
00283 bool IncomingDialog::incomeCounter(ScheduleItemIn *item)
00284 {
00285 IncidenceBase *incidence = ((ScheduleItemIn *)item)->event();
00286 if ( incidence->type() != "Event" ) return false;
00287
00288 Event *counterEvent = static_cast<Event *>( incidence );
00289
00290 Event *even = mCalendar->event(counterEvent->uid());
00291
00292 KOCounterDialog *eventViewer = new KOCounterDialog(this);
00293
00294
00295 eventViewer->addText(i18n("counter proposal event","<b>Counter-event:</b><p>"));
00296 eventViewer->addEvent(counterEvent);
00297 eventViewer->addText("<hr>");
00298 eventViewer->addText(i18n("<b>Original event:</b><p>"));
00299 if (even) eventViewer->addEvent(even);
00300 else eventViewer->addText(i18n("A corresponding event is missing in your calendar!"));
00301 eventViewer->addText("<hr>");
00302 eventViewer->addText(i18n("If this counter-event is a good proposal for your event, press 'Accept'. All Attendees will then get the new version of this event"));
00303 eventViewer->show();
00304
00305 eventViewer->exec();
00306 if (eventViewer->result()) {
00307 kdDebug() << "IncomingDialog::Counter:Accept" << endl;
00308 int revision = 0;
00309 if (even) {
00310 revision = even->revision();
00311 mCalendar->deleteEvent(even);
00312 }
00313 mCalendar->addIncidence(counterEvent);
00314 even = mCalendar->event(item->event()->uid());
00315 if (even) {
00316 if (revision < even->revision())
00317 even->setRevision(even->revision()+1);
00318 else
00319 even->setRevision(revision+1);
00320 Event *ev = new Event(*even);
00321 mOutgoing->addMessage(ev,Scheduler::Request);
00322 delete(ev);
00323 }
00324 mScheduler->deleteTransaction(item->event());
00325 delete item;
00326 emit numMessagesChanged(mMessageListView->childCount());
00327 return true;
00328 } else {
00329 kdDebug() << "IncomingDialog::Counter:Decline" << endl;
00330
00331
00332 mOutgoing->addMessage(counterEvent,Scheduler::Declinecounter);
00333 delete item;
00334 emit numMessagesChanged(mMessageListView->childCount());
00335 mScheduler->deleteTransaction(item->event());
00336 delete item;
00337 emit numMessagesChanged(mMessageListView->childCount());
00338 return true;
00339 }
00340
00341 delete item;
00342 emit numMessagesChanged(mMessageListView->childCount());
00343 return false;
00344 }
00345
00346 bool IncomingDialog::incomeDeclineCounter(ScheduleItemIn *item)
00347 {
00348 Event *even = mCalendar->event(item->event()->uid());
00349 if (even) {
00350 mOutgoing->addMessage(even,Scheduler::Refresh);
00351 mScheduler->deleteTransaction(item->event());
00352 delete item;
00353 emit numMessagesChanged(mMessageListView->childCount());
00354 return true;
00355 }
00356 mScheduler->deleteTransaction(item->event());
00357 delete item;
00358 emit numMessagesChanged(mMessageListView->childCount());
00359 return false;
00360 }
00361
00362 bool IncomingDialog::incomeAdd(ScheduleItemIn *item)
00363 {
00364 IncidenceBase *incidence = ((ScheduleItemIn *)item)->event();
00365 if (incidence->type() == "Event" ) {
00366 Event *refr = static_cast<Event *>( incidence );
00367 mOutgoing->addMessage(refr,Scheduler::Refresh);
00368 mScheduler->deleteTransaction( incidence );
00369 delete item;
00370 emit numMessagesChanged(mMessageListView->childCount());
00371 return true;
00372 }
00373 else {
00374 kdDebug() << "IncomingDialog::incomeAdd - only Events are supportet yet" << endl;
00375 mScheduler->deleteTransaction( incidence );
00376 delete item;
00377 emit numMessagesChanged(mMessageListView->childCount());
00378 return false;
00379 }
00380 }
00381
00382 bool IncomingDialog::incomeDefault(ScheduleItemIn *item)
00383 {
00384 if (mScheduler->acceptTransaction(item->event(),item->method(),item->status())) {
00385 delete item;
00386 emit numMessagesChanged(mMessageListView->childCount());
00387 return true;
00388 }
00389 else {
00390 KMessageBox::error(this,i18n("Unable to accept the IMIP-message. It may be a problem with the email addresses."));
00391 kdDebug() << "IncomingDialog::acceptMessage(): Error!" << endl;
00392 return false;
00393 }
00394 return false;
00395 }
00396
00397 bool IncomingDialog::incomeRequest(ScheduleItemIn *item)
00398 {
00399 if (item->event()->type()=="FreeBusy") {
00400
00401 IncidenceBase *inc = item->event();
00402 QDateTime start = inc->dtStart();
00403 QDateTime end = start.addDays(inc->duration()/86400);
00404
00405 FreeBusy *freebusy = new FreeBusy(mCalendar, start, end);
00406 freebusy->setOrganizer(inc->organizer());
00407 Attendee *att = new Attendee(KOPrefs::instance()->fullName(),
00408 KOPrefs::instance()->email());
00409 freebusy->addAttendee(att);
00410
00411 kdDebug() << "calendarview: schedule_publish_freebusy: startDate: "
00412 << KGlobal::locale()->formatDateTime( start ) << " End Date: "
00413 << KGlobal::locale()->formatDateTime( end ) << endl;
00414
00415 if (mOutgoing->addMessage(freebusy,Scheduler::Reply)) {
00416 delete item;
00417 emit numMessagesChanged(mMessageListView->childCount());
00418 delete(freebusy);
00419 return true;
00420 }
00421 return false;
00422 } else {
00423 return incomeDefault(item);
00424 }
00425 return false;
00426 }
00427
00428 bool IncomingDialog::automaticAction(ScheduleItemIn *item)
00429 {
00430 bool autoAction = false;
00431 IncidenceBase *inc = item->event();
00432 Scheduler::Method method = item->method();
00433
00434 if( inc->type()=="FreeBusy" ) {
00435 if ( method==Scheduler::Request ) {
00436 if ( KOPrefs::instance()->mIMIPAutoFreeBusy==KOPrefs::addressbookAuto ) {
00437
00438 if ( checkOrganizerInAddressbook(inc->organizer()) ) {
00439 incomeRequest(item);
00440 }
00441 } else return false;
00442 } else {
00443
00444 if ( method==Scheduler::Reply ) {
00445 if ( KOPrefs::instance()->mIMIPAutoFreeBusy==KOPrefs::addressbookAuto ) {
00446
00447
00448
00449 } else return false;
00450 } else {
00451 if ( method==Scheduler::Publish) {
00452 if ( KOPrefs::instance()->mIMIPAutoFreeBusy==KOPrefs::addressbookAuto ) {
00453
00454
00455
00456 }
00457 } else return false;
00458 }
00459 }
00460 }
00461
00462 if ( inc->type()=="Event" ) {
00463 if ( method==Scheduler::Request || method==Scheduler::Publish ) {
00464 if ( KOPrefs::instance()->mIMIPAutoInsertRequest==KOPrefs::addressbookAuto ) {
00465
00466 if ( checkOrganizerInAddressbook(inc->organizer()) )
00467 autoAction = acceptMessage(item);
00468 } else return false;
00469 } else {
00470
00471 if ( method==Scheduler::Reply ) {
00472 if ( KOPrefs::instance()->mIMIPAutoInsertReply==KOPrefs::addressbookAuto ) {
00473
00474 if ( checkAttendeesInAddressbook(inc) )
00475 autoAction = acceptMessage(item);
00476 } else return false;
00477 } else {
00478
00479 if ( method==Scheduler::Refresh ) {
00480 if ( KOPrefs::instance()->mIMIPAutoRefresh==KOPrefs::addressbookAuto ) {
00481
00482 if ( checkAttendeesInAddressbook(inc) )
00483 autoAction = acceptMessage(item);
00484 else return false;
00485 } else return false;
00486 } else return false;
00487 }
00488 }
00489 }
00490 return autoAction;
00491 }
00492
00493 bool IncomingDialog::checkOrganizerInAddressbook(QString organizer)
00494 {
00495 bool inBook = false;
00496 #ifndef KORG_NOKABC
00497 KABC::AddressBook *add_book = KABC::StdAddressBook::self();
00498 KABC::Addressee::List addressList;
00499 addressList = add_book->findByEmail(organizer);
00500 if ( addressList.size()>0 ) inBook = true;
00501 #endif
00502 return inBook;
00503 }
00504
00505 bool IncomingDialog::checkAttendeesInAddressbook(IncidenceBase *inc)
00506 {
00507 bool inBook = false;
00508 #ifndef KORG_NOKABC
00509 KABC::AddressBook *add_book = KABC::StdAddressBook::self();
00510 KABC::Addressee::List addressList;
00511 QPtrList <Attendee> attendees;
00512 Attendee *att;
00513 attendees = inc->attendees();
00514 for (att=attendees.first();att;att=attendees.next()) {
00515 addressList = add_book->findByEmail(att->email());
00516 if (addressList.size()>0 ) inBook = true;
00517 }
00518 #endif
00519 return inBook;
00520 }
00521
00522 #include "incomingdialog.moc"