Return to CMPI_Broker.cpp CVS log | Up to [Pegasus] / pegasus / src / Pegasus / ProviderManager2 / CMPI |
File: [Pegasus] / pegasus / src / Pegasus / ProviderManager2 / CMPI / CMPI_Broker.cpp
(download)
Revision: 1.41, Fri Aug 3 18:30:31 2007 UTC (16 years, 11 months ago) by dave.sudlik Branch: MAIN CVS Tags: RELEASE_2_7_0-BETA Changes since 1.40: +36 -0 lines BUG#: 6722 TITLE: Association UP calls does not work properly with empty KeyBindings in CMPIObjectPath. DESCRIPTION: committing approved fix |
//%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 "CMPI_Version.h" #include "CMPI_Broker.h" #include "CMPI_Object.h" #include "CMPI_ContextArgs.h" #include "CMPI_Enumeration.h" #include "CMPI_Value.h" #include "CMPIProviderManager.h" #include "CMPI_String.h" #include <Pegasus/Common/CIMName.h> #include <Pegasus/Common/CIMPropertyList.h> #include <Pegasus/Provider/CIMOMHandle.h> #include <Pegasus/Common/CIMValue.h> #include <Pegasus/Common/CIMType.h> PEGASUS_USING_STD; PEGASUS_NAMESPACE_BEGIN #define DDD(X) if (_cmpi_trace) X; static const CMPIUint32 MB_CAPABILITIES = # ifdef CMPI_VER_200 CMPI_MB_Supports_Extended_Error | # endif CMPI_MB_BasicRead | CMPI_MB_BasicWrite | CMPI_MB_InstanceManipulation | CMPI_MB_AssociationTraversal | CMPI_MB_QueryNormalization | CMPI_MB_Indications | CMPI_MB_BasicQualifierSupport | CMPI_MB_OSEncapsulationSupport # ifndef PEGASUS_DISABLE_EXECQUERY | CMPI_MB_QueryExecution # endif ; extern int _cmpi_trace; static CIMPropertyList getList(const char** l) { CIMPropertyList pl; if (l) { Array<CIMName> n; while (*l) { n.append(*l++); } pl.set(n); } return pl; } CIMClass* mbGetClass(const CMPIBroker *mb, const CIMObjectPath &cop) { DDD(cout<<"--- mbGetClass()"<<endl); mb=CM_BROKER; CMPI_Broker *xBroker=(CMPI_Broker*)mb; String clsId = cop.getNameSpace().getString()+":"+cop.getClassName().getString(); CIMClass *ccp; { ReadLock readLock (xBroker->rwsemClassCache); if (xBroker->clsCache->lookup(clsId,ccp)) { return ccp; } } try { WriteLock writeLock (xBroker->rwsemClassCache); if (xBroker->clsCache->lookup(clsId,ccp)) { return ccp; } CIMClass cc = CM_CIMOM(mb)->getClass( OperationContext(), cop.getNameSpace(), cop.getClassName(), (bool)0, (bool)1, (bool)0, CIMPropertyList()); ccp = new CIMClass(cc); xBroker->clsCache->insert(clsId,ccp); return ccp; } catch (const CIMException &e) { DDD(cout<<"### exception: mbGetClass - code: "<<e.getCode() <<" msg: "<<e.getMessage()<<endl); } return NULL; } extern "C" { static CMPIInstance* mbGetInstance( const CMPIBroker *mb, const CMPIContext *ctx, const CMPIObjectPath *cop, const char **properties, CMPIStatus *rc) { DDD(cout<<"--- mbGetInstance()"<<endl); mb = CM_BROKER; CMPIFlags flgs = ctx->ft->getEntry(ctx,CMPIInvocationFlags,NULL).value.uint32; const CIMPropertyList props = getList(properties); CIMObjectPath qop( String::EMPTY, CIMNamespaceName(), CM_ObjectPath(cop)->getClassName(), CM_ObjectPath(cop)->getKeyBindings()); try { CIMInstance ci = CM_CIMOM(mb)->getInstance( OperationContext(*CM_Context(ctx)), CM_ObjectPath(cop)->getNameSpace(), qop, //*CM_ObjectPath(cop), CM_LocalOnly(flgs), CM_IncludeQualifiers(flgs), CM_ClassOrigin(flgs), props); ci.setPath(*CM_ObjectPath(cop)); CMSetStatus(rc,CMPI_RC_OK); return reinterpret_cast<CMPIInstance*>( new CMPI_Object(new CIMInstance(ci))); } catch (const CIMException &e) { DDD(cout<<"### exception: mbGetInstance - code: "<<e.getCode() <<" msg: "<<e.getMessage()<<endl); if (rc) { CMSetStatusWithString( rc, (CMPIrc)e.getCode(), (CMPIString*)string2CMPIString(e.getMessage())); } return NULL; } // Code flow should never get here. } static CMPIObjectPath* mbCreateInstance( const CMPIBroker *mb, const CMPIContext *ctx, const CMPIObjectPath *cop, const CMPIInstance *ci, CMPIStatus *rc) { DDD(cout<<"--- mbCreateInstance()"<<endl); mb = CM_BROKER; try { CIMObjectPath ncop = CM_CIMOM(mb)->createInstance( OperationContext(*CM_Context(ctx)), CM_ObjectPath(cop)->getNameSpace(), *CM_Instance(ci)); CMSetStatus(rc,CMPI_RC_OK); return reinterpret_cast<CMPIObjectPath*>( new CMPI_Object(new CIMObjectPath(ncop))); } catch (const CIMException &e) { DDD(cout<<"### exception: mbCreateInstance - code: "<<e.getCode() <<" msg: "<<e.getMessage()<<endl); if (rc) { CMSetStatusWithString( rc,(CMPIrc)e.getCode(), (CMPIString*)string2CMPIString(e.getMessage())); } return NULL; } // Code flow should never get here. } static CMPIStatus mbModifyInstance( const CMPIBroker *mb, const CMPIContext *ctx, const CMPIObjectPath *cop, const CMPIInstance *ci, const char ** properties) { DDD(cout<<"--- mbSetInstance()"<<endl); mb = CM_BROKER; CMPIFlags flgs = ctx->ft->getEntry(ctx,CMPIInvocationFlags,NULL).value.uint32; const CIMPropertyList props = getList(properties); try { CIMInstance cmi(*CM_Instance(ci)); cmi.setPath(*CM_ObjectPath(cop)); CM_CIMOM(mb)->modifyInstance( OperationContext(*CM_Context(ctx)), CM_ObjectPath(cop)->getNameSpace(), cmi, CM_IncludeQualifiers(flgs), props); } catch (const CIMException &e) { DDD(cout<<"### exception: mbSetInstance - code: "<<e.getCode() <<" msg: "<<e.getMessage()<<endl); CMReturnWithString( (CMPIrc)e.getCode(), (CMPIString*)string2CMPIString(e.getMessage())); } CMReturn(CMPI_RC_OK); } static CMPIStatus mbDeleteInstance( const CMPIBroker *mb, const CMPIContext *ctx, const CMPIObjectPath *cop) { DDD(cout<<"--- mbDeleteInstance()"<<endl); mb = CM_BROKER; CIMObjectPath qop( String::EMPTY,CIMNamespaceName(), CM_ObjectPath(cop)->getClassName(), CM_ObjectPath(cop)->getKeyBindings()); try { CM_CIMOM(mb)->deleteInstance( OperationContext(*CM_Context(ctx)), CM_ObjectPath(cop)->getNameSpace(), qop); //*CM_ObjectPath(cop)); } catch (const CIMException &e) { DDD(cout<<"### exception: mbDeleteInstance - code: "<<e.getCode() <<" msg: "<<e.getMessage()<<endl); CMReturnWithString( (CMPIrc)e.getCode(), (CMPIString*)string2CMPIString(e.getMessage())); } CMReturn(CMPI_RC_OK); } static CMPIEnumeration* mbExecQuery( const CMPIBroker *mb, const CMPIContext *ctx, const CMPIObjectPath *cop, const char *query, const char *lang, CMPIStatus *rc) { DDD(cout<<"--- mbExecQuery()"<<endl); mb = CM_BROKER; try { Array<CIMObject> const &en = CM_CIMOM(mb)->execQuery( OperationContext(*CM_Context(ctx)), CM_ObjectPath(cop)->getNameSpace(), String(lang), String(query)); CMSetStatus(rc,CMPI_RC_OK); return reinterpret_cast<CMPIEnumeration*> ( new CMPI_Object( new CMPI_ObjEnumeration(new Array<CIMObject>(en)))); } catch (const CIMException &e) { DDD(cout<<"### exception: mbExecQuery - code: "<<e.getCode() <<" msg: "<<e.getMessage()<<endl); if (rc) { CMSetStatusWithString( rc, (CMPIrc)e.getCode(), (CMPIString*)string2CMPIString(e.getMessage())); } return NULL; } // Code flow should never get here. } static CMPIEnumeration* mbEnumInstances( const CMPIBroker *mb, const CMPIContext *ctx, const CMPIObjectPath *cop, const char **properties, CMPIStatus *rc) { DDD(cout<<"--- mbEnumInstances()"<<endl); mb = CM_BROKER; CMPIFlags flgs = ctx->ft->getEntry(ctx,CMPIInvocationFlags,NULL).value.uint32; const CIMPropertyList props = getList(properties); try { Array<CIMInstance> const &en = CM_CIMOM(mb)->enumerateInstances( OperationContext(*CM_Context(ctx)), CM_ObjectPath(cop)->getNameSpace(), CM_ObjectPath(cop)->getClassName(), CM_DeepInheritance(flgs), CM_LocalOnly(flgs), CM_IncludeQualifiers(flgs), CM_ClassOrigin(flgs), props); CMSetStatus(rc,CMPI_RC_OK); // Workaround for bugzilla 4677 // When running out of process the returned instances don't contain // a name space. Create a writable copy of the array and add the // namespace from the input parameters. Array<CIMInstance> * aInst = new Array<CIMInstance>(en); for (unsigned int index=0; index < aInst->size(); index++) { CIMInstance& myInst = (*aInst)[index]; CIMObjectPath orgCop = myInst.getPath(); orgCop.setNameSpace(CM_ObjectPath(cop)->getNameSpace()); (*aInst)[index].setPath(orgCop); } return reinterpret_cast<CMPIEnumeration*>( new CMPI_Object(new CMPI_InstEnumeration(aInst))); } catch (const CIMException &e) { DDD(cout<<"### exception: mbEnumInstances - code: "<<e.getCode() <<" msg: "<<e.getMessage()<<endl); if (rc) { CMSetStatusWithString( rc, (CMPIrc)e.getCode(), (CMPIString*)string2CMPIString(e.getMessage())); } return NULL; } // Code flow should never get here. } static CMPIEnumeration* mbEnumInstanceNames( const CMPIBroker *mb, const CMPIContext *ctx, const CMPIObjectPath *cop, CMPIStatus *rc) { DDD(cout<<"--- mbEnumInstanceNames()"<<endl); mb = CM_BROKER; try { Array<CIMObjectPath> const &en = CM_CIMOM(mb)->enumerateInstanceNames( OperationContext(*CM_Context(ctx)), CM_ObjectPath(cop)->getNameSpace(), CM_ObjectPath(cop)->getClassName()); CMSetStatus(rc,CMPI_RC_OK); // When running out of process the returned instances don't contain // a name space. Create a writable copy of the array and add the // namespace from the input parameters. Array<CIMObjectPath> * aObj = new Array<CIMObjectPath>(en); for (unsigned int index=0; index < aObj->size(); index++) { (*aObj)[index].setNameSpace( CM_ObjectPath(cop)->getNameSpace()); } return reinterpret_cast<CMPIEnumeration*>( new CMPI_Object(new CMPI_OpEnumeration(aObj))); } catch (const CIMException &e) { DDD(cout<<"### exception: mbEnumInstances - code: "<<e.getCode() <<" msg: "<<e.getMessage()<<endl); if (rc) { CMSetStatusWithString( rc, (CMPIrc)e.getCode(), (CMPIString*)string2CMPIString(e.getMessage())); } return NULL; } // Code flow should never get here. } static CMPIEnumeration* mbAssociators( const CMPIBroker *mb, const CMPIContext *ctx, const CMPIObjectPath *cop, const char *assocClass, const char *resultClass, const char *role, const char *resultRole, const char **properties, CMPIStatus *rc) { DDD(cout<<"--- mbAssociators()"<<endl); mb = CM_BROKER; // ATTN-CAKG-P2-20020726: The following condition does not correctly // distinguish instanceNames from classNames in every case // The instanceName of a singleton instance of a keyless class has no // key bindings if (!CM_ObjectPath(cop)->getKeyBindings().size()) { CMSetStatus(rc, CMPI_RC_ERR_FAILED); return 0; } CMPIFlags flgs = ctx->ft->getEntry(ctx,CMPIInvocationFlags,NULL).value.uint32; const CIMPropertyList props = getList(properties); CIMObjectPath qop( String::EMPTY,CIMNamespaceName(), CM_ObjectPath(cop)->getClassName(), CM_ObjectPath(cop)->getKeyBindings()); try { Array<CIMObject> const &en = CM_CIMOM(mb)->associators( OperationContext(*CM_Context(ctx)), CM_ObjectPath(cop)->getNameSpace(), qop, assocClass ? CIMName(assocClass) : CIMName(), resultClass ? CIMName(resultClass) : CIMName(), role ? String(role) : String::EMPTY, resultRole ? String(resultRole) : String::EMPTY, CM_IncludeQualifiers(flgs), CM_ClassOrigin(flgs), props); CMSetStatus(rc,CMPI_RC_OK); // Workaround for bugzilla 4677 // When running out of process the returned instances don't contain // a name space. Create a writable copy of the array and add the // namespace from the input parameters. Array<CIMObject> * aInst = new Array<CIMObject>(en); for (unsigned int index=0; index < aInst->size(); index++) { CIMObject& myInst = (*aInst)[index]; CIMObjectPath orgCop = myInst.getPath(); orgCop.setNameSpace(CM_ObjectPath(cop)->getNameSpace()); (*aInst)[index].setPath(orgCop); } return reinterpret_cast<CMPIEnumeration*>( new CMPI_Object(new CMPI_ObjEnumeration(aInst))); } catch (const CIMException &e) { DDD(cout<<"### exception: mbAssociators - code: "<<e.getCode() <<" msg: "<<e.getMessage()<<endl); if (rc) { CMSetStatusWithString( rc, (CMPIrc)e.getCode(), (CMPIString*)string2CMPIString(e.getMessage())); } return NULL; } // Code flow should never get here. } static CMPIEnumeration* mbAssociatorNames( const CMPIBroker *mb, const CMPIContext *ctx, const CMPIObjectPath *cop, const char *assocClass, const char *resultClass, const char *role, const char *resultRole, CMPIStatus *rc) { DDD(cout<<"--- mbAssociatorsNames()"<<endl); mb = CM_BROKER; // ATTN-CAKG-P2-20020726: The following condition does not correctly // distinguish instanceNames from classNames in every case // The instanceName of a singleton instance of a keyless class has no // key bindings if (!CM_ObjectPath(cop)->getKeyBindings().size()) { CMSetStatus(rc, CMPI_RC_ERR_FAILED); return 0; } CIMObjectPath qop( String::EMPTY,CIMNamespaceName(), CM_ObjectPath(cop)->getClassName(), CM_ObjectPath(cop)->getKeyBindings()); try { Array<CIMObjectPath> const &en = CM_CIMOM(mb)->associatorNames( OperationContext(*CM_Context(ctx)), CM_ObjectPath(cop)->getNameSpace(), qop, assocClass ? CIMName(assocClass) : CIMName(), resultClass ? CIMName(resultClass) : CIMName(), role ? String(role) : String::EMPTY, resultRole ? String(resultRole) : String::EMPTY); CMSetStatus(rc,CMPI_RC_OK); // When running out of process the returned instances don't contain // a name space. Create a writable copy of the array and add the // namespace from the input parameters. Array<CIMObjectPath> * aObj = new Array<CIMObjectPath>(en); for (unsigned int index=0; index < aObj->size(); index++) { (*aObj)[index].setNameSpace( CM_ObjectPath(cop)->getNameSpace()); } return reinterpret_cast<CMPIEnumeration*>( new CMPI_Object(new CMPI_OpEnumeration(aObj))); } catch (const CIMException &e) { DDD(cout<<"### exception: mbAssociatorsNames - code: "<<e.getCode() <<" msg: "<<e.getMessage()<<endl); if (rc) { CMSetStatusWithString( rc, (CMPIrc)e.getCode(), (CMPIString*)string2CMPIString(e.getMessage())); } return NULL; } // Code flow should never get here. } static CMPIEnumeration* mbReferences( const CMPIBroker *mb, const CMPIContext *ctx, const CMPIObjectPath *cop, const char *resultClass, const char *role , const char **properties, CMPIStatus *rc) { DDD(cout<<"--- mbReferences()"<<endl); mb = CM_BROKER; // ATTN-CAKG-P2-20020726: The following condition does not correctly // distinguish instanceNames from classNames in every case // The instanceName of a singleton instance of a keyless class has no // key bindings if (!CM_ObjectPath(cop)->getKeyBindings().size()) { CMSetStatus(rc, CMPI_RC_ERR_FAILED); return 0; } CMPIFlags flgs = ctx->ft->getEntry(ctx,CMPIInvocationFlags,NULL).value.uint32; CIMPropertyList props = getList(properties); CIMObjectPath qop( String::EMPTY, CIMNamespaceName(), CM_ObjectPath(cop)->getClassName(), CM_ObjectPath(cop)->getKeyBindings()); try { Array<CIMObject> const &en = CM_CIMOM(mb)->references( OperationContext(*CM_Context(ctx)), CM_ObjectPath(cop)->getNameSpace(), qop, resultClass ? CIMName(resultClass) : CIMName(), role ? String(role) : String::EMPTY, CM_IncludeQualifiers(flgs), CM_ClassOrigin(flgs), props); CMSetStatus(rc,CMPI_RC_OK); // Workaround for bugzilla 4677 // When running out of process the returned instances don't contain // a name space. Create a writable copy of the array and add the // namespace from the input parameters. Array<CIMObject> * aInst = new Array<CIMObject>(en); for (unsigned int index=0; index < aInst->size(); index++) { CIMObject& myInst = (*aInst)[index]; CIMObjectPath orgCop = myInst.getPath(); orgCop.setNameSpace(CM_ObjectPath(cop)->getNameSpace()); (*aInst)[index].setPath(orgCop); } return reinterpret_cast<CMPIEnumeration*>( new CMPI_Object(new CMPI_ObjEnumeration(aInst))); } catch (const CIMException &e) { DDD(cout<<"### exception: mbReferences - code: "<<e.getCode() <<" msg: "<<e.getMessage()<<endl); if (rc) { CMSetStatusWithString( rc, (CMPIrc)e.getCode(), (CMPIString*)string2CMPIString(e.getMessage())); } return NULL; } // Code flow should never get here. } static CMPIEnumeration* mbReferenceNames( const CMPIBroker *mb, const CMPIContext *ctx, const CMPIObjectPath *cop, const char *resultClass, const char *role, CMPIStatus *rc) { DDD(cout<<"--- mbReferencesNames()"<<endl); mb = CM_BROKER; // ATTN-CAKG-P2-20020726: The following condition does not correctly // distinguish instanceNames from classNames in every case // The instanceName of a singleton instance of a keyless class has no // key bindings if (!CM_ObjectPath(cop)->getKeyBindings().size()) { CMSetStatus(rc, CMPI_RC_ERR_FAILED); return 0; } CIMObjectPath qop( String::EMPTY, CIMNamespaceName(), CM_ObjectPath(cop)->getClassName(), CM_ObjectPath(cop)->getKeyBindings()); try { Array<CIMObjectPath> const &en = CM_CIMOM(mb)->referenceNames( OperationContext(*CM_Context(ctx)), CM_ObjectPath(cop)->getNameSpace(), qop, resultClass ? CIMName(resultClass) : CIMName(), role ? String(role) : String::EMPTY); CMSetStatus(rc,CMPI_RC_OK); // When running out of process the returned instances don't contain // a name space. Create a writable copy of the array and add the // namespace from the input parameters. Array<CIMObjectPath> * aObj = new Array<CIMObjectPath>(en); for (unsigned int index=0; index < aObj->size(); index++) { (*aObj)[index].setNameSpace( CM_ObjectPath(cop)->getNameSpace()); } return reinterpret_cast<CMPIEnumeration*>( new CMPI_Object(new CMPI_OpEnumeration(aObj))); } catch (const CIMException &e) { DDD(cout<<"### exception: mbReferencesNames - code: "<<e.getCode() <<" msg: "<<e.getMessage()<<endl); if (rc) { CMSetStatusWithString( rc, (CMPIrc)e.getCode(), (CMPIString*)string2CMPIString(e.getMessage())); } return NULL; } // Code flow should never get here. } #define CM_Args(args) ((Array<CIMParamValue>*)args->hdl) static CMPIData mbInvokeMethod( const CMPIBroker *mb, const CMPIContext *ctx, const CMPIObjectPath *cop, const char *method, const CMPIArgs *in, CMPIArgs *out, CMPIStatus *rc) { DDD(cout<<"--- mbInvokeMethod()"<<endl); CMPIData data = {0,CMPI_nullValue,{0}}; mb = CM_BROKER; CIMObjectPath qop( String::EMPTY,CIMNamespaceName(), CM_ObjectPath(cop)->getClassName(), CM_ObjectPath(cop)->getKeyBindings()); try { CIMValue v = CM_CIMOM(mb)->invokeMethod( OperationContext(*CM_Context(ctx)), CM_ObjectPath(cop)->getNameSpace(), qop, method ? String(method) : String::EMPTY, *CM_Args(in), *CM_Args(out)); CIMType vType=v.getType(); CMPIType t = type2CMPIType(vType,v.isArray()); value2CMPIData(v,t,&data); if (rc) { CMSetStatus(rc,CMPI_RC_OK); } } catch (const CIMException &e) { DDD(cout<<"### exception: mbInvokeMethod - code: "<<e.getCode() <<" msg: "<<e.getMessage()<<endl); if (rc) { CMSetStatusWithString( rc, (CMPIrc)e.getCode(), (CMPIString*)string2CMPIString(e.getMessage())); } } return data; // "data" will be valid data or nullValue (in error case) } static CMPIStatus mbSetProperty( const CMPIBroker *mb, const CMPIContext *ctx, const CMPIObjectPath *cop, const char *name, const CMPIValue *val, CMPIType type) { DDD(cout<<"--- mbSetProperty()"<<endl); mb = CM_BROKER; CMPIrc rc; CIMValue v = value2CIMValue(val,type,&rc); try { CM_CIMOM(mb)->setProperty( OperationContext(*CM_Context(ctx)), CM_ObjectPath(cop)->getNameSpace(), *CM_ObjectPath(cop), String(name), v); } catch (const CIMException &e) { DDD(cout<<"### exception: mbSetProperty - code: "<<e.getCode() <<" msg: "<<e.getMessage()<<endl); CMReturnWithString( (CMPIrc)e.getCode(), (CMPIString*)string2CMPIString(e.getMessage())); } CMReturn(CMPI_RC_OK); } static CMPIData mbGetProperty( const CMPIBroker *mb, const CMPIContext *ctx, const CMPIObjectPath *cop, const char *name, CMPIStatus *rc) { DDD(cout<<"--- mbGetProperty()"<<endl); mb = CM_BROKER; CMPIData data = {0,CMPI_nullValue,{0}}; try { CIMValue v = CM_CIMOM(mb)->getProperty( OperationContext(*CM_Context(ctx)), CM_ObjectPath(cop)->getNameSpace(), *CM_ObjectPath(cop), String(name)); CIMType vType = v.getType(); CMPIType t = type2CMPIType(vType,v.isArray()); value2CMPIData(v,t,&data); CMSetStatus(rc,CMPI_RC_OK); } catch (const CIMException &e) { DDD(cout<<"### exception: mbGetProperty - code: "<<e.getCode() <<" msg: "<<e.getMessage()<<endl); CMSetStatus(rc,(CMPIrc)e.getCode()); } return data; // "data" will be valid data or nullValue (in error case) } static CMPIContext* mbPrepareAttachThread( const CMPIBroker* mb, const CMPIContext* eCtx) { DDD(cout<<"--- mbPrepareAttachThread()"<<endl); mb = CM_BROKER; OperationContext *ctx = (OperationContext*)((CMPI_Context*)eCtx)->ctx; OperationContext nctx = *ctx; CMPIContext* neCtx = new CMPI_Context(*(new OperationContext(nctx))); CMPIString *name; for (int i=0,s=CMPI_Args_Ftab->getArgCount( reinterpret_cast<const CMPIArgs*>(eCtx),NULL); i<s; i++) { CMPIData data = CMPI_Args_Ftab->getArgAt( reinterpret_cast<const CMPIArgs*>(eCtx),i,&name,NULL); CMPI_Args_Ftab->addArg( reinterpret_cast<CMPIArgs*>(neCtx), CMGetCharPtr(name), &data.value,data.type); } return neCtx; } static CMPIStatus mbAttachThread( const CMPIBroker* mb, const CMPIContext* eCtx) { DDD(cout<<"--- mbAttachThread()"<<endl); ((CMPI_Context*)eCtx)->thr = new CMPI_ThreadContext(mb,eCtx); CMReturn(CMPI_RC_OK); } static CMPIStatus mbDetachThread( const CMPIBroker* mb, const CMPIContext* eCtx) { DDD(cout<<"--- mbDetachThread()"<<endl); mb = CM_BROKER; CMPI_Context *neCtx = (CMPI_Context *)eCtx; delete neCtx->thr; // Delete also CMPIContext delete neCtx; CMReturn(CMPI_RC_OK); } static CMPIStatus mbDeliverIndication( const CMPIBroker* eMb, const CMPIContext* ctx, const char *ns, const CMPIInstance* ind) { DDD(cout<<"--- mbDeliverIndication()"<<endl); eMb = CM_BROKER; CMPI_Broker *mb = (CMPI_Broker*)eMb; CMPIProviderManager::indProvRecord *prec; OperationContext* context = CM_Context(ctx); // When an indication to be delivered comes from Remote providers, // the CMPIBroker contains the name of the provider in the form // of physical-name:logical-name. Search using logical-name. -V 5884 String provider_name; CMPIUint32 n; if ( (n = mb->name.find(':') ) != PEG_NOT_FOUND) { provider_name = mb->name.subString (n + 1); } else { provider_name = mb->name; } ReadLock readLock(CMPIProviderManager::rwSemProvTab); if (CMPIProviderManager::provTab.lookup(provider_name,prec)) { if (prec->enabled) { try { context->get(SubscriptionInstanceNamesContainer::NAME); } catch (const Exception &) { Array<CIMObjectPath> subscriptionInstanceNames; context->insert( SubscriptionInstanceNamesContainer( subscriptionInstanceNames)); } CIMIndication cimIndication(*CM_Instance(ind)); try { prec->handler->deliver( *context, // OperationContext(*CM_Context(ctx)), cimIndication); CMReturn(CMPI_RC_OK); } catch (const CIMException &e) { DDD(cout<<"### exception: mbSetProperty - code: " <<e.getCode()<<" msg: "<<e.getMessage()<<endl); CMReturn((CMPIrc)e.getCode()); } } } CMReturn(CMPI_RC_ERR_FAILED); } } static CMPIBrokerFT broker_FT = { MB_CAPABILITIES, // brokerClassification; CMPICurrentVersion, "Pegasus", mbPrepareAttachThread, mbAttachThread, mbDetachThread, mbDeliverIndication, mbEnumInstanceNames, mbGetInstance, mbCreateInstance, mbModifyInstance, mbDeleteInstance, mbExecQuery, mbEnumInstances, mbAssociators, mbAssociatorNames, mbReferences, mbReferenceNames, mbInvokeMethod, mbSetProperty, mbGetProperty, }; CMPIBrokerFT *CMPI_Broker_Ftab = & broker_FT; PEGASUS_NAMESPACE_END
No CVS admin address has been configured |
Powered by ViewCVS 0.9.2 |