diff options
Diffstat (limited to 'kpilot/kroupware.cpp')
-rw-r--r-- | kpilot/kroupware.cpp | 311 |
1 files changed, 311 insertions, 0 deletions
diff --git a/kpilot/kroupware.cpp b/kpilot/kroupware.cpp new file mode 100644 index 0000000..289199f --- /dev/null +++ b/kpilot/kroupware.cpp @@ -0,0 +1,311 @@ +/* KPilot +** +** Copyright still to be determined. +** +** This file defines the actions taken when KPilot +** is Kroupware-enabled. Basically it just does a +** little communication with the local Kroupware agent (KMail). +*/ + +/* +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program in a file called COPYING; if not, write to +** the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +** MA 02110-1301, USA. +*/ + +/* +** Bug reports and questions can be sent to kde-pim@kde.org +*/ + +#include "options.h" + +#include <tqfile.h> + +#include <dcopclient.h> +#include <tdetempfile.h> + + +#include <tdeapplication.h> +#include "kroupware.h" +#include "kpilotConfig.h" + +KroupwareSync::KroupwareSync(bool pre,int parts,KPilotDeviceLink *p) : + SyncAction(p,pre ? "KroupwarePreSync" : "KroupwarePostSync"), + fPre(pre), + fParts(parts) +{ + +} + +/* virtual */ bool KroupwareSync::exec() +{ + FUNCTIONSETUP; + if (fPre) + { + preSync(); + } + else + { + postSync(); + } + // delayDone(); + emit syncDone(this); + return true; +} + +void KroupwareSync::cleanupConfig() +{ + // tempfile check in case app has terminated during sync + // TODO!!! Use sensitive groups/keys for the kroupware branch... + TDEConfig* c = KPilotSettings::self()->config(); + c->setGroup("todoOptions"); + if ( c->hasKey( "CalFileBackup") ) { + TQString fn = c->readPathEntry( "CalFileBackup" ); + if ( fn != CSL1("empty") ) { + c->writePathEntry( "CalFile" ,fn ); + c->writeEntry( "CalFileBackup" , "empty" ); + } + } + c->setGroup("vcalOptions"); + if ( c->hasKey( "CalFileBackup") ) { + TQString fn = c->readPathEntry( "CalFileBackup" ); + if ( fn != CSL1("empty") ) { + c->writePathEntry( "CalFile" ,fn ); + c->writeEntry( "CalFileBackup" , "empty" ); + } + } + c->setGroup("Abbrowser-conduit"); + c->writeEntry( "KMailTempFile" , "empty" ); + KPilotSettings::writeConfig(); +} + +// For the log messages, I've added i18n to the +// ones I consider relevant for the user. The rest is +// really debug info, and shouldn't go to the normal +// sync log for the user. +// +// TODO!!! better way to read the config options! +void KroupwareSync::start_syncCal_TodosWithKMail( bool cal, bool todos ) +{ + if ( !cal && ! todos ) + return; + TDEConfig*c = KPilotSettings::self()->config(); + DCOPClient *client = kapp->dcopClient(); + KTempFile tempfile; + TQString filename = tempfile.name(); + TQByteArray data, reply_data; + TQCString reply_type; + TQDataStream arg(data, IO_WriteOnly); + arg << filename; + if (!client->call( "kmail" , + "KOrganizerSyncIface", + "pullSyncData(TQString)", + data, + reply_type, + reply_data)) { + logMessage( CSL1("Calling KMail over DCOP failed!" )); + logMessage(CSL1("Not syncing calendars with KMail")); + logMessage(CSL1("Not syncing to-dos with KMail")); + } + else { + logMessage(CSL1("Calling Cal/Todo over DCOP succeeded")); + // now prepare for syncing + _syncWithKMail = true; + if ( todos ) { + logMessage( i18n("Syncing to-dos with KMail" )); + c->setGroup("todoOptions"); + TQString fn = c->readPathEntry( "CalFile" ); + c->writePathEntry( "CalFileBackup" ,fn ); + c->writePathEntry( "CalFile" ,filename ); + } + else + logMessage( CSL1("Not syncing todos with KMail" )); + if ( cal ) { + logMessage( i18n("Syncing calendar with KMail" )); + c->setGroup("vcalOptions"); + TQString fn = c->readPathEntry( "CalFile" ); + c->writePathEntry( "CalFileBackup" ,fn ); + c->writePathEntry( "CalFile" ,filename ); + } + else + logMessage( CSL1("Not syncing calendar with KMail" )); + } + KPilotSettings::self()->writeConfig(); +} + +void KroupwareSync::start_syncAddWithKMail() +{ + logMessage( CSL1("Syncing Addresses with KMail" )); + DCOPClient *client = kapp->dcopClient(); + KTempFile tempfile; + TQString filename = tempfile.name(); + TQByteArray data, reply_data; + TQCString reply_type; + TQDataStream arg(data, IO_WriteOnly); + arg << filename; + if (!client->call( "kmail" , + "KMailIface", + "requestAddresses(TQString)", + data, + reply_type, + reply_data)) { + logMessage(CSL1("Calling KMail over DCOP failed!" )); + logMessage(CSL1("Not syncing Addresses with KMail")); + } + else { + // TODO!!! better config handling! + TDEConfig*c = KPilotSettings::self()->config(); + logMessage(CSL1("Calling addresses over DCOP succeeded")); + c->setGroup("Abbrowser-conduit"); + c->writePathEntry( "KMailTempFile" , filename ); + KPilotSettings::self()->writeConfig(); + } +} +void KroupwareSync::start_syncNotesWithKMail() +{ + logMessage( i18n("Syncing Notes with Mail" )); + logMessage( CSL1("Syncing Notes-sorry not implemented" )); +} + +void KroupwareSync::end_syncCal_TodosWithKMail( bool cal, bool todos) +{ + if ( !cal && ! todos ) + return; + TQString filename; + TDEConfig*c=KPilotSettings::self()->config(); + if ( todos ) { + logMessage( i18n("Rewriting to-dos to KMail..." )); + c->setGroup("todoOptions"); + filename = c->readPathEntry( "CalFile" ); + c->writePathEntry( "CalFile", c->readPathEntry( "CalFileBackup" ) ); + c->writeEntry( "CalFileBackup", "empty"); + } + if ( cal ) { + logMessage( i18n("Rewriting Calendar to KMail" )); + c->setGroup("vcalOptions"); + filename = c->readPathEntry( "CalFile" ); + TQString tf = c->readPathEntry( "CalFileBackup" ) ; + c->writePathEntry( "CalFile" , tf ); + c->writeEntry( "CalFileBackup" ,"empty"); + } + KPilotSettings::writeConfig(); + if ( !filename.isEmpty() ) { + logMessage(CSL1("Try to call KMail via DCOP to finish sync...")); + // try DCOP connection to KMail + DCOPClient *client = kapp->dcopClient(); + TQByteArray data, reply_data; + TQCString reply_type; + TQDataStream arg(data, IO_WriteOnly); + arg << filename; + if (!client->call( "kmail" /*"korganizer" kmdcop */, + "KOrganizerSyncIface", + "pushSyncData(TQString)", + data, + reply_type, + reply_data)) { + logMessage( CSL1("Calling KMail over DCOP failed!" )); + logMessage( CSL1("Sync is not complete")); + logMessage( CSL1("Data from Palm stored in file:")); + logMessage(filename); + } else { + logMessage(CSL1("Calling over DCOP succeeded")); + logMessage(CSL1("Sync to KMail has finished successfully")); + } + TQFile::remove( filename ); + } +} +void KroupwareSync::end_syncAddWithKMail() +{ + logMessage( i18n("Syncing KMail with Addresses " )); + DCOPClient *client = kapp->dcopClient(); + // TODO!! better config handling (TDEConfig XT) + TDEConfig*c = KPilotSettings::self()->config(); + c->setGroup("Abbrowser-conduit"); + TQString filename = c->readPathEntry( "KMailTempFile" ); + c->writeEntry( "KMailTempFile" , "empty" ); + KPilotSettings::writeConfig(); + TQByteArray data, reply_data; + TQCString reply_type; + TQDataStream arg(data, IO_WriteOnly); + arg << filename; + arg << TQStringList(); + if (!client->call( "kmail" , + "KMailIface", + "storeAddresses(TQString, TQStringList)", + data, + reply_type, + reply_data)) { + logMessage(CSL1("Calling KMail over DCOP failed!" )); + logMessage(CSL1("Not syncing Addresses with KMail")); + } + else { + logMessage(CSL1("Calling store addresses over DCOP succeeded")); + } + //TQFile::remove( filename ); +} +void KroupwareSync::end_syncNotesWithKMail() +{ + logMessage( i18n("Syncing KMail with Notes" )); + logMessage( CSL1("Syncing Notes-sorry not implemented" )); +} + + + +/* static */ bool KroupwareSync::startKMail(TQString *error) +{ + FUNCTIONSETUP; + + TQCString kmdcop; + TQString mess; + int pid; + + return TDEApplication::startServiceByDesktopName(CSL1("kmail"), + TQString(), + error, + &kmdcop, + &pid + )==0; +} + + +void KroupwareSync::preSync() +{ + cleanupConfig(); + start_syncCal_TodosWithKMail( fParts & Cal, fParts & Todo ); + if (fParts & Notes) + { + start_syncNotesWithKMail(); + } + if (fParts & Address) + { + start_syncAddWithKMail(); + } +} + +void KroupwareSync::postSync() +{ + cleanupConfig(); + end_syncCal_TodosWithKMail( fParts & Cal, fParts & Todo ); + if (fParts & Notes) + { + end_syncNotesWithKMail(); + } + if (fParts & Address) + { + end_syncAddWithKMail(); + } +} + + + |