/* * kxmlrpcclient.h - (c) 2003 Frerich Raabe * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef KXMLRPCCLIENT_H #define KXMLRPCCLIENT_H #include #include #include #include #include #include class QDomDocument; class QDomElement; namespace KIO { class Job; } namespace KXMLRPC { class Query; class QueryResult; class Server; class Query : public QObject { Q_OBJECT public: class Result { friend class Query; friend QDataStream &operator>>( QDataStream &s, Query::Result &r ); public: Result() { } bool success() const { return m_success; } int errorCode() const { return m_errorCode; } QString errorString() const { return m_errorString; } QValueList data() const { return m_data; } QString server() const { return m_server; } QString method() const { return m_method; } QValueList args() const { return m_args; } private: bool m_success; int m_errorCode; QString m_errorString; QValueList m_data; QString m_server; QString m_method; QValueList m_args; }; static Query *create( QObject *parent = 0, const char *name = 0 ); static QString marshal( const QVariant &v ); static QVariant demarshal( const QDomElement &e ); public slots: void call( const QString &server, const QString &method, const QValueList &args = QValueList(), const QString &userAgent = "KDE-XMLRPC" ); signals: void infoMessage( const QString &msg ); void finished( const KXMLRPC::Query::Result &result ); private slots: void slotInfoMessage( KIO::Job *job, const QString &msg ); void slotData( KIO::Job *job, const QByteArray &data ); void slotResult( KIO::Job *job ); private: bool isMessageResponse( const QDomDocument &doc ) const; bool isFaultResponse( const QDomDocument &doc ) const; Result parseMessageResponse( const QDomDocument &doc ) const; Result parseFaultResponse( const QDomDocument &doc ) const; QString markupCall( const QString &method, const QValueList &args ) const; Query( QObject *parent = 0, const char *name = 0 ); QBuffer m_buffer; QString m_server; QString m_method; QValueList m_args; }; class Server : public QObject { Q_OBJECT public: Server( const KURL &url = KURL(), QObject *parent = 0, const char *name = 0 ); const KURL &url() const { return m_url; } void setUrl( const KURL &url ); QString userAgent() const { return m_userAgent; } void setUserAgent( const QString &userAgent) { m_userAgent = userAgent; } template void call( const QString &method, const QValueList &arg, QObject *object, const char *slot ); static QValueList toVariantList( const QVariant &arg ); static QValueList toVariantList( int arg ); static QValueList toVariantList( bool arg ); static QValueList toVariantList( double arg ); static QValueList toVariantList( const QString &arg ); static QValueList toVariantList( const QCString &arg ); static QValueList toVariantList( const QByteArray &arg ); static QValueList toVariantList( const QDateTime &arg ); static QValueList toVariantList( const QStringList &arg ); signals: void infoMessage( const QString &msg ); public slots: void call( const QString &method, const QValueList &args, QObject *object, const char *slot ); void call( const QString &method, const QValueList &args, QObject *object, const char *slot, QObject *infoObject, const char *infoSlot ); private: KURL m_url; QString m_userAgent; }; inline QDataStream &operator>>( QDataStream &s, Query::Result &r ) { return s >> r.m_errorCode >> r.m_errorString >> r.m_data >> r.m_server >> r.m_method >> r.m_args; } } template void KXMLRPC::Server::call( const QString &method, const QValueList &arg, QObject *object, const char *slot ) { QValueList args; typename QValueList::ConstIterator it = arg.begin(); typename QValueList::ConstIterator end = arg.end(); for ( ; it != end; ++it ) args << QVariant( *it ); call( method, args, object, slot ); } inline QDataStream &operator<<( QDataStream &s, const KXMLRPC::Query::Result &r ) { return s << r.errorCode() << r.errorString() << r.data() << r.server() << r.method() << r.args(); } #endif // KXMLRPCCLIENT_H // vim:ts=4:sw=4:noet