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 Wed Jul 28 23:58:14 2004 by doxygen 1.3.7 written by Dimitri van Heesch, © 1997-2003