00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include <qfile.h>
00021
00022 #include <kapplication.h>
00023 #include <kconfig.h>
00024 #include <kstandarddirs.h>
00025
00026 #include <kurl.h>
00027 #include <kdebug.h>
00028
00029 #include <kmessagebox.h>
00030 #include <klocale.h>
00031 #include <kaction.h>
00032 #include <kglobal.h>
00033
00034 #include "korganizer/korganizer.h"
00035 #include "korganizer/calendarview.h"
00036
00037 #include <exchangeclient.h>
00038 #include <exchangeaccount.h>
00039
00040 #include "exchange.h"
00041 #include "exchangedialog.h"
00042 #include "exchangeconfig.h"
00043
00044
00045 using namespace KCal;
00046
00047 class ExchangeFactory : public KOrg::PartFactory {
00048 public:
00049 KOrg::Part *create(KOrg::MainWindow *parent, const char *name)
00050 {
00051 kdDebug(5850) << "Registering Exchange Plugin...\n";
00052 KGlobal::locale()->insertCatalogue("libkpimexchange");
00053 return new Exchange(parent,name);
00054 }
00055 };
00056
00057 K_EXPORT_COMPONENT_FACTORY( libkorg_exchange, ExchangeFactory )
00058
00059 Exchange::Exchange(KOrg::MainWindow *parent, const char *name) :
00060 KOrg::Part(parent,name)
00061 {
00062 setInstance( new KInstance( "korganizer" ) );
00063
00064 kdDebug(5850) << "Creating Exchange Plugin...\n";
00065
00066 mAccount = new KPIM::ExchangeAccount( "Calendar/Exchange Plugin" );
00067 mClient = new KPIM::ExchangeClient( mAccount );
00068 mClient->setWindow( parent->topLevelWidget() );
00069
00070 setXMLFile("plugins/exchangeui.rc");
00071
00072 new KAction(i18n("&Download..."), 0, this, SLOT(download()),
00073 actionCollection(), "exchange_download");
00074
00075 KAction *action = new KAction(i18n("&Upload Event..."), 0, this, SLOT(upload()),
00076 actionCollection(), "exchange_upload");
00077 QObject::connect(mainWindow()->view(),SIGNAL(incidenceSelected(Incidence *)),
00078 this, SLOT(slotIncidenceSelected(Incidence *)));
00079 action->setEnabled( false );
00080 QObject::connect(this,SIGNAL(enableIncidenceActions(bool)),
00081 action,SLOT(setEnabled(bool)));
00082
00083 action = new KAction(i18n("De&lete Event"), 0, this, SLOT(remove()),
00084 actionCollection(), "exchange_delete");
00085 QObject::connect(this,SIGNAL(enableIncidenceActions(bool)),
00086 action,SLOT(setEnabled(bool)));
00087 action->setEnabled( false );
00088
00089 new KAction(i18n("&Configure..."), 0, this, SLOT(configure()),
00090 actionCollection(), "exchange_configure");
00091
00092 connect( this, SIGNAL( calendarChanged() ), mainWindow()->view(), SLOT( updateView() ) );
00093 connect( this, SIGNAL( calendarChanged(const QDate &, const QDate &)),
00094 mainWindow()->view(), SLOT(updateView(const QDate &, const QDate &)) );
00095 }
00096
00097 Exchange::~Exchange()
00098 {
00099 kdDebug(5850) << "Exchange Plugin destructor" << endl;
00100 }
00101
00102 QString Exchange::info()
00103 {
00104 return i18n("This plugin imports and export calendar events from/to a Microsoft Exchange 2000 Server.");
00105 }
00106
00107 QString Exchange::shortInfo()
00108 {
00109 return i18n("Exchange Plugin");
00110 }
00111
00112 void Exchange::slotIncidenceSelected( Incidence *incidence )
00113 {
00114 emit enableIncidenceActions( incidence != 0 );
00115 }
00116
00117 void Exchange::download()
00118 {
00119 ExchangeDialog dialog( mainWindow()->view()->startDate(), mainWindow()->view()->endDate() );
00120
00121 if (dialog.exec() != QDialog::Accepted )
00122 return;
00123
00124 QDate start = dialog.m_start->date();
00125 QDate end = dialog.m_end->date();
00126
00127 KCal::Calendar* calendar = mainWindow()->view()->calendar();
00128
00129 int result = mClient->downloadSynchronous(calendar, start, end, true );
00130
00131 if ( result == KPIM::ExchangeClient::ResultOK )
00132 emit calendarChanged();
00133 else
00134 showError( result, mClient->detailedErrorString() );
00135
00136 }
00137
00138 void Exchange::upload()
00139 {
00140 kdDebug(5850) << "Called Exchange::upload()" << endl;
00141
00142 Event* event = dynamic_cast<Event *> ( mainWindow()->view()->currentSelection() );
00143 if ( ! event )
00144 {
00145 KMessageBox::information( 0L, i18n("Please select an appointment."), i18n("Exchange Plugin") );
00146 return;
00147 }
00148 if ( KMessageBox::warningContinueCancel( 0L, i18n("Exchange Upload is EXPERIMENTAL, you may lose data on this appointment!"), i18n("Exchange Plugin"), i18n("&Upload") )
00149 == KMessageBox::Continue ) {
00150 kdDebug(5850) << "Trying to add appointment " << event->summary() << endl;
00151 int result = mClient->uploadSynchronous( event );
00152 if ( result != KPIM::ExchangeClient::ResultOK )
00153 showError( result, mClient->detailedErrorString() );
00154 }
00155 }
00156
00157 void Exchange::remove()
00158 {
00159 kdDebug(5850) << "Called Exchange::remove()" << endl;
00160
00161 Event* event = dynamic_cast<Event *> ( mainWindow()->view()->currentSelection() );
00162 if ( ! event )
00163 {
00164 KMessageBox::information( 0L, i18n("Please select an appointment."), i18n("Exchange Plugin") );
00165 return;
00166 }
00167
00168 if ( KMessageBox::warningContinueCancel( 0L, i18n("Exchange Delete is EXPERIMENTAL, if this is a recurring event it will delete all instances!"), i18n("Exchange Plugin"), KGuiItem(i18n("&Delete"),"editdelete") )
00169 == KMessageBox::Continue ) {
00170 kdDebug(5850) << "Trying to delete appointment " << event->summary() << endl;
00171 int result = mClient->removeSynchronous( event );
00172
00173 if ( result == KPIM::ExchangeClient::ResultOK ) {
00174 mainWindow()->view()->calendar()->deleteEvent( event );
00175 emit calendarChanged();
00176 } else
00177 showError( result, mClient->detailedErrorString() );
00178 }
00179 }
00180
00181 void Exchange::configure()
00182 {
00183 kdDebug(5850) << "Exchange::configure" << endl;
00184 ExchangeConfig dialog( mAccount );
00185
00186 if (dialog.exec() == QDialog::Accepted )
00187 mAccount->save( "Calendar/Exchange Plugin" );
00188 }
00189
00190 void Exchange::showError( int error, const QString& moreInfo )
00191 {
00192 QString errorText;
00193 switch( error ) {
00194 case KPIM::ExchangeClient::ResultOK:
00195 errorText = i18n( "No Error" );
00196 break;
00197 case KPIM::ExchangeClient::CommunicationError:
00198 errorText = i18n( "The Exchange server could not be reached or returned an error." );
00199 break;
00200 case KPIM::ExchangeClient::ServerResponseError:
00201 errorText = i18n( "Server response could not be interpreted." );
00202 break;
00203 case KPIM::ExchangeClient::IllegalAppointmentError:
00204 errorText = i18n( "Appointment data could not be interpreted." );
00205 break;
00206 case KPIM::ExchangeClient::NonEventError:
00207 errorText = i18n( "This should not happen: trying to upload wrong type of event." );
00208 break;
00209 case KPIM::ExchangeClient::EventWriteError:
00210 errorText = i18n( "An error occurred trying to write an appointment to the server." );
00211 break;
00212 case KPIM::ExchangeClient::DeleteUnknownEventError:
00213 errorText = i18n( "Trying to delete an event that is not present on the server." );
00214 break;
00215 case KPIM::ExchangeClient::UnknownError:
00216 default:
00217 errorText = i18n( "Unknown Error" );
00218 }
00219
00220 if ( error != KPIM::ExchangeClient::ResultOK ) {
00221 if ( moreInfo.isNull() )
00222 KMessageBox::error( mainWindow()->topLevelWidget(), errorText, i18n( "Exchange Plugin" ) );
00223 else
00224 KMessageBox::detailedError( mainWindow()->topLevelWidget(), errorText, moreInfo, i18n( "Exchange Plugin" ) );
00225 }
00226 }
00227
00228 void Exchange::test()
00229 {
00230 kdDebug(5850) << "Entering test()" << endl;
00231 mClient->test();
00232 }
00233
00234 void Exchange::test2()
00235 {
00236 kdDebug(5850) << "Entering test2()" << endl;
00237 }
00238 #include "exchange.moc"