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