⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cimlistener.cpp

📁 Pegasus is an open-source implementationof the DMTF CIM and WBEM standards. It is designed to be por
💻 CPP
📖 第 1 页 / 共 2 页
字号:
//%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 + -