You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdepim/kresources/egroupware/knotes_resourcexmlrpc.cpp

334 lines
9.1 KiB

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