korganizer Library API Documentation

outgoingdialog.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 <kdebug.h>
00021 
00022 #include <qfile.h>
00023 #include <qdir.h>
00024 #include <qtextstream.h>
00025 
00026 #include <kglobal.h>
00027 #include <klocale.h>
00028 #include <ktempfile.h>
00029 #include <kstandarddirs.h>
00030 
00031 #include <libkcal/event.h>
00032 #include <libkcal/freebusy.h>
00033 //#include <libkcal/imipscheduler.h>
00034 #include <libkcal/dummyscheduler.h>
00035 #include <libkcal/icalformat.h>
00036 #include <libkcal/calendar.h>
00037 
00038 #ifndef KORG_NOMAIL
00039 #include "mailscheduler.h"
00040 #endif
00041 
00042 #include "koprefs.h"
00043 #include "outgoingdialog.h"
00044 #include "koeventviewerdialog.h"
00045 #include "docprefs.h"
00046 
00047 ScheduleItemOut::ScheduleItemOut(QListView *parent,IncidenceBase *ev,
00048                                  Scheduler::Method method,
00049                                  const QString &recipients)
00050   : QListViewItem(parent)
00051 {
00052   mIncidence = ev;
00053   mMethod = method;
00054   mRecipients = recipients;
00055 
00056   kdDebug() << "ScheduleItemOut: setting the summary" << endl;
00057   //Set the summary
00058   if(ev->type() != "FreeBusy") {
00059     Incidence *incidence = static_cast<Incidence *>(ev);
00060     setText(0,incidence->summary());
00061   } else {
00062     setText(0,i18n("Free Busy Object"));
00063   }
00064 
00065   kdDebug() << "ScheduleItemOut: checking if the object is an event" << endl;
00066   //If the object is an event
00067   if(ev->type()=="Event") {
00068     Event *event = static_cast<Event *>(ev);
00069 
00070     setText(1,event->dtStartDateStr());
00071     if (event->doesFloat()) {  //If the event floats set the start and end times to no time
00072       setText(2,i18n("no time"));
00073       setText(4,i18n("no time"));
00074     } else {  //If it does not float
00075       setText(2,event->dtStartTimeStr());
00076       if (event->hasDuration()) {
00077         setText(4,event->dtEndTimeStr());
00078       } else {
00079         setText(4,i18n("no time"));
00080       }
00081     }
00082     if (event->hasEndDate()) {
00083       setText(3,event->dtEndDateStr());
00084     }
00085     else {
00086        setText(3,i18n("no time"));
00087     }
00088   }
00089 
00090   //If the object is an Todo
00091   if(ev->type()=="Todo") {
00092     Todo *event = static_cast<Todo *>(ev);
00093     if (event->hasStartDate()) {
00094       setText(1,event->dtStartDateStr());
00095       if (!event->doesFloat()) {
00096         setText(2,event->dtStartTimeStr());
00097       }
00098     }
00099     if (event->hasDueDate()) {
00100       setText(3,event->dtDueDateStr());
00101       if (!event->doesFloat()) {
00102         setText(4,event->dtDueTimeStr());
00103       }
00104     }
00105   }
00106 
00107   kdDebug() << "ScheduleItemOut: checking if the object is a FreeBusy object" << endl;
00108   //If the object is a freebusy object
00109   if(ev->type() == "FreeBusy") {
00110     FreeBusy *freebusy = static_cast<FreeBusy *>(ev);
00111 
00112     setText(1,freebusy->dtStartDateStr());
00113     setText(2,freebusy->dtStartTimeStr());
00114     //Must try and get this to the users local settings
00115     setText(3,KGlobal::locale()->formatDate( freebusy->dtEnd().date() ) );
00116     setText(4,KGlobal::locale()->formatTime( freebusy->dtEnd().time() ) );
00117   }
00118 
00119   kdDebug() << "ScheduleItemOut: Setting the method" << endl;
00120   //Set the Method
00121   setText(5,Scheduler::methodName(mMethod));
00122 }
00123 
00124 OutgoingDialog::OutgoingDialog(Calendar *calendar,QWidget* parent,
00125                                const char* name,bool modal,
00126                                WFlags fl)
00127     : OutgoingDialog_base(parent,name,modal,fl)
00128 {
00129   mCalendar = calendar;
00130 
00131   mFormat = new ICalFormat;
00132 
00133   if (KOPrefs::instance()->mIMIPScheduler == KOPrefs::IMIPDummy ) {
00134     kdDebug() << "--- Dummy" << endl;
00135     mScheduler = new DummyScheduler(mCalendar);
00136   } else {
00137 #ifndef KORG_NOMAIL
00138     kdDebug() << "--- Mailer" << endl;
00139     mScheduler = new MailScheduler(mCalendar);
00140 #else
00141     mScheduler = new DummyScheduler(mCalendar);
00142 #endif
00143   }
00144   mMessageListView->setColumnAlignment(1,AlignHCenter);
00145   mMessageListView->setColumnAlignment(2,AlignHCenter);
00146   mMessageListView->setColumnAlignment(3,AlignHCenter);
00147   mMessageListView->setColumnAlignment(4,AlignHCenter);
00148   QObject::connect(mMessageListView,SIGNAL(doubleClicked(QListViewItem *)),
00149                    this,SLOT(showEvent(QListViewItem *)));
00150   mDocPrefs = new DocPrefs("groupschedule");
00151   loadMessages();
00152 }
00153 
00154 OutgoingDialog::~OutgoingDialog()
00155 {
00156   kdDebug() << "OutgoingDialog::~OutgoingDialog()" << endl;  
00157   delete mDocPrefs;
00158   delete mFormat;
00159 }
00160 
00161 bool OutgoingDialog::addMessage(IncidenceBase *incidence,Scheduler::Method method)
00162 {
00163   kdDebug() << "Outgoing::addMessage" << "Method:" << method << endl;
00164   if (method == Scheduler::Publish) return false;
00165   if( mDocPrefs ) {
00166     if (method != Scheduler::Cancel) {
00167       mDocPrefs->writeEntry( incidence->uid()+"-scheduled", true );
00168     } else {
00169       if (!mDocPrefs->readBoolEntry(incidence->uid()+"-scheduled") )
00170         return true;
00171     }
00172   }
00173 
00174   if (KOPrefs::instance()->mIMIPSend == KOPrefs::IMIPOutbox) {
00175     new ScheduleItemOut(mMessageListView,incidence,method);
00176     saveMessage(incidence,method);
00177     emit numMessagesChanged(mMessageListView->childCount());
00178   }
00179   else {
00180     mScheduler->performTransaction(incidence,method);
00181   }
00182   return true;
00183 }
00184 
00185 bool OutgoingDialog::addMessage(IncidenceBase *incidence,Scheduler::Method method,
00186                                 const QString &recipients)
00187 {
00188   //if (method != Scheduler::Publish) return false;
00189   if( mDocPrefs ) {
00190     if (method != Scheduler::Cancel) {
00191       mDocPrefs->writeEntry( incidence->uid()+"-scheduled", true );
00192     } else {
00193       if (!mDocPrefs->readBoolEntry(incidence->uid()+"-scheduled") )
00194         return true;
00195     }
00196   }
00197   if (KOPrefs::instance()->mIMIPSend == KOPrefs::IMIPOutbox) {
00198     new ScheduleItemOut(mMessageListView,incidence,method,recipients);
00199     saveMessage(incidence,method,recipients);
00200     emit numMessagesChanged(mMessageListView->childCount());
00201   }
00202   else {
00203     mScheduler->performTransaction(incidence,method,recipients);
00204   }
00205   return true;
00206 }
00207 
00208 void OutgoingDialog::send()
00209 {
00210   kdDebug() << "OutgoingDialog::send" << endl;
00211   ScheduleItemOut *item = (ScheduleItemOut *)(mMessageListView->firstChild());
00212   while(item) {
00213     bool success;
00214     if (item->method() == Scheduler::Publish) {
00215       success = mScheduler->publish(item->event(),item->recipients());
00216     } else {
00217       success = mScheduler->performTransaction(item->event(),item->method());
00218     }
00219     ScheduleItemOut *oldItem = item;
00220     item = (ScheduleItemOut *)(item->nextSibling());
00221     if (success) {
00222       deleteMessage(oldItem->event());
00223       delete (oldItem->event());
00224       delete oldItem;
00225     }
00226   }
00227 
00228   emit numMessagesChanged(mMessageListView->childCount());
00229 }
00230 
00231 void OutgoingDialog::deleteItem()
00232 {
00233   ScheduleItemOut *item = (ScheduleItemOut *)(mMessageListView->selectedItem());
00234   if(!item)
00235       return;
00236   deleteMessage(item->event());
00237   delete(item->event());
00238   mMessageListView->takeItem(item);
00239   emit numMessagesChanged(mMessageListView->childCount());
00240 }
00241 
00242 void OutgoingDialog::showEvent(QListViewItem *qitem)
00243 {
00244   ScheduleItemOut *item = (ScheduleItemOut *)qitem;
00245   Event *event = 0;
00246   Todo *todo = 0;
00247   if ( item->event()->type()=="Event" ) {
00248     event = static_cast<Event *>(item->event());
00249   }
00250   if ( item->event()->type()=="Todo" ) {
00251     todo = static_cast<Todo *>(item->event());
00252   }
00253   QString sendText;
00254   if (event || todo) {
00255     KOEventViewerDialog *eventViewer = new KOEventViewerDialog(this);
00256     if (event) eventViewer->setEvent(event);
00257     if (todo) eventViewer->setTodo(todo);
00258     sendText = "<hr><h4>"+i18n("Event will be sent to:")+"</h4>";
00259     switch (item->method()) {
00260     case Scheduler::Publish: {
00261       sendText += item->recipients();
00262       break; }
00263     case Scheduler::Request: {
00264       sendText += i18n("All attendees");
00265       break; }
00266     case Scheduler::Refresh: {
00267       sendText += i18n("All attendees");
00268       break; }
00269     case Scheduler::Cancel: {
00270       sendText += i18n("All attendees");
00271       break; }
00272     case Scheduler::Add: {
00273       sendText += i18n("All attendees");
00274       break; }
00275     case Scheduler::Reply: {
00276       sendText += i18n("The organizer %1").arg(item->event()->organizer());
00277       break; }
00278     case Scheduler::Counter: {
00279       sendText += i18n("The organizer %1").arg(item->event()->organizer());
00280       break; }
00281     case Scheduler::Declinecounter: {
00282       sendText += i18n("All attendees");
00283       break; }
00284     case Scheduler::NoMethod: {
00285       sendText += "";
00286       break; }
00287     default:
00288       sendText = "";
00289     }
00290     eventViewer->addText(sendText);
00291     eventViewer->show();
00292   }
00293 }
00294 
00295 bool OutgoingDialog::saveMessage(IncidenceBase *incidence,Scheduler::Method method,
00296           const QString &recipients)
00297 {
00298   KTempFile ktfile(locateLocal("data","korganizer/outgoing/"),"ics");
00299   QString messageText = mFormat->createScheduleMessage(incidence,method);
00300   QTextStream *qts = ktfile.textStream();
00301   *qts << messageText;
00302   *qts << "METHOD-BEGIN:" << endl << method << endl << ":METHOD-END" << endl;
00303   *qts << "RECIPIENTS-BEGIN:" << endl << recipients << endl << ":RECIPIENTS-END" << endl;
00304   mMessageMap[incidence]=ktfile.name();
00305 
00306   return true;
00307 }
00308 
00309 bool OutgoingDialog::deleteMessage(IncidenceBase *incidence)
00310 {
00311   QFile f( mMessageMap[incidence] );
00312   mMessageMap.remove(incidence);
00313   if ( !f.exists() ) return false;
00314   else
00315     return f.remove();
00316 }
00317 
00318 void OutgoingDialog::loadMessages()
00319 {
00320   Scheduler::Method method;
00321   QString recipients;
00322 
00323   QString outgoingDirName = locateLocal("appdata","outgoing");
00324   QDir outgoingDir(outgoingDirName);
00325   QStringList outgoing = outgoingDir.entryList(QDir::Files);
00326   QStringList::ConstIterator it;
00327   for(it = outgoing.begin(); it != outgoing.end(); ++it) {
00328     kdDebug() << "-- File: " << (*it) << endl;
00329     QFile f(outgoingDirName + "/" + (*it));
00330     bool inserted = false;
00331     QMap<IncidenceBase*, QString>::Iterator iter;
00332     for ( iter = mMessageMap.begin(); iter != mMessageMap.end(); ++iter ) {
00333       if (iter.data() == outgoingDirName + "/" + (*it)) inserted = true;
00334     }
00335     if (!inserted) {
00336     if (!f.open(IO_ReadOnly)) {
00337       kdDebug() << "OutgoingDialog::loadMessage(): Can't open file'"
00338                 << (*it) << "'" << endl;
00339     } else {
00340       QTextStream t(&f);
00341       QString messageString = t.read();
00342       ScheduleMessage *message = mFormat->parseScheduleMessage(mCalendar,
00343                                                                messageString);
00344       int begin_pos = messageString.find("METHOD-BEGIN:");
00345       begin_pos = messageString.find('\n',begin_pos)+1;
00346       QString meth = messageString.mid(begin_pos,1);
00347       switch (meth.toInt()) {
00348         case 0:method=Scheduler::Publish; break;
00349         case 1:method=Scheduler::Request; break;
00350         case 2:method=Scheduler::Refresh; break;
00351         case 3:method=Scheduler::Cancel; break;
00352         case 4:method=Scheduler::Add; break;
00353         case 5:method=Scheduler::Reply; break;
00354         case 6:method=Scheduler::Counter; break;
00355         case 7:method=Scheduler::Declinecounter; break;
00356         default :method=Scheduler::NoMethod; break;
00357       }
00358       begin_pos = messageString.find("RECIPIENTS-BEGIN:");
00359       begin_pos = messageString.find('\n',begin_pos)+1;
00360       int end_pos = messageString.find(":RECIPIENTS-END",begin_pos)-1;
00361       recipients = messageString.mid(begin_pos, end_pos-begin_pos);
00362       kdDebug() << "Outgoing::loadMessage(): Recipients: " << recipients << endl;
00363 
00364       if (message) {
00365         bool inserted = false;
00366         QMap<IncidenceBase*, QString>::Iterator iter;
00367         for ( iter = mMessageMap.begin(); iter != mMessageMap.end(); ++iter ) {
00368           if (iter.data() == outgoingDirName + "/" + (*it)) inserted = true;
00369         }
00370         if (!inserted) {
00371           kdDebug() << "OutgoingDialog::loadMessage(): got message '"
00372                     << (*it) << "'" << endl;
00373           IncidenceBase *inc = message->event();
00374           new ScheduleItemOut(mMessageListView,inc,method,recipients);
00375           mMessageMap[message->event()]=outgoingDirName + "/" + (*it);
00376         }
00377       } else {
00378         QString errorMessage;
00379         if (mFormat->exception()) {
00380           errorMessage = mFormat->exception()->message();
00381         }
00382         kdDebug() << "OutgoingDialog::loadMessage(): Error parsing "
00383                      "message: " << errorMessage << endl;
00384       }
00385       f.close();
00386     }
00387     }
00388   }
00389   emit numMessagesChanged(mMessageListView->childCount());
00390 }
00391 
00392 void OutgoingDialog::setDocumentId( const QString &id )
00393 {
00394   mDocPrefs->setDoc( id );
00395 }
00396 
00397 #include "outgoingdialog.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:10 2004 by doxygen 1.3.5 written by Dimitri van Heesch, © 1997-2001