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

  1 martin 1.32 //%LICENSE////////////////////////////////////////////////////////////////
  2 martin 1.33 //
  3 martin 1.32 // Licensed to The Open Group (TOG) under one or more contributor license
  4             // agreements.  Refer to the OpenPegasusNOTICE.txt file distributed with
  5             // this work for additional information regarding copyright ownership.
  6             // Each contributor licenses this file to you under the OpenPegasus Open
  7             // Source License; you may not use this file except in compliance with the
  8             // License.
  9 martin 1.33 //
 10 martin 1.32 // Permission is hereby granted, free of charge, to any person obtaining a
 11             // copy of this software and associated documentation files (the "Software"),
 12             // to deal in the Software without restriction, including without limitation
 13             // the rights to use, copy, modify, merge, publish, distribute, sublicense,
 14             // and/or sell copies of the Software, and to permit persons to whom the
 15             // Software is furnished to do so, subject to the following conditions:
 16 martin 1.33 //
 17 martin 1.32 // The above copyright notice and this permission notice shall be included
 18             // in all copies or substantial portions of the Software.
 19 martin 1.33 //
 20 martin 1.32 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
 21 martin 1.33 // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 22 martin 1.32 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
 23             // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
 24             // CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
 25             // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
 26             // SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 27 martin 1.33 //
 28 martin 1.32 //////////////////////////////////////////////////////////////////////////
 29 schuur 1.1  //
 30             //%/////////////////////////////////////////////////////////////////////////////
 31             
 32 schuur 1.4  #include "CMPI_Version.h"
 33 schuur 1.1  
 34             #include "CMPI_Object.h"
 35             #include "CMPI_Ftabs.h"
 36 thilo.boehm 1.33.4.1 #include "CMPI_Array.h"
 37 ms.aruran   1.25     #include <Pegasus/Common/Tracer.h>
 38 konrad.r    1.16     #include <string.h>
 39                      
 40 schuur      1.1      PEGASUS_USING_STD;
 41                      PEGASUS_NAMESPACE_BEGIN
 42                      
 43 venkat.puvvada 1.24     extern "C"
 44                         {
 45 schuur         1.9      
 46 venkat.puvvada 1.24         PEGASUS_STATIC CMPIStatus arrayRelease(CMPIArray* eArray)
 47                             {
 48 ms.aruran      1.25             PEG_METHOD_ENTER(
 49                                     TRC_CMPIPROVIDERINTERFACE,
 50                                     "CMPI_Array:arrayRelease()");
 51 thilo.boehm    1.33.4.1         CMPIStatus rrc = {CMPI_RC_OK,NULL};
 52                                 CMPI_Array *arr = (CMPI_Array*)eArray->hdl;
 53                                 if (!arr)
 54 venkat.puvvada 1.24             {
 55 ms.aruran      1.25                 PEG_METHOD_EXIT();
 56 thilo.boehm    1.33.4.1             CMReturn(CMPI_RC_ERR_INVALID_HANDLE);
 57 venkat.puvvada 1.24             }
 58 thilo.boehm    1.33.4.1         CMPIData* dta=(CMPIData*)arr->hdl;
 59                                 if (!dta)
 60                                 {
 61                                     PEG_METHOD_EXIT();
 62                                     CMReturn(CMPI_RC_ERR_INVALID_HANDLE);
 63                                 }
 64                         
 65 marek          1.33.4.3         if (arr->isCloned != 0)
 66 thilo.boehm    1.33.4.1         {
 67                                     for (unsigned int i=1; i<=dta->value.uint32; i++)
 68                                     {
 69                                         if (dta->type & CMPI_ENC && dta[i].state==CMPI_goodValue)
 70                                         {
 71                                             switch (dta[i].type)
 72                                             {
 73                                                 case CMPI_instance:
 74                                                     if (dta[i].value.inst)
 75                                                     {
 76                                                         rrc = (dta[i].value.inst)->ft->release(
 77                                                             dta[i].value.inst);
 78                                                     }
 79                                                     break;
 80                                                 case CMPI_ref:
 81                                                     if (dta[i].value.ref)
 82                                                     {
 83                                                         rrc = (dta[i].value.ref)->ft->release(
 84                                                             dta[i].value.ref);
 85                                                     }
 86                                                     break;
 87 thilo.boehm    1.33.4.1                         case CMPI_args:
 88                                                     if (dta[i].value.args)
 89                                                     {
 90                                                         rrc = (dta[i].value.args)->ft->release(
 91                                                             dta[i].value.args);
 92                                                     }
 93                                                     break;
 94                                                 case CMPI_dateTime:
 95                                                     if (dta[i].value.dateTime)
 96                                                     {
 97                                                         rrc = (dta[i].value.dateTime)->ft->release(
 98                                                             dta[i].value.dateTime);
 99                                                     }
100                                                     break;
101                                                 case CMPI_enumeration:
102                                                     if (dta[i].value.Enum)
103                                                     {
104                                                         rrc = (dta[i].value.Enum)->ft->release(
105                                                             dta[i].value.Enum);
106                                                     }
107                                                     break;
108 thilo.boehm    1.33.4.1                         case CMPI_filter:
109                                                     if (dta[i].value.filter)
110                                                     {
111                                                         rrc = (dta[i].value.filter)->ft->release(
112                                                             dta[i].value.filter);
113                                                     }
114                                                     break;
115                                                 case CMPI_charsptr:
116                                                     if (dta[i].value.dataPtr.ptr)
117                                                     {
118                                                         free(dta[i].value.dataPtr.ptr);
119                                                     }
120                                                     break;
121                                                 case CMPI_string:
122                                                     if (dta[i].value.string)
123                                                     {
124                                                         rrc = (dta[i].value.string)->ft->release(
125                                                             dta[i].value.string);
126                                                     }
127                                                     break;
128                                             }
129 thilo.boehm    1.33.4.1                 }
130                                     }
131                                 }
132                                 delete[] dta;
133                                 delete arr;
134                                 reinterpret_cast<CMPI_Object*>(eArray)->unlinkAndDelete();
135 ms.aruran      1.25             PEG_METHOD_EXIT();
136 thilo.boehm    1.33.4.1         CMReturn(CMPI_RC_OK);
137 venkat.puvvada 1.24         }
138                         
139                             PEGASUS_STATIC CMPIArray* arrayClone(
140                                 const CMPIArray* eArray,
141                                 CMPIStatus* rc)
142                             {
143 ms.aruran      1.25             PEG_METHOD_ENTER(
144                                     TRC_CMPIPROVIDERINTERFACE,
145                                     "CMPI_Array:arrayClone()");
146 thilo.boehm    1.33.4.1         CMPI_Array *arr = (CMPI_Array*)eArray->hdl;
147                                 if (!arr)
148                                 {
149                                     CMSetStatus(rc, CMPI_RC_ERR_INVALID_HANDLE);
150                                     PEG_METHOD_EXIT();
151                                     return NULL;
152                                 }
153                                 CMPIData* dta=(CMPIData*)arr->hdl;
154 venkat.puvvada 1.24             if (!dta)
155                                 {
156                                     CMSetStatus(rc, CMPI_RC_ERR_INVALID_HANDLE);
157 ms.aruran      1.25                 PEG_METHOD_EXIT();
158 venkat.puvvada 1.24                 return NULL;
159                                 }
160                                 CMPIData* nDta = new CMPIData[dta->value.uint32+1];
161 thilo.boehm    1.33.4.1         CMPI_Array* nArr = new CMPI_Array(nDta, true);
162                                 CMPI_Object* obj = new CMPI_Object(nArr);
163 venkat.puvvada 1.24             obj->unlink();
164                                 CMPIArray* nArray = reinterpret_cast<CMPIArray*>(obj);
165                                 CMPIStatus rrc = {CMPI_RC_OK,NULL};
166                         
167                                 if (dta->type & CMPI_ENC)
168                                 {
169                                     for (unsigned int i=1; i<=dta->value.uint32; i++)
170                                     {
171                                         nDta[i].state=CMPI_nullValue;
172                                     }
173                                 }
174                         
175                                 for (unsigned int i=0; i<=dta->value.uint32; i++)
176                                 {
177                                     nDta[i]=dta[i];
178                                     if (i == 0)
179                                     {
180                                         continue;
181                                     }
182                                     if (dta->type & CMPI_ENC && dta[i].state==CMPI_goodValue)
183                                     {
184 thilo.boehm    1.33.4.1                 switch (dta[i].type)
185 venkat.puvvada 1.24                     {
186 thilo.boehm    1.33.4.1                     case CMPI_instance:
187                                                 if (dta[i].value.inst)
188 venkat.puvvada 1.24                             {
189 thilo.boehm    1.33.4.1                             nDta[i].value.inst =
190                                                         (dta[i].value.inst)->ft->clone(
191                                                             dta[i].value.inst,
192                                                             &rrc);
193 venkat.puvvada 1.24                             }
194 thilo.boehm    1.33.4.1                         break;
195 thilo.boehm    1.33.4.4 
196 thilo.boehm    1.33.4.1                     case CMPI_ref:
197                                                 if (dta[i].value.ref)
198                                                 {
199                                                     nDta[i].value.ref = (dta[i].value.ref)->ft->clone(
200                                                         dta[i].value.ref,
201                                                         &rrc);
202                                                 }
203                                                 break;
204 venkat.puvvada 1.24     
205 thilo.boehm    1.33.4.1                     case CMPI_args:
206                                                 if (dta[i].value.args)
207                                                 {
208                                                     nDta[i].value.args =
209                                                         (dta[i].value.args)->ft->clone(
210                                                             dta[i].value.args,
211                                                             &rrc);
212                                                 }
213                                                 break;
214                         
215                                             case CMPI_dateTime:
216                                                 if (dta[i].value.dateTime)
217                                                 {
218                                                     nDta[i].value.dateTime =
219                                                         (dta[i].value.dateTime)->ft->clone(
220                                                             dta[i].value.dateTime,
221                                                             &rrc);
222                                                 }
223                                                 break;
224                         
225                                             case CMPI_enumeration:
226 thilo.boehm    1.33.4.1                         if (dta[i].value.Enum)
227                                                 {
228                                                     nDta[i].value.Enum =
229                                                         (dta[i].value.Enum)->ft->clone(
230                                                             dta[i].value.Enum,
231                                                             &rrc);
232                                                 }
233                                                 break;
234                         
235                                             case CMPI_filter:
236                                                 if (dta[i].value.filter)
237                                                 {
238                                                     nDta[i].value.filter =
239                                                         (dta[i].value.filter)->ft->clone(
240                                                             dta[i].value.filter,
241                                                             &rrc);
242                                                 }
243                                                 break;
244                         
245                                             case CMPI_charsptr:
246                                                 if (dta[i].value.dataPtr.length>0)
247 thilo.boehm    1.33.4.1                         {
248 thilo.boehm    1.33.4.4                             nDta[i].value.dataPtr.length =
249 thilo.boehm    1.33.4.1                                 dta[i].value.dataPtr.length;
250                                                     nDta[i].value.dataPtr.ptr =
251                                                         malloc(nDta[i].value.dataPtr.length);
252                                                     if (nDta[i].value.dataPtr.ptr == NULL)
253                                                     {
254                                                         arrayRelease(nArray);
255                                                         if (rc)
256                                                         {
257                                                             *rc=rrc;
258                                                         }
259                                                         return NULL;
260                                                     }
261                                                     memcpy(
262                                                         nDta[i].value.dataPtr.ptr,
263                                                         dta[i].value.dataPtr.ptr,
264                                                         dta[i].value.dataPtr.length);
265                                                 }
266                                                 break;
267                         
268                                             case CMPI_string:
269                                                 if (dta[i].value.string)
270 thilo.boehm    1.33.4.1                         {
271                                                     nDta[i].value.string =
272                                                         (dta[i].value.string)->ft->clone(
273                                                             dta[i].value.string,
274                                                             &rrc);
275                                                 }
276                                                 break;
277 venkat.puvvada 1.24                     }
278                                         if (rrc.rc)
279                                         {
280                                             arrayRelease(nArray);
281                                             if (rc)
282                                             {
283                                                 *rc=rrc;
284                                             }
285 ms.aruran      1.25                         PEG_METHOD_EXIT();
286 venkat.puvvada 1.24                         return NULL;
287                                         }
288                                     }
289                                 }
290 thilo.boehm    1.33.4.1 
291 venkat.puvvada 1.24             CMSetStatus(rc,CMPI_RC_OK);
292 ms.aruran      1.25             PEG_METHOD_EXIT();
293 venkat.puvvada 1.24             return nArray;
294                             }
295                         
296                             PEGASUS_STATIC CMPIData arrayGetElementAt(
297                                 const CMPIArray* eArray,
298                                 CMPICount pos,
299                                 CMPIStatus* rc)
300                             {
301                                 CMPIData data = {0,CMPI_nullValue,{0}};
302 thilo.boehm    1.33.4.1         CMPI_Array *arr = (CMPI_Array*)eArray->hdl;
303                                 if (!arr)
304                                 {
305                                     CMSetStatus(rc, CMPI_RC_ERR_INVALID_HANDLE);
306                                     return data;
307                                 }
308                         
309                                 CMPIData *dta = (CMPIData*)arr->hdl;
310 venkat.puvvada 1.24             if (!dta)
311                                 {
312                                     CMSetStatus(rc, CMPI_RC_ERR_INVALID_HANDLE);
313                                     return data;
314                                 }
315                                 CMSetStatus(rc,CMPI_RC_OK);
316                                 if (pos < dta->value.uint32)
317                                 {
318 ouyang.jian    1.31                 if (dta->type == CMPI_chars && dta[pos+1].state == CMPI_goodValue)
319 marek          1.29                 {
320                                         data.type = CMPI_chars;
321                                         data.state = CMPI_goodValue;
322 s.kodali       1.30                     data.value.chars = (char*)CMGetCharsPtr(
323                                             dta[pos+1].value.string,
324                                             NULL);
325 marek          1.29                     return data;
326                                     }
327                                     else
328                                     {
329                                         return dta[pos+1];
330                                     }
331 venkat.puvvada 1.24             }
332                                 CMSetStatus(rc,CMPI_RC_ERR_NO_SUCH_PROPERTY);
333                                 return data;
334                             }
335                         
336                             CMPIStatus arraySetElementAt(
337                                 CMPIArray* eArray,
338                                 CMPICount pos,
339                                 const CMPIValue *val,
340                                 CMPIType type)
341                             {
342 ms.aruran      1.25             PEG_METHOD_ENTER(
343                                     TRC_CMPIPROVIDERINTERFACE,
344                                     "CMPI_Array:arraySetElementAt()");
345 thilo.boehm    1.33.4.1         CMPI_Array *arr = (CMPI_Array*)eArray->hdl;
346                                 if (!arr)
347                                 {
348                                     PEG_METHOD_EXIT();
349                                     CMReturn(CMPI_RC_ERR_INVALID_HANDLE);
350                                 }
351                         
352                                 CMPIData *dta = (CMPIData*)arr->hdl;
353 venkat.puvvada 1.24             if (!dta)
354                                 {
355 ms.aruran      1.25                 PEG_METHOD_EXIT();
356 venkat.puvvada 1.24                 CMReturn(CMPI_RC_ERR_INVALID_HANDLE);
357                                 }
358                                 if (!val)
359                                 {
360 ms.aruran      1.25                 PEG_METHOD_EXIT();
361 venkat.puvvada 1.24                 CMReturn( CMPI_RC_ERR_INVALID_PARAMETER);
362                                 }
363                                 if (pos<dta->value.uint32)
364                                 {
365 thilo.boehm    1.33.4.1             if (type == CMPI_null)
366                                     {
367                                         dta[pos+1].state=CMPI_nullValue;
368                                         PEG_METHOD_EXIT();
369                                         CMReturn(CMPI_RC_OK);
370                                     }
371                                     else if ((dta->type&~CMPI_ARRAY)==type)
372 venkat.puvvada 1.24                 {
373                                         dta[pos+1].state=CMPI_goodValue;
374 kumpf          1.27                     if (type == CMPI_chars)
375                                         {
376 marek          1.29                         // Store char* as CMPIString internally, this frees us from
377                                             // doing explicit memory management for char*.
378                                             dta[pos+1].value.string = reinterpret_cast<CMPIString*>(
379                                                 new CMPI_Object((const char*) val));
380                                             dta[pos+1].type = CMPI_string;
381 kumpf          1.27                     }
382                                         else
383                                         {
384                                             dta[pos+1].value = *val;
385                                         }
386 ms.aruran      1.25                     PEG_METHOD_EXIT();
387 venkat.puvvada 1.24                     CMReturn(CMPI_RC_OK);
388                                     }
389                                     else
390                                     {
391                                         char msg[512];
392                                         sprintf(msg,"arraySetElementAt(): CMPI_RC_ERR_TYPE_MISMATCH."
393 kavita.gupta   1.26                         " Is %u - should be %u",
394 kumpf          1.28                         (unsigned int)type, (unsigned int)dta->type);
395 ms.aruran      1.25                     PEG_METHOD_EXIT();
396 venkat.puvvada 1.24                     CMReturnWithString(
397                                             CMPI_RC_ERR_TYPE_MISMATCH,
398                                             reinterpret_cast<CMPIString*>(new CMPI_Object(msg)));
399                                     }
400                                 }
401 ms.aruran      1.25             PEG_METHOD_EXIT();
402 venkat.puvvada 1.24             CMReturn(CMPI_RC_ERR_NO_SUCH_PROPERTY);
403                             }
404                         
405                             PEGASUS_STATIC CMPICount arrayGetSize(
406                                 const CMPIArray* eArray,
407                                 CMPIStatus* rc)
408                             {
409 thilo.boehm    1.33.4.1         CMPI_Array *arr = (CMPI_Array*)eArray->hdl;
410                                 if (!arr)
411                                 {
412                                     CMSetStatus(rc, CMPI_RC_ERR_INVALID_HANDLE);
413                                     return 0;
414                                 }
415                                 CMPIData *dta = (CMPIData*)arr->hdl;
416 venkat.puvvada 1.24             if (!dta)
417                                 {
418                                     CMSetStatus(rc, CMPI_RC_ERR_INVALID_HANDLE);
419                                     return 0;
420                                 }
421                                 CMSetStatus(rc,CMPI_RC_OK);
422                                 return dta->value.uint32;
423                             }
424                         
425                             PEGASUS_STATIC CMPIType arrayGetType(
426                                 const CMPIArray* eArray,
427                                 CMPIStatus* rc)
428                             {
429 thilo.boehm    1.33.4.1         CMPI_Array *arr = (CMPI_Array*)eArray->hdl;
430                                 if (!arr)
431                                 {
432                                     CMSetStatus(rc, CMPI_RC_ERR_INVALID_HANDLE);
433                                     return 0;
434                                 }
435                                 CMPIData *dta = (CMPIData*)arr->hdl;
436 venkat.puvvada 1.24             if (!dta)
437                                 {
438                                     CMSetStatus(rc, CMPI_RC_ERR_INVALID_HANDLE);
439                                     return CMPI_null;
440                                 }
441                                 CMSetStatus(rc,CMPI_RC_OK);
442                                 return dta->type;
443                             }
444                         }
445 schuur         1.1      
446 venkat.puvvada 1.24     static CMPIArrayFT array_FT =
447                         {
448                             CMPICurrentVersion,
449                             arrayRelease,
450                             arrayClone,
451                             arrayGetSize,
452                             arrayGetType,
453                             arrayGetElementAt,
454                             arraySetElementAt,
455 schuur         1.1      };
456                         
457 venkat.puvvada 1.24     CMPIArrayFT *CMPI_Array_Ftab = &array_FT;
458 schuur         1.1      
459                         PEGASUS_NAMESPACE_END

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2