KXMLRPC Client Library
client.cpp
Go to the documentation of this file.
00001 /***************************************************************************** 00002 * Copyright (C) 2003 - 2004 by Frerich Raabe <raabe@kde.org> * 00003 * Tobias Koenig <tokoe@kde.org> * 00004 * Copyright (C) 2006 by Narayan Newton <narayannewton@gmail.com> * 00005 * * 00006 * This program is distributed in the hope that it will be useful, but * 00007 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * 00008 * or FITNESS FOR A PARTICULAR PURPOSE. For licensing and distribution * 00009 * details, check the accompanying file 'COPYING.BSD'. * 00010 *****************************************************************************/ 00024 #include "client.h" 00025 #include "query.h" 00026 00027 #include <kio/job.h> 00028 #include <kdebug.h> 00029 #include <klocale.h> 00030 #include <kurl.h> 00031 00032 #include <QtCore/QVariant> 00033 00034 using namespace KXmlRpc; 00035 00036 class Client::Private 00037 { 00038 public: 00039 Private() : mUserAgent( "KDE XMLRPC resources" ), mDigestAuth( false ){} 00040 00041 void queryFinished( Query * ); 00042 00043 KUrl mUrl; 00044 QString mUserAgent; 00045 bool mDigestAuth; 00046 QList<Query*> mPendingQueries; 00047 }; 00048 00049 void Client::Private::queryFinished( Query *query ) 00050 { 00051 mPendingQueries.removeAll( query ); 00052 query->deleteLater(); 00053 } 00054 00055 Client::Client( QObject *parent ) 00056 : QObject( parent ), d( new Private ) 00057 { 00058 } 00059 00060 Client::Client( const KUrl &url, QObject *parent ) 00061 : QObject( parent ), d( new Private ) 00062 { 00063 d->mUrl = url; 00064 } 00065 00066 Client::~Client() 00067 { 00068 QList<Query *>::Iterator it; 00069 for ( it = d->mPendingQueries.begin(); it != d->mPendingQueries.end(); ++it ) { 00070 (*it)->deleteLater(); 00071 } 00072 00073 d->mPendingQueries.clear(); 00074 00075 delete d; 00076 } 00077 00078 void Client::setUrl( const KUrl &url ) 00079 { 00080 d->mUrl = url.isValid() ? url : KUrl(); 00081 } 00082 00083 KUrl Client::url() const 00084 { 00085 return d->mUrl; 00086 } 00087 00088 QString Client::userAgent() const 00089 { 00090 return d->mUserAgent; 00091 } 00092 00093 void Client::setUserAgent( const QString &userAgent ) 00094 { 00095 d->mUserAgent = userAgent; 00096 } 00097 00098 bool Client::isDigestAuthEnabled() const 00099 { 00100 return d->mDigestAuth; 00101 } 00102 00103 void Client::setDigestAuthEnabled( bool enabled ) 00104 { 00105 d->mDigestAuth = enabled; 00106 } 00107 00108 void Client::call( const QString &method, const QList<QVariant> &args, 00109 QObject *msgObj, const char *messageSlot, 00110 QObject *faultObj, const char *faultSlot, const QVariant &id ) 00111 { 00112 00113 QMap<QString, QString> metaData; 00114 00115 if ( d->mUrl.isEmpty() ) { 00116 kWarning() << "Cannot execute call to" << method << ": empty server URL"; 00117 } 00118 00119 //Fill metadata, with userAgent and possible digest auth 00120 if ( d->mUserAgent.isEmpty() ) { 00121 metaData["UserAgent"] = "KDE-XMLRPC"; 00122 } else { 00123 metaData["UserAgent"] = d->mUserAgent; 00124 } 00125 00126 if ( d->mDigestAuth ) { 00127 metaData["WWW-Authenticate:"] = "Digest"; 00128 } 00129 00130 Query *query = Query::create( id, this ); 00131 connect( query, SIGNAL(message(const QList<QVariant> &,const QVariant &)), msgObj, messageSlot ); 00132 connect( query, SIGNAL(fault(int,const QString &,const QVariant &)), faultObj, faultSlot ); 00133 connect( query, SIGNAL(finished(Query *)), this, SLOT(queryFinished(Query *)) ); 00134 d->mPendingQueries.append( query ); 00135 00136 query->call( d->mUrl.url(), method, args, metaData ); 00137 } 00138 00139 void Client::call( const QString &method, const QVariant &arg, 00140 QObject *msgObj, const char *messageSlot, 00141 QObject *faultObj, const char *faultSlot, 00142 const QVariant &id ) 00143 { 00144 QList<QVariant> args; 00145 args << arg ; 00146 call( method, args, msgObj, messageSlot, faultObj, faultSlot, id ); 00147 } 00148 00149 void Client::call( const QString &method, int arg, 00150 QObject *msgObj, const char *messageSlot, 00151 QObject *faultObj, const char *faultSlot, 00152 const QVariant &id ) 00153 { 00154 QList<QVariant> args; 00155 args << QVariant( arg ); 00156 call( method, args, msgObj, messageSlot, faultObj, faultSlot, id ); 00157 } 00158 00159 void Client::call( const QString &method, bool arg, 00160 QObject *msgObj, const char *messageSlot, 00161 QObject *faultObj, const char *faultSlot, 00162 const QVariant &id ) 00163 { 00164 QList<QVariant> args; 00165 args << QVariant( arg ); 00166 call( method, args, msgObj, messageSlot, faultObj, faultSlot, id ); 00167 } 00168 00169 void Client::call( const QString &method, double arg, 00170 QObject *msgObj, const char *messageSlot, 00171 QObject *faultObj, const char *faultSlot, 00172 const QVariant &id ) 00173 { 00174 QList<QVariant> args; 00175 args << QVariant( arg ); 00176 call( method, args, msgObj, messageSlot, faultObj, faultSlot, id ); 00177 } 00178 00179 void Client::call( const QString &method, const QString &arg, 00180 QObject *msgObj, const char *messageSlot, 00181 QObject *faultObj, const char *faultSlot, 00182 const QVariant &id ) 00183 { 00184 QList<QVariant> args; 00185 args << QVariant( arg ); 00186 call( method, args, msgObj, messageSlot, faultObj, faultSlot, id ); 00187 } 00188 00189 void Client::call( const QString &method, const QByteArray &arg, 00190 QObject *msgObj, const char *messageSlot, 00191 QObject *faultObj, const char *faultSlot, 00192 const QVariant &id ) 00193 { 00194 QList<QVariant> args; 00195 args << QVariant( arg ); 00196 call( method, args, faultObj, faultSlot, msgObj, messageSlot, id ); 00197 } 00198 00199 void Client::call( const QString &method, const QDateTime &arg, 00200 QObject *msgObj, const char *messageSlot, 00201 QObject *faultObj, const char *faultSlot, 00202 const QVariant &id ) 00203 { 00204 QList<QVariant> args; 00205 args << QVariant( arg ); 00206 call( method, args, msgObj, messageSlot, faultObj, faultSlot, id ); 00207 } 00208 00209 void Client::call( const QString &method, const QStringList &arg, 00210 QObject *msgObj, const char *messageSlot, 00211 QObject *faultObj, const char *faultSlot, 00212 const QVariant &id ) 00213 { 00214 QList<QVariant> args; 00215 for ( int i = 0; i < arg.count(); ++i ) { 00216 args << QVariant( arg[ i ] ); 00217 } 00218 00219 call( method, args, msgObj, messageSlot, faultObj, faultSlot, id ); 00220 } 00221 00222 #include "client.moc"