00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 #include "cmpisrv.h"
00023 #include "OW_CIMException.hpp"
00024 #include "OW_CIMProperty.hpp"
00025 #include "OW_CIMObjectPath.hpp"
00026 #include "OW_ProviderEnvironmentIFC.hpp"
00027 #include "OW_Logger.hpp"
00028 
00029 namespace
00030 {
00031    const OpenWBEM::String COMPONENT_NAME("ow.provider.cmpi.ifc");
00032 }
00033 
00034 #define CM_LOGGER() \
00035 (* static_cast<OpenWBEM::ProviderEnvironmentIFCRef *>(CMPI_ThreadContext::getBroker()->hdl))->getLogger(COMPONENT_NAME)
00036 
00037 
00038 
00039 static CMPIInstance* mbEncNewInstance(const CMPIBroker*, const CMPIObjectPath* eCop,
00040                    CMPIStatus *rc)
00041 {
00042    OW_LOG_DEBUG(CM_LOGGER(), "CMPIBrokerEnc: mbEncNewInstance()");
00043 
00044    OpenWBEM::CIMObjectPath * cop = static_cast<OpenWBEM::CIMObjectPath *>(eCop->hdl);
00045 
00046    OpenWBEM::AutoPtr<OpenWBEM::CIMClass> cls(mbGetClass(0,*cop));
00047 
00048    OpenWBEM::CIMInstance ci;
00049 
00050    if (cls.get() && *cls)
00051    {
00052       
00053       
00054       
00055       ci = cls->newInstance();
00056 
00057       
00058 
00059       
00060       
00061       
00062    }
00063    else
00064       ci.setClassName(cop->getClassName());
00065 
00066    CMPIInstance * neInst = (CMPIInstance *)new CMPI_Object(
00067                new OpenWBEM::CIMInstance(ci));
00068    CMSetStatus(rc,CMPI_RC_OK);
00069    return neInst;
00070 }
00071 
00072 static CMPIObjectPath* mbEncNewObjectPath(const CMPIBroker*, const char *ns, const char *cls,
00073               CMPIStatus *rc)
00074 {
00075    OW_LOG_DEBUG(CM_LOGGER(), "CMPIBrokerEnc: mbEncNewObjectPath()");
00076    OpenWBEM::String className(cls);
00077    OpenWBEM::String nameSpace(ns);
00078    OpenWBEM::CIMObjectPath * cop = new OpenWBEM::CIMObjectPath(className,nameSpace);
00079 
00080    CMPIObjectPath * nePath = (CMPIObjectPath*)new CMPI_Object(cop);
00081    CMSetStatus(rc,CMPI_RC_OK);
00082    return nePath;
00083 }
00084 
00085 static CMPIArgs* mbEncNewArgs(const CMPIBroker*, CMPIStatus *rc)
00086 {
00087    CMSetStatus(rc,CMPI_RC_OK);
00088    return (CMPIArgs*)new CMPI_Object(new OpenWBEM::Array<OpenWBEM::CIMParamValue>());
00089 }
00090 
00091 static CMPIString* mbEncNewString(const CMPIBroker*, const char *cStr, CMPIStatus *rc)
00092 {
00093    CMSetStatus(rc,CMPI_RC_OK);
00094    return (CMPIString*)new CMPI_Object(cStr);
00095 }
00096 
00097 CMPIString* mbIntNewString(char *s) {
00098    return mbEncNewString(NULL,s,NULL);
00099 }
00100 
00101 static CMPIArray* mbEncNewArray(const CMPIBroker*, CMPICount count, CMPIType type,
00102                         CMPIStatus *rc)
00103 {
00104    OW_LOG_DEBUG(CM_LOGGER(), "CMPIBrokerEnc: mbEncNewArray()");
00105    CMSetStatus(rc,CMPI_RC_OK);
00106    CMPIData * dta = new CMPIData[count+1];
00107    dta->type = type;
00108    dta->value.uint32 = count;
00109    for (unsigned int i=1; i<=count; i++)
00110    {
00111       dta[i].type = type;
00112       dta[i].state = CMPI_nullValue;
00113       dta[i].value.uint64 = 0;
00114    }
00115 
00116    return (CMPIArray *)new CMPI_Object(dta);
00117 }
00118 
00119 extern CMPIDateTime *newDateTime();
00120 
00121 static CMPIDateTime* mbEncNewDateTime(const CMPIBroker*, CMPIStatus *rc)
00122 {
00123    CMSetStatus(rc,CMPI_RC_OK);
00124    return newDateTime();
00125 }
00126 
00127 extern CMPIDateTime *newDateTime(CMPIUint64,CMPIBoolean);
00128 
00129 static CMPIDateTime* mbEncNewDateTimeFromBinary(const CMPIBroker*,
00130     CMPIUint64 time, CMPIBoolean interval ,CMPIStatus *rc)
00131 {
00132    CMSetStatus(rc,CMPI_RC_OK);
00133    return newDateTime(time,interval);
00134 }
00135 
00136 extern CMPIDateTime *newDateTime(const char*);
00137 
00138 static CMPIDateTime* mbEncNewDateTimeFromString(const CMPIBroker*,
00139        const char *t ,CMPIStatus *rc)
00140 {
00141    CMSetStatus(rc,CMPI_RC_OK);
00142    return newDateTime(t);
00143 }
00144 
00145 static CMPIString* mbEncToString(const CMPIBroker *, const void * o, CMPIStatus * rc)
00146 {
00147    CMPI_Object *obj = (CMPI_Object*)o;
00148    OpenWBEM::String str;
00149 
00150    if (obj == NULL)
00151    {
00152       str.format("** Null object ptr (0x%p) **", o);
00153       CMSetStatus(rc, CMPI_RC_ERR_FAILED);
00154       return (CMPIString*) new CMPI_Object(str);
00155    }
00156 
00157    if (obj->hdl == NULL)
00158    {
00159       str.format("** Null object hdl (*0x%p) **", o);
00160       CMSetStatus(rc, CMPI_RC_ERR_FAILED);
00161       return (CMPIString*) new CMPI_Object(str);
00162    }
00163 
00164    if (obj->ftab == (void*)CMPI_Instance_Ftab
00165       || obj->ftab == (void*)CMPI_InstanceOnStack_Ftab)
00166    {
00167       str.format("** Object not supported (%p) **", o);
00168       CMSetStatus(rc,CMPI_RC_ERR_FAILED);
00169       return (CMPIString*) new CMPI_Object(str);
00170    }
00171    else if (obj->ftab == (void*)CMPI_ObjectPath_Ftab
00172           || obj->ftab == (void*)CMPI_ObjectPathOnStack_Ftab)
00173    {
00174       str = ((OpenWBEM::CIMObjectPath*)obj->hdl)->toString();
00175    }
00176    else if (obj->ftab == (void*) CMPI_String_Ftab)
00177    {
00178       str = *((OpenWBEM::String*) obj->hdl);
00179    }
00180    
00181 
00182 
00183 
00184 
00185 
00186 
00187 
00188 
00189 
00190 
00191 
00192    else
00193    {
00194       str.format("** Object not recognized (0x%p) **", o);
00195       CMSetStatus(rc, CMPI_RC_ERR_FAILED);
00196       return (CMPIString*) new CMPI_Object(str);
00197    }
00198 
00199    return (CMPIString*) new CMPI_Object(str);
00200 }
00201 
00202 static CMPIBoolean mbEncClassPathIsA(const CMPIBroker *, const CMPIObjectPath *eCp,
00203                const char *type, CMPIStatus *rc)
00204 {
00205    OpenWBEM::CIMObjectPath* cop=static_cast<OpenWBEM::CIMObjectPath *>(eCp->hdl);
00206 
00207    OpenWBEM::String tcn(type);
00208 
00209    if (tcn == cop->getClassName()) return 1;
00210 
00211    OpenWBEM::AutoPtr<OpenWBEM::CIMClass> cc(mbGetClass(0,*cop));
00212    OpenWBEM::CIMObjectPath  scp(*cop);
00213    scp.setClassName(cc->getSuperClass());
00214                                                             
00215    for (; !scp.getClassName().empty(); )
00216    {
00217       cc=mbGetClass(0,scp);
00218       if (cc->getName()==tcn) return 1;
00219       scp.setClassName(cc->getSuperClass());
00220    };
00221    return 0;
00222 }
00223 
00224 CMPIBoolean mbEncIsOfType(const CMPIBroker *mb, const void *o, const char *type, CMPIStatus *rc)
00225 {
00226    CMPI_Object *obj=(CMPI_Object*)o;
00227    char msg[128];
00228    if (obj==NULL) {
00229       sprintf(msg,"** Null object ptr (%p) **",o);
00230       CMSetStatusWithChars(mb,rc,CMPI_RC_ERR_FAILED,msg);
00231       return 0;
00232    }
00233                                                             
00234    CMSetStatus(rc,CMPI_RC_OK);
00235 
00236    if (obj->ftab==(void*)CMPI_Instance_Ftab &&
00237       strcmp(type,"CMPIInstance")==0) return 1;
00238    if (obj->ftab!=(void*)CMPI_ObjectPath_Ftab &&
00239       strcmp(type,"CMPIObjectPath")==0) return 1;
00240    
00241 
00242 
00243 
00244 
00245 
00246 
00247 
00248 
00249 
00250 
00251     if (obj->ftab!=(void*)CMPI_Array_Ftab &&
00252       strcmp(type,"CMPIArray")==0) return 1;
00253                                                             
00254    sprintf(msg,"** Object not recognized (%p) **",o);
00255    CMSetStatusWithChars(mb,rc,CMPI_RC_ERR_FAILED,msg);
00256    return 0;
00257 }
00258 
00259 
00260 static CMPIString* mbEncGetType(const CMPIBroker *mb, const void *o, CMPIStatus *rc)
00261 {
00262    CMPI_Object *obj=(CMPI_Object*)o;
00263    char msg[128];
00264    if (obj==NULL) {
00265       sprintf(msg,"** Null object ptr (%p) **",o);
00266       CMSetStatusWithChars(mb,rc,CMPI_RC_ERR_FAILED,msg);
00267       return NULL;
00268    }
00269                                                             
00270    CMSetStatus(rc,CMPI_RC_OK);
00271                                                             
00272    if (obj->ftab==(void*)CMPI_Instance_Ftab)
00273       return mb->eft->newString(mb,const_cast<char*>("CMPIInstance"),rc);
00274    if (obj->ftab!=(void*)CMPI_ObjectPath_Ftab)
00275       return mb->eft->newString(mb,const_cast<char*>("CMPIObjectPath"),rc);
00276    
00277 
00278 
00279 
00280 
00281 
00282 
00283 
00284 
00285 
00286 
00287    if (obj->ftab!=(void*)CMPI_Array_Ftab)
00288       return mb->eft->newString(mb,const_cast<char*>("CMPIArray"),rc);
00289                                                             
00290    sprintf(msg,"** Object not recognized (%p) **",o);
00291    CMSetStatusWithChars(mb,rc,CMPI_RC_ERR_FAILED,msg);
00292    return NULL;
00293 }
00294 
00295 #if defined (CMPI_VER_85)
00296 #if 0 // need to port to OW
00297 static Formatter::Arg formatValue(va_list *argptr, CMPIStatus *rc) {
00298                                                             
00299    CMPIValue *val=va_arg(*argptr,CMPIValue*);
00300    CMPIType type=va_arg(*argptr,int);
00301    CMSetStatus(rc,CMPI_RC_OK);
00302                                                             
00303    if ((type & (CMPI_UINT|CMPI_SINT))==CMPI_UINT) {
00304     CMPIUint64 u64;
00305      switch (type) {
00306      case CMPI_uint8:  u64=(CMPIUint64)val->uint8;  break;
00307      case CMPI_uint16: u64=(CMPIUint64)val->uint16; break;
00308      case CMPI_uint32: u64=(CMPIUint64)val->uint32; break;
00309      case CMPI_uint64: u64=(CMPIUint64)val->uint64; break;
00310      }
00311      return Formatter::Arg(u64);
00312    }
00313    else if ((type & (CMPI_UINT|CMPI_SINT))==CMPI_SINT) {
00314    CMPISint64 s64;
00315     switch (type) {
00316      case CMPI_sint8:  s64=(CMPISint64)val->sint8;  break;
00317      case CMPI_sint16: s64=(CMPISint64)val->sint16; break;
00318      case CMPI_sint32: s64=(CMPISint64)val->sint32; break;
00319      case CMPI_sint64: s64=(CMPISint64)val->sint64; break;
00320      }
00321      return Formatter::Arg(s64);
00322    }
00323    else if (type==CMPI_chars) return Formatter::Arg((const char*)val);
00324    else if (type==CMPI_string)
00325      return Formatter::Arg((const char*)CMGetCharsPtr(val->string,NULL));
00326    else if (type==CMPI_real32)  return Formatter::Arg((CMPIReal64)val->real32);
00327                                                             
00328    else if (type==CMPI_real64)  return Formatter::Arg(val->real64);
00329    else if (type==CMPI_boolean) return Formatter::Arg((Boolean)val->boolean);
00330                                                             
00331    CMSetStatus(rc,CMPI_RC_ERR_INVALID_PARAMETER);
00332    return Formatter::Arg((Boolean)0);
00333 }
00334 #endif // #if 0
00335 
00336 CMPIString* mbEncGetMessage(const CMPIBroker *, const char *msgId, const char *defMsg,
00337          CMPIStatus* rc, unsigned int count, ...) {
00338 #if 0 
00339    MessageLoaderParms parms(msgId,defMsg);
00340    
00341    if (count>0) {
00342      va_list argptr;
00343      va_start(argptr,count);
00344      for (;;) {
00345        if (count>0) parms.arg0=formatValue(&argptr,rc);
00346        else break;
00347        if (count>1) parms.arg1=formatValue(&argptr,rc);
00348        else break;
00349        if (count>2) parms.arg2=formatValue(&argptr,rc);
00350        else break;
00351        if (count>3) parms.arg3=formatValue(&argptr,rc);
00352        else break;
00353        if (count>4) parms.arg4=formatValue(&argptr,rc);
00354        else break;
00355        if (count>5) parms.arg5=formatValue(&argptr,rc);
00356        else break;
00357        if (count>6) parms.arg6=formatValue(&argptr,rc);
00358        else break;
00359        if (count>7) parms.arg7=formatValue(&argptr,rc);
00360        else break;
00361        if (count>8) parms.arg8=formatValue(&argptr,rc);
00362        else break;
00363        if (count>9) parms.arg9=formatValue(&argptr,rc);
00364        break;
00365      }
00366    }
00367    String nMsg=MessageLoader::getMessage(parms);
00368    return string2CMPIString(nMsg);
00369 #endif // #if 0
00370    return string2CMPIString(OpenWBEM::String(defMsg)); 
00371 }
00372 #endif
00373 
00374 
00375 
00376 CMPIStatus mbEncLogMessage(const CMPIBroker* mb, int severity, 
00377                      const char* id, const char* text, 
00378                      const CMPIString* string)
00379 {
00380    
00381    CMPIStatus rc; 
00382    rc.rc = CMPI_RC_ERR_METHOD_NOT_AVAILABLE; 
00383    return rc; 
00384 }
00385 
00386 CMPIStatus mbEncTrace(const CMPIBroker* mb, int level, const char* component, 
00387                  const char* text, const CMPIString* string)
00388 {
00389    
00390    CMPIStatus rc; 
00391    rc.rc = CMPI_RC_ERR_METHOD_NOT_AVAILABLE; 
00392    return rc; 
00393 }
00394 
00395 
00396 static CMPIBrokerEncFT brokerEnc_FT={
00397 CMPICurrentVersion,
00398    mbEncNewInstance,
00399    mbEncNewObjectPath,
00400    mbEncNewArgs,
00401    mbEncNewString,
00402    mbEncNewArray,
00403    mbEncNewDateTime,
00404    mbEncNewDateTimeFromBinary,
00405    mbEncNewDateTimeFromString,
00406    NULL,
00407    mbEncClassPathIsA,
00408    mbEncToString,
00409    mbEncIsOfType,
00410    mbEncGetType,
00411 #if defined (CMPI_VER_85)
00412    mbEncGetMessage,
00413    mbEncLogMessage, 
00414    mbEncTrace
00415 #endif
00416 };
00417 
00418 CMPIBrokerEncFT *CMPI_BrokerEnc_Ftab=&brokerEnc_FT;