CMPIStatus Adapter::associators( CMPIAssociationMI* mi, const CMPIContext* context, const CMPIResult* result, const CMPIObjectPath* cmpi_op, const char* assoc_class_, const char* result_class_, const char* role_, const char* result_role_, const char** properties) { TRACE; const char* assoc_class = assoc_class_ ? assoc_class_ : ""; const char* result_class = result_class_ ? result_class_ : ""; const char* role = role_ ? role_ : ""; const char* result_role = result_role_ ? result_role_ : ""; _context_tls.set((void*)context); Adapter* adapter = (Adapter*)mi->hdl; Auto_RMutex auto_lock(adapter->_lock); CIMPLE_ASSERT(strcasecmp(assoc_class, adapter->_mc->name) == 0); // Lookup meta class for cmpi_op (not the same as the provider class). const Meta_Class* mc = adapter->_find_meta_class(class_name(cmpi_op)); if (!mc) CMReturn(CMPI_RC_ERR_INVALID_CLASS); // Convert to CIMPLE reference: Instance* cimple_ref = 0; CMPIrc rc = make_cimple_reference(mc, cmpi_op, cimple_ref); Destroyer<Instance> cimple_ref_d(cimple_ref); if (rc != CMPI_RC_OK) CMReturn(rc); // Invoke the provider: associators::Data data = { adapter->broker, context, result, name_space(cmpi_op), properties, CMPI_RC_OK }; Enum_Associator_Names_Status status = adapter->enum_associator_names( cimple_ref, result_class, role, result_role, associators::_proc, &data); CMReturn(CMPI_RC_OK); }
CMPIStatus Adapter::referenceNames( CMPIAssociationMI* mi, const CMPIContext* context, const CMPIResult* result, const CMPIObjectPath* cmpi_op, const char* result_class_, const char* role_) { TRACE; _context_tls.set((void*)context); Adapter* adapter = (Adapter*)mi->hdl; Auto_RMutex auto_lock(adapter->_lock); const char* result_class = result_class_ ? result_class_ : ""; const char* role = role_ ? role_ : ""; // Lookup meta class for cmpi_op (not the same as the provider class). const Meta_Class* mc = adapter->_find_meta_class(class_name(cmpi_op)); if (!mc) CMReturn(CMPI_RC_ERR_INVALID_CLASS); CIMPLE_ASSERT(strcasecmp(result_class, adapter->_mc->name) == 0); // Convert to CIMPLE reference: Instance* cimple_ref = 0; CMPIrc rc = make_cimple_reference(mc, cmpi_op, cimple_ref); Destroyer<Instance> cimple_ref_d(cimple_ref); if (rc != CMPI_RC_OK) CMReturn(rc); // Create a model. const Meta_Class* model_meta_class = 0; adapter->get_meta_class(model_meta_class); Instance* cimple_model = cimple::create(model_meta_class); nullify_non_keys(cimple_model); // Invoke the provider: reference_names::Data data = { adapter->broker, context, result, name_space(cmpi_op), CMPI_RC_OK }; Enum_References_Status status = adapter->enum_references( cimple_ref, cimple_model, role, reference_names::_proc, &data); destroy(cimple_model); switch (status) { case ENUM_REFERENCES_OK: CMReturn(CMPI_RC_OK); case ENUM_REFERENCES_FAILED: case ENUM_REFERENCES_UNSUPPORTED: CMReturn(CMPI_RC_ERR_FAILED); } // Unreachable! CMReturn(CMPI_RC_OK); }