/*============================================================================= wininet.cpp =============================================================================== This is the Wininet XML transport of the C++ XML-RPC client library for Xmlrpc-c. =============================================================================*/ #include #include #include #include "xmlrpc-c/girerr.hpp" using girerr::error; using girerr::throwf; #include "xmlrpc-c/girmem.hpp" using girmem::autoObjectPtr; using girmem::autoObject; #include "env_wrap.hpp" #include "xmlrpc-c/base.h" #include "xmlrpc-c/client.h" #include "xmlrpc-c/transport.h" #include "xmlrpc-c/base_int.h" /* transport_config.h defines MUST_BUILD_WININET_CLIENT */ #include "transport_config.h" #include "xmlrpc-c/client_transport.hpp" using namespace std; using namespace xmlrpc_c; namespace { class globalConstant { public: globalConstant(); ~globalConstant(); }; globalConstant::globalConstant() { // Not thread safe xmlrpc_transport_setup setupFn; #if MUST_BUILD_WININET_CLIENT setupFn = xmlrpc_wininet_transport_ops.setup_global_const; #else setupFn = NULL; #endif if (setupFn) { env_wrap env; setupFn(&env.env_c); // Not thread safe if (env.env_c.fault_occurred) throwf("Failed to do global initialization " "of Wininet transport code. %s", env.env_c.fault_string); } } globalConstant::~globalConstant() { // Not thread safe xmlrpc_transport_teardown teardownFn; #if MUST_BUILD_WININET_CLIENT teardownFn = xmlrpc_wininet_transport_ops.teardown_global_const; #else teardownFn = NULL; #endif if (teardownFn) teardownFn(); // not thread safe } globalConstant globalConst; // This object is never accessed. Its whole purpose to to be born and // to die, which it does automatically as part of C++ program // program initialization and termination. } // namespace namespace xmlrpc_c { carriageParm_wininet0::carriageParm_wininet0( string const serverUrl ) { this->instantiate(serverUrl); } carriageParm_wininet0Ptr::carriageParm_wininet0Ptr() { // Base class constructor will construct pointer that points to nothing } carriageParm_wininet0Ptr::carriageParm_wininet0Ptr( carriageParm_wininet0 * const carriageParmP) { this->point(carriageParmP); } carriageParm_wininet0 * carriageParm_wininet0Ptr::operator->() const { autoObject * const p(this->objectP); return dynamic_cast(p); } #if MUST_BUILD_WININET_CLIENT clientXmlTransport_wininet::clientXmlTransport_wininet( bool const allowInvalidSslCerts ) { struct xmlrpc_wininet_xportparms transportParms; transportParms.allowInvalidSSLCerts = allowInvalidSslCerts; this->c_transportOpsP = &xmlrpc_wininet_transport_ops; env_wrap env; xmlrpc_wininet_transport_ops.create( &env.env_c, 0, "", "", &transportParms, XMLRPC_WXPSIZE(allowInvalidSSLCerts), &this->c_transportP); if (env.env_c.fault_occurred) throw(error(env.env_c.fault_string)); } #else // MUST_BUILD_WININET_CLIENT clientXmlTransport_wininet::clientXmlTransport_wininet(bool const) { throw(error("There is no Wininet client XML transport " "in this XML-RPC client library")); } #endif clientXmlTransport_wininet::~clientXmlTransport_wininet() { this->c_transportOpsP->destroy(this->c_transportP); } } // namespace