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 #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
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
00058
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
00067
00068 if(ev->type()=="Event") {
00069 Event *event = static_cast<Event *>(ev);
00070
00071 setText(1,event->dtStartDateStr());
00072 if (event->doesFloat()) {
00073 setText(2,i18n("no time"));
00074 setText(4,i18n("no time"));
00075 } else {
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
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
00109
00110 if(ev->type() == "FreeBusy") {
00111 FreeBusy *freebusy = static_cast<FreeBusy *>(ev);
00112
00113 setText(1,freebusy->dtStartDateStr());
00114 setText(2,freebusy->dtStartTimeStr());
00115
00116 setText(3,KGlobal::locale()->formatDate( freebusy->dtEnd().date() ) );
00117 setText(4,KGlobal::locale()->formatTime( freebusy->dtEnd().time() ) );
00118 }
00119
00120
00121
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
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"