Return to IndicationOperationAggregate.cpp CVS log | Up to [Pegasus] / pegasus / src / Pegasus / IndicationService |
File: [Pegasus] / pegasus / src / Pegasus / IndicationService / IndicationOperationAggregate.cpp
(download)
Revision: 1.9.2.1, Mon Mar 21 16:49:02 2005 UTC (19 years, 3 months ago) by carolann.graves Branch: RELEASE_2_4-branch CVS Tags: RELEASE_2_4_3, RELEASE_2_4_2, RELEASE_2_4_1-BETA3, RELEASE_2_4_1, IBM_241_April1405 Changes since 1.9: +1 -14 lines BUG#: 2193 TITLE: Provider enable (cimprovider -e) or provider registration change that affects multiple subscriptions can cause cimserver core dump DESCRIPTION: Modified the IndicationService to use SendWait instead of SendAsync for Create Subscription, Delete Subscription, Enable Indications and Disable Indications requests associated with Notify Provider Enable or Notify Provider Registration operations. |
//%2004//////////////////////////////////////////////////////////////////////// // // 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. // // 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. // //============================================================================== // // Author: Carol Ann Krug Graves, Hewlett-Packard Company // (carolann_graves@hp.com) // // Modified By: Seema Gupta (gseema@in.ibm.com) for PEP135 // Alagaraja Ramasubramanian (alags_raj@in.ibm.com) for Bug#1090 // //%///////////////////////////////////////////////////////////////////////////// #include <Pegasus/Common/Tracer.h> #include <Pegasus/Common/OperationContextInternal.h> #include "IndicationOperationAggregate.h" PEGASUS_USING_STD; PEGASUS_NAMESPACE_BEGIN IndicationOperationAggregate::IndicationOperationAggregate ( CIMRequestMessage * origRequest, const Array <CIMName> & indicationSubclasses) : _origRequest (origRequest), _indicationSubclasses (indicationSubclasses), _numberIssued (0), _magicNumber (_theMagicNumber) {} IndicationOperationAggregate::~IndicationOperationAggregate () { _magicNumber = 0; if (_origRequest) { delete _origRequest; } Uint32 numberRequests = getNumberRequests (); for (Uint32 i = 0; i < numberRequests; i++) { // // Since deleteRequest also removes the element from the array, // delete first element of the array each time // deleteRequest (0); } Uint32 numberResponses = getNumberResponses (); for (Uint32 j = 0; j < numberResponses; j++) { // // Since deleteResponse also removes the element from the array, // delete first element of the array each time // deleteResponse (0); } } Boolean IndicationOperationAggregate::valid () { return (_magicNumber == _theMagicNumber) ? true: false; } CIMRequestMessage * IndicationOperationAggregate::getOrigRequest () { return _origRequest; } Uint32 IndicationOperationAggregate::getOrigType () { if (_origRequest == 0) { return 0; } else { return _origRequest->getType (); } } String IndicationOperationAggregate::getOrigMessageId () { if (_origRequest == 0) { return String::EMPTY; } else { return _origRequest->messageId; } } Uint32 IndicationOperationAggregate::getOrigDest () { if (_origRequest == 0) { return 0; } else { return _origRequest->queueIds.top (); } } Boolean IndicationOperationAggregate::requiresResponse () { if ((getOrigType () == CIM_CREATE_INSTANCE_REQUEST_MESSAGE) || (getOrigType () == CIM_MODIFY_INSTANCE_REQUEST_MESSAGE) || (getOrigType () == CIM_DELETE_INSTANCE_REQUEST_MESSAGE)) { return true; } else { return false; } } Array <CIMName> & IndicationOperationAggregate::getIndicationSubclasses () { return _indicationSubclasses; } void IndicationOperationAggregate::setPath (const CIMObjectPath & path) { _path = path; } CIMObjectPath & IndicationOperationAggregate::getPath () { return _path; } Uint32 IndicationOperationAggregate::getNumberIssued () { return _numberIssued; } void IndicationOperationAggregate::setNumberIssued (Uint32 i) { _numberIssued = i; } Boolean IndicationOperationAggregate::appendResponse ( CIMResponseMessage * response) { AutoMutex autoMut(_appendResponseMutex); _responseList.append (response); Boolean returnValue = (getNumberResponses () == getNumberIssued ()); return returnValue; } Uint32 IndicationOperationAggregate::getNumberResponses () { return _responseList.size (); } CIMResponseMessage * IndicationOperationAggregate::getResponse ( const Uint32 & pos) { return _responseList [pos]; } void IndicationOperationAggregate::deleteResponse ( const Uint32 & pos) { delete _responseList [pos]; _responseList.remove (pos); } void IndicationOperationAggregate::appendRequest ( CIMRequestMessage * request) { AutoMutex autoMut(_appendRequestMutex); _requestList.append (request); } Uint32 IndicationOperationAggregate::getNumberRequests () { return _requestList.size (); } CIMRequestMessage * IndicationOperationAggregate::getRequest ( const Uint32 & pos) { return _requestList [pos]; } void IndicationOperationAggregate::deleteRequest ( const Uint32 & pos) { delete _requestList [pos]; _requestList.remove (pos); } ProviderClassList IndicationOperationAggregate::findProvider ( const String & messageId) { // // Look in the list of requests for the request with the message ID // corresponding to the message ID in the response // ProviderClassList provider; Uint32 numberRequests = getNumberRequests (); for (Uint32 i = 0; i < numberRequests; i++) { if (getRequest (i)->messageId == messageId ) { // // Get the provider and provider module from the matching request // switch (getRequest (i)->getType ()) { case CIM_CREATE_SUBSCRIPTION_REQUEST_MESSAGE: { CIMCreateSubscriptionRequestMessage * request = (CIMCreateSubscriptionRequestMessage *) getRequest (i); ProviderIdContainer pidc = request->operationContext.get(ProviderIdContainer::NAME); provider.provider = pidc.getProvider(); provider.providerModule = pidc.getModule(); provider.classList = request->classNames; break; } case CIM_ENABLE_INDICATIONS_REQUEST_MESSAGE: { CIMEnableIndicationsRequestMessage * request = (CIMEnableIndicationsRequestMessage *) getRequest (i); ProviderIdContainer pidc = request->operationContext.get(ProviderIdContainer::NAME); provider.provider = pidc.getProvider(); provider.providerModule = pidc.getModule(); break; } case CIM_DELETE_SUBSCRIPTION_REQUEST_MESSAGE: { CIMDeleteSubscriptionRequestMessage * request = (CIMDeleteSubscriptionRequestMessage *) getRequest (i); ProviderIdContainer pidc = request->operationContext.get(ProviderIdContainer::NAME); provider.provider = pidc.getProvider(); provider.providerModule = pidc.getModule(); provider.classList = request->classNames; break; } case CIM_DISABLE_INDICATIONS_REQUEST_MESSAGE: { CIMDisableIndicationsRequestMessage * request = (CIMDisableIndicationsRequestMessage *) getRequest (i); ProviderIdContainer pidc = request->operationContext.get(ProviderIdContainer::NAME); provider.provider = pidc.getProvider(); provider.providerModule = pidc.getModule(); break; } default: { PEG_TRACE_STRING (TRC_INDICATION_SERVICE, Tracer::LEVEL2, "Unexpected request type " + String (MessageTypeToString (getRequest (i)->getType ())) + " in findProvider"); PEGASUS_ASSERT (false); break; } } return provider; } } // // No request found with message ID matching message ID from response // PEGASUS_ASSERT (false); return provider; } const Uint32 IndicationOperationAggregate::_theMagicNumber = 98765; PEGASUS_NAMESPACE_END
No CVS admin address has been configured |
Powered by ViewCVS 0.9.2 |