00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
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
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
00066
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
00075
00076 if(ev->type()=="Event") {
00077 Event *event = static_cast<Event *>(ev);
00078
00079 setText(1,event->dtStartDateStr());
00080 if (event->doesFloat()) {
00081 setText(2,i18n("no time"));
00082 setText(4,i18n("no time"));
00083 } else {
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
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
00117
00118 if(ev->type() == "FreeBusy") {
00119 FreeBusy *freebusy = static_cast<FreeBusy *>(ev);
00120
00121 setText(1,freebusy->dtStartDateStr());
00122 setText(2,freebusy->dtStartTimeStr());
00123
00124 setText(3,KGlobal::locale()->formatDate( freebusy->dtEnd().date() ) );
00125 setText(4,KGlobal::locale()->formatTime( freebusy->dtEnd().time() ) );
00126 }
00127
00128
00129
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
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"