korganizer Library API Documentation

outgoingdialog.cpp

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