⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jmpiimpl.cpp

📁 Pegasus is an open-source implementationof the DMTF CIM and WBEM standards. It is designed to be por
💻 CPP
📖 第 1 页 / 共 5 页
字号:
//%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 "JMPIImpl.h"#if defined(PEGASUS_PLATFORM_WIN32_IX86_MSVC)#include <Pegasus/Common/DynamicLibrary.h>#else#include <dlfcn.h>#endif#include <iostream>#include <sstream>#include <Pegasus/Common/Config.h>#include <Pegasus/Common/System.h>#include <Pegasus/Common/CIMClass.h>#include <Pegasus/Common/CIMInstance.h>#include <Pegasus/Common/CIMObjectPath.h>#include <Pegasus/Common/CIMProperty.h>#include <Pegasus/Common/OperationContext.h>#include <Pegasus/Provider/CIMOMHandle.h>#include <Pegasus/Client/CIMClient.h>#include <Pegasus/ProviderManager2/JMPI/JMPIProviderManager.h>#include <Pegasus/WQL/WQLSelectStatement.h>#include <Pegasus/WQL/WQLParser.h>#define CALL_SIGN_WQL "WQL"PEGASUS_USING_STD;PEGASUS_NAMESPACE_BEGINJavaVM *JMPIjvm::jvm=NULL;JvmVector JMPIjvm::jv;int JMPIjvm::trace=0;#ifdef PEGASUS_DEBUG#define DDD(x) if (JMPIjvm::trace) x;#else#define DDD(x)#endif#include "Convert.h"JMPIjvm::ClassTable  JMPIjvm::_classTable;JMPIjvm::ObjectTable JMPIjvm::_objectTable;const char* classNames[]={/*00*/ "java/util/Vector" ,/*01*/ "java/lang/Boolean",/*02*/ "java/lang/Byte",/*03*/ "java/lang/Short",/*04*/ "java/lang/Integer",/*05*/ "java/lang/Long",/*06*/ "java/lang/Float",/*07*/ "java/lang/Double",/*08*/ "org/pegasus/jmpi/UnsignedInt8",/*09*/ "org/pegasus/jmpi/UnsignedInt16",/*10*/ "org/pegasus/jmpi/UnsignedInt32",/*11*/ "org/pegasus/jmpi/UnsignedInt64",/*12*/ "org/pegasus/jmpi/CIMObjectPath",/*13*/ "org/pegasus/jmpi/CIMException",/*14*/ "java/math/BigInteger",/*15*/ "org/pegasus/jmpi/CIMProperty",/*16*/ "org/pegasus/jmpi/CIMOMHandle",/*17*/ "org/pegasus/jmpi/CIMClass",/*18*/ "org/pegasus/jmpi/CIMInstance",/*19*/ "org/pegasus/jmpi/CIMValue",/*20*/ "java/lang/Object",/*21*/ "java/lang/Throwable",/*22*/ "java/lang/String",/*23*/ "org/pegasus/jmpi/JarClassLoader",/*24*/ "org/pegasus/jmpi/CIMDateTime",/*25*/ "org/pegasus/jmpi/SelectExp",/*26*/ "org/pegasus/jmpi/CIMQualifier",/*27*/ "org/pegasus/jmpi/CIMQualifierType",/*28*/ "org/pegasus/jmpi/CIMFlavor",/*29*/ "org/pegasus/jmpi/CIMArgument",/*30*/ "org/pegasus/jmpi/CIMInstanceException",/*31*/ "org/pegasus/jmpi/CIMObject",/*32*/ "java/lang/Character",/*33*/ "org/pegasus/jmpi/OperationContext",/*34*/ "java/lang/Class",};const METHOD_STRUCT instanceMethodNames[]={/*00 VectorNew                   */ { /*Vector           */ 0, "<init>",          "()V" },/*01 BooleanNewZ                 */ { /*Boolean          */ 1, "<init>",          "(Z)V" },/*02 ByteNewB                    */ { /*Byte             */ 2, "<init>",          "(B)V" },/*03 ShortNewS                   */ { /*Short            */ 3, "<init>",          "(S)V" },/*04 IntegerNewI                 */ { /*Integer          */ 4, "<init>",          "(I)V" },/*05 LongNewJ                    */ { /*Long             */ 5, "<init>",          "(J)V" },/*06 FloatNewF                   */ { /*Float            */ 6, "<init>",          "(F)V" },/*07 DoubleNewD                  */ { /*Double           */ 7, "<init>",          "(D)V" },/*08 UnsignedInt8NewS            */ { /*UnsignedInt8     */ 8, "<init>",          "(S)V" },/*09 UnsignedInt16NewI           */ { /*UnsignedInt16    */ 9, "<init>",          "(I)V" },/*10 UnsignedInt32NewJ           */ { /*UnsignedInt32    */10, "<init>",          "(J)V" },/*11 UnsignedInt64NewBi          */ { /*UnsignedInt64    */11, "<init>",          "(Ljava/math/BigInteger;)V" },/*12 CIMObjectPathNewJ           */ { /*CIMObjectPath    */12, "<init>",          "(J)V" },/*13 CIMExceptionNewSt           */ { /*CIMException     */13, "<init>",          "(Ljava/lang/String;)V" },/*14 CIMPropertyNewJ             */ { /*CIMProperty      */15, "<init>",          "(J)V" },/*15 VectorAddElement            */ { /*Vector           */ 0, "addElement",      "(Ljava/lang/Object;)V" },/*16 VectorElementAt             */ { /*Vector           */ 0, "elementAt",       "(I)Ljava/lang/Object;" },/*17 CIMOMHandleNewJSt           */ { /*CIMOMHandle      */16, "<init>",          "(JLjava/lang/String;)V" },/*18 CIMExceptionNewI            */ { /*CIMException     */13, "<init>",          "(I)V" },/*19 CIMClassNewJ                */ { /*CIMClass         */17, "<init>",          "(J)V" },/*20 CIMInstanceNewJ             */ { /*CIMInstance      */18, "<init>",          "(J)V" },/*21 CIMObjectPathCInst          */ { /*CIMObjectPath    */12, "cInst",           "()J" },/*22 CIMInstanceCInst            */ { /*CIMInstance      */18, "cInst",           "()J" },/*23 CIMClassCInst               */ { /*CIMClass         */17, "cInst",           "()J" },/*24 ObjectToString              */ { /*Object           */20, "toString",        "()Ljava/lang/String;" },/*25 ThrowableGetMessage         */ { /*Throwable        */21, "getMessage",      "()Ljava/lang/String;" },/*26 CIMExceptionGetID           */ { /*CIMException     */13, "getID",           "()Ljava/lang/String;" },/*27 VectorSize                  */ { /*Vector           */ 0, "size",            "()I" },/*28 CIMPropertyCInst            */ { /*CIMProperty      */15, "cInst",           "()J" },/*29 CIMOMHandleGetClass         */ { /*CIMOMHandle      */16, "getClass",        "(Lorg/pegasus/jmpi/CIMObjectPath;Z)Lorg/pegasus/jmpi/CIMClass;" },/*30 VectorRemoveElementAt       */ { /*Vector           */ 0, "removeElementAt", "(I)V" },/*31 CIMValueCInst               */ { /*CIMValue         */19, "cInst",           "()J" },/*32 CIMExceptionNewISt          */ { /*CIMException     */13, "<init>",          "(ILjava/lang/String;)V" },/*33 CIMExceptionGetCode         */ { /*CIMException     */13, "getCode",         "()I" },/*34 CIMDateTimeNewJ             */ { /*CIMDateTime      */24, "<init>",          "(J)V" },/*35 SelectExpNewJ               */ { /*SelectExp        */25, "<init>",          "(J)V" },/*36 CIMQualifierNewJ            */ { /*CIMQualifier     */26, "<init>",          "(J)V" },/*37 CIMFlavorNewI               */ { /*CIMFlavor        */28, "<init>",          "(I)V" },/*38 CIMFlavorGetFlavor          */ { /*CIMFlavor        */28, "getFlavor",       "()I" },/*39 CIMArgumentCInst            */ { /*CIMArgument      */29, "cInst",           "()J" },/*40 CIMArgumentNewJ             */ { /*CIMArgument      */29, "<init>",          "(J)V" },/*41 CIMExceptionNew             */ { /*CIMException     */13, "<init>",          "()V" },/*42 CIMExceptionNewStOb         */ { /*CIMException     */13, "<init>",          "(Ljava/lang/String;Ljava/lang/Object;)V" },/*43 CIMExceptionNewStObOb       */ { /*CIMException     */13, "<init>",          "(Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;)V" },/*44 CIMExceptionNewStObObOb     */ { /*CIMException     */13, "<init>",          "(Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V" },/*45 CIMValueNewJ                */ { /*CIMValue         */19, "<init>",          "(J)V" },/*46 CIMObjectNewJZ              */ { /*CIMObject        */31, "<init>",          "(JZ)V" },/*47 CharacterNewC               */ { /*Character        */32, "<init>",          "(C)V" },/*48 OperationContextNewJ        */ { /*OperationContext */33, "<init>",          "(J)V" },/*49 OperationContextUnassociate */ { /*OperationContext */33, "unassociate",     "()V" },/*50 ClassGetInterfaces          */ { /*Class            */34, "getInterfaces",   "()[Ljava/lang/Class;" },/*51 ClassGetName                */ { /*Class            */34, "getName",         "()Ljava/lang/String;" },/*52 UnsignedInt64NewStr         */ { /*UnsignedInt64    */11, "<init>",          "(Ljava/lang/String;)V" }};const METHOD_STRUCT staticMethodNames[]={/*00*/ { 14, "valueOf",         "(J)Ljava/math/BigInteger;" },/*01*/ { 23, "load",            "(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/Class;" },};static int methodInitDone=0;jclass    classRefs[sizeof(classNames)/sizeof(classNames[0])];jmethodID instanceMethodIDs[sizeof(instanceMethodNames)/sizeof(instanceMethodNames[0])];jmethodID staticMethodIDs[sizeof(staticMethodNames)/sizeof(staticMethodNames[0])];jclass JMPIjvm::getGlobalClassRef(JNIEnv *env, const char* name){  jclass localRefCls = env->FindClass(name);  if (localRefCls == NULL)     return JNI_FALSE;  jclass globalRefCls = (jclass) env->NewGlobalRef(localRefCls);#if 0  jmethodID   jmidToString   = env->GetMethodID(globalRefCls, "toString", "()Ljava/lang/String;");  jstring     jstringResult  = (jstring)env->CallObjectMethod(globalRefCls, jmidToString);  const char *pszResult      = env->GetStringUTFChars(jstringResult, 0);  DDD(PEGASUS_STD(cout)<<"--- JMPIjvm::getGlobalClassRef: globalRefCls = "<<PEGASUS_STD(hex)<<(long)globalRefCls<<PEGASUS_STD(dec)<<", name = "<<name<<", pszResult = "<<pszResult<<PEGASUS_STD(endl));  env->ReleaseStringUTFChars (jstringResult, pszResult);#else  DDD(PEGASUS_STD(cout)<<"--- JMPIjvm::getGlobalClassRef: globalRefCls = "<<PEGASUS_STD(hex)<<(long)globalRefCls<<PEGASUS_STD(dec)<<", name = "<<name<<PEGASUS_STD(endl));#endif  env->DeleteLocalRef(localRefCls);  return globalRefCls;}JMPIjvm::JMPIjvm(){   initJVM ();}JMPIjvm::~JMPIjvm(){}int JMPIjvm::cacheIDs(JNIEnv *env){   if (methodInitDone == 1)      return JNI_TRUE;   if (methodInitDone == -1)      return JNI_FALSE;   DDD(PEGASUS_STD(cout)<<"--- JMPIjvm::cacheIDs(): enter"<<PEGASUS_STD(endl));   methodInitDone = -1;   for (unsigned i = 0; i<(sizeof(classNames)/sizeof(classNames[0])); i++)   {//////DDD(PEGASUS_STD(cout)<<"--- JMPIjvm::cacheIDs(): Trying "<<classNames[i]<<PEGASUS_STD(endl));      if ((classRefs[i] = getGlobalClassRef(env,classNames[i])) == NULL)      {         DDD(PEGASUS_STD(cout)<<"--- JMPIjvm::cacheIDs(): Error: Count not find global class ref for "<<classNames[i]<<PEGASUS_STD(endl));         return JNI_FALSE;      }   }   for (unsigned j = 0; j<(sizeof(instanceMethodNames)/sizeof(instanceMethodNames[0])); j++)   {//////DDD(PEGASUS_STD(cout)<<"--- JMPIjvm::cacheIDs(): Trying "<<j<<": "<<classNames[instanceMethodNames[j].clsIndex]<<": "<<instanceMethodNames[j].methodName<<": "<<instanceMethodNames[j].signature<<PEGASUS_STD(endl));      if ((instanceMethodIDs[j] = env->GetMethodID(classRefs[instanceMethodNames[j].clsIndex],                                                 instanceMethodNames[j].methodName,                                                 instanceMethodNames[j].signature)) == NULL)      {         DDD(PEGASUS_STD(cout)<<"--- JMPIjvm::cacheIDs(): Error could not get method id for "<<classNames[instanceMethodNames[j].clsIndex]<<": "<<instanceMethodNames[j].methodName<<PEGASUS_STD(endl));         return 0;      }   }   for (unsigned k = 0; k<(sizeof(staticMethodNames)/sizeof(staticMethodNames[0])); k++)   {//////DDD(PEGASUS_STD(cout)<<"--- JMPIjvm::cacheIDs(): Trying "<<k<<": "<<classNames[staticMethodNames[k].clsIndex]<<": "<<staticMethodNames[k].methodName<<": "<<staticMethodNames[k].signature<<PEGASUS_STD(endl));      if ((staticMethodIDs[k] = env->GetStaticMethodID(classRefs[staticMethodNames[k].clsIndex],                                                     staticMethodNames[k].methodName,                                                     staticMethodNames[k].signature)) == NULL)      {         DDD(PEGASUS_STD(cout)<<"--- JMPIjvm::cacheIDs(): Error could not get method id for "<<classNames[staticMethodNames[k].clsIndex]<<": "<<staticMethodNames[k].methodName<<PEGASUS_STD(endl));         return 0;      }   }   DDD(PEGASUS_STD(cout)<<"--- JMPIjvm::cacheIDs(): exit"<<PEGASUS_STD(endl));   jv.env = env;   jv.classRefs = classRefs;   jv.instMethodIDs = instanceMethodIDs;   jv.staticMethodIDs = staticMethodIDs;   jv.instanceMethodNames = instanceMethodNames;   methodInitDone = 1;   return JNI_TRUE;}static void throwCIMException (JNIEnv *env, char *e){   JMPIjvm::cacheIDs (env);   env->ThrowNew (JMPIjvm::jv.CIMExceptionClassRef, e);}int JMPIjvm::destroyJVM (){   DDD(PEGASUS_STD(cerr)<<"--- JPIjvm::destroyJVM()"<<PEGASUS_STD(endl));#ifdef JAVA_DESTROY_VM_WORKS   if (jvm!= NULL)   {      JvmVector *jv;      attachThread(&jv);      jvm->DestroyJavaVM();      jvm = NULL;      return 0;   }#endif   return -1;}Mutex JMPIjvm::_initMutex;int JMPIjvm::initJVM (){   AutoMutex lock (_initMutex);   if (jvm != NULL)   {      return 0;   }   JavaVMInitArgs vm_args;   jint res;   char *envstring;   JNIEnv *env;   JavaVMOption *poptions = 0;   int maxoption = 0;   typedef struct _JVMOptions {      const char *pszEnvName;      const char *pszPrefix;      bool        fSplit;   } JVMOPTIONS;   Array<std::string> JNIoptions;   static JVMOPTIONS aEnvOptions[] = {      { "CLASSPATH",                           "-Djava.class.path=", false },      { "PEGASUS_JMPI_MAX_HEAP",               "-Xmx"              , false },      { "PEGASUS_JMPI_INITIAL_HEAP",           "-Xms"              , false },      { "PEGASUS_JMPI_JAVA_THREAD_STACK_SIZE", "-Xss"              , false },      { "PEGASUS_JMPI_VERBOSE",                "-verbose:"         , true  }   };   std::ostringstream oss;#ifdef PEGASUS_DEBUG   if (getenv("PEGASUS_JMPI_TRACE"))      JMPIjvm::trace = 1;   else      JMPIjvm::trace = 0;#else   JMPIjvm::trace = 0;#endif   DDD(PEGASUS_STD(cout) << "--- JMPIjvm::initJVM()" << PEGASUS_STD(endl));   jv.initRc = 0;   envstring = getenv("CLASSPATH");   if (envstring == NULL)   {      jv.initRc = 1;      DDD(PEGASUS_STD(cerr) << "--- JMPIjvm::initJVM(): No CLASSPATH environment variable found" << PEGASUS_STD(endl));#ifdef PEGASUS_PLATFORM_ZOS_ZSERIES_IBM      throw PEGASUS_CIM_EXCEPTION_L(                 CIM_ERR_FAILED,                 MessageLoaderParms(                     "ProviderManager2.JMPI.JMPIImpl.GET_CLASSPATH_FAILED.PEGASUS_OS_ZOS",                     "Could not get CLASSPATH from environment."                     " Either CLASSPATH is longer than 255 characters"                     " or not set at all.")                 );#else      throw PEGASUS_CIM_EXCEPTION_L(                 CIM_ERR_FAILED,                 MessageLoaderParms(                     "ProviderManager2.JMPI.JMPIImpl.GET_CLASSPATH_FAILED.STANDARD",                     "Could not get CLASSPATH from environment.")                 );#endif      return -1;   }///JNIoptions.append ("-Djava.compiler=NONE");///maxoption++;   for (Uint32 i = 0; i < (int)(sizeof (aEnvOptions)/sizeof (aEnvOptions[0])); i++)   {      JVMOPTIONS *pEnvOption = &aEnvOptions[i];      envstring = getenv (pEnvOption->pszEnvName);      if (envstring)      {         if (pEnvOption->fSplit)         {            bool              fCommaFound  = true;            string            stringValues = envstring;            string::size_type posStart     = 0;            string::size_type posEnd       = stringValues.length () - 1;            while (fCommaFound)            {               string            stringValue;               string::size_type posComma    = stringValues.find (',', posStart);               if (posComma != string::npos)               {                  fCommaFound = true;                  stringValue = stringValues.substr (posStart, posComma);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -