📄 cimlistener.cpp
字号:
//%2006//////////////////////////////////////////////////////////////////////////// Copyright (c) 2000, 2001, 2002 BMC Software; Hewlett-Packard Development// Company, L.P.; IBM Corp.; The Open Group; Tivoli Systems.// Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L.P.;// IBM Corp.; EMC Corporation, The Open Group.// Copyright (c) 2004 BMC Software; Hewlett-Packard Development Company, L.P.;// IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group.// Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.;// EMC Corporation; VERITAS Software Corporation; The Open Group.// Copyright (c) 2006 Hewlett-Packard Development Company, L.P.; IBM Corp.;// EMC Corporation; Symantec Corporation; The Open Group.//// Permission is hereby granted, free of charge, to any person obtaining a copy// of this software and associated documentation files (the "Software"), to// deal in the Software without restriction, including without limitation the// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or// sell copies of the Software, and to permit persons to whom the Software is// furnished to do so, subject to the following conditions:// // THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN// ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED// "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT// LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN// ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.////==============================================================================////%/////////////////////////////////////////////////////////////////////////////#include "CIMListener.h"#include <Pegasus/Common/Exception.h>#include <Pegasus/Common/SSLContext.h>#include <Pegasus/Common/Monitor.h>#include <Pegasus/Common/HTTPAcceptor.h>#include <Pegasus/Common/PegasusVersion.h>#include <Pegasus/Common/MessageLoader.h>#include <Pegasus/Common/Time.h>#include <Pegasus/ExportServer/CIMExportResponseEncoder.h>#include <Pegasus/ExportServer/CIMExportRequestDecoder.h>#include <Pegasus/Consumer/CIMIndicationConsumer.h>#include <Pegasus/Listener/CIMListenerIndicationDispatcher.h>PEGASUS_NAMESPACE_BEGIN//////////////////////////////////////////////////////////////////////////////////// CIMListenerService//////////////////////////////////////////////////////////////////////////////////class CIMListenerService{public: CIMListenerService(Uint32 portNumber, SSLContext * sslContext = NULL); CIMListenerService(CIMListenerService & svc); ~CIMListenerService(); void init(); /** bind to the port */ void bind(); /** runForever Main runloop for the server. */ void runForever(); /** Call to gracefully shutdown the server. The server connection socket will be closed to disable new connections from clients. */ void stopClientConnection(); /** Call to gracefully shutdown the server. It is called when the server has been stopped and is ready to be shutdown. Next time runForever() is called, the server shuts down. */ void shutdown(); /** Return true if the server has shutdown, false otherwise. */ Boolean terminated() const { return _dieNow; }; /** Call to resume the sever. */ void resume(); /** Call to set the CIMServer state. Also inform the appropriate message queues about the current state of the CIMServer. */ void setState(Uint32 state); Uint32 getOutstandingRequestCount(); /** Returns the indication listener dispatcher */ CIMListenerIndicationDispatcher *getIndicationDispatcher() const; /** Returns the indication listener dispatcher */ void setIndicationDispatcher(CIMListenerIndicationDispatcher* dispatcher); /** Returns the port number being used. */ Uint32 getPortNumber() const; static ThreadReturnType PEGASUS_THREAD_CDECL _listener_routine(void *param);private: Uint32 _portNumber; SSLContext *_sslContext; Monitor *_monitor; Mutex _monitorMutex; HTTPAcceptor *_acceptor; Boolean _dieNow; CIMListenerIndicationDispatcher *_dispatcher; CIMExportResponseEncoder *_responseEncoder; CIMExportRequestDecoder *_requestDecoder;};CIMListenerService::CIMListenerService( Uint32 portNumber, SSLContext * sslContext) : _portNumber(portNumber), _sslContext(sslContext), _monitor(NULL), _acceptor(NULL), _dieNow(false), _dispatcher(NULL), _responseEncoder(NULL), _requestDecoder(NULL){}CIMListenerService::CIMListenerService(CIMListenerService & svc) : _portNumber(svc._portNumber), _sslContext(svc._sslContext), _monitor(NULL), _acceptor(NULL), _dieNow(svc._dieNow), _dispatcher(NULL), _responseEncoder(NULL), _requestDecoder(NULL){}CIMListenerService::~CIMListenerService(){ delete _responseEncoder; delete _requestDecoder; delete _acceptor; delete _monitor;}void CIMListenerService::init(){ PEG_METHOD_ENTER(TRC_LISTENER, "CIMListenerService::init"); if (NULL == _monitor) _monitor = new Monitor(); // _dispatcher = new CIMListenerIndicationDispatcher(); if (NULL == _responseEncoder) _responseEncoder = new CIMExportResponseEncoder(); if (NULL == _requestDecoder) { _requestDecoder = new CIMExportRequestDecoder( _dispatcher, _responseEncoder->getQueueId()); } if (NULL == _acceptor) { _acceptor = new HTTPAcceptor( _monitor, _requestDecoder, false, _portNumber, _sslContext, false); } bind(); PEG_METHOD_EXIT();}void CIMListenerService::bind(){ if (_acceptor != NULL) { _acceptor->bind(); Logger::put( Logger::STANDARD_LOG, System::CIMLISTENER, Logger::INFORMATION, "Listening on HTTP port $0.", _portNumber); }}void CIMListenerService::runForever(){ if (!_dieNow) { _monitor->run(500000); static struct timeval lastIdleCleanupTime = {0, 0}; struct timeval now; Time::gettimeofday(&now); if (now.tv_sec - lastIdleCleanupTime.tv_sec > 300) { lastIdleCleanupTime.tv_sec = now.tv_sec; try { MessageQueueService::get_thread_pool()->cleanupIdleThreads(); } catch(...) { // Ignore! } } }}void CIMListenerService::shutdown(){ PEG_METHOD_ENTER(TRC_LISTENER, "CIMListenerService::shutdown()"); // This logic signals the thread currently executing _listener_routine() // to exit. That function deletes this instance of CIMListenerService, // which deletes the _monitor member. We use a mutex to keep it from // deleting the monitor until after tickle has been called. { AutoMutex am(_monitorMutex); _dieNow = true; _monitor->tickle(); } PEG_METHOD_EXIT();}void CIMListenerService::resume(){ PEG_METHOD_ENTER(TRC_LISTENER, "CIMListenerService::resume()"); if (_acceptor != NULL) _acceptor->reopenConnectionSocket(); PEG_METHOD_EXIT();}void CIMListenerService::stopClientConnection(){ PEG_METHOD_ENTER( TRC_LISTENER, "CIMListenerService::stopClientConnection()"); // tell Monitor to stop listening for client connections _monitor->stopListeningForConnections(true); if (_acceptor != NULL) _acceptor->closeConnectionSocket(); PEG_METHOD_EXIT();}Uint32 CIMListenerService::getOutstandingRequestCount(){ return _acceptor->getOutstandingRequestCount();}CIMListenerIndicationDispatcher* CIMListenerService::getIndicationDispatcher() const{ return _dispatcher;}void CIMListenerService::setIndicationDispatcher( CIMListenerIndicationDispatcher* dispatcher){ _dispatcher = dispatcher;}Uint32 CIMListenerService::getPortNumber() const{ Uint32 portNumber = _portNumber; if ((portNumber == 0) && (_acceptor != 0)) { portNumber = _acceptor->getPortNumber(); } return (portNumber);}ThreadReturnType PEGASUS_THREAD_CDECL CIMListenerService::_listener_routine(void *param){ CIMListenerService *svc = reinterpret_cast < CIMListenerService * >(param); try { // svc->init(); bug 1394 while (!svc->terminated()) {#if defined(PEGASUS_OS_DARWIN)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -