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