1 martin 1.8 //%LICENSE////////////////////////////////////////////////////////////////
|
2 martin 1.9 //
|
3 martin 1.8 // Licensed to The Open Group (TOG) under one or more contributor license
4 // agreements. Refer to the OpenPegasusNOTICE.txt file distributed with
5 // this work for additional information regarding copyright ownership.
6 // Each contributor licenses this file to you under the OpenPegasus Open
7 // Source License; you may not use this file except in compliance with the
8 // License.
|
9 martin 1.9 //
|
10 martin 1.8 // Permission is hereby granted, free of charge, to any person obtaining a
11 // copy of this software and associated documentation files (the "Software"),
12 // to deal in the Software without restriction, including without limitation
13 // the rights to use, copy, modify, merge, publish, distribute, sublicense,
14 // and/or sell copies of the Software, and to permit persons to whom the
15 // Software is furnished to do so, subject to the following conditions:
|
16 martin 1.9 //
|
17 martin 1.8 // The above copyright notice and this permission notice shall be included
18 // in all copies or substantial portions of the Software.
|
19 martin 1.9 //
|
20 martin 1.8 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
21 martin 1.9 // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
22 martin 1.8 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
23 // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
24 // CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
25 // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
26 // SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
27 martin 1.9 //
|
28 martin 1.8 //////////////////////////////////////////////////////////////////////////
|
29 h.sterling 1.1 //
30 // Author: Heather Sterling (hsterl@us.ibm.com)
31 //
|
32 kumpf 1.10 // Modified By:
|
33 h.sterling 1.1 //
|
34 marek 1.7 //%////////////////////////////////////////////////////////////////////////////
|
35 h.sterling 1.1
36 #include "DynamicListener.h"
37 #include "ListenerService.h"
38 #include "ConsumerManager.h"
39
40 #include <Pegasus/Common/Config.h>
41 #include <Pegasus/Common/Exception.h>
42 #include <Pegasus/Common/SSLContext.h>
43 #include <Pegasus/Common/Monitor.h>
44 #include <Pegasus/Common/HTTPAcceptor.h>
45 #include <Pegasus/Common/PegasusVersion.h>
46 #include <Pegasus/Common/Tracer.h>
47
48 #include <Pegasus/Common/HashTable.h>
49 #include <Pegasus/Common/FileSystem.h>
50
51 #include <Pegasus/ExportServer/CIMExportResponseEncoder.h>
52 #include <Pegasus/ExportServer/CIMExportRequestDecoder.h>
53
54 PEGASUS_NAMESPACE_BEGIN
55 PEGASUS_USING_STD;
56 h.sterling 1.1
57
58 const Boolean DynamicListener::DEFAULT_CONSUMER_UNLOAD = true;
59 const Uint32 DynamicListener::DEFAULT_IDLE_TIMEOUT = 300000; //ms
60 const Boolean DynamicListener::DEFAULT_FORCE_SHUTDOWN = false;
61 const Uint32 DynamicListener::DEFAULT_SHUTDOWN_TIMEOUT = 10000; //ms
62
63
64 /////////////////////////////////////////////////////////////////////////////
65 // DynamicListenerRep
66 /////////////////////////////////////////////////////////////////////////////
67
68 //This class is used to stabilize the DynamicListener external interface.
69
70 class DynamicListenerRep
71 {
72 public:
73
|
74 kumpf 1.10 DynamicListenerRep(Uint32 portNumber,
75 const String& consumerDir,
|
76 h.sterling 1.1 const String& consumerConfigDir,
77 SSLContext* sslContext,
|
78 kumpf 1.10 Boolean enableConsumerUnload,
79 Uint32 consumerIdleTimeout,
|
80 h.sterling 1.1 Uint32 shutdownTimeout);
81
82 ~DynamicListenerRep();
83
84 void start();
85
86 void stop(Boolean forceShutdown);
87
88 Boolean isAlive();
89
|
90 marek 1.7 Boolean addConsumer(
91 const String& consumerName,
92 const String& location = String::EMPTY);
|
93 h.sterling 1.1
94 Boolean removeConsumer(const String& consumerName);
95
96 Uint32 getPortNumber();
97
98 String getConsumerDir();
99
100 String getConsumerConfigDir();
101
102 void setEnableConsumerUnload(Boolean consumerUnload);
103
104 Boolean getEnableConsumerUnload();
105
|
106 gs.keenan 1.4 void setIdleTimeout(Uint32 idleTimeout);
|
107 h.sterling 1.1
|
108 kumpf 1.10 Uint32 getIdleTimeout();
|
109 h.sterling 1.1
110 private:
111
112 // core components
|
113 kumpf 1.10 ListenerService* _listenerService;
|
114 h.sterling 1.1 ConsumerManager* _consumerManager;
115
116 // config properties -- do we want to separate these out????
117 Uint32 _port;
118 SSLContext* _sslContext;
119 };
120
|
121 marek 1.7 DynamicListenerRep::DynamicListenerRep(
|
122 kumpf 1.10 Uint32 portNumber,
|
123 marek 1.7 const String& consumerDir, //consumer mgr
124 const String& consumerConfigDir, //consumer mgr
125 SSLContext* sslContext, //listener svc
126 Boolean enableConsumerUnload, //consumer mgr
127 Uint32 consumerIdleTimeout, //consumer mgr
128 Uint32 shutdownTimeout) : _port(portNumber), _sslContext(sslContext)
|
129 h.sterling 1.1 {
130 PEG_METHOD_ENTER(TRC_LISTENER, "DynamicListenerRep::DynamicListenerRep");
131
|
132 marek 1.7 _consumerManager = new ConsumerManager(
133 consumerDir,
134 consumerConfigDir,
135 enableConsumerUnload,
136 consumerIdleTimeout);
|
137 h.sterling 1.1
138 _listenerService = new ListenerService(_consumerManager);
139
140 PEG_METHOD_EXIT();
141 }
142
143 DynamicListenerRep::~DynamicListenerRep()
144 {
145 PEG_METHOD_ENTER(TRC_LISTENER, "DynamicListenerRep::~DynamicListenerRep");
146
|
147 kumpf 1.6 delete _consumerManager;
|
148 h.sterling 1.1
|
149 kumpf 1.6 delete _listenerService;
|
150 h.sterling 1.1
151 PEG_METHOD_EXIT();
152 }
153
154 void DynamicListenerRep::start()
155 {
156 PEG_METHOD_ENTER(TRC_LISTENER, "DynamicListenerRep::start");
157
158 if (_sslContext)
159 {
160 _listenerService->initializeListener(_port, true, _sslContext);
161
162 } else
163 {
164 _listenerService->initializeListener(_port, false, 0);
165 }
166
167 _listenerService->runListener();
168
|
169 kumpf 1.10 PEG_METHOD_EXIT();
|
170 h.sterling 1.1 }
171
172 void DynamicListenerRep::stop(Boolean forceShutdown)
173 {
174 PEG_METHOD_ENTER(TRC_LISTENER, "DynamicListenerRep::stop");
175
176 _listenerService->shutdownListener();
177
178 PEG_METHOD_EXIT();
179 }
180
181 Boolean DynamicListenerRep::isAlive()
182 {
183 return _listenerService->isAlive();
184 }
185
|
186 kumpf 1.10 //TODO:
|
187 marek 1.7 Boolean DynamicListenerRep::addConsumer(
188 const String& consumerName,
189 const String& location)
|
190 h.sterling 1.1 {
191 return true;
192 //return _consumerManager->addConsumer(consumerName, location);
193 }
194
195 //TODO:
196 Boolean DynamicListenerRep::removeConsumer(const String& consumerName)
197 {
198 return true;
199 //return _consumerManager->unloadConsumer(consumerName);
200 }
201
|
202 kumpf 1.10 Uint32 DynamicListenerRep::getPortNumber()
|
203 h.sterling 1.1 {
204 return _listenerService->getPortNumber();
205 }
206
207 String DynamicListenerRep::getConsumerDir()
208 {
209 return _consumerManager->getConsumerDir();
210 }
211
212 String DynamicListenerRep::getConsumerConfigDir()
213 {
214 return _consumerManager->getConsumerConfigDir();
215 }
216
217 Boolean DynamicListenerRep::getEnableConsumerUnload()
218 {
219 return _consumerManager->getEnableConsumerUnload();
220 }
221
222 void DynamicListenerRep::setEnableConsumerUnload(Boolean enableConsumerUnload)
223 {
224 h.sterling 1.1 //do nothing for now
225 }
226
227 Uint32 DynamicListenerRep::getIdleTimeout()
228 {
229 return _consumerManager->getIdleTimeout();
230 }
231
|
232 gs.keenan 1.3 void DynamicListenerRep::setIdleTimeout(Uint32 idleTimeout)
|
233 h.sterling 1.1 {
234 //do nothing for now
235 }
236
237
238 /////////////////////////////////////////////////////////////////////////////
239 // DynamicListener
240 /////////////////////////////////////////////////////////////////////////////
241
|
242 kumpf 1.10 DynamicListener::DynamicListener(Uint32 portNumber,
243 const String& consumerDir,
|
244 h.sterling 1.1 const String& consumerConfigDir,
|
245 kumpf 1.10 Boolean enableConsumerUnload,
246 Uint32 consumerIdleTimeout,
247 Uint32 shutdownTimeout)
248 {
249 _rep = new DynamicListenerRep(portNumber,
250 consumerDir,
251 consumerConfigDir,
252 0,
253 enableConsumerUnload,
254 consumerIdleTimeout,
|
255 h.sterling 1.1 shutdownTimeout);
256 }
257
258 #ifdef PEGASUS_HAS_SSL
|
259 marek 1.7 DynamicListener::DynamicListener(
|
260 kumpf 1.10 Uint32 portNumber,
|
261 marek 1.7 const String& consumerDir,
262 const String& consumerConfigDir,
|
263 kumpf 1.10 Boolean useSSL,
264 const String& keyPath,
|
265 marek 1.7 const String& certPath,
|
266 kumpf 1.10 Boolean enableConsumerUnload,
267 Uint32 consumerIdleTimeout,
|
268 marek 1.7 Uint32 shutdownTimeout) //ONLY IF PEGASUS_HAS_SSL
|
269 h.sterling 1.1 {
270 SSLContext* sslContext = 0;
271 if (useSSL)
272 {
|
273 marek 1.7 sslContext = new SSLContext(
274 String::EMPTY,
275 certPath,
276 keyPath,
277 0,
278 String::EMPTY); //randFile);
|
279 h.sterling 1.1 }
280
|
281 kumpf 1.10 _rep = new DynamicListenerRep(portNumber,
282 consumerDir,
283 consumerConfigDir,
284 sslContext,
285 enableConsumerUnload,
286 consumerIdleTimeout,
|
287 h.sterling 1.1 shutdownTimeout);
288 }
289
|
290 marek 1.7 DynamicListener::DynamicListener(
|
291 kumpf 1.10 Uint32 portNumber,
|
292 marek 1.7 const String& consumerDir,
293 const String& consumerConfigDir,
|
294 kumpf 1.10 Boolean useSSL,
|
295 marek 1.7 SSLContext* sslContext,
|
296 kumpf 1.10 Boolean enableConsumerUnload,
297 Uint32 consumerIdleTimeout,
|
298 marek 1.7 Uint32 shutdownTimeout) //ONLY IF PEGASUS_HAS_SSL
|
299 h.sterling 1.1 {
|
300 kumpf 1.10 _rep = new DynamicListenerRep(portNumber,
301 consumerDir,
302 consumerConfigDir,
303 sslContext,
304 enableConsumerUnload,
305 consumerIdleTimeout,
|
306 h.sterling 1.1 shutdownTimeout);
307 }
308 #endif
309
310 DynamicListener::~DynamicListener()
311 {
|
312 kumpf 1.6 delete static_cast<DynamicListenerRep*>(_rep);
|
313 h.sterling 1.1 }
314
315 void DynamicListener::start()
316 {
317 static_cast<DynamicListenerRep*>(_rep)->start();
318 }
319
320 void DynamicListener::stop(Boolean forceShutdown)
321 {
322 static_cast<DynamicListenerRep*>(_rep)->stop(forceShutdown);
323 }
324
325 Boolean DynamicListener::isAlive()
326 {
327 return static_cast<DynamicListenerRep*>(_rep)->isAlive();
328 }
329
|
330 marek 1.7 Boolean DynamicListener::addConsumer(
331 const String& consumerName,
332 const String& location)
333 {
334 return static_cast<DynamicListenerRep*>(_rep)->addConsumer(
335 consumerName,
336 location);
|
337 h.sterling 1.1 }
338
339 Boolean DynamicListener::removeConsumer(const String& consumerName)
340 {
|
341 marek 1.7 return static_cast<DynamicListenerRep*>(_rep)->removeConsumer(
342 consumerName);
|
343 h.sterling 1.1 }
344
|
345 kumpf 1.10 Uint32 DynamicListener::getPortNumber()
|
346 h.sterling 1.1 {
347 return static_cast<DynamicListenerRep*>(_rep)->getPortNumber();
348 }
349
|
350 kumpf 1.10 String DynamicListener::getConsumerDir()
|
351 h.sterling 1.1 {
352 return static_cast<DynamicListenerRep*>(_rep)->getConsumerDir();
|
353 kumpf 1.10 }
|
354 h.sterling 1.1
|
355 kumpf 1.10 String DynamicListener::getConsumerConfigDir()
|
356 h.sterling 1.1 {
357 return static_cast<DynamicListenerRep*>(_rep)->getConsumerConfigDir();
|
358 kumpf 1.10 }
|
359 h.sterling 1.1
360 void DynamicListener::setEnableConsumerUnload(const Boolean consumerUnload)
361 {
|
362 marek 1.7 static_cast<DynamicListenerRep*>(_rep)->setEnableConsumerUnload(
363 consumerUnload);
|
364 h.sterling 1.1 }
365
366 Boolean DynamicListener::getEnableConsumerUnload()
367 {
368 return static_cast<DynamicListenerRep*>(_rep)->getEnableConsumerUnload();
369 }
370
|
371 kumpf 1.10 Uint32 DynamicListener::getIdleTimeout()
|
372 h.sterling 1.1 {
373 return static_cast<DynamicListenerRep*>(_rep)->getIdleTimeout();
374 }
375
|
376 gs.keenan 1.3 void DynamicListener::setIdleTimeout(Uint32 idleTimeout)
|
377 h.sterling 1.1 {
378 static_cast<DynamicListenerRep*>(_rep)->setIdleTimeout(idleTimeout);
379 }
380
381
382 PEGASUS_NAMESPACE_END
383
|