/* * 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 TQDomDocument; class TQDomElement; namespace TDEIO { class Job; } namespace KXMLRPC { class Query; class QueryResult; class Server; class Query : public TQObject { Q_OBJECT public: class Result { friend class Query; friend TQDataStream &operator>>( TQDataStream &s, Query::Result &r ); public: Result() { } bool success() const { return m_success; } int errorCode() const { return m_errorCode; } TQString errorString() const { return m_errorString; } TQValueList data() const { return m_data; } TQString server() const { return m_server; } TQString method() const { return m_method; } TQValueList args() const { return m_args; } private: bool m_success; int m_errorCode; TQString m_errorString; TQValueList m_data; TQString m_server; TQString m_method; TQValueList m_args; }; static Query *create( TQObject *parent = 0, const char *name = 0 ); static TQString marshal( const TQVariant &v ); static TQVariant demarshal( const TQDomElement &e ); public slots: void call( const TQString &server, const TQString &method, const TQValueList &args = TQValueList(), const TQString &userAgent = "KDE-XMLRPC" ); signals: void infoMessage( const TQString &msg ); void finished( const KXMLRPC::Query::Result &result ); private slots: void slotInfoMessage( TDEIO::Job *job, const TQString &msg ); void slotData( TDEIO::Job *job, const TQByteArray &data ); void slotResult( TDEIO::Job *job ); private: bool isMessageResponse( const TQDomDocument &doc ) const; bool isFaultResponse( const TQDomDocument &doc ) const; Result parseMessageResponse( const TQDomDocument &doc ) const; Result parseFaultResponse( const TQDomDocument &doc ) const; TQString markupCall( const TQString &method, const TQValueList &args ) const; Query( TQObject *parent = 0, const char *name = 0 ); TQBuffer m_buffer; TQString m_server; TQString m_method; TQValueList m_args; }; class Server : public TQObject { Q_OBJECT public: Server( const KURL &url = KURL(), TQObject *parent = 0, const char *name = 0 ); const KURL &url() const { return m_url; } void setUrl( const KURL &url ); TQString userAgent() const { return m_userAgent; } void setUserAgent( const TQString &userAgent) { m_userAgent = userAgent; } template void call( const TQString &method, const TQValueList &arg, TQObject *object, const char *slot ); static TQValueList toVariantList( const TQVariant &arg ); static TQValueList toVariantList( int arg ); static TQValueList toVariantList( bool arg ); static TQValueList toVariantList( double arg ); static TQValueList toVariantList( const TQString &arg ); static TQValueList toVariantList( const TQCString &arg ); static TQValueList toVariantList( const TQByteArray &arg ); static TQValueList toVariantList( const TQDateTime &arg ); static TQValueList toVariantList( const TQStringList &arg ); signals: void infoMessage( const TQString &msg ); public slots: void call( const TQString &method, const TQValueList &args, TQObject *object, const char *slot ); void call( const TQString &method, const TQValueList &args, TQObject *object, const char *slot, TQObject *infoObject, const char *infoSlot ); private: KURL m_url; TQString m_userAgent; }; inline TQDataStream &operator>>( TQDataStream &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 TQString &method, const TQValueList &arg, TQObject *object, const char *slot ) { TQValueList args; typename TQValueList::ConstIterator it = arg.begin(); typename TQValueList::ConstIterator end = arg.end(); for ( ; it != end; ++it ) args << TQVariant( *it ); call( method, args, object, slot ); } inline TQDataStream &operator<<( TQDataStream &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