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 "cmpisrv.h"
00025 
00026 static CMPIStatus arrayRelease(CMPIArray* eArray)
00027 {
00028    CMPIData *dta = (CMPIData *)eArray->hdl;
00029    if (dta)
00030    {
00031       if (dta->type & CMPI_ENC)
00032       {
00033          
00034          
00035             
00036                
00037                
00038                
00039          
00040       }
00041       delete[] dta;
00042       ((CMPI_Object *)eArray)->unlinkAndDelete();
00043    }
00044    CMReturn(CMPI_RC_OK);
00045 }
00046 
00047 static CMPIArray* arrayClone(const CMPIArray* eArray, CMPIStatus* rc)
00048 {
00049    CMPIData * dta=(CMPIData *)eArray->hdl;
00050    CMPIData * nDta=new CMPIData[dta->value.uint32+1];
00051    CMPIArray * nArray=(CMPIArray *)new CMPI_Object(nDta, CMPI_Array_Ftab);
00052    CMPIStatus rrc={CMPI_RC_OK, NULL};
00053 
00054    if (dta->type & CMPI_ENC) for (unsigned int i=1; i<=dta->value.uint32; i++)
00055       nDta[i].state=CMPI_nullValue;
00056 
00057    for (unsigned int i=0; i<=dta->value.uint32; i++)
00058    {
00059       nDta[i] = dta[i];
00060       if (dta->type & CMPI_ENC && dta[i].state==0)
00061       {
00062          nDta[i].value.string =
00063             ((CMPIString*)dta[i].value.string)->ft->clone(
00064                (CMPIString *)dta[i].value.string,&rrc);
00065          if (rrc.rc)
00066          {
00067             arrayRelease(nArray);
00068             if (rc) *rc=rrc;
00069             return NULL;
00070          }
00071       }
00072    }
00073 
00074    CMSetStatus(rc, CMPI_RC_OK);
00075    return nArray;
00076 }
00077 
00078 static CMPIData arrayGetElementAt(const CMPIArray* eArray, CMPICount pos,
00079                 CMPIStatus* rc)
00080 {
00081    CMPIData * dta=(CMPIData *)eArray->hdl;
00082    CMSetStatus(rc, CMPI_RC_OK);
00083    if (pos<dta->value.uint32) return dta[pos+1];
00084 
00085    CMPIData data={(CMPIType) 0, CMPI_nullValue, {0} };
00086    CMSetStatus(rc, CMPI_RC_ERR_NOT_FOUND);
00087    return data;
00088 }
00089 
00090 static CMPIStatus arraySetElementAt(CMPIArray* eArray, CMPICount pos,
00091                const CMPIValue *val, CMPIType type)
00092 {
00093    CMPIData * dta=(CMPIData *)eArray->hdl;
00094 
00095    if (pos<dta->value.uint32)
00096    {
00097       if ((dta->type&~CMPI_ARRAY)==type)
00098       {
00099          dta[pos+1].state=0;
00100          dta[pos+1].value=*val;
00101          CMReturn(CMPI_RC_OK);
00102       }
00103       
00104       
00105       
00106       
00107       CMReturn(CMPI_RC_ERR_TYPE_MISMATCH);
00108    }
00109    CMReturn(CMPI_RC_ERR_NOT_FOUND);
00110 }
00111 
00112 static CMPICount arrayGetSize(const CMPIArray* eArray, CMPIStatus* rc)
00113 {
00114    CMPIData * dta=(CMPIData *)eArray->hdl;
00115    CMSetStatus(rc,CMPI_RC_OK);
00116    return dta->value.uint32;
00117 }
00118 
00119 static CMPIType arrayGetType(const CMPIArray* eArray, CMPIStatus* rc)
00120 {
00121    CMPIData * dta=(CMPIData *)eArray->hdl;
00122    CMSetStatus(rc,CMPI_RC_OK);
00123    return dta->type;
00124 }
00125 
00126 static CMPIArrayFT array_FT={
00127    CMPICurrentVersion,
00128    arrayRelease,
00129    arrayClone,
00130    arrayGetSize,
00131    arrayGetType,
00132    arrayGetElementAt,
00133    arraySetElementAt,
00134 };
00135 
00136 CMPIArrayFT *CMPI_Array_Ftab=&array_FT;
00137