diff options
Diffstat (limited to 'kresources/egroupware/knotes_resourcexmlrpc.cpp')
-rw-r--r-- | kresources/egroupware/knotes_resourcexmlrpc.cpp | 333 |
1 files changed, 333 insertions, 0 deletions
diff --git a/kresources/egroupware/knotes_resourcexmlrpc.cpp b/kresources/egroupware/knotes_resourcexmlrpc.cpp new file mode 100644 index 000000000..c30da41f0 --- /dev/null +++ b/kresources/egroupware/knotes_resourcexmlrpc.cpp @@ -0,0 +1,333 @@ +/* + This file is part of kdepim. + + Copyright (c) 2004 Tobias Koenig <tokoe@kde.org> + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#include <qapplication.h> +#include <qstringlist.h> + +#include <kdebug.h> +#include <klocale.h> +#include <kstandarddirs.h> +#include <kstringhandler.h> +#include <kurl.h> + +#include "libkcal/journal.h" + +#include "knotes/resourcemanager.h" + +#include "knotes_egroupwareprefs.h" +#include "knotes_resourcexmlrpc.h" +#include "knotes_resourcexmlrpcconfig.h" + +#include "synchronizer.h" +#include "xmlrpciface.h" + +using namespace KNotes; + +typedef KRES::PluginFactory< ResourceXMLRPC, ResourceXMLRPCConfig> XMLRPCFactory; +K_EXPORT_COMPONENT_FACTORY( knotes_xmlrpc, XMLRPCFactory ) + +static const QString SearchNotesCommand = "infolog.boinfolog.search"; +static const QString AddNoteCommand = "infolog.boinfolog.write"; +static const QString DeleteNoteCommand = "infolog.boinfolog.delete"; +static const QString LoadNoteCategoriesCommand = "infolog.boinfolog.categories"; + +ResourceXMLRPC::ResourceXMLRPC( const KConfig* config ) + : ResourceNotes( config ), mCalendar( QString::fromLatin1("UTC") ), + mServer( 0 ) +{ + init(); + + mPrefs->addGroupPrefix( identifier() ); + + if ( config ) + readConfig( config ); +} + +ResourceXMLRPC::ResourceXMLRPC( ) + : ResourceNotes( 0 ), mCalendar( QString::fromLatin1("UTC") ), + mServer( 0 ) +{ + init(); + + mPrefs->addGroupPrefix( identifier() ); +} + +ResourceXMLRPC::~ResourceXMLRPC() +{ + delete mServer; + mServer = 0; + + delete mPrefs; + mPrefs = 0; + + delete mSynchronizer; + mSynchronizer = 0; +} + +void ResourceXMLRPC::init() +{ + setType( "xmlrpc" ); + + mPrefs = new EGroupwarePrefs; + + mSynchronizer = new Synchronizer; +} + +void ResourceXMLRPC::readConfig( const KConfig* ) +{ + mPrefs->readConfig(); +} + +void ResourceXMLRPC::writeConfig( KConfig* config ) +{ + ResourceNotes::writeConfig( config ); + + mPrefs->writeConfig(); +} + +bool ResourceXMLRPC::load() +{ + mCalendar.close(); + + if ( mServer ) + delete mServer; + + mServer = new KXMLRPC::Server( KURL(), this ); + mServer->setUrl( KURL( mPrefs->url() ) ); + mServer->setUserAgent( "KDE-Notes" ); + + QMap<QString, QVariant> args, columns; + args.insert( "domain", mPrefs->domain() ); + args.insert( "username", mPrefs->user() ); + args.insert( "password", mPrefs->password() ); + + mServer->call( "system.login", QVariant( args ), + this, SLOT( loginFinished( const QValueList<QVariant>&, const QVariant& ) ), + this, SLOT( fault( int, const QString&, const QVariant& ) ) ); + + mSynchronizer->start(); + + columns.insert( "type", "note" ); + args.clear(); + args.insert( "filter", "none" ); + args.insert( "col_filter", columns ); + args.insert( "order", "id_parent" ); + + mServer->call( SearchNotesCommand, args, + this, SLOT( listNotesFinished( const QValueList<QVariant>&, const QVariant& ) ), + this, SLOT( fault( int, const QString&, const QVariant& ) ) ); + + mSynchronizer->start(); + + return true; +} + +bool ResourceXMLRPC::save() +{ + mCalendar.close(); + + return true; +} + +bool ResourceXMLRPC::addNote( KCal::Journal *journal ) +{ + QMap<QString, QVariant> args; + writeNote( journal, args ); + + KCal::Journal *oldJournal = mCalendar.journal( journal->uid() ); + + bool added = false; + if ( oldJournal ) { + if ( !oldJournal->isReadOnly() ) { + writeNote( journal, args ); + args.insert( "id", mUidMap[ journal->uid() ].toInt() ); + mServer->call( AddNoteCommand, QVariant( args ), + this, SLOT( updateNoteFinished( const QValueList<QVariant>&, const QVariant& ) ), + this, SLOT( fault( int, const QString&, const QVariant& ) ) ); + mCalendar.addJournal( journal ); + added = true; + } + } else { + mServer->call( AddNoteCommand, QVariant( args ), + this, SLOT( addNoteFinished( const QValueList<QVariant>&, const QVariant& ) ), + this, SLOT( fault( int, const QString&, const QVariant& ) ), + QVariant( journal->uid() ) ); + + mCalendar.addJournal( journal ); + added = true; + } + + if ( added ) + mSynchronizer->start(); + + return true; +} + +bool ResourceXMLRPC::deleteNote( KCal::Journal *journal ) +{ + int id = mUidMap[ journal->uid() ].toInt(); + + mServer->call( DeleteNoteCommand, id, + this, SLOT( deleteNoteFinished( const QValueList<QVariant>&, const QVariant& ) ), + this, SLOT( fault( int, const QString&, const QVariant& ) ), + QVariant( journal->uid() ) ); + mSynchronizer->start(); + + return true; +} + +KCal::Alarm::List ResourceXMLRPC::alarms( const QDateTime& from, const QDateTime& to ) +{ + KCal::Alarm::List alarms; + KCal::Journal::List notes = mCalendar.journals(); + KCal::Journal::List::ConstIterator note; + for ( note = notes.begin(); note != notes.end(); ++note ) + { + QDateTime preTime = from.addSecs( -1 ); + KCal::Alarm::List::ConstIterator it; + for( it = (*note)->alarms().begin(); it != (*note)->alarms().end(); ++it ) + { + if ( (*it)->enabled() ) + { + QDateTime dt = (*it)->nextRepetition( preTime ); + if ( dt.isValid() && dt <= to ) + alarms.append( *it ); + } + } + } + + return alarms; +} + +void ResourceXMLRPC::loginFinished( const QValueList<QVariant>& variant, + const QVariant& ) +{ + QMap<QString, QVariant> map = variant[ 0 ].toMap(); + + KURL url = KURL( mPrefs->url() ); + if ( map[ "GOAWAY" ].toString() == "XOXO" ) { // failed + mSessionID = mKp3 = ""; + } else { + mSessionID = map[ "sessionid" ].toString(); + mKp3 = map[ "kp3" ].toString(); + } + + url.setUser( mSessionID ); + url.setPass( mKp3 ); + mServer->setUrl( url ); + + mSynchronizer->stop(); +} + +void ResourceXMLRPC::logoutFinished( const QValueList<QVariant>& variant, + const QVariant& ) +{ + QMap<QString, QVariant> map = variant[ 0 ].toMap(); + + if ( map[ "GOODBYE" ].toString() != "XOXO" ) + kdError() << "logout failed" << endl; + + KURL url = KURL( mPrefs->url() ); + mSessionID = mKp3 = ""; + url.setUser( mSessionID ); + url.setPass( mKp3 ); + mServer->setUrl( url ); + + mSynchronizer->stop(); +} + +void ResourceXMLRPC::listNotesFinished( const QValueList<QVariant> &list, const QVariant& ) +{ + QMap<QString, QString>::Iterator uidIt; + for ( uidIt = mUidMap.begin(); uidIt != mUidMap.end(); ++uidIt ) { + KCal::Journal *journal = mCalendar.journal( uidIt.key() ); + mCalendar.deleteJournal( journal ); + } + + mUidMap.clear(); + + QValueList<QVariant> noteList = list[ 0 ].toList(); + QValueList<QVariant>::Iterator noteIt; + + for ( noteIt = noteList.begin(); noteIt != noteList.end(); ++noteIt ) { + QMap<QString, QVariant> map = (*noteIt).toMap(); + + KCal::Journal *journal = new KCal::Journal(); + + QString uid; + readNote( map, journal, uid ); + mUidMap.insert( journal->uid(), uid ); + + mCalendar.addJournal( journal ); + manager()->registerNote( this, journal ); + } + + mSynchronizer->stop(); +} + +void ResourceXMLRPC::addNoteFinished( const QValueList<QVariant> &list, const QVariant &id ) +{ + int uid = list[ 0 ].toInt(); + mUidMap.insert( id.toString(), QString::number( uid ) ); + + mSynchronizer->stop(); +} + +void ResourceXMLRPC::updateNoteFinished( const QValueList<QVariant>&, const QVariant& ) +{ + mSynchronizer->stop(); +} + +void ResourceXMLRPC::deleteNoteFinished( const QValueList<QVariant>&, const QVariant &id ) +{ + mUidMap.erase( id.toString() ); + + KCal::Journal *journal = mCalendar.journal( id.toString() ); + mCalendar.deleteJournal( journal ); + + mSynchronizer->stop(); +} + +void ResourceXMLRPC::fault( int error, const QString& errorMsg, const QVariant& ) +{ + kdError() << "Server send error " << error << ": " << errorMsg << endl; + mSynchronizer->stop(); +} + +void ResourceXMLRPC::writeNote( KCal::Journal* journal, QMap<QString, QVariant>& args ) +{ + args.insert( "subject", journal->summary() ); + args.insert( "des", journal->description() ); + args.insert( "access", + (journal->secrecy() == KCal::Journal::SecrecyPublic ? "public" : "private" ) ); +} + +void ResourceXMLRPC::readNote( const QMap<QString, QVariant>& args, KCal::Journal *journal, QString &uid ) +{ + uid = args[ "id" ].toString(); + + journal->setSummary( args[ "subject" ].toString() ); + journal->setDescription( args[ "des" ].toString() ); + journal->setSecrecy( args[ "access" ].toString() == "public" ? + KCal::Journal::SecrecyPublic : KCal::Journal::SecrecyPrivate ); +} + +#include "knotes_resourcexmlrpc.moc" |