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