📄 cmpi_broker.cpp
字号:
orgCop.setNameSpace(CM_ObjectPath(cop)->getNameSpace()); (*aInst)[index].setPath(orgCop); } CMPI_Object *obj = new CMPI_Object(new CMPI_ObjEnumeration(aInst)); /*CMPI_Object *obj = new CMPI_Object(new CMPI_ObjEnumeration(new Array<CIMObject>(en)));*/ // End of workaround for bugzilla 4677 return (CMPI_ObjEnumeration *)obj->getHdl(); } 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; CIMObjectPath qop(String::EMPTY,CIMNamespaceName(), CM_ObjectPath(cop)->getClassName(), CM_ObjectPath(cop)->getKeyBindings()); AutoMutex mtx(((CMPI_Broker*)mb)->mtx); 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); if (rc) 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()); } CMPI_Object *obj = new CMPI_Object(new CMPI_OpEnumeration(aObj)); return (CMPI_OpEnumeration *)obj->getHdl(); } 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; 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()); AutoMutex mtx(((CMPI_Broker*)mb)->mtx); 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); if (rc) 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); } CMPI_Object *obj = new CMPI_Object(new CMPI_ObjEnumeration(aInst)); /*CMPI_Object *obj = new CMPI_Object(new CMPI_ObjEnumeration(new Array<CIMObject>(en)));*/ // End of workaround for bugzilla 4677 return (CMPI_ObjEnumeration *)obj->getHdl(); } 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; CIMObjectPath qop(String::EMPTY,CIMNamespaceName(), CM_ObjectPath(cop)->getClassName(), CM_ObjectPath(cop)->getKeyBindings()); AutoMutex mtx(((CMPI_Broker*)mb)->mtx); 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); if (rc) 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()); } CMPI_Object *obj = new CMPI_Object(new CMPI_OpEnumeration(aObj)); return (CMPI_OpEnumeration *)obj->getHdl(); } 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()); AutoMutex mtx(((CMPI_Broker*)mb)->mtx); 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); AutoMutex mtx(((CMPI_Broker*)mb)->mtx); 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}}; AutoMutex mtx(((CMPI_Broker*)mb)->mtx); 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); if (rc) CMSetStatus(rc,CMPI_RC_OK); } catch (const CIMException &e) { DDD(cout<<"### exception: mbGetProperty - code: "<<e.getCode()<<" msg: "<<e.getMessage()<<endl); if (rc) 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)); AutoMutex mtx(((CMPI_Broker*)mb)->mtx); 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={ 0, // 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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -