(file) Return to DynamicListener.cpp CVS log (file) (dir) Up to [Pegasus] / pegasus / src / Pegasus / DynListener

  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                 

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2