initial load of upstream version 1.06.32
[xmlrpc-c] / src / cpp / wininet.cpp
1 /*=============================================================================
2                                 wininet.cpp
3 ===============================================================================
4   This is the Wininet XML transport of the C++ XML-RPC client library for
5   Xmlrpc-c.
6 =============================================================================*/
7
8 #include <stdlib.h>
9 #include <cassert>
10 #include <string>
11
12 #include "xmlrpc-c/girerr.hpp"
13 using girerr::error;
14 using girerr::throwf;
15 #include "xmlrpc-c/girmem.hpp"
16 using girmem::autoObjectPtr;
17 using girmem::autoObject;
18 #include "env_wrap.hpp"
19 #include "xmlrpc-c/base.h"
20 #include "xmlrpc-c/client.h"
21 #include "xmlrpc-c/transport.h"
22 #include "xmlrpc-c/base_int.h"
23
24 #include "xmlrpc_wininet_transport.h"
25
26 /* transport_config.h defines MUST_BUILD_WININET_CLIENT */
27 #include "transport_config.h"
28
29 #include "xmlrpc-c/client_transport.hpp"
30
31
32 using namespace std;
33 using namespace xmlrpc_c;
34
35
36 namespace {
37
38 class globalConstant {
39 public:
40     globalConstant();
41     ~globalConstant();
42 };
43
44
45
46 globalConstant::globalConstant() {
47
48     // Not thread safe
49
50     xmlrpc_transport_setup setupFn;
51
52 #if MUST_BUILD_WININET_CLIENT
53     setupFn = xmlrpc_wininet_transport_ops.setup_global_const;
54 #else
55     setupFn = NULL;
56 #endif
57     if (setupFn) {
58         env_wrap env;
59
60         setupFn(&env.env_c); // Not thread safe
61
62         if (env.env_c.fault_occurred)
63             throwf("Failed to do global initialization "
64                    "of Wininet transport code.  %s", env.env_c.fault_string);
65     }
66 }
67
68
69
70 globalConstant::~globalConstant() {
71
72     // Not thread safe
73
74     xmlrpc_transport_teardown teardownFn;
75
76 #if MUST_BUILD_WININET_CLIENT
77     teardownFn = xmlrpc_wininet_transport_ops.teardown_global_const;
78 #else
79     teardownFn = NULL;
80 #endif
81     if (teardownFn)
82         teardownFn();  // not thread safe
83 }
84
85
86
87 globalConstant globalConst;
88     // This object is never accessed.  Its whole purpose to to be born and
89     // to die, which it does automatically as part of C++ program
90     // program initialization and termination.
91
92 } // namespace
93
94
95 namespace xmlrpc_c {
96
97 carriageParm_wininet0::carriageParm_wininet0(
98     string const serverUrl
99     ) {
100
101     this->instantiate(serverUrl);
102 }
103
104
105
106 carriageParm_wininet0Ptr::carriageParm_wininet0Ptr() {
107     // Base class constructor will construct pointer that points to nothing
108 }
109
110
111
112 carriageParm_wininet0Ptr::carriageParm_wininet0Ptr(
113     carriageParm_wininet0 * const carriageParmP) {
114     this->point(carriageParmP);
115 }
116
117
118
119 carriageParm_wininet0 *
120 carriageParm_wininet0Ptr::operator->() const {
121
122     autoObject * const p(this->objectP);
123     return dynamic_cast<carriageParm_wininet0 *>(p);
124 }
125
126
127
128 #if MUST_BUILD_WININET_CLIENT
129
130 clientXmlTransport_wininet::clientXmlTransport_wininet(
131     bool const allowInvalidSslCerts
132     ) {
133
134     struct xmlrpc_wininet_xportparms transportParms; 
135
136     transportParms.allowInvalidSSLCerts = allowInvalidSslCerts;
137
138     this->c_transportOpsP = &xmlrpc_wininet_transport_ops;
139
140     env_wrap env;
141
142     xmlrpc_wininet_transport_ops.create(
143         &env.env_c, 0, "", "",
144         &transportParms, XMLRPC_WXPSIZE(allowInvalidSSLCerts),
145         &this->c_transportP);
146
147     if (env.env_c.fault_occurred)
148         throw(error(env.env_c.fault_string));
149 }
150
151 #else  // MUST_BUILD_WININET_CLIENT
152
153 clientXmlTransport_wininet::clientXmlTransport_wininet(bool const) {
154
155     throw(error("There is no Wininet client XML transport "
156                 "in this XML-RPC client library"));
157 }
158
159 #endif
160  
161
162
163 clientXmlTransport_wininet::~clientXmlTransport_wininet() {
164
165     this->c_transportOpsP->destroy(this->c_transportP);
166 }
167
168 } // namespace