00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 #include <iostream>
00025 #include "cmpisrv.h"
00026 
00027 static CMPIStatus refRelease(CMPIObjectPath* eRef)
00028 {
00029 
00030    OpenWBEM::CIMObjectPath* ref=(OpenWBEM::CIMObjectPath*)eRef->hdl;
00031    if (ref)
00032    {
00033       delete ref;
00034       ((CMPI_Object*)eRef)->unlinkAndDelete();
00035    }
00036    CMReturn(CMPI_RC_OK);
00037 }
00038 
00039 static CMPIStatus refReleaseNop(CMPIObjectPath* eRef)
00040 {
00041    CMReturn(CMPI_RC_OK);
00042 }
00043 
00044 static CMPIObjectPath* refClone(const CMPIObjectPath* eRef, CMPIStatus* rc)
00045 {
00046    OpenWBEM::CIMObjectPath *ref=(OpenWBEM::CIMObjectPath*)eRef->hdl;
00047    
00048    
00049    
00050    
00051    OpenWBEM::CIMObjectPath *nRef = new OpenWBEM::CIMObjectPath(* ref);
00052    CMPIObjectPath* neRef=(CMPIObjectPath*)new CMPI_Object(nRef,CMPI_ObjectPath_Ftab);
00053 
00054    CMSetStatus(rc,CMPI_RC_OK);
00055    return neRef;
00056 }
00057 
00058 static CMPIStatus refSetNameSpace(CMPIObjectPath* eRef, const char* ns)
00059 {
00060    OpenWBEM::CIMObjectPath* ref=(OpenWBEM::CIMObjectPath*)eRef->hdl;
00061    ref->setNameSpace(OpenWBEM::String(ns));
00062    CMReturn(CMPI_RC_OK);
00063 }
00064 
00065 static CMPIString* refGetNameSpace(const CMPIObjectPath* eRef, CMPIStatus* rc)
00066 {
00067    OpenWBEM::CIMObjectPath* ref=(OpenWBEM::CIMObjectPath*)eRef->hdl;
00068    const OpenWBEM::String &ns=ref->getNameSpace();
00069    CMPIString *eNs=string2CMPIString(ns);
00070    CMSetStatus(rc,CMPI_RC_OK);
00071    return eNs;
00072 }
00073 
00074 static CMPIStatus refSetClassName(CMPIObjectPath * eRef,const char * cl)
00075 {
00076    OpenWBEM::CIMObjectPath* ref=(OpenWBEM::CIMObjectPath*)eRef->hdl;
00077    ref->setClassName(OpenWBEM::String(cl));
00078    CMReturn(CMPI_RC_OK);
00079 }
00080 
00081 static CMPIString* refGetClassName(const CMPIObjectPath* eRef, CMPIStatus* rc)
00082 {
00083    OpenWBEM::CIMObjectPath * ref=(OpenWBEM::CIMObjectPath*)eRef->hdl;
00084    const OpenWBEM::String &cn=ref->getClassName();
00085    CMPIString* eCn=string2CMPIString(cn);
00086    CMSetStatus(rc,CMPI_RC_OK);
00087    return eCn;
00088 }
00089 
00090 
00091 static long locateKey(const OpenWBEM::CIMPropertyArray &kb, const OpenWBEM::String& eName)
00092 {
00093    for (unsigned long i=0,s=kb.size(); i<s; i++)
00094    {
00095       const OpenWBEM::String &n=kb[i].getName();
00096       if (n.equalsIgnoreCase(eName))
00097       {
00098          return i;
00099       }
00100    }
00101    return -1;
00102 }
00103 
00104 static CMPIStatus refAddKey(CMPIObjectPath* eRef, const char* name,
00105    const CMPIValue* data, const CMPIType type)
00106 {
00107    OpenWBEM::CIMObjectPath* ref=(OpenWBEM::CIMObjectPath*)eRef->hdl;
00108    OpenWBEM::CIMPropertyArray keyBindings=ref->getKeys();
00109    OpenWBEM::String key(name);
00110    CMPIrc rc;
00111 
00112    long i = locateKey(keyBindings, key);
00113    if (i >= 0)
00114    {
00115       keyBindings.remove(i);
00116       ref->setKeys(keyBindings);
00117    }
00118 
00119    OpenWBEM::CIMValue val = value2CIMValue(data,type,&rc);
00120    ref->setKeyValue(key, val);
00121    CMReturn(CMPI_RC_OK);
00122 }
00123 
00124 static CMPIData refGetKey(const CMPIObjectPath* eRef, const char* name, CMPIStatus* rc)
00125 {
00126    OpenWBEM::CIMObjectPath* ref=(OpenWBEM::CIMObjectPath*)eRef->hdl;
00127    const OpenWBEM::String eName(name);
00128    OpenWBEM::CIMProperty cpr = ref->getKey(eName);
00129    CMPIData data = {(CMPIType) 0, CMPI_nullValue, {0} };
00130 
00131    CMSetStatus(rc,CMPI_RC_OK);
00132 
00133    if (cpr)
00134    {
00135       OpenWBEM::CIMValue cv = cpr.getValue();
00136       value2CMPIData(cv, type2CMPIType(cv.getType(), cv.isArray()), &data);
00137       return data;
00138    }
00139 
00140    CMSetStatus(rc,CMPI_RC_ERR_NOT_FOUND);
00141    return data;
00142 }
00143 
00144 static CMPIData refGetKeyAt(const CMPIObjectPath* eRef, unsigned pos, CMPIString** name,
00145    CMPIStatus* rc)
00146 {
00147    OpenWBEM::CIMObjectPath* ref=(OpenWBEM::CIMObjectPath*)eRef->hdl;
00148    const OpenWBEM::CIMPropertyArray &akb=ref->getKeys();
00149    CMPIData data={(CMPIType) 0, CMPI_nullValue, {0} };
00150    CMSetStatus(rc,CMPI_RC_OK);
00151 
00152    if (pos >= akb.size())
00153    {
00154       CMSetStatus(rc,CMPI_RC_ERR_NOT_FOUND);
00155       return data;
00156    }
00157 
00158    OpenWBEM::CIMValue cv = akb[pos].getValue();
00159    value2CMPIData(cv, type2CMPIType(cv.getType(),cv.isArray()) ,&data);
00160 
00161    if (name)
00162    {
00163       const OpenWBEM::String &n=akb[pos].getName();
00164       *name=string2CMPIString(n);
00165    }
00166    return data;
00167 }
00168 
00169 static CMPICount refGetKeyCount(const CMPIObjectPath* eRef, CMPIStatus* rc)
00170 {
00171    OpenWBEM::CIMObjectPath* ref=(OpenWBEM::CIMObjectPath*)eRef->hdl;
00172    const OpenWBEM::CIMPropertyArray &akb=ref->getKeys();
00173    CMSetStatus(rc,CMPI_RC_OK);
00174    return akb.size();
00175 }
00176 
00177 static CMPIStatus refSetNameSpaceFromObjectPath(CMPIObjectPath* eRef,
00178    const CMPIObjectPath* eSrc)
00179 {
00180    OpenWBEM::CIMObjectPath* ref=(OpenWBEM::CIMObjectPath*)eRef->hdl;
00181    OpenWBEM::CIMObjectPath* src=(OpenWBEM::CIMObjectPath*)eSrc->hdl;
00182    ref->setNameSpace(src->getNameSpace());
00183    CMReturn(CMPI_RC_OK);
00184 }
00185 
00186 #if 0
00187 static CMPIBoolean refClassPathIsA(CMPIObjectPath *eRef,
00188    char * classname, CMPIStatus * rc)
00189 {
00190    return false;
00191 }
00192 #endif
00193 
00194 #if defined(CMPI_VER_86)
00195 
00200 static      CMPIString *refToString(const CMPIObjectPath* op, CMPIStatus *rc)
00201 {
00202    rc->rc = CMPI_RC_ERR_METHOD_NOT_AVAILABLE; 
00203    CMPIString* rval = new CMPIString; 
00204    
00205    return rval; 
00206 }
00207 #endif
00208 
00209 static CMPIObjectPathFT objectPath_FT={
00210    CMPICurrentVersion,
00211    refRelease,
00212    refClone,
00213    refSetNameSpace,
00214    refGetNameSpace,
00215    NULL,    
00216    NULL,    
00217    refSetClassName,
00218    refGetClassName,
00219    refAddKey,
00220    refGetKey,
00221    refGetKeyAt,
00222    refGetKeyCount,
00223    refSetNameSpaceFromObjectPath,
00224    NULL,    
00225    
00226    
00227    NULL,
00228    NULL,
00229    NULL,
00230    NULL,
00231    refToString 
00232 };
00233 
00234 CMPIObjectPathFT *CMPI_ObjectPath_Ftab=&objectPath_FT;
00235 
00236 static CMPIObjectPathFT objectPathOnStack_FT={
00237    CMPICurrentVersion,
00238    refReleaseNop,
00239    refClone,
00240    refSetNameSpace,
00241    refGetNameSpace,
00242    NULL,    
00243    NULL,    
00244    refSetClassName,
00245    refGetClassName,
00246    refAddKey,
00247    refGetKey,
00248    refGetKeyAt,
00249    refGetKeyCount,
00250    refSetNameSpaceFromObjectPath,
00251    NULL,    
00252    
00253    
00254    NULL,
00255    NULL,
00256    NULL,
00257    NULL,
00258    NULL 
00259 };
00260 
00261 CMPIObjectPathFT *CMPI_ObjectPathOnStack_Ftab=&objectPathOnStack_FT;
00262 
00263 
00264 CMPI_ObjectPathOnStack::CMPI_ObjectPathOnStack(const OpenWBEM::CIMObjectPath& cop)
00265 {
00266    hdl=(void*)&cop;
00267    ft=CMPI_ObjectPathOnStack_Ftab;
00268 }