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