📄 providermessagehandler.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 "ProviderMessageHandler.h"#include <Pegasus/Common/OperationContextInternal.h>#include <Pegasus/Common/Tracer.h>#include <Pegasus/Common/StatisticalData.h>#include <Pegasus/Common/Logger.h>#include <Pegasus/Common/MessageLoader.h>#include <Pegasus/Common/Constants.h>#include <Pegasus/Provider/CIMInstanceQueryProvider.h>#include <Pegasus/Provider/CIMAssociationProvider.h>#include <Pegasus/Provider/CIMMethodProvider.h>#include <Pegasus/Provider/CIMIndicationProvider.h>#include <Pegasus/Provider/CIMIndicationConsumerProvider.h>#include <Pegasus/Query/QueryExpression/QueryExpression.h>#include <Pegasus/ProviderManager2/QueryExpressionFactory.h>#include <Pegasus/ProviderManager2/SimpleResponseHandler.h>#include <Pegasus/ProviderManager2/OperationResponseHandler.h>#include <Pegasus/ProviderManager2/AutoPThreadSecurity.h>#define HANDLE_PROVIDER_EXCEPTION(providerCall, handler) \ try \ { \ providerCall; \ } \ catch (CIMException& e) \ { \ PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4, \ "Provider Exception: " + e.getMessage()); \ handler.setCIMException(e); \ } \ catch (Exception& e) \ { \ PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4, \ "Provider Exception: " + e.getMessage()); \ handler.setStatus( \ CIM_ERR_FAILED, e.getContentLanguages(), e.getMessage()); \ } \ catch (...) \ { \ PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4, \ "Provider Exception: Unknown"); \ handler.setStatus(CIM_ERR_FAILED, "Unknown error."); \ }PEGASUS_NAMESPACE_BEGINtemplate<class T>inline T* getProviderInterface(CIMProvider* provider){ T* p = dynamic_cast<T*>(provider); if (p == 0) { throw PEGASUS_CIM_EXCEPTION_L(CIM_ERR_NOT_SUPPORTED, MessageLoaderParms( "ProviderManager.ProviderFacade.INVALID_PROVIDER_INTERFACE", "Invalid provider interface.")); } return p;}//// Default Provider Manager//ProviderMessageHandler::ProviderMessageHandler( const String& name, CIMProvider* provider, PEGASUS_INDICATION_CALLBACK_T indicationCallback, PEGASUS_RESPONSE_CHUNK_CALLBACK_T responseChunkCallback, Boolean subscriptionInitComplete) : _name(name), _provider(provider), _indicationCallback(indicationCallback), _responseChunkCallback(responseChunkCallback), _subscriptionInitComplete(subscriptionInitComplete), _indicationResponseHandler(0){}ProviderMessageHandler::~ProviderMessageHandler(){}String ProviderMessageHandler::getName() const{ return _name;}CIMProvider* ProviderMessageHandler::getProvider(){ return _provider;}void ProviderMessageHandler::setProvider(CIMProvider* provider){ _provider = provider;}void ProviderMessageHandler::initialize(CIMOMHandle& cimom){ _provider->initialize(cimom);}void ProviderMessageHandler::terminate(){ _disableIndications(); try { _provider->terminate(); } catch (...) { PEG_TRACE_STRING(TRC_DISCARDED_DATA, Tracer::LEVEL2, "Caught exception from provider " + _name + " terminate() method."); }}void ProviderMessageHandler::subscriptionInitComplete(){ if (status.testSubscriptions()) { _enableIndications(); } _subscriptionInitComplete = true;}CIMResponseMessage* ProviderMessageHandler::processMessage( CIMRequestMessage* request){ PEG_METHOD_ENTER(TRC_PROVIDERMANAGER, "ProviderMessageHandler::processMessage()"); CIMResponseMessage* response = 0; try { // pass the request message to a handler method based on message type switch(request->getType()) { case CIM_GET_INSTANCE_REQUEST_MESSAGE: response = _handleGetInstanceRequest(request); break; case CIM_ENUMERATE_INSTANCES_REQUEST_MESSAGE: response = _handleEnumerateInstancesRequest(request); break; case CIM_ENUMERATE_INSTANCE_NAMES_REQUEST_MESSAGE: response = _handleEnumerateInstanceNamesRequest(request); break; case CIM_CREATE_INSTANCE_REQUEST_MESSAGE: response = _handleCreateInstanceRequest(request); break; case CIM_MODIFY_INSTANCE_REQUEST_MESSAGE: response = _handleModifyInstanceRequest(request); break; case CIM_DELETE_INSTANCE_REQUEST_MESSAGE: response = _handleDeleteInstanceRequest(request); break; case CIM_EXEC_QUERY_REQUEST_MESSAGE: response = _handleExecQueryRequest(request); break; case CIM_ASSOCIATORS_REQUEST_MESSAGE: response = _handleAssociatorsRequest(request); break; case CIM_ASSOCIATOR_NAMES_REQUEST_MESSAGE: response = _handleAssociatorNamesRequest(request); break; case CIM_REFERENCES_REQUEST_MESSAGE: response = _handleReferencesRequest(request); break; case CIM_REFERENCE_NAMES_REQUEST_MESSAGE: response = _handleReferenceNamesRequest(request); break; case CIM_GET_PROPERTY_REQUEST_MESSAGE: response = _handleGetPropertyRequest(request); break; case CIM_SET_PROPERTY_REQUEST_MESSAGE: response = _handleSetPropertyRequest(request); break; case CIM_INVOKE_METHOD_REQUEST_MESSAGE: response = _handleInvokeMethodRequest(request); break; case CIM_CREATE_SUBSCRIPTION_REQUEST_MESSAGE: response = _handleCreateSubscriptionRequest(request); break; case CIM_MODIFY_SUBSCRIPTION_REQUEST_MESSAGE: response = _handleModifySubscriptionRequest(request); break; case CIM_DELETE_SUBSCRIPTION_REQUEST_MESSAGE: response = _handleDeleteSubscriptionRequest(request); break; case CIM_EXPORT_INDICATION_REQUEST_MESSAGE: response = _handleExportIndicationRequest(request); break; default: PEGASUS_ASSERT(0); break; } } catch (CIMException& e) { PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL2, "CIMException: " + e.getMessage()); response = request->buildResponse(); response->cimException = PEGASUS_CIM_EXCEPTION_LANG( e.getContentLanguages(), e.getCode(), e.getMessage()); } catch (Exception& e) { PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL2, "Exception: " + e.getMessage()); response = request->buildResponse(); response->cimException = PEGASUS_CIM_EXCEPTION_LANG( e.getContentLanguages(), CIM_ERR_FAILED, e.getMessage()); } catch (...) { PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL2, "Exception: Unknown"); response = request->buildResponse(); response->cimException = PEGASUS_CIM_EXCEPTION( CIM_ERR_FAILED, "Unknown error."); } PEG_METHOD_EXIT(); return response;}OperationContext ProviderMessageHandler::_createProviderOperationContext( const OperationContext& context){ OperationContext providerContext; providerContext.insert(context.get(IdentityContainer::NAME)); providerContext.insert(context.get(AcceptLanguageListContainer::NAME)); providerContext.insert(context.get(ContentLanguageListContainer::NAME)); return providerContext;}CIMResponseMessage* ProviderMessageHandler::_handleGetInstanceRequest( CIMRequestMessage* message){ PEG_METHOD_ENTER(TRC_PROVIDERMANAGER, "ProviderMessageHandler::_handleGetInstanceRequest"); CIMGetInstanceRequestMessage* request = dynamic_cast<CIMGetInstanceRequestMessage*>(message); PEGASUS_ASSERT(request != 0); AutoPtr<CIMGetInstanceResponseMessage> response( dynamic_cast<CIMGetInstanceResponseMessage*>( request->buildResponse())); PEGASUS_ASSERT(response.get() != 0); // create a handler for this request GetInstanceResponseHandler handler( request, response.get(), _responseChunkCallback); // make target object path CIMObjectPath objectPath( System::getHostName(), request->nameSpace, request->instanceName.getClassName(), request->instanceName.getKeyBindings()); PEG_LOGGER_TRACE((Logger::STANDARD_LOG, System::CIMSERVER, Logger::TRACE, "ProviderMessageHandler::_handleGetInstanceRequest - " "Object path: $0", objectPath.toString())); OperationContext providerContext( _createProviderOperationContext(request->operationContext)); AutoPThreadSecurity threadLevelSecurity(providerContext); CIMInstanceProvider* provider = getProviderInterface<CIMInstanceProvider>(_provider); PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4, "Calling provider.getInstance: " + _name); StatProviderTimeMeasurement providerTime(response.get()); HANDLE_PROVIDER_EXCEPTION( provider->getInstance( providerContext, objectPath, request->includeQualifiers, request->includeClassOrigin, request->propertyList, handler), handler) PEG_METHOD_EXIT(); return response.release();}CIMResponseMessage* ProviderMessageHandler::_handleEnumerateInstancesRequest( CIMRequestMessage* message){ PEG_METHOD_ENTER(TRC_PROVIDERMANAGER, "ProviderMessageHandler::_handleEnumerateInstanceRequest"); CIMEnumerateInstancesRequestMessage* request = dynamic_cast<CIMEnumerateInstancesRequestMessage*>(message); PEGASUS_ASSERT(request != 0); AutoPtr<CIMEnumerateInstancesResponseMessage> response( dynamic_cast<CIMEnumerateInstancesResponseMessage*>( request->buildResponse())); PEGASUS_ASSERT(response.get() != 0); // create a handler for this request EnumerateInstancesResponseHandler handler( request, response.get(), _responseChunkCallback); // make target object path CIMObjectPath objectPath( System::getHostName(), request->nameSpace, request->className); PEG_LOGGER_TRACE((Logger::STANDARD_LOG, System::CIMSERVER, Logger::TRACE, "ProviderMessageHandler::_handleEnumerateInstancesRequest - " "Object path: $0", objectPath.toString())); OperationContext providerContext( _createProviderOperationContext(request->operationContext)); AutoPThreadSecurity threadLevelSecurity(providerContext); CIMInstanceProvider* provider = getProviderInterface<CIMInstanceProvider>(_provider); PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4, "Calling provider.enumerateInstances: " + _name); StatProviderTimeMeasurement providerTime(response.get()); HANDLE_PROVIDER_EXCEPTION( provider->enumerateInstances( providerContext, objectPath, request->includeQualifiers, request->includeClassOrigin, request->propertyList, handler), handler) PEG_METHOD_EXIT(); return response.release();}CIMResponseMessage* ProviderMessageHandler::_handleEnumerateInstanceNamesRequest(
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -