1 /*
2  * Portions of this file Copyright 1999-2005 University of Chicago
3  * Portions of this file Copyright 1999-2005 The University of Southern California.
4  *
5  * This file or a portion of this file is licensed under the
6  * terms of the Globus Toolkit Public License, found at
7  * http://www.globus.org/toolkit/download/license.html.
8  * If you redistribute this file, with or without
9  * modifications, you must include this notice in the file.
10  */
11
12
13 #include "globus_common.h"
14 #include "version.h"
15 #include "libxml/xmlschemastypes.h"
16 #include "globus_xio.h"
17 #include "globus_xio_buffer.h"
18 #include "globus_i_soap_message.h"
19 #include "globus_soap_message_utils.h"
20 #include "globus_xsd_type_registry.h"
21
22 globus_xsd_type_registry_t              GLOBUS_XSD_BASE_REGISTRY = NULL;
23 globus_xsd_type_registry_t              GLOBUS_GLOBAL_TYPE_REGISTRY = NULL;
24
25 static int
26 globus_l_soap_message_activate();
27
28 static int
29 globus_l_soap_message_deactivate();
30
31 globus_module_descriptor_t
32 globus_i_soap_message_module =
33 {
34     "globus_soap_message_module",
35     globus_l_soap_message_activate,
36     globus_l_soap_message_deactivate,
37     NULL,
38     NULL,
39     &local_version
40 };
41
42 0 GlobusDebugDefine(GLOBUS_SOAP_MESSAGE);
43
44 globus_xio_stack_t                  globus_i_soap_message_xio_stack;
45 globus_xio_driver_t                 globus_i_soap_message_tcp_driver;
46 globus_xio_driver_t                 globus_i_soap_message_http_driver;
47 globus_xio_driver_t                 globus_i_soap_message_buffer_driver;
48
49 globus_xio_stack_t                  globus_i_soap_message_xio_file_stack;
50 globus_xio_driver_t                 globus_i_soap_message_file_driver;
51
52 globus_xio_stack_t                  globus_i_soap_message_xio_https_stack;
53 globus_xio_driver_t                 globus_i_soap_message_gsi_driver;
54
55
56 static int
57 globus_l_soap_message_activate()
58 {
59 102     globus_result_t                     result = GLOBUS_SUCCESS;
60 102     int                                 rc = 0;
61 102     GlobusFuncName(globus_l_soap_message_activate);
62     
63 102     globus_i_soap_message_xio_stack = NULL;
64 102     globus_i_soap_message_tcp_driver = NULL;
65 102     globus_i_soap_message_http_driver = NULL;
66 102     globus_i_soap_message_buffer_driver = NULL;
67
68 102     globus_i_soap_message_xio_file_stack = NULL;
69 102     globus_i_soap_message_file_driver = NULL;
70
71 102     globus_i_soap_message_xio_https_stack = NULL;
72 102     globus_i_soap_message_gsi_driver = NULL;
73
74 102     rc = globus_module_activate(GLOBUS_COMMON_MODULE);
75 102     if(rc != GLOBUS_SUCCESS)
76     {
77 0         return rc;
78     }
79
80 102     GlobusDebugInit(GLOBUS_SOAP_MESSAGE, 
81                     MESSAGES INFO DEBUG TRACE WARN REGISTRY WILDCARDS);
82 102     GlobusSoapMessageDebugEnter();
83
84 102     rc = globus_module_activate(GLOBUS_XIO_MODULE);
85 102     if(rc != GLOBUS_SUCCESS)
86     {
87 0         return rc;
88     }
89
90 102     result = globus_xio_stack_init(
91         &globus_i_soap_message_xio_stack, NULL);
92 102     if(result != GLOBUS_SUCCESS)
93     {
94 0         result = GlobusSoapMessageErrorFailedTransport(
95             result, "Failed xio stack initialization");
96 0         goto error;
97     }
98
99 102     result = globus_xio_driver_load(
100         "tcp", &globus_i_soap_message_tcp_driver);
101 102     if(result != GLOBUS_SUCCESS)
102     {
103 0         result = GlobusSoapMessageErrorFailedTransport(
104             result, "Failed to load tcp driver");
105 0         goto error;
106     }
107     
108 102     result = globus_xio_stack_push_driver(
109         globus_i_soap_message_xio_stack, globus_i_soap_message_tcp_driver);
110 102     if(result != GLOBUS_SUCCESS)
111     {
112 0         result = GlobusSoapMessageErrorFailedTransport(
113             result, "Failed to push tcp driver onto stack");
114 0         goto error;
115     }
116     
117 102     result = globus_xio_driver_load(
118         "http", &globus_i_soap_message_http_driver);
119 102     if(result != GLOBUS_SUCCESS)
120     {
121 0         result = GlobusSoapMessageErrorFailedTransport(
122             result, "Failed to load http driver");
123 0         goto error;
124     }
125     
126 102     result = globus_xio_driver_load(
127         "buffer", &globus_i_soap_message_buffer_driver);
128 102     if(result != GLOBUS_SUCCESS)
129     {
130 0         result = GlobusSoapMessageErrorFailedTransport(
131             result, "Failed to load buffer driver");
132 0         goto error;
133     }
134     
135 102     result = globus_xio_stack_push_driver(
136         globus_i_soap_message_xio_stack, globus_i_soap_message_http_driver);
137 102     if(result != GLOBUS_SUCCESS)
138     {
139 0         result = GlobusSoapMessageErrorFailedTransport(
140             result, "Failed to push http driver");
141 0         goto error;
142     }
143     
144 102     result = globus_xio_stack_push_driver(
145         globus_i_soap_message_xio_stack, globus_i_soap_message_buffer_driver);
146 102     if(result != GLOBUS_SUCCESS)
147     {
148 0         result = GlobusSoapMessageErrorFailedTransport(
149             result, "Failed to push buffer driver");
150 0         goto error;
151     }
152     
153 102     result = globus_xio_stack_init(
154         &globus_i_soap_message_xio_file_stack, NULL);
155 102     if(result != GLOBUS_SUCCESS)
156     {
157 0         result = GlobusSoapMessageErrorFailedTransport(
158             result, "Failed xio stack initialization");
159 0         goto error;
160     }
161
162 102     result = globus_xio_driver_load(
163         "file", &globus_i_soap_message_file_driver);
164 102     if(result != GLOBUS_SUCCESS)
165     {
166 0         result = GlobusSoapMessageErrorFailedTransport(
167             result, "Failed to load file driver");
168 0         goto error;
169     }
170     
171 102     result = globus_xio_stack_push_driver(
172         globus_i_soap_message_xio_file_stack,
173         globus_i_soap_message_file_driver);
174 102     if(result != GLOBUS_SUCCESS)
175     {
176 0         result = GlobusSoapMessageErrorFailedTransport(
177             result, "Failed to push file driver onto stack");
178 0         goto error;
179     }
180
181 102     result = globus_xio_stack_init(
182         &globus_i_soap_message_xio_https_stack, NULL);
183 102     if(result != GLOBUS_SUCCESS)
184     {
185 0         result = GlobusSoapMessageErrorFailedTransport(
186             result, "Failed xio stack initialization");
187 0         goto error;
188     }
189
190 102     result = globus_xio_driver_load(
191         "gsi", &globus_i_soap_message_gsi_driver);
192 102     if(result != GLOBUS_SUCCESS)
193     {
194 0         result = GlobusSoapMessageErrorFailedTransport(
195             result, "Failed to load gsi driver");
196 0         goto error;
197     }
198     
199 102     result = globus_xio_stack_push_driver(
200         globus_i_soap_message_xio_https_stack,
201         globus_i_soap_message_tcp_driver);
202 102     if(result != GLOBUS_SUCCESS)
203     {
204 0         result = GlobusSoapMessageErrorFailedTransport(
205             result, "Failed to push gsi driver onto stack");
206 0         goto error;
207     }
208
209 102     result = globus_xio_stack_push_driver(
210         globus_i_soap_message_xio_https_stack,
211         globus_i_soap_message_gsi_driver);
212 102     if(result != GLOBUS_SUCCESS)
213     {
214 0         result = GlobusSoapMessageErrorFailedTransport(
215             result, "Failed to push gsi driver onto stack");
216 0         goto error;
217     }
218
219 102     result = globus_xio_stack_push_driver(
220         globus_i_soap_message_xio_https_stack,
221         globus_i_soap_message_http_driver);
222 102     if(result != GLOBUS_SUCCESS)
223     {
224 0         result = GlobusSoapMessageErrorFailedTransport(
225             result, "Failed to push gsi driver onto stack");
226 0         goto error;
227     }
228
229 102     result = globus_xio_stack_push_driver(
230         globus_i_soap_message_xio_https_stack,
231         globus_i_soap_message_buffer_driver);
232 102     if(result != GLOBUS_SUCCESS)
233     {
234 0         result = GlobusSoapMessageErrorFailedTransport(
235             result, "Failed to push gsi driver onto stack");
236 0         goto error;
237     }
238
239 102     xmlSchemaInitTypes();
240
241 102     globus_xsd_type_registry_init(&GLOBUS_XSD_BASE_REGISTRY);
242 102     globus_xsd_type_registry_add_base_types(GLOBUS_XSD_BASE_REGISTRY);
243      
244 102     globus_xsd_type_registry_init(&GLOBUS_GLOBAL_TYPE_REGISTRY);
245 102     globus_xsd_type_registry_add_base_types(GLOBUS_GLOBAL_TYPE_REGISTRY);
246
247 102     goto exit;
248
249  error:
250
251 0     if(globus_i_soap_message_xio_stack)
252     {
253 0         globus_xio_stack_destroy(globus_i_soap_message_xio_stack);
254     }
255
256 0     if(globus_i_soap_message_buffer_driver)
257     {
258 0         globus_xio_driver_unload(globus_i_soap_message_buffer_driver);
259     }
260
261 0     if(globus_i_soap_message_http_driver)
262     {
263 0         globus_xio_driver_unload(globus_i_soap_message_http_driver);
264     }
265
266 0     if(globus_i_soap_message_tcp_driver)
267     {
268 0         globus_xio_driver_unload(globus_i_soap_message_tcp_driver);
269     }
270     
271 0     if(globus_i_soap_message_file_driver)
272     {
273 0         globus_xio_driver_unload(globus_i_soap_message_file_driver);
274     }
275     
276 0     if(globus_i_soap_message_xio_file_stack)
277     {
278 0         globus_xio_stack_destroy(globus_i_soap_message_xio_file_stack);
279     }
280
281 0     if(globus_i_soap_message_gsi_driver)
282     {
283 0         globus_xio_driver_unload(globus_i_soap_message_gsi_driver);
284     }
285
286 0     if(globus_i_soap_message_xio_https_stack)
287     {
288 0         globus_xio_stack_destroy(globus_i_soap_message_xio_https_stack);
289     }
290
291  exit:
292
293 102     GlobusSoapMessageDebugExit();
294 102     return (int) result;
295 }
296
297 static int
298 globus_l_soap_message_deactivate()
299 74 {
300 74     int                                 rc = 0;
301 74     GlobusFuncName(globus_l_soap_message_deactivate);
302 74     GlobusSoapMessageDebugEnter();
303
304 74     if(GLOBUS_XSD_BASE_REGISTRY)
305     {
306 74         globus_xsd_type_registry_destroy(GLOBUS_XSD_BASE_REGISTRY);
307 74         GLOBUS_XSD_BASE_REGISTRY = NULL;
308     }
309  
310 74     if(GLOBUS_GLOBAL_TYPE_REGISTRY)
311     {
312 74         globus_xsd_type_registry_destroy(GLOBUS_GLOBAL_TYPE_REGISTRY);
313 74         GLOBUS_GLOBAL_TYPE_REGISTRY = NULL;
314     }
315
316 74     xmlSchemaCleanupTypes();
317     
318 74     if(globus_i_soap_message_file_driver)
319     {
320 74         globus_xio_driver_unload(globus_i_soap_message_file_driver);
321     }
322
323 74     if(globus_i_soap_message_xio_https_stack)
324     {
325 74         globus_xio_stack_destroy(globus_i_soap_message_xio_https_stack);
326     }
327     
328 74     if(globus_i_soap_message_xio_file_stack)
329     {
330 74         globus_xio_stack_destroy(globus_i_soap_message_xio_file_stack);
331     }
332     
333 74     if(globus_i_soap_message_xio_stack)
334     {
335 74         globus_xio_stack_destroy(globus_i_soap_message_xio_stack);
336     }
337     
338 74     if(globus_i_soap_message_buffer_driver)
339     {
340 74         globus_xio_driver_unload(globus_i_soap_message_buffer_driver);
341     }
342
343 74     if(globus_i_soap_message_http_driver)
344     {
345 74         globus_xio_driver_unload(globus_i_soap_message_http_driver);
346     }
347
348 74     if(globus_i_soap_message_tcp_driver)
349     {
350 74         globus_xio_driver_unload(globus_i_soap_message_tcp_driver);
351     }
352
353 74     if(globus_i_soap_message_gsi_driver)
354     {
355 74         globus_xio_driver_unload(globus_i_soap_message_gsi_driver);
356     }
357
358 74     rc = globus_module_deactivate(GLOBUS_XIO_MODULE);
359 74     if(rc != GLOBUS_SUCCESS)
360     {
361 0         return rc;
362     }
363
364 74     rc = globus_module_deactivate(GLOBUS_COMMON_MODULE);
365 74     if(rc != GLOBUS_SUCCESS)
366     {
367 0         return rc;
368     }
369
370 74     return GLOBUS_SUCCESS;