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

  1 karl  1.28 //%2005////////////////////////////////////////////////////////////////////////
  2 kumpf 1.1  //
  3 karl  1.25 // 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 karl  1.12 // IBM Corp.; EMC Corporation, The Open Group.
  7 karl  1.25 // Copyright (c) 2004 BMC Software; Hewlett-Packard Development Company, L.P.;
  8            // IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group.
  9 karl  1.28 // Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.;
 10            // EMC Corporation; VERITAS Software Corporation; The Open Group.
 11 kumpf 1.1  //
 12            // Permission is hereby granted, free of charge, to any person obtaining a copy
 13            // of this software and associated documentation files (the "Software"), to
 14            // deal in the Software without restriction, including without limitation the
 15            // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
 16            // sell copies of the Software, and to permit persons to whom the Software is
 17            // furnished to do so, subject to the following conditions:
 18 david.dillard 1.31 //
 19 kumpf         1.1  // THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN
 20                    // ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED
 21                    // "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
 22                    // LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
 23                    // PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
 24                    // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
 25                    // ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 26                    // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 27                    //
 28                    //==============================================================================
 29                    //
 30 tony          1.8  // Author: Dong Xiang, EMC Corporation (xiang_dong@emc.com)
 31 kumpf         1.1  //
 32 dj.gorey      1.14 // Modified By:   Dan Gorey (djgorey@us.ibm.com)
 33 a.arora       1.21 //                Amit K Arora, IBM (amita@in.ibm.com) for PEP#183
 34 kumpf         1.26 //                Roger Kumpf, Hewlett-Packard Company (roger_kumpf@hp.com)
 35 david.dillard 1.31 //                David Dillard, VERITAS Software Corp.
 36                    //                    (david.dillard@veritas.com)
 37 vijay.eli     1.33 //                Vijay Eli, IBM (vijay.eli@in.ibm.com) for bug#3425
 38 aruran.ms     1.35 //                Aruran, IBM (ashanmug@in.ibm.com) for Bug# 3604
 39 kumpf         1.1  //
 40                    //%/////////////////////////////////////////////////////////////////////////////
 41                    
 42 tony          1.8  #include "CIMListener.h"
 43 kumpf         1.1  
 44 tony          1.8  #include <Pegasus/Common/Exception.h>
 45                    #include <Pegasus/Common/SSLContext.h>
 46                    #include <Pegasus/Common/Monitor.h>
 47 kumpf         1.1  #include <Pegasus/Common/HTTPAcceptor.h>
 48 kumpf         1.11 #include <Pegasus/Common/PegasusVersion.h>
 49 konrad.r      1.38 #include <Pegasus/Common/MessageLoader.h>
 50 kumpf         1.2  
 51 kumpf         1.1  #include <Pegasus/ExportServer/CIMExportResponseEncoder.h>
 52                    #include <Pegasus/ExportServer/CIMExportRequestDecoder.h>
 53                    
 54 tony          1.8  #include <Pegasus/Consumer/CIMIndicationConsumer.h>
 55                    #include <Pegasus/Listener/CIMListenerIndicationDispatcher.h>
 56                    
 57                    PEGASUS_NAMESPACE_BEGIN
 58                    /////////////////////////////////////////////////////////////////////////////
 59                    // CIMListenerService
 60                    /////////////////////////////////////////////////////////////////////////////
 61                    class CIMListenerService
 62                    {
 63                    public:
 64                    	CIMListenerService(Uint32 portNumber, SSLContext* sslContext=NULL);
 65                    	CIMListenerService(CIMListenerService& svc);
 66                      ~CIMListenerService();
 67                    
 68                    	void				init();
 69                    	/** bind to the port
 70                    	*/
 71                    	void				bind();
 72                    	/** runForever Main runloop for the server.
 73                    	*/
 74                    	void runForever();
 75 david.dillard 1.31 
 76 tony          1.8  	/** Call to gracefully shutdown the server.  The server connection socket
 77                    	will be closed to disable new connections from clients.
 78                    	*/
 79                    	void stopClientConnection();
 80 david.dillard 1.31 
 81 tony          1.8  	/** Call to gracefully shutdown the server.  It is called when the server
 82                    	has been stopped and is ready to be shutdown.  Next time runForever()
 83                    	is called, the server shuts down.
 84                    	*/
 85                    	void shutdown();
 86 david.dillard 1.31 
 87 tony          1.8  	/** Return true if the server has shutdown, false otherwise.
 88                    	*/
 89 david.dillard 1.34 	Boolean terminated() const { return _dieNow; };
 90 david.dillard 1.31 
 91 tony          1.8  	/** Call to resume the sever.
 92                    	*/
 93                    	void resume();
 94 david.dillard 1.31 
 95 tony          1.8  	/** Call to set the CIMServer state.  Also inform the appropriate
 96                    	message queues about the current state of the CIMServer.
 97                    	*/
 98                    	void setState(Uint32 state);
 99 david.dillard 1.31 
100 tony          1.8  	Uint32 getOutstandingRequestCount();
101                    
102                    	/** Returns the indication listener dispatcher
103                    	 */
104                    	CIMListenerIndicationDispatcher* getIndicationDispatcher() const;
105                    
106 david.dillard 1.34 	/** Returns the indication listener dispatcher
107 tony          1.8  	 */
108                    	void setIndicationDispatcher(CIMListenerIndicationDispatcher* dispatcher);
109                    
110 david.dillard 1.34 	/** Returns the port number being used.
111                    	 */
112                    	Uint32 getPortNumber() const;
113                    
114 tony          1.8  	static PEGASUS_THREAD_RETURN PEGASUS_THREAD_CDECL _listener_routine(void *param);
115                    
116                    private:
117 david.dillard 1.34 	Uint32 _portNumber;
118 tony          1.8  	SSLContext* _sslContext;
119 david.dillard 1.34 	Monitor* _monitor;
120                    	HTTPAcceptor* _acceptor;
121 dj.gorey      1.14 
122                      Boolean					_dieNow;
123 tony          1.8  
124                      CIMListenerIndicationDispatcher* _dispatcher;
125                    
126                      CIMExportResponseEncoder* _responseEncoder;
127                      CIMExportRequestDecoder*  _requestDecoder;
128                    
129                    };
130                    
131                    CIMListenerService::CIMListenerService(Uint32 portNumber, SSLContext* sslContext)
132                    :_portNumber(portNumber)
133                    ,_sslContext(sslContext)
134                    ,_monitor(NULL)
135                    ,_acceptor(NULL)
136                    ,_dieNow(false)
137                    ,_dispatcher(NULL)
138                    ,_responseEncoder(NULL)
139                    ,_requestDecoder(NULL)
140                    {
141                    }
142                    
143                    CIMListenerService::CIMListenerService(CIMListenerService& svc)
144 tony          1.8  :_portNumber(svc._portNumber)
145                    ,_sslContext(svc._sslContext)
146                    ,_monitor(NULL)
147                    ,_acceptor(NULL)
148                    ,_dieNow(svc._dieNow)
149                    ,_dispatcher(NULL)
150                    ,_responseEncoder(NULL)
151                    ,_requestDecoder(NULL)
152                    {
153                    }
154                    CIMListenerService::~CIMListenerService()
155                    {
156 kumpf         1.36     // if port is alive, clean up the port
157                        //delete _sslContext;
158 tony          1.8  
159 kumpf         1.36     delete _responseEncoder;
160 tony          1.8  
161 kumpf         1.36     delete _requestDecoder;
162 kumpf         1.1  
163 kumpf         1.36     //delete _dispatcher;
164 kumpf         1.1  
165 kumpf         1.36     delete _acceptor;
166 kumpf         1.1  
167 kumpf         1.36     delete _monitor;
168 tony          1.8  }
169 kumpf         1.1  
170 tony          1.8  void CIMListenerService::init()
171 kumpf         1.1  {
172 tony          1.8  	PEG_METHOD_ENTER(TRC_LISTENER, "CIMListenerService::init");
173 kumpf         1.1  
174 vijay.eli     1.33   if(NULL == _monitor) _monitor = new Monitor();
175 david.dillard 1.31 
176 tony          1.8  	//_dispatcher = new CIMListenerIndicationDispatcher();
177 kumpf         1.1  
178 vijay.eli     1.33   if(NULL == _responseEncoder) _responseEncoder = new CIMExportResponseEncoder();
179                      if(NULL == _requestDecoder) _requestDecoder = new CIMExportRequestDecoder(
180                                                          _dispatcher,_responseEncoder->getQueueId());
181 tony          1.8  
182 vijay.eli     1.33   if(NULL == _acceptor) _acceptor = new HTTPAcceptor(
183 david.dillard 1.31 		 _monitor,
184                    		 _requestDecoder,
185                    		 false,
186                    		 _portNumber,
187 kumpf         1.19 		 _sslContext,
188                                     false);
189 kumpf         1.1  
190 chuck         1.20   bind();
191 kumpf         1.1  
192 chuck         1.20   PEG_METHOD_EXIT();
193 tony          1.8  }
194 david.dillard 1.34 
195 tony          1.8  void CIMListenerService::bind()
196                    {
197 chuck         1.20   if(_acceptor!=NULL)
198                        { // Bind to the port
199                          _acceptor->bind();
200 tony          1.8  
201 chuck         1.20       //listener.addAcceptor(false, portNumberHttp, false);
202                          Logger::put(Logger::STANDARD_LOG, System::CIMLISTENER, Logger::INFORMATION,
203 tony          1.8                          "Listening on HTTP port $0.", _portNumber);
204 kumpf         1.1  
205 chuck         1.20     }
206 tony          1.8  }
207 chuck         1.20 
208 tony          1.8  void CIMListenerService::runForever()
209                    {
210 chuck         1.20   static int modulator = 0;
211 kumpf         1.1  
212 chuck         1.20   if(!_dieNow)
213 dj.gorey      1.14     {
214 david.dillard 1.31       if(false == _monitor->run(500000))
215                    	{
216 chuck         1.20 	  modulator++;
217 david.dillard 1.31       try
218 a.arora       1.21       {
219                    	     //MessageQueueService::_check_idle_flag = 1;
220                    		 //MessageQueueService::_polling_sem.signal();
221 kumpf         1.30 		 MessageQueueService::get_thread_pool()->cleanupIdleThreads();
222 a.arora       1.21       }
223                    	  catch(...)
224                          {
225                          }
226 chuck         1.20 	}
227                    /*
228                          if (handleShutdownSignal)
229                          {
230                            Tracer::trace(TRC_SERVER, Tracer::LEVEL3,
231                    	"CIMServer::runForever - signal received.  Shutting down.");
232                    
233                    	ShutdownService::getInstance(this)->shutdown(true, 10, false);
234                    	handleShutdownSignal = false;
235                          }
236 tony          1.8  */
237 chuck         1.20     }
238 tony          1.8  }
239 kumpf         1.1  
240 tony          1.8  void CIMListenerService::shutdown()
241                    {
242                        PEG_METHOD_ENTER(TRC_LISTENER, "CIMListenerService::shutdown()");
243 kumpf         1.1  
244 tony          1.8      _dieNow = true;
245 a.arora       1.21     _monitor->tickle();
246 kumpf         1.1  
247 kumpf         1.4      PEG_METHOD_EXIT();
248 kumpf         1.1  }
249                    
250 tony          1.8  void CIMListenerService::resume()
251 kumpf         1.1  {
252 tony          1.8      PEG_METHOD_ENTER(TRC_LISTENER, "CIMListenerService::resume()");
253 kumpf         1.1  
254 tony          1.8      if(_acceptor!=NULL)
255                            _acceptor->reopenConnectionSocket();
256 kumpf         1.1  
257 kumpf         1.4      PEG_METHOD_EXIT();
258 kumpf         1.1  }
259                    
260 tony          1.8  void CIMListenerService::stopClientConnection()
261 kumpf         1.1  {
262 tony          1.8      PEG_METHOD_ENTER(TRC_LISTENER, "CIMListenerService::stopClientConnection()");
263 kumpf         1.1  
264 kumpf         1.10     // tell Monitor to stop listening for client connections
265 chuck         1.22     _monitor->stopListeningForConnections(true);
266 kumpf         1.10 
267                        //
268                        // Wait 150 milliseconds to allow time for the Monitor to stop
269                        // listening for client connections.
270                        //
271                        // This wait time is the timeout value for the select() call
272                        // in the Monitor's run() method (currently set to 100
273                        // milliseconds) plus a delta of 50 milliseconds.  The reason
274                        // for the wait here is to make sure that the Monitor entries
275                        // are updated before closing the connection sockets.
276                        //
277 a.arora       1.21     // pegasus_sleep(150); Not needed now due to the semaphore in the Monitor
278 david.dillard 1.31 
279 tony          1.8      if(_acceptor!=NULL)
280                        _acceptor->closeConnectionSocket();
281 kumpf         1.1  
282 kumpf         1.4      PEG_METHOD_EXIT();
283 kumpf         1.1  }
284                    
285 chuck         1.23 Uint32 CIMListenerService::getOutstandingRequestCount()
286                    {
287                        return _acceptor->getOutstandingRequestCount();
288                    }
289 tony          1.8  
290                    CIMListenerIndicationDispatcher* CIMListenerService::getIndicationDispatcher() const
291 kumpf         1.1  {
292 david.dillard 1.32     return _dispatcher;
293 tony          1.8  }
294 david.dillard 1.34 
295 tony          1.8  void CIMListenerService::setIndicationDispatcher(CIMListenerIndicationDispatcher* dispatcher)
296                    {
297 david.dillard 1.32     _dispatcher = dispatcher;
298 kumpf         1.1  }
299                    
300 david.dillard 1.34 Uint32 CIMListenerService::getPortNumber() const
301                    {
302                    
303                        Uint32 portNumber = _portNumber;
304                    
305                        if (( portNumber == 0 ) && ( _acceptor != 0 ))
306                        {
307                            portNumber = _acceptor->getPortNumber();
308                        }
309                    
310                        return(portNumber);
311                    }
312                    
313 tony          1.8  PEGASUS_THREAD_RETURN PEGASUS_THREAD_CDECL CIMListenerService::_listener_routine(void *param)
314 kumpf         1.1  {
315 konrad.r      1.37   try { 
316 david.dillard 1.32     AutoPtr<CIMListenerService> svc(reinterpret_cast<CIMListenerService *>(param));
317 kumpf         1.1  
318 david.dillard 1.32     //svc->init(); bug 1394
319                        while(!svc->terminated())
320                        {
321 chuck         1.20 #if defined(PEGASUS_PLATFORM_DARWIN_PPC_GNU)
322 david.dillard 1.32         pthread_testcancel();
323 chuck         1.20 #endif
324 david.dillard 1.32         svc->runForever();
325                        }
326 konrad.r      1.37   } catch (...) 
327                      { 
328                            Tracer::trace(TRC_SERVER, Tracer::LEVEL2,
329                    			"Unknown exception thrown in _listener_routine.");
330                      }
331 david.dillard 1.32     return 0;
332 tony          1.8  }
333                    
334                    /////////////////////////////////////////////////////////////////////////////
335                    // CIMListenerRep
336                    /////////////////////////////////////////////////////////////////////////////
337                    class CIMListenerRep
338                    {
339                    public:
340                    	CIMListenerRep(Uint32 portNumber, SSLContext* sslContext=NULL);
341                      ~CIMListenerRep();
342                    
343                    	Uint32 getPortNumber() const;
344                    
345                    	SSLContext* getSSLContext() const;
346                    	void setSSLContext(SSLContext* sslContext);
347 david.dillard 1.31 
348 tony          1.8  	void start();
349                    	void stop();
350                    
351                    	Boolean isAlive();
352                    
353                    	Boolean addConsumer(CIMIndicationConsumer* consumer);
354                    	Boolean removeConsumer(CIMIndicationConsumer* consumer);
355                    
356                    private:
357 chuck         1.23   Boolean waitForPendingRequests(Uint32 shutdownTimeout);
358                    
359                      Uint32 _portNumber;
360                      SSLContext* _sslContext;
361 tony          1.8  
362                      CIMListenerIndicationDispatcher* _dispatcher;
363 chuck         1.23   ThreadPool* _thread_pool;
364 david.dillard 1.31   CIMListenerService* _svc;
365 chuck         1.20   Semaphore *_listener_sem;
366 tony          1.8  };
367                    
368                    CIMListenerRep::CIMListenerRep(Uint32 portNumber, SSLContext* sslContext)
369                    :_portNumber(portNumber)
370                    ,_sslContext(sslContext)
371                    ,_dispatcher(new CIMListenerIndicationDispatcher())
372                    ,_thread_pool(NULL)
373 chuck         1.20 ,_svc(NULL)
374                    ,_listener_sem(NULL)
375 tony          1.8  {
376                    }
377 david.dillard 1.31 
378 tony          1.8  CIMListenerRep::~CIMListenerRep()
379                    {
380 david.dillard 1.31     // if port is alive, clean up the port
381                        if (_thread_pool != 0)
382                        {
383                            // Block incoming export requests and unbind the port
384                            _svc->stopClientConnection();
385                    
386                            // Wait until pending export requests in the server are done.
387                            waitForPendingRequests(10);
388 chuck         1.23 
389 david.dillard 1.31         // Shutdown the CIMListenerService
390                            _svc->shutdown();
391                        }
392 chuck         1.20 
393                        delete _sslContext;
394                        delete _dispatcher;
395                        delete _thread_pool;
396                        delete _listener_sem;
397 tony          1.8  
398 chuck         1.20   // don't delete _svc, this is deleted by _listener_routine
399 tony          1.8  }
400                    
401                    Uint32 CIMListenerRep::getPortNumber() const
402                    {
403 david.dillard 1.34     Uint32 portNumber;
404                    
405                        if ( _svc == 0 )
406                        {
407                            portNumber = _portNumber;
408                        }
409                        else portNumber = _svc->getPortNumber();
410                    
411                        return portNumber;
412 tony          1.8  }
413 kumpf         1.1  
414 tony          1.8  SSLContext* CIMListenerRep::getSSLContext() const
415                    {
416 david.dillard 1.31     return _sslContext;
417 kumpf         1.1  }
418 david.dillard 1.31 
419 tony          1.8  void CIMListenerRep::setSSLContext(SSLContext* sslContext)
420                    {
421 david.dillard 1.31     delete _sslContext;
422                        _sslContext = sslContext;
423                    }
424 kumpf         1.1  
425 tony          1.8  void CIMListenerRep::start()
426 kumpf         1.1  {
427 david.dillard 1.31     // spawn a thread to do this
428                        if(_thread_pool==0)
429 chuck         1.20     {
430 david.dillard 1.31         AutoPtr<CIMListenerService> svc(new CIMListenerService(_portNumber,_sslContext));
431 chuck         1.20 
432 david.dillard 1.31         svc->setIndicationDispatcher(_dispatcher);
433                            svc->init();
434 chuck         1.20 
435 david.dillard 1.31         struct timeval deallocateWait = {15, 0};
436                            AutoPtr<ThreadPool> threadPool(new ThreadPool(0, "Listener", 0, 1, deallocateWait));
437                            AutoPtr<Semaphore> sem(new Semaphore(0));
438 konrad.r      1.38         if (threadPool->allocate_and_awaken(svc.get(), CIMListenerService::_listener_routine, sem.get()) != PEGASUS_THREAD_OK)
439                        	{
440                    	    Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::TRACE,
441                    			"Not enough threads to start CIMListernerService.");
442                     
443                    	    Tracer::trace(TRC_SERVER, Tracer::LEVEL2,
444                    			"Could not allocate thread for CIMListenerService::_listener_routine."); 
445                    	    throw Exception(MessageLoaderParms("Listener.CIMListener.CANNOT_ALLOCATE_THREAD",
446                    				"Could not allocate thread."));
447                            }
448 david.dillard 1.31         Logger::put(Logger::STANDARD_LOG,System::CIMLISTENER, Logger::INFORMATION,
449                                            "CIMListener started");
450                    
451                            _svc = svc.release();
452                            _thread_pool = threadPool.release();
453                            _listener_sem = sem.release();
454                        }
455 tony          1.8  }
456 kumpf         1.1  
457 tony          1.8  void CIMListenerRep::stop()
458                    {
459 chuck         1.20   if(_thread_pool!=NULL)
460 david.dillard 1.31   {
461 chuck         1.20     //
462                        // Graceful shutdown of the listener service
463                        //
464                    
465                        // Block incoming export requests and unbind the port
466                        _svc->stopClientConnection();
467 chuck         1.23 
468                        // Wait until pending export requests in the server are done.
469 chuck         1.24     waitForPendingRequests(10);
470 david.dillard 1.31 
471 chuck         1.20     // Shutdown the CIMListenerService
472                        _svc->shutdown();
473                    
474                        // Wait for the _listener_routine thread to exit.
475                        // The thread could be delivering an export, so give it 3sec.
476                        // Note that _listener_routine deletes the CIMListenerService,
477                        // so no need to delete _svc.
478                        try
479                        {
480 david.dillard 1.31       _listener_sem->time_wait(3000);
481 chuck         1.20     }
482 david.dillard 1.34     catch (const TimeOut &)
483 chuck         1.20     {
484                          // No need to do anything, the thread pool will be deleted below
485                          // to cancel the _listener_routine thread if it is still running.
486                        }
487                    
488                        delete _listener_sem;
489                        _listener_sem = NULL;
490 david.dillard 1.31 
491 chuck         1.20     // Delete the thread pool.  This cancels the listener thread if it is still
492                        // running.
493                        delete _thread_pool;
494                        _thread_pool = NULL;
495                    
496                        Logger::put(Logger::STANDARD_LOG,System::CIMLISTENER,
497                    		Logger::INFORMATION,
498                    		"CIMListener stopped");
499                      }
500 kumpf         1.1  }
501                    
502 tony          1.8  Boolean CIMListenerRep::isAlive()
503 kumpf         1.1  {
504 tony          1.8  	return (_thread_pool!=NULL)?true:false;
505                    }
506 kumpf         1.1  
507 tony          1.8  Boolean CIMListenerRep::addConsumer(CIMIndicationConsumer* consumer)
508                    {
509                    	return _dispatcher->addConsumer(consumer);
510                    }
511                    Boolean CIMListenerRep::removeConsumer(CIMIndicationConsumer* consumer)
512                    {
513                    	return _dispatcher->removeConsumer(consumer);
514                    }
515 kumpf         1.1  
516 chuck         1.23 Boolean CIMListenerRep::waitForPendingRequests(Uint32 shutdownTimeout)
517                    {
518                      // Wait for 10 sec max
519                      Uint32 reqCount;
520                      Uint32 countDown = shutdownTimeout * 10;
521                      for (; countDown > 0; countDown--)
522                      {
523                        reqCount = _svc->getOutstandingRequestCount();
524                        if (reqCount > 0)
525                          pegasus_sleep(100);
526                        else
527                          return true;
528                      }
529 david.dillard 1.31 
530 chuck         1.23   return false;
531 david.dillard 1.31 }
532 chuck         1.23 
533 tony          1.8  /////////////////////////////////////////////////////////////////////////////
534                    // CIMListener
535                    /////////////////////////////////////////////////////////////////////////////
536                    CIMListener::CIMListener(Uint32 portNumber, SSLContext* sslContext)
537                    :_rep(new CIMListenerRep(portNumber,sslContext))
538                    {
539                    }
540                    CIMListener::~CIMListener()
541                    {
542                    	if(_rep!=NULL)
543 tony          1.9  		delete static_cast<CIMListenerRep*>(_rep);
544 tony          1.8  	_rep=NULL;
545                    }
546 david.dillard 1.31 
547 tony          1.8  Uint32 CIMListener::getPortNumber() const
548                    {
549                    	return static_cast<CIMListenerRep*>(_rep)->getPortNumber();
550 kumpf         1.1  }
551                    
552 tony          1.8  SSLContext* CIMListener::getSSLContext() const
553                    {
554                    	return static_cast<CIMListenerRep*>(_rep)->getSSLContext();
555                    }
556                    void CIMListener::setSSLContext(SSLContext* sslContext)
557                    {
558                    	static_cast<CIMListenerRep*>(_rep)->setSSLContext(sslContext);
559                    }
560                    void CIMListener::start()
561 kumpf         1.1  {
562 tony          1.8  	static_cast<CIMListenerRep*>(_rep)->start();
563                    }
564                    void CIMListener::stop()
565                    {
566                    	static_cast<CIMListenerRep*>(_rep)->stop();
567                    }
568 kumpf         1.1  
569 aruran.ms     1.35 Boolean CIMListener::isAlive() const
570 tony          1.8  {
571                    	return static_cast<CIMListenerRep*>(_rep)->isAlive();
572                    }
573 kumpf         1.1  
574 tony          1.8  Boolean CIMListener::addConsumer(CIMIndicationConsumer* consumer)
575                    {
576                    	return static_cast<CIMListenerRep*>(_rep)->addConsumer(consumer);
577                    }
578                    Boolean CIMListener::removeConsumer(CIMIndicationConsumer* consumer)
579                    {
580                    	return static_cast<CIMListenerRep*>(_rep)->removeConsumer(consumer);
581 kumpf         1.1  }
582                    
583                    PEGASUS_NAMESPACE_END

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2