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