(file) Return to CMPI_Value.cpp CVS log (file) (dir) Up to [Pegasus] / pegasus / src / Pegasus / ProviderManager2 / CMPI

  1 karl  1.19 //%2006////////////////////////////////////////////////////////////////////////
  2 schuur 1.1  //
  3 karl   1.14 // Copyright (c) 2000, 2001, 2002 BMC Software; Hewlett-Packard Development
  4             // Company, L.P.; IBM Corp.; The Open Group; Tivoli Systems.
  5             // Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L.P.;
  6 schuur 1.1  // IBM Corp.; EMC Corporation, The Open Group.
  7 karl   1.14 // Copyright (c) 2004 BMC Software; Hewlett-Packard Development Company, L.P.;
  8             // IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group.
  9 karl   1.15 // Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.;
 10             // EMC Corporation; VERITAS Software Corporation; The Open Group.
 11 karl   1.19 // Copyright (c) 2006 Hewlett-Packard Development Company, L.P.; IBM Corp.;
 12             // EMC Corporation; Symantec Corporation; The Open Group.
 13 schuur 1.1  //
 14             // Permission is hereby granted, free of charge, to any person obtaining a copy
 15             // of this software and associated documentation files (the "Software"), to
 16             // deal in the Software without restriction, including without limitation the
 17             // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
 18             // sell copies of the Software, and to permit persons to whom the Software is
 19             // furnished to do so, subject to the following conditions:
 20 r.kieninger 1.21 //
 21 schuur      1.1  // THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN
 22                  // ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED
 23                  // "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
 24                  // LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
 25                  // PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
 26                  // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
 27                  // ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 28                  // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 29                  //
 30                  //==============================================================================
 31                  //
 32                  //%/////////////////////////////////////////////////////////////////////////////
 33                  
 34 schuur      1.5  #include "CMPI_Version.h"
 35 schuur      1.2  
 36 schuur      1.1  #include "CMPI_String.h"
 37 schuur      1.11 #include "CMPI_Value.h"
 38 schuur      1.1  
 39                  PEGASUS_USING_STD;
 40                  PEGASUS_NAMESPACE_BEGIN
 41                  
 42                  #define CopyToArray(pt,ct) { Array<pt> ar##pt(aSize); \
 43                     for (int i=0; i<aSize; i++) ar##pt[i]=aData[i].value.ct; \
 44                     v.set(ar##pt); }
 45                  
 46                  #define CopyToStringArray(pt,ct) { Array<pt> ar##pt(aSize); \
 47                     for (int i=0; i<aSize; i++) ar##pt[i]=String(((char*)aData[i].value.ct)); \
 48                     v.set(ar##pt); }
 49                  
 50 schuur      1.12 #define CopyCharsptrToStringArray(pt,ct) { Array<pt> ar##pt(aSize); \
 51                     for (int i=0; i<aSize; i++) ar##pt[i]=String((*(char**)aData[i].value.ct)); \
 52                     v.set(ar##pt); }
 53                  
 54 schuur      1.1  #define CopyToEncArray(pt,ct) { Array<pt> ar##pt(aSize); \
 55                     for (int i=0; i<aSize; i++) ar##pt[i]=*((pt*)aData[i].value.ct->hdl); \
 56                     v.set(ar##pt); }
 57                  
 58 konrad.r    1.17 CIMValue value2CIMValue(const CMPIValue* data, const CMPIType type, CMPIrc *rc) {
 59 schuur      1.1     CIMValue v;
 60                     if (rc) *rc=CMPI_RC_OK;
 61                  
 62                     if (type & CMPI_ARRAY) {
 63 schuur      1.11 
 64                        if (data==NULL || data->array==NULL) {
 65                           CMPIType aType=type&~CMPI_ARRAY;
 66                           return CIMValue(type2CIMType(aType),true);
 67                        }
 68                  
 69 schuur      1.1        CMPIArray *ar=data->array;
 70                        CMPIData *aData=(CMPIData*)ar->hdl;
 71                        CMPIType aType=aData->type&~CMPI_ARRAY;
 72                        int aSize=aData->value.sint32;
 73                        aData++;
 74                  
 75 schuur      1.11      if (aType & CMPI_ENC && (data==NULL || data->array==NULL)) {
 76                           if (aType==CMPI_chars || aType==CMPI_string)
 77                              return CIMValue(CIMTYPE_STRING,true);
 78                           if (aType==CMPI_dateTime)
 79                              return CIMValue(CIMTYPE_DATETIME,true);
 80                           if (aType==CMPI_ref)
 81                              return CIMValue(CIMTYPE_REFERENCE,true);
 82                        }
 83                  
 84 schuur      1.1        if ((aType & (CMPI_UINT|CMPI_SINT))==CMPI_SINT) {
 85                           switch (aType) {
 86                              case CMPI_sint32: CopyToArray(Sint32,sint32); break;
 87                              case CMPI_sint16: CopyToArray(Sint16,sint16); break;
 88                              case CMPI_sint8:  CopyToArray(Sint8,sint8);   break;
 89                              case CMPI_sint64: CopyToArray(Sint64,sint64); break;
 90                              default: ;
 91                           }
 92                        }
 93                  
 94 schuur      1.12       else if (aType==CMPI_chars)       CopyToStringArray(String,chars)
 95                        else if (aType==CMPI_charsptr)    CopyCharsptrToStringArray(String,chars)
 96                        else if (aType==CMPI_string)      CopyToStringArray(String,string->hdl)
 97 schuur      1.1  
 98                        else if ((aType & (CMPI_UINT|CMPI_SINT))==CMPI_UINT) {
 99                           switch (aType) {
100                              case CMPI_uint32: CopyToArray(Uint32,uint32); break;
101                              case CMPI_uint16: CopyToArray(Uint16,uint16); break;
102                              case CMPI_uint8:  CopyToArray(Uint8,uint8);   break;
103                              case CMPI_uint64: CopyToArray(Uint64,uint64); break;
104                              default: ;
105                           }
106                        }
107                  
108                        else switch (aType) {
109                           case CMPI_ref:      CopyToEncArray(CIMObjectPath,ref); break;
110                           case CMPI_dateTime: CopyToEncArray(CIMDateTime,dateTime); break;
111 marek       1.24 #ifdef PEGASUS_EMBEDDED_INSTANCE_SUPPORT
112                           case CMPI_instance: CopyToEncArray(CIMInstance,inst); break;
113                  #endif
114 schuur      1.1           case CMPI_boolean:  CopyToArray(Boolean,boolean); break;
115                           case CMPI_char16:   CopyToArray(Char16,char16); break;
116                           case CMPI_real32:   CopyToArray(Real32,real32); break;
117                           case CMPI_real64:   CopyToArray(Real64,real64); break;
118                           default:
119                           if (rc) *rc=CMPI_RC_ERR_NOT_SUPPORTED;
120                        }
121                        return CIMValue(v);
122                     } // end of array processing
123                  
124 schuur      1.11 
125                  
126                     else if (type==CMPI_chars) {
127                        if (data) v.set(String((char*)data));
128                        else return CIMValue(CIMTYPE_STRING,false);
129                     }
130 schuur      1.12    else if (type==CMPI_charsptr) {
131                        if (data && *(char**)data) v.set(String(*(char**)data));
132                        else return CIMValue(CIMTYPE_STRING,false);
133                     }
134 schuur      1.11 
135                     else if (type & CMPI_ENC &&
136                        (data==NULL || data->string==NULL || data->string->hdl==NULL)) {
137                           if (type==CMPI_string)
138                              return CIMValue(CIMTYPE_STRING,false);
139                           if (type==CMPI_dateTime)
140                              return CIMValue(CIMTYPE_DATETIME,false);
141                           if (type==CMPI_ref)
142                              return CIMValue(CIMTYPE_REFERENCE,false);
143                     }
144                  
145 schuur      1.1     else if ((type & (CMPI_UINT|CMPI_SINT))==CMPI_SINT) {
146                        switch (type) {
147                           case CMPI_sint32: v.set((Sint32)data->sint32); break;
148                           case CMPI_sint16: v.set((Sint16)data->sint16); break;
149                           case CMPI_sint8:  v.set((Sint8)data->sint8);   break;
150                           case CMPI_sint64: v.set((Sint64)data->sint64); break;
151                           default: ;
152                        }
153                     }
154                  
155 schuur      1.6     else if (type==CMPI_string) v.set(data->string->hdl ?
156                          String((char*)data->string->hdl) : String::EMPTY);
157 schuur      1.1  
158                     else if ((type & (CMPI_UINT|CMPI_SINT))==CMPI_UINT) {
159                        switch (type) {
160 kumpf       1.18          case CMPI_uint32: v.set((Uint32)data->uint32); break;
161                           case CMPI_uint16: v.set((Uint16)data->uint16); break;
162                           case CMPI_uint8:  v.set((Uint8)data->uint8);   break;
163                           case CMPI_uint64: v.set((Uint64)data->uint64); break;
164 schuur      1.1           default: ;
165                        }
166                     }
167 r.kieninger 1.21    else if (type ==CMPI_instance)
168 konrad.r    1.16 	{
169 a.dunfey    1.20 		v.set(*((CIMObject*) data->inst->hdl));
170 konrad.r    1.16 	}
171 schuur      1.1     else switch (type) {
172                        case CMPI_ref:      v.set(*((CIMObjectPath*)data->ref->hdl)); break;
173                        case CMPI_dateTime: v.set(*((CIMDateTime*)data->dateTime->hdl)); break;
174                        case CMPI_boolean:  v.set((Boolean&)data->boolean); break;
175                        case CMPI_char16:   v.set((Char16)data->char16); break;
176                        case CMPI_real32:   v.set((Real32)data->real32); break;
177                        case CMPI_real64:   v.set((Real64)data->real64); break;
178                        default:
179                        if (rc) *rc=CMPI_RC_ERR_NOT_SUPPORTED;
180                     }
181                     return CIMValue(v);
182                  }
183                  
184                  
185                  
186                  #define CopyFromArray(pt,ct) { Array<pt> ar##pt; \
187                     v.get(ar##pt); \
188                     for (int i=0; i<aSize; i++) aData[i].value.ct=ar##pt[i]; }
189                  
190                  #define CopyFromStringArray(pt,ct) { Array<pt> ar##pt; \
191                     v.get(ar##pt); \
192 schuur      1.1     for (int i=0; i<aSize; i++) { \
193 mreddy      1.22       aData[i].value.ct=reinterpret_cast<CMPIString*>(new CMPI_Object(ar##pt[i])); } }
194 schuur      1.1  
195                  #define CopyFromEncArray(pt,ct,cn) { Array<pt> ar##pt; \
196                     v.get(ar##pt); \
197                     for (int i=0; i<aSize; i++) { \
198 mreddy      1.22      aData[i].value.cn=reinterpret_cast<ct*>(new CMPI_Object(new pt(ar##pt[i]))); } }
199 schuur      1.1  
200                  
201                  CMPIrc value2CMPIData(const CIMValue& v, CMPIType t, CMPIData *data) {
202                  
203                     data->type=t;
204 schuur      1.11    data->state=0;
205                     data->value.uint64=0;
206                  
207                     if (v.isNull()) {
208                        data->state=CMPI_nullValue;
209                        return CMPI_RC_OK;
210                     }
211 schuur      1.1  
212                     if (t & CMPI_ARRAY) {
213                        int aSize=v.getArraySize();
214                        CMPIType aType=t&~CMPI_ARRAY;
215                        CMPIData *aData=new CMPIData[aSize+1];
216                        aData->type=aType;
217                        aData->value.sint32=aSize;
218 schuur      1.11 
219                        for (int i=1; i<aSize+1; i++) {
220                           aData[i].type=aType;
221                           aData[i].state=0;
222                        }
223 schuur      1.1        aData++;
224                  
225 schuur      1.11       if ((aType & (CMPI_UINT|CMPI_SINT))==CMPI_SINT) {
226 schuur      1.1           switch (aType) {
227                              case CMPI_sint32: CopyFromArray(Sint32,sint32); break;
228                              case CMPI_sint16: CopyFromArray(Sint16,sint16); break;
229                              case CMPI_sint8:  CopyFromArray(Sint8,sint8);   break;
230                              case CMPI_sint64: CopyFromArray(Sint64,sint64); break;
231                              default: ;
232                           }
233                        }
234                        else if (aType==CMPI_string) CopyFromStringArray(String,string)
235 schuur      1.11       else if ((aType & (CMPI_UINT|CMPI_SINT))==CMPI_UINT) {
236 schuur      1.1           switch (aType) {
237                              case CMPI_uint32: CopyFromArray(Uint32,uint32); break;
238                              case CMPI_uint16: CopyFromArray(Uint16,uint16); break;
239                              case CMPI_uint8:  CopyFromArray(Uint8,uint8);   break;
240                              case CMPI_uint64: CopyFromArray(Uint64,uint64); break;
241                              default: ;
242                           }
243                        }
244                        else switch (aType) {
245                           case CMPI_ref:      CopyFromEncArray(CIMObjectPath,CMPIObjectPath,ref); break;
246                           case CMPI_dateTime: CopyFromEncArray(CIMDateTime,CMPIDateTime,dateTime); break;
247 marek       1.24 #ifdef PEGASUS_EMBEDDED_INSTANCE_SUPPORT
248                           case CMPI_instance: CopyFromEncArray(CIMInstance,CMPIInstance,inst); break;
249                  #endif
250 schuur      1.1           case CMPI_boolean:  CopyFromArray(Boolean,boolean); break;
251                           case CMPI_char16:   CopyFromArray(Char16,char16); break;
252                           case CMPI_real32:   CopyFromArray(Real32,real32); break;
253                           case CMPI_real64:   CopyFromArray(Real64,real64); break;
254                           default:
255 venkat.puvvada 1.25              // Not supported for this CMPItype
256                                  delete [] aData;
257                                  return CMPI_RC_ERR_NOT_SUPPORTED;
258 schuur         1.1        }
259 mreddy         1.22       data->value.array=reinterpret_cast<CMPIArray*>(new CMPI_Object(aData-1));
260 schuur         1.1     }  // end of array porocessing
261                     
262                        else if ((t & (CMPI_UINT|CMPI_SINT))==CMPI_SINT) {
263                           switch (t) {
264                              case CMPI_sint32: v.get((Sint32&)data->value.sint32); break;
265                              case CMPI_sint16: v.get((Sint16&)data->value.sint16); break;
266                              case CMPI_sint8:  v.get((Sint8&)data->value.sint8);   break;
267                              case CMPI_sint64: v.get((Sint64&)data->value.sint64); break;
268                              default: ;
269                           }
270                        }
271                     
272                        else if (t==CMPI_string) {
273                           String str;
274                           v.get(str);
275                           data->value.string=string2CMPIString(str);
276                        }
277                     
278                        else if ((t & (CMPI_UINT|CMPI_SINT))==CMPI_UINT) {
279                           switch (t) {
280                              case CMPI_uint32: v.get((Uint32&)data->value.uint32); break;
281 schuur         1.1           case CMPI_uint16: v.get((Uint16&)data->value.uint16); break;
282                              case CMPI_uint8:  v.get((Uint8&)data->value.uint8);   break;
283                              case CMPI_uint64: v.get((Uint64&)data->value.uint64); break;
284                              default: ;
285                           }
286                        }
287                     
288                        else switch (t) {
289                        case CMPI_ref: {
290                              CIMObjectPath ref;
291                              v.get(ref);
292 mreddy         1.22          data->value.ref=reinterpret_cast<CMPIObjectPath*>(new CMPI_Object(new CIMObjectPath(ref)));
293 schuur         1.1        }
294                           break;
295 a.dunfey       1.20    case CMPI_instance: {
296                              CIMInstance inst;
297                              if(v.getType() == CIMTYPE_OBJECT)
298                              {
299                                CIMObject tmpObj;
300                                v.get(tmpObj);
301                                inst = CIMInstance(tmpObj);
302                              }
303                              else
304                              {
305                     #ifdef PEGASUS_EMBEDDED_INSTANCE_SUPPORT
306                                  v.get(inst);
307                     #else
308                                  return CMPI_RC_ERR_NOT_SUPPORTED;
309                     #endif // PEGASUS_EMBEDDED_INSTANCE_SUPPORT
310                              }
311 r.kieninger    1.21 
312 mreddy         1.23          data->value.inst=reinterpret_cast<CMPIInstance*>(new CMPI_Object(new CIMInstance(inst)));
313 a.dunfey       1.20       }
314                           break;
315 schuur         1.1     case CMPI_dateTime: {
316                              CIMDateTime dt;
317                              v.get(dt);
318 mreddy         1.22          data->value.dateTime=reinterpret_cast<CMPIDateTime*>(new CMPI_Object(new CIMDateTime(dt)));
319 schuur         1.1        }
320                           break;
321                        case CMPI_boolean:      v.get((Boolean&)data->value.boolean); break;
322                        case CMPI_char16:       v.get((Char16&)data->value.char16); break;
323                        case CMPI_real32:       v.get((Real32&)data->value.real32); break;
324                        case CMPI_real64:       v.get((Real64&)data->value.real64); break;
325                        default:
326                           return CMPI_RC_ERR_NOT_SUPPORTED;
327                        }
328                        return CMPI_RC_OK;
329                     }
330                     
331                     CMPIType type2CMPIType(CIMType pt, int array) {
332                        static CMPIType types[]={
333                             CMPI_boolean,    // BOOLEAN,
334                             CMPI_uint8,      // UINT8,
335                             CMPI_sint8,      // SINT8,
336                             CMPI_uint16,     // UINT16,
337                             CMPI_sint16,     // SINT16,
338                             CMPI_uint32,     // UINT32,
339                             CMPI_sint32,     // SINT32,
340 schuur         1.1          CMPI_uint64,     // UINT64,
341                             CMPI_sint64,     // SINT64,
342                             CMPI_real32,     // REAL32,
343                             CMPI_real64,     // REAL64,
344                             CMPI_char16,     // CHAR16,
345                             CMPI_string,     // STRING,
346                             CMPI_dateTime,   // DATETIME,
347                             CMPI_ref,        // REFERENCE
348 a.dunfey       1.20         CMPI_instance    // Embedded Object
349                     #ifdef PEGASUS_EMBEDDED_INSTANCE_SUPPORT
350                             , CMPI_instance  // Embedded Instance
351                     #endif // PEGASUS_EMBEDDED_INSTANCE_SUPPORT
352 schuur         1.1      };
353                         int t=types[pt];
354                         if (array) t|=CMPI_ARRAY;
355                         return (CMPIType)t;
356                     }
357                     
358 schuur         1.11 CIMType type2CIMType(CMPIType pt) {
359                        switch (pt) {
360                        case CMPI_null:      return (CIMType)0;
361                        case CMPI_boolean:   return CIMTYPE_BOOLEAN;
362                        case CMPI_char16:    return CIMTYPE_CHAR16;
363                     
364                        case CMPI_real32:    return CIMTYPE_REAL32;
365                        case CMPI_real64:    return CIMTYPE_REAL64;
366                     
367                        case CMPI_uint8:     return CIMTYPE_UINT8;
368                        case CMPI_uint16:    return CIMTYPE_UINT16;
369                        case CMPI_uint32:    return CIMTYPE_UINT32;
370                        case CMPI_uint64:    return CIMTYPE_UINT64;
371                     
372                        case CMPI_sint8:     return CIMTYPE_SINT8;
373                        case CMPI_sint16:    return CIMTYPE_SINT16;
374                        case CMPI_sint32:    return CIMTYPE_SINT32;
375                        case CMPI_sint64:    return CIMTYPE_SINT64;
376                     
377                        case CMPI_string:    return CIMTYPE_STRING;
378                        case CMPI_chars:     return CIMTYPE_STRING;
379 schuur         1.11    case CMPI_dateTime:  return CIMTYPE_DATETIME;
380                        case CMPI_ref:       return CIMTYPE_REFERENCE;
381                     
382                        default:             return (CIMType)0;
383                        }
384                      }
385                     
386 schuur         1.2  CMPIrc key2CMPIData(const String& v, CIMKeyBinding::Type t, CMPIData *data) {
387 schuur         1.1     data->state=CMPI_keyValue;
388                        switch (t) {
389 schuur         1.2     case CIMKeyBinding::NUMERIC: {
390 schuur         1.4           CString vp=v.getCString();
391 kv.le          1.13 
392                              data->value.sint64 = 0;
393 r.kieninger    1.21          if (*((const char*)vp)=='-')
394                              {
395                                  sscanf((const char*)vp, "%" PEGASUS_64BIT_CONVERSION_WIDTH "d",
396                                          &data->value.sint64);
397                                  data->type=CMPI_sint64;
398                              }
399                              else
400                              {
401                                  sscanf((const char*)vp, "%" PEGASUS_64BIT_CONVERSION_WIDTH "u",
402                                          &data->value.uint64);
403                                  data->type=CMPI_uint64;
404                              }
405 schuur         1.1        }
406                           break;
407 schuur         1.2     case CIMKeyBinding::STRING:
408 schuur         1.1        data->value.string=string2CMPIString(v);
409                           data->type=CMPI_string;
410                           break;
411 schuur         1.2     case CIMKeyBinding::BOOLEAN:
412 schuur         1.1        data->value.boolean=(String::equalNoCase(v,"true"));
413                           data->type=CMPI_boolean;
414                           break;
415 schuur         1.2     case CIMKeyBinding::REFERENCE:
416 mreddy         1.22       data->value.ref=reinterpret_cast<CMPIObjectPath*>(new CMPI_Object(new CIMObjectPath(v)));
417 schuur         1.1        data->type=CMPI_ref;
418                           break;
419                        default:
420                           return CMPI_RC_ERR_NOT_SUPPORTED;
421                        }
422                        return CMPI_RC_OK;
423                     }
424                     
425                     PEGASUS_NAMESPACE_END
426                     
427                     
428                     
429                     
430                     
431                     

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2