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 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"