summaryrefslogtreecommitdiffabout
path: root/korganizer/incomingdialog.cpp
Unidiff
Diffstat (limited to 'korganizer/incomingdialog.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--korganizer/incomingdialog.cpp527
1 files changed, 527 insertions, 0 deletions
diff --git a/korganizer/incomingdialog.cpp b/korganizer/incomingdialog.cpp
new file mode 100644
index 0000000..490d21e
--- a/dev/null
+++ b/korganizer/incomingdialog.cpp
@@ -0,0 +1,527 @@
1/*
2 This file is part of KOrganizer.
3 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org>
4
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version.
9
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18*/
19
20#include <qlistview.h>
21#include <qfile.h>
22#include <qdir.h>
23#include <qmap.h>
24
25#include <kglobal.h>
26#include <klocale.h>
27#include <kdebug.h>
28#include <kstandarddirs.h>
29#include <kmessagebox.h>
30
31#include <libkcal/incidence.h>
32#include <libkcal/event.h>
33#include <libkcal/calendar.h>
34#include <libkcal/freebusy.h>
35#include <libkcal/attendee.h>
36#include <libkcal/calendarresources.h>
37#include <libkcal/resourcecalendar.h>
38#include <kresources/resourceselectdialog.h>
39
40#ifndef KORG_NOMAIL
41#include "mailscheduler.h"
42#else
43#include <libkcal/dummyscheduler.h>
44#endif
45
46
47#include "incomingdialog.h"
48#include "koeventviewerdialog.h"
49#include "kocounterdialog.h"
50#include "koprefs.h"
51
52#ifndef KORG_NOKABC
53#include <kabc/stdaddressbook.h>
54#define size count
55#endif
56
57
58ScheduleItemIn::ScheduleItemIn(QListView *parent,IncidenceBase *ev,
59 Scheduler::Method method,ScheduleMessage::Status status)
60 : QListViewItem(parent)
61{
62 mIncidence = ev;
63 mMethod = method;
64 mStatus = status;
65 setText(6,Scheduler::translatedMethodName(mMethod)+" ");
66 setText(7,ScheduleMessage::statusName(status));
67}
68
69
70/* Visitor */
71ScheduleItemVisitor::ScheduleItemVisitor(ScheduleItemIn *item)
72{
73 mItem = item;
74}
75
76ScheduleItemVisitor::~ScheduleItemVisitor()
77{
78}
79
80bool ScheduleItemVisitor::visit(Event *e)
81{
82 mItem->setText(0,e->summary());
83 mItem->setText(1,e->dtStartDateStr());
84 if (e->doesFloat()) {
85 mItem->setText(2,i18n("no time "));
86 mItem->setText(4,i18n("no time "));
87 }
88 else {
89 mItem->setText(2,e->dtStartTimeStr());
90 mItem->setText(4,e->dtEndTimeStr());
91 }
92 if (e->hasEndDate()) {
93 mItem->setText(3,e->dtEndDateStr());
94 }
95 else {
96 mItem->setText(3,"");
97 }
98 mItem->setText(5,e->organizer()+" ");
99
100 return true;
101}
102
103bool ScheduleItemVisitor::visit(Todo *e)
104{
105 mItem->setText(0,e->summary());
106 if (e->hasStartDate()) {
107 mItem->setText(1,e->dtStartDateStr());
108 if (!e->doesFloat()) {
109 mItem->setText(2,e->dtStartTimeStr());
110 }
111 }
112 if (e->hasDueDate()) {
113 mItem->setText(1,e->dtDueDateStr());
114 if (!e->doesFloat()) {
115 mItem->setText(2,e->dtDueTimeStr());
116 }
117 }
118 mItem->setText(5,e->organizer()+" ");
119
120 return true;
121}
122
123bool ScheduleItemVisitor::visit(Journal *)
124{
125 return false;
126}
127
128
129/*
130 * Constructs a IncomingDialog which is a child of 'parent', with the
131 * name 'name' and widget flags set to 'f'
132 *
133 * The dialog will by default be modeless, unless you set 'modal' to
134 * TRUE to construct a modal dialog.
135 */
136IncomingDialog::IncomingDialog(Calendar *calendar,OutgoingDialog *outgoing,
137 QWidget* parent,const char* name,bool modal,WFlags fl) :
138 IncomingDialog_base(parent,name,modal,fl)
139{
140 mCalendar = calendar;
141 mOutgoing = outgoing;
142#ifndef KORG_NOMAIL
143 mScheduler = new MailScheduler(mCalendar);
144#else
145 mScheduler = new DummyScheduler(mCalendar);
146#endif
147 mMessageListView->setColumnAlignment(1,AlignHCenter);
148 mMessageListView->setColumnAlignment(2,AlignHCenter);
149 mMessageListView->setColumnAlignment(3,AlignHCenter);
150 mMessageListView->setColumnAlignment(4,AlignHCenter);
151 QObject::connect(mMessageListView,SIGNAL(doubleClicked(QListViewItem *)),
152 this,SLOT(showEvent(QListViewItem *)));
153 retrieve();
154}
155
156/*
157 * Destroys the object and frees any allocated resources
158 */
159IncomingDialog::~IncomingDialog()
160{
161 // no need to delete child widgets, Qt does it all for us
162}
163
164void IncomingDialog::setOutgoingDialog(OutgoingDialog *outgoing)
165{
166 mOutgoing = outgoing;
167}
168
169void IncomingDialog::retrieve()
170{
171 QPtrList <ScheduleMessage> messages = mScheduler->retrieveTransactions();
172
173 ScheduleMessage *message;
174 for(message = messages.first();message;message = messages.next()) {
175 IncidenceBase *inc = message->event();
176 Scheduler::Method method = (Scheduler::Method)message->method();
177 ScheduleMessage::Status status = message->status();
178
179 ScheduleItemIn *item = new ScheduleItemIn(mMessageListView,inc,method,status);
180 if(inc->type()!="FreeBusy") {
181 Incidence *incidence = static_cast<Incidence *>(inc);
182 ScheduleItemVisitor v(item);
183 if (!incidence->accept(v)) delete item;
184 } else {
185 FreeBusy *fb = static_cast<FreeBusy *>(item->event());
186 item->setText(0, "FreeBusy");
187 item->setText(1, KGlobal::locale()->formatDate( fb->dtStart().date() ) );
188 item->setText(2, KGlobal::locale()->formatTime( fb->dtStart().time() ) );
189 item->setText(3, KGlobal::locale()->formatDate( fb->dtEnd().date() ) );
190 item->setText(4, KGlobal::locale()->formatTime( fb->dtEnd().time() ) );
191 item->setText(5, fb->organizer());
192 }
193 automaticAction(item);
194 }
195 emit numMessagesChanged(mMessageListView->childCount());
196}
197
198void IncomingDialog::acceptAllMessages()
199{
200 bool success = false;
201
202 ScheduleItemIn *item = (ScheduleItemIn *)mMessageListView->firstChild();
203 while(item) {
204 ScheduleItemIn *nextitem = (ScheduleItemIn *)(item->nextSibling());
205 if (acceptMessage(item)) success = true;
206 item = nextitem;
207 }
208
209 if (success) emit calendarUpdated();
210}
211
212void IncomingDialog::acceptMessage()
213{
214 ScheduleItemIn *item = (ScheduleItemIn *)mMessageListView->selectedItem();
215 if (item) {
216 if (acceptMessage(item)) emit calendarUpdated();
217 }
218}
219
220bool IncomingDialog::acceptMessage(ScheduleItemIn *item)
221{
222 switch (item->method()) {
223 case Scheduler::Refresh:
224 return incomeRefresh(item);
225 break;
226 case Scheduler::Counter:
227 return incomeCounter(item);
228 break;
229 case Scheduler::Declinecounter:
230 return incomeDeclineCounter(item);
231 break;
232 case Scheduler::Add:
233 return incomeAdd(item);
234 break;
235 case Scheduler::Request:
236 return incomeRequest(item);
237 break;
238 default:
239 return incomeDefault(item);
240 }
241 return false;
242}
243
244void IncomingDialog::rejectMessage()
245{
246 ScheduleItemIn *item = (ScheduleItemIn *)mMessageListView->selectedItem();
247 if (item) {
248 mScheduler->deleteTransaction(item->event());
249 delete item;
250 emit numMessagesChanged(mMessageListView->childCount());
251 }
252}
253
254void IncomingDialog::showEvent(QListViewItem *item)
255{
256 IncidenceBase *incidence = ((ScheduleItemIn *)item)->event();
257 if( incidence && incidence->type() == "Event" ) {
258 Event *event = static_cast<Event *>(incidence);
259 KOEventViewerDialog *eventViewer = new KOEventViewerDialog(this);
260 eventViewer->setEvent(event);
261 eventViewer->show();
262 }
263}
264
265bool IncomingDialog::incomeRefresh(ScheduleItemIn *item)
266{
267 Event *ev = mCalendar->event(item->event()->uid());
268 if (ev) {
269 //user interaction before??
270 Attendee *att;
271 QPtrList<Attendee> attlist = ev->attendees();
272 for (att=attlist.first(); att; att=attlist.next()) {
273 Event *event = new Event(*ev);
274 mOutgoing->addMessage(event,Scheduler::Request,att->email());
275 delete(event);
276 }
277 mScheduler->deleteTransaction(item->event());
278 delete item;
279 emit numMessagesChanged(mMessageListView->childCount());
280 return true;
281 }
282 mScheduler->deleteTransaction(item->event());
283 delete item;
284 emit numMessagesChanged(mMessageListView->childCount());
285 return false;
286}
287
288bool IncomingDialog::incomeCounter(ScheduleItemIn *item)
289{
290 IncidenceBase *incidence = ((ScheduleItemIn *)item)->event();
291 // currently only events supportet - attetion at insertion below!
292 if ( incidence->type() != "Event" ) return false;
293
294 Event *counterEvent = static_cast<Event *>( incidence );
295
296 Event *even = mCalendar->event(counterEvent->uid());
297
298 KOCounterDialog *eventViewer = new KOCounterDialog(this);
299 eventViewer->addText(i18n("counter proposal event","<b>Counter-event:</b><p>"));
300 eventViewer->addEvent(counterEvent);
301 eventViewer->addText("<hr>");
302 eventViewer->addText(i18n("<b>Original event:</b><p>"));
303 if (even) eventViewer->addEvent(even);
304 else eventViewer->addText(i18n("A corresponding event is missing in your calendar!"));
305 eventViewer->addText("<hr>");
306 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"));
307 eventViewer->show();
308
309 eventViewer->exec();
310 if (eventViewer->result()) {
311 kdDebug() << "IncomingDialog::Counter:Accept" << endl;
312 int revision = 0;
313 if (even) {
314 revision = even->revision();
315 mCalendar->deleteEvent(even);
316 }
317 mCalendar->addIncidence(counterEvent);
318
319 even = mCalendar->event(item->event()->uid());
320 if (even) {
321 if (revision < even->revision())
322 even->setRevision(even->revision()+1);
323 else
324 even->setRevision(revision+1);
325 Event *ev = new Event(*even);
326 mOutgoing->addMessage(ev,Scheduler::Request);
327 delete(ev);
328 }
329 mScheduler->deleteTransaction(item->event());
330 delete item;
331 emit numMessagesChanged(mMessageListView->childCount());
332 return true;
333 } else {
334 kdDebug() << "IncomingDialog::Counter:Decline" << endl;
335 //the counter-sender's email is missing...
336 //now every attendee gets an declinecounter :-(
337 mOutgoing->addMessage(counterEvent,Scheduler::Declinecounter);
338 delete item;
339 emit numMessagesChanged(mMessageListView->childCount());
340 mScheduler->deleteTransaction(item->event());
341 delete item;
342 emit numMessagesChanged(mMessageListView->childCount());
343 return true;
344 }
345 //mScheduler->deleteTransaction(item->event());
346 delete item;
347 emit numMessagesChanged(mMessageListView->childCount());
348 return false;
349}
350
351bool IncomingDialog::incomeDeclineCounter(ScheduleItemIn *item)
352{
353 Event *even = mCalendar->event(item->event()->uid());
354 if (even) {
355 mOutgoing->addMessage(even,Scheduler::Refresh);
356 mScheduler->deleteTransaction(item->event());
357 delete item;
358 emit numMessagesChanged(mMessageListView->childCount());
359 return true;
360 }
361 mScheduler->deleteTransaction(item->event());
362 delete item;
363 emit numMessagesChanged(mMessageListView->childCount());
364 return false;
365}
366
367bool IncomingDialog::incomeAdd(ScheduleItemIn *item)
368{
369 IncidenceBase *incidence = ((ScheduleItemIn *)item)->event();
370 if (incidence->type() == "Event" ) {
371 Event *refr = static_cast<Event *>( incidence );
372 mOutgoing->addMessage(refr,Scheduler::Refresh);
373 mScheduler->deleteTransaction( incidence );
374 delete item;
375 emit numMessagesChanged(mMessageListView->childCount());
376 return true;
377 }
378 else {
379 kdDebug() << "IncomingDialog::incomeAdd - only Events are supportet yet" << endl;
380 mScheduler->deleteTransaction( incidence );
381 delete item;
382 emit numMessagesChanged(mMessageListView->childCount());
383 return false;
384 }
385}
386
387bool IncomingDialog::incomeDefault(ScheduleItemIn *item)
388{
389 if (mScheduler->acceptTransaction(item->event(),item->method(),item->status())) {
390 delete item;
391 emit numMessagesChanged(mMessageListView->childCount());
392 return true;
393 }
394 else {
395 KMessageBox::error(this,i18n("Unable to accept the IMIP-message. It may be a problem with the email addresses."));
396 kdDebug() << "IncomingDialog::acceptMessage(): Error!" << endl;
397 return false;
398 }
399 return false;
400}
401
402bool IncomingDialog::incomeRequest(ScheduleItemIn *item)
403{
404 if (item->event()->type()=="FreeBusy") {
405 //handel freebusy request
406 IncidenceBase *inc = item->event();
407 QDateTime start = inc->dtStart();
408 QDateTime end = start.addDays(inc->duration()/86400);
409
410 FreeBusy *freebusy = new FreeBusy(mCalendar, start, end);
411 freebusy->setOrganizer(inc->organizer());
412 Attendee *att = new Attendee(KOPrefs::instance()->fullName(),
413 KOPrefs::instance()->email());
414 freebusy->addAttendee(att);
415
416 kdDebug() << "calendarview: schedule_publish_freebusy: startDate: "
417 << KGlobal::locale()->formatDateTime( start ) << " End Date: "
418 << KGlobal::locale()->formatDateTime( end ) << endl;
419
420 if (mOutgoing->addMessage(freebusy,Scheduler::Reply)) {
421 delete item;
422 emit numMessagesChanged(mMessageListView->childCount());
423 delete(freebusy);
424 return true;
425 }
426 return false;
427 } else {
428 return incomeDefault(item);
429 }
430 return false;
431}
432
433bool IncomingDialog::automaticAction(ScheduleItemIn *item)
434{
435 bool autoAction = false;
436 IncidenceBase *inc = item->event();
437 Scheduler::Method method = item->method();
438
439 if( inc->type()=="FreeBusy" ) {
440 if ( method==Scheduler::Request ) {
441 if ( KOPrefs::instance()->mIMIPAutoFreeBusy==KOPrefs::addressbookAuto ) {
442 // reply freebusy information
443 if ( checkOrganizerInAddressbook(inc->organizer()) ) {
444 incomeRequest(item);
445 }
446 } else return false;
447 } else {
448
449 if ( method==Scheduler::Reply ) {
450 if ( KOPrefs::instance()->mIMIPAutoFreeBusy==KOPrefs::addressbookAuto ) {
451 // insert freebusy information
452 //if ( checkAttendeesInAddressbook(inc) )
453
454 } else return false;
455 } else {
456 if ( method==Scheduler::Publish) {
457 if ( KOPrefs::instance()->mIMIPAutoFreeBusy==KOPrefs::addressbookAuto ) {
458 // insert freebusy information
459 //if ( checkOrganizerInAddressbook(inc->organizer()) )
460
461 }
462 } else return false;
463 }
464 }
465 }
466
467 if ( inc->type()=="Event" ) {
468 if ( method==Scheduler::Request || method==Scheduler::Publish ) {
469 if ( KOPrefs::instance()->mIMIPAutoInsertRequest==KOPrefs::addressbookAuto ) {
470 // insert event
471 if ( checkOrganizerInAddressbook(inc->organizer()) )
472 autoAction = acceptMessage(item);
473 } else return false;
474 } else {
475
476 if ( method==Scheduler::Reply ) {
477 if ( KOPrefs::instance()->mIMIPAutoInsertReply==KOPrefs::addressbookAuto ) {
478 // update event information
479 if ( checkAttendeesInAddressbook(inc) )
480 autoAction = acceptMessage(item);
481 } else return false;
482 } else {
483
484 if ( method==Scheduler::Refresh ) {
485 if ( KOPrefs::instance()->mIMIPAutoRefresh==KOPrefs::addressbookAuto ) {
486 // send refresh-information
487 if ( checkAttendeesInAddressbook(inc) )
488 autoAction = acceptMessage(item);
489 else return false;
490 } else return false;
491 } else return false;
492 }
493 }
494 }
495 return autoAction;
496}
497
498bool IncomingDialog::checkOrganizerInAddressbook(QString organizer)
499{
500 bool inBook = false;
501#ifndef KORG_NOKABC
502 KABC::AddressBook *add_book = KABC::StdAddressBook::self();
503 KABC::Addressee::List addressList;
504 addressList = add_book->findByEmail(organizer);
505 if ( addressList.size()>0 ) inBook = true;
506#endif
507 return inBook;
508}
509
510bool IncomingDialog::checkAttendeesInAddressbook(IncidenceBase *inc)
511{
512 bool inBook = false;
513#ifndef KORG_NOKABC
514 KABC::AddressBook *add_book = KABC::StdAddressBook::self();
515 KABC::Addressee::List addressList;
516 QPtrList <Attendee> attendees;
517 Attendee *att;
518 attendees = inc->attendees();
519 for (att=attendees.first();att;att=attendees.next()) {
520 addressList = add_book->findByEmail(att->email());
521 if (addressList.size()>0 ) inBook = true;
522 }
523#endif
524 return inBook;
525}
526
527#include "incomingdialog.moc"