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 sendText += i18n("The organizer %1").arg(item->event()->organizer()); 00286 break; } 00287 case Scheduler::Counter: { 00288 sendText += i18n("The organizer %1").arg(item->event()->organizer()); 00289 break; } 00290 case Scheduler::Declinecounter: { 00291 sendText += i18n("All attendees"); 00292 break; } 00293 case Scheduler::NoMethod: { 00294 sendText += ""; 00295 break; } 00296 default: 00297 sendText = ""; 00298 } 00299 eventViewer->addText(sendText); 00300 eventViewer->show(); 00301 } 00302 } 00303 00304 bool OutgoingDialog::saveMessage(IncidenceBase *incidence,Scheduler::Method method, 00305 const QString &recipients) 00306 { 00307 KTempFile ktfile(locateLocal("data","korganizer/outgoing/"),"ics"); 00308 QString messageText = mFormat->createScheduleMessage(incidence,method); 00309 QTextStream *qts = ktfile.textStream(); 00310 qts->setEncoding( QTextStream::UnicodeUTF8 ); 00311 *qts << messageText; 00312 *qts << "METHOD-BEGIN:" << endl << method << endl << ":METHOD-END" << endl; 00313 *qts << "RECIPIENTS-BEGIN:" << endl << recipients << endl << ":RECIPIENTS-END" << endl; 00314 mMessageMap[incidence]=ktfile.name(); 00315 00316 return true; 00317 } 00318 00319 bool OutgoingDialog::deleteMessage(IncidenceBase *incidence) 00320 { 00321 QFile f( mMessageMap[incidence] ); 00322 mMessageMap.remove(incidence); 00323 if ( !f.exists() ) return false; 00324 else 00325 return f.remove(); 00326 } 00327 00328 void OutgoingDialog::loadMessages() 00329 { 00330 Scheduler::Method method; 00331 QString recipients; 00332 00333 QString outgoingDirName = locateLocal("data","korganizer/outgoing"); 00334 QDir outgoingDir(outgoingDirName); 00335 QStringList outgoing = outgoingDir.entryList(QDir::Files); 00336 QStringList::ConstIterator it; 00337 for(it = outgoing.begin(); it != outgoing.end(); ++it) { 00338 kdDebug(5850) << "-- File: " << (*it) << endl; 00339 QFile f(outgoingDirName + "/" + (*it)); 00340 bool inserted = false; 00341 QMap<IncidenceBase*, QString>::Iterator iter; 00342 for ( iter = mMessageMap.begin(); iter != mMessageMap.end(); ++iter ) { 00343 if (iter.data() == outgoingDirName + "/" + (*it)) inserted = true; 00344 } 00345 if (!inserted) { 00346 if (!f.open(IO_ReadOnly)) { 00347 kdDebug(5850) << "OutgoingDialog::loadMessage(): Can't open file'" 00348 << (*it) << "'" << endl; 00349 } else { 00350 QTextStream t(&f); 00351 t.setEncoding( QTextStream::Latin1 ); 00352 QString messageString = t.read(); 00353 messageString.replace( QRegExp("\n[ \t]"), ""); 00354 messageString = QString::fromUtf8( messageString.latin1() ); 00355 ScheduleMessage *message = mFormat->parseScheduleMessage(mCalendar, 00356 messageString); 00357 int begin_pos = messageString.find("METHOD-BEGIN:"); 00358 begin_pos = messageString.find('\n',begin_pos)+1; 00359 QString meth = messageString.mid(begin_pos,1); 00360 switch (meth.toInt()) { 00361 case 0:method=Scheduler::Publish; break; 00362 case 1:method=Scheduler::Request; break; 00363 case 2:method=Scheduler::Refresh; break; 00364 case 3:method=Scheduler::Cancel; break; 00365 case 4:method=Scheduler::Add; break; 00366 case 5:method=Scheduler::Reply; break; 00367 case 6:method=Scheduler::Counter; break; 00368 case 7:method=Scheduler::Declinecounter; break; 00369 default :method=Scheduler::NoMethod; break; 00370 } 00371 begin_pos = messageString.find("RECIPIENTS-BEGIN:"); 00372 begin_pos = messageString.find('\n',begin_pos)+1; 00373 int end_pos = messageString.find(":RECIPIENTS-END",begin_pos)-1; 00374 recipients = messageString.mid(begin_pos, end_pos-begin_pos); 00375 kdDebug(5850) << "Outgoing::loadMessage(): Recipients: " << recipients << endl; 00376 00377 if (message) { 00378 bool inserted = false; 00379 QMap<IncidenceBase*, QString>::Iterator iter; 00380 for ( iter = mMessageMap.begin(); iter != mMessageMap.end(); ++iter ) { 00381 if (iter.data() == outgoingDirName + "/" + (*it)) inserted = true; 00382 } 00383 if (!inserted) { 00384 kdDebug(5850) << "OutgoingDialog::loadMessage(): got message '" 00385 << (*it) << "'" << endl; 00386 IncidenceBase *inc = message->event(); 00387 new ScheduleItemOut(mMessageListView,inc,method,recipients); 00388 mMessageMap[message->event()]=outgoingDirName + "/" + (*it); 00389 } 00390 } else { 00391 QString errorMessage; 00392 if (mFormat->exception()) { 00393 errorMessage = mFormat->exception()->message(); 00394 } 00395 kdDebug(5850) << "OutgoingDialog::loadMessage(): Error parsing " 00396 "message: " << errorMessage << endl; 00397 } 00398 f.close(); 00399 } 00400 } 00401 } 00402 emit numMessagesChanged(mMessageListView->childCount()); 00403 } 00404 00405 void OutgoingDialog::setDocumentId( const QString &id ) 00406 { 00407 mDocPrefs->setDoc( id ); 00408 } 00409 00410 #include "outgoingdialog.moc"
KDE Logo
This file is part of the documentation for korganizer Library Version 3.3.0.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Fri Oct 1 15:19:32 2004 by doxygen 1.3.7 written by Dimitri van Heesch, © 1997-2003