00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033 #include "OW_config.h"
00034 #include "OW_CMPIMethodProviderProxy.hpp"
00035 #include "OW_CIMClass.hpp"
00036 #include "OW_CIMException.hpp"
00037 #include "OW_Format.hpp"
00038 #include "OW_CMPIProviderIFCUtils.hpp"
00039 #include "OW_CIMValue.hpp"
00040 #include "OW_CIMObjectPath.hpp"
00041 #include "OW_CIMParamValue.hpp"
00042 #include "OW_Logger.hpp"
00043
00044 namespace OW_NAMESPACE
00045 {
00046
00047 namespace
00048 {
00049 const String COMPONENT_NAME("ow.provider.cmpi.ifc");
00050 }
00051
00053 CMPIMethodProviderProxy::CMPIMethodProviderProxy(const CMPIFTABLERef& f)
00054 : m_ftable(f)
00055 {
00056 }
00058 CMPIMethodProviderProxy::~CMPIMethodProviderProxy()
00059 {
00060 }
00062 CIMValue
00063 CMPIMethodProviderProxy::invokeMethod(const ProviderEnvironmentIFCRef &env,
00064 const String& ns,
00065 const CIMObjectPath& path,
00066 const String &methodName,
00067 const CIMParamValueArray &in, CIMParamValueArray &out)
00068 {
00069 OW_LOG_DEBUG(env->getLogger(COMPONENT_NAME), "CMPIMethodProviderProxy::invokeMethod()");
00070
00071 m_ftable->lastAccessTime.setToCurrent();
00072
00073 if (m_ftable->miVector.methMI->ft->invokeMethod != NULL)
00074 {
00075 CMPIStatus rc = {CMPI_RC_OK, NULL};
00076 ::CMPIOperationContext context;
00077 ProviderEnvironmentIFCRef env2(env);
00078 ::CMPI_Broker localBroker(m_ftable->broker);
00079 localBroker.hdl = static_cast<void *>(&env2);
00080
00081 CMPI_ContextOnStack eCtx(context);
00082 CMPI_ThreadContext thr(&localBroker, &eCtx);
00083 CIMObjectPath objectReference = path;
00084 objectReference.setNameSpace(ns);
00085 CMPI_ObjectPathOnStack eRef(objectReference);
00086 CMPI_ArgsOnStack eArgsIn(in);
00087 CMPI_ArgsOnStack eArgsOut(out);
00088 CMPIValueValueResultHandler handler;
00089 CMPI_ResultOnStack eRes(handler);
00090 char* mName = const_cast<char*>(methodName.c_str());
00091 CMPIFlags flgs=0;
00092 eCtx.ft->addEntry(&eCtx, const_cast<char*>(CMPIInvocationFlags), (CMPIValue*)&flgs,
00093 CMPI_uint32);
00094
00095 rc=m_ftable->miVector.methMI->ft->invokeMethod(
00096 m_ftable->miVector.methMI, &eCtx, &eRes, &eRef, mName, &eArgsIn,
00097 &eArgsOut);
00098
00099 if (rc.rc == CMPI_RC_OK)
00100 {
00101 return handler.getValue();
00102 }
00103 else
00104 {
00105 OW_THROWCIMMSG(CIMException::ErrNoType(rc.rc), rc.msg ?
00106 CMGetCharPtr(rc.msg) : "");
00107 }
00108 }
00109
00110 return CIMValue(CIMNULL);
00111 }
00112
00113 }
00114