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