korganizer Library API Documentation

incomingdialog.cpp

00001 /*
00002     This file is part of KOrganizer.
00003     Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org>
00004 
00005     This program is free software; you can redistribute it and/or modify
00006     it under the terms of the GNU General Public License as published by
00007     the Free Software Foundation; either version 2 of the License, or
00008     (at your option) any later version.
00009 
00010     This program is distributed in the hope that it will be useful,
00011     but WITHOUT ANY WARRANTY; without even the implied warranty of
00012     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
00013     GNU General Public License for more details.
00014 
00015     You should have received a copy of the GNU General Public License
00016     along with this program; if not, write to the Free Software
00017     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
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 /* Visitor */
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  *  Constructs a IncomingDialog which is a child of 'parent', with the
00126  *  name 'name' and widget flags set to 'f'
00127  *
00128  *  The dialog will by default be modeless, unless you set 'modal' to
00129  *  TRUE to construct a modal dialog.
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  *  Destroys the object and frees any allocated resources
00153  */
00154 IncomingDialog::~IncomingDialog()
00155 {
00156     // no need to delete child widgets, Qt does it all for us
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     //user interaction before??
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   //eventViewer->addText(i18n("You received a counterevent<p>"));
00294   //eventViewer->addText(i18n("<hr>"));
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     //the counter-sender's email is missing...
00331     //now every attendee gets an declinecounter :-(
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   //mScheduler->deleteTransaction(item->event());
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     //handel freebusy request
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         // reply freebusy information
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           // insert freebusy information
00447           //if ( checkAttendeesInAddressbook(inc) )
00448 
00449         } else return false;
00450       } else {
00451         if ( method==Scheduler::Publish) {
00452           if ( KOPrefs::instance()->mIMIPAutoFreeBusy==KOPrefs::addressbookAuto ) {
00453             // insert freebusy information
00454             //if ( checkOrganizerInAddressbook(inc->organizer()) )
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         // insert event
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           //  update event information
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             // send refresh-information
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"
KDE Logo
This file is part of the documentation for kdelibs Version 3.1.5.
Documentation copyright © 1996-2002 the KDE developers.
Generated on Sun Feb 15 11:41:08 2004 by doxygen 1.3.5 written by Dimitri van Heesch, © 1997-2001