00001
00002
00003
00004
00005
00006
00007
00008
00009
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
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"