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

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

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2