(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 ms.aruran 1.25 #include <Pegasus/Common/Tracer.h>
 37 konrad.r  1.16 #include <string.h>
 38                
 39 schuur    1.1  PEGASUS_USING_STD;
 40                PEGASUS_NAMESPACE_BEGIN
 41                
 42 venkat.puvvada 1.24 extern "C"
 43                     {
 44 schuur         1.9  
 45 venkat.puvvada 1.24     PEGASUS_STATIC CMPIStatus arrayRelease(CMPIArray* eArray)
 46                         {
 47 ms.aruran      1.25         PEG_METHOD_ENTER(
 48                                 TRC_CMPIPROVIDERINTERFACE,
 49                                 "CMPI_Array:arrayRelease()");
 50                     
 51 venkat.puvvada 1.24         CMPIData *dta = (CMPIData*)eArray->hdl;
 52                             if (dta)
 53                             {
 54                                 delete[] dta;
 55                                 reinterpret_cast<CMPI_Object*>(eArray)->unlinkAndDelete();
 56 ms.aruran      1.25             PEG_METHOD_EXIT();
 57 schuur         1.9              CMReturn(CMPI_RC_OK);
 58 venkat.puvvada 1.24         }
 59 ms.aruran      1.25         PEG_METHOD_EXIT();
 60 venkat.puvvada 1.24         CMReturn(CMPI_RC_ERR_INVALID_HANDLE);
 61                         }
 62                     
 63                         PEGASUS_STATIC CMPIArray* arrayClone(
 64                             const CMPIArray* eArray,
 65                             CMPIStatus* rc)
 66                         {
 67 ms.aruran      1.25         PEG_METHOD_ENTER(
 68                                 TRC_CMPIPROVIDERINTERFACE,
 69                                 "CMPI_Array:arrayClone()");
 70 venkat.puvvada 1.24         CMPIData* dta=(CMPIData*)eArray->hdl;
 71                     
 72                             if (!dta)
 73                             {
 74                                 CMSetStatus(rc, CMPI_RC_ERR_INVALID_HANDLE);
 75 ms.aruran      1.25             PEG_METHOD_EXIT();
 76 venkat.puvvada 1.24             return NULL;
 77                             }
 78                             CMPIData* nDta = new CMPIData[dta->value.uint32+1];
 79                             CMPI_Object* obj = new CMPI_Object(nDta);
 80                             obj->unlink();
 81                             CMPIArray* nArray = reinterpret_cast<CMPIArray*>(obj);
 82                             CMPIStatus rrc = {CMPI_RC_OK,NULL};
 83                     
 84                             if (dta->type & CMPI_ENC)
 85                             {
 86                                 for (unsigned int i=1; i<=dta->value.uint32; i++)
 87                                 {
 88                                     nDta[i].state=CMPI_nullValue;
 89                                 }
 90                             }
 91                     
 92                             for (unsigned int i=0; i<=dta->value.uint32; i++)
 93                             {
 94                                 nDta[i]=dta[i];
 95                                 if (i == 0)
 96                                 {
 97 venkat.puvvada 1.24                 continue;
 98                                 }
 99                                 if (dta->type & CMPI_ENC && dta[i].state==CMPI_goodValue)
100                                 {
101                                     if ((dta[i].type == CMPI_instance) && (dta[i].value.inst))
102                                     {
103                                         nDta[i].value.inst =
104                                             (dta[i].value.inst)->ft->clone(dta[i].value.inst,&rrc);
105                                     }
106                                     if ((dta[i].type == CMPI_ref) && (dta[i].value.ref))
107                                     {
108                                         nDta[i].value.ref =
109                                             (dta[i].value.ref)->ft->clone(dta[i].value.ref,&rrc);
110                                     }
111                                     if ((dta[i].type == CMPI_args) && (dta[i].value.args))
112                                     {
113                                         nDta[i].value.args =
114                                             (dta[i].value.args)->ft->clone(dta[i].value.args,&rrc);
115                                     }
116                                     if ((dta[i].type == CMPI_dateTime) && (dta[i].value.dateTime))
117                                     {
118 venkat.puvvada 1.24                     nDta[i].value.dateTime =
119                                             (dta[i].value.dateTime)->ft->clone(
120                                                 dta[i].value.dateTime,
121                                                 &rrc);
122                                     }
123                                     if ((dta[i].type == CMPI_enumeration) && (dta[i].value.Enum))
124                                     {
125                                         nDta[i].value.Enum =
126                                             (dta[i].value.Enum)->ft->clone(dta[i].value.Enum,&rrc);
127                                     }
128                                     if ((dta[i].type == CMPI_filter) && (dta[i].value.filter))
129                                     {
130                                         nDta[i].value.filter =
131                                             (dta[i].value.filter)->ft->clone(
132                                                 dta[i].value.filter,
133                                                 &rrc);
134                                     }
135                                     if ((dta[i].type == CMPI_charsptr) &&
136                                         (dta[i].value.dataPtr.length>0))
137                                     {
138                                         nDta[i].value.dataPtr.length = dta[i].value.dataPtr.length;
139 venkat.puvvada 1.24                     nDta[i].value.dataPtr.ptr =
140                                             malloc(nDta[i].value.dataPtr.length);
141                                         if (nDta[i].value.dataPtr.ptr == NULL)
142                                         {
143                                             arrayRelease(nArray);
144                                             if (rc)
145                                             {
146                                                 *rc=rrc;
147                                             }
148                                             return NULL;
149                                         }
150                                         memcpy(
151                                             nDta[i].value.dataPtr.ptr,
152                                             dta[i].value.dataPtr.ptr,
153                                             dta[i].value.dataPtr.length);
154                                     }
155                     
156                                     if ((dta[i].type == CMPI_string) && (dta[i].value.string))
157                                     {
158                                         nDta[i].value.string =
159                                             (dta[i].value.string)->ft->clone(
160 venkat.puvvada 1.24                             dta[i].value.string,
161                                                 &rrc);
162                                     }
163                                     if (rrc.rc)
164                                     {
165                                         arrayRelease(nArray);
166                                         if (rc)
167                                         {
168                                             *rc=rrc;
169                                         }
170 ms.aruran      1.25                     PEG_METHOD_EXIT();
171 venkat.puvvada 1.24                     return NULL;
172                                     }
173                                 }
174                             }
175                             CMSetStatus(rc,CMPI_RC_OK);
176 ms.aruran      1.25         PEG_METHOD_EXIT();
177 venkat.puvvada 1.24         return nArray;
178                         }
179                     
180                         PEGASUS_STATIC CMPIData arrayGetElementAt(
181                             const CMPIArray* eArray,
182                             CMPICount pos,
183                             CMPIStatus* rc)
184                         {
185                             CMPIData *dta = (CMPIData*)eArray->hdl;
186                             CMPIData data = {0,CMPI_nullValue,{0}};
187                             if (!dta)
188                             {
189                                 CMSetStatus(rc, CMPI_RC_ERR_INVALID_HANDLE);
190                                 return data;
191                             }
192                             CMSetStatus(rc,CMPI_RC_OK);
193                             if (pos < dta->value.uint32)
194                             {
195 ouyang.jian    1.31             if (dta->type == CMPI_chars && dta[pos+1].state == CMPI_goodValue)
196 marek          1.29             {
197                                     data.type = CMPI_chars;
198                                     data.state = CMPI_goodValue;
199 s.kodali       1.30                 data.value.chars = (char*)CMGetCharsPtr(
200                                         dta[pos+1].value.string,
201                                         NULL);
202 marek          1.29                 return data;
203                                 }
204                                 else
205                                 {
206                                     return dta[pos+1];
207                                 }
208 venkat.puvvada 1.24         }
209                             CMSetStatus(rc,CMPI_RC_ERR_NO_SUCH_PROPERTY);
210                             return data;
211                         }
212                     
213                         CMPIStatus arraySetElementAt(
214                             CMPIArray* eArray,
215                             CMPICount pos,
216                             const CMPIValue *val,
217                             CMPIType type)
218                         {
219 ms.aruran      1.25         PEG_METHOD_ENTER(
220                                 TRC_CMPIPROVIDERINTERFACE,
221                                 "CMPI_Array:arraySetElementAt()");
222 venkat.puvvada 1.24         CMPIData *dta = (CMPIData*)eArray->hdl;
223                             if (!dta)
224                             {
225 ms.aruran      1.25             PEG_METHOD_EXIT();
226 venkat.puvvada 1.24             CMReturn(CMPI_RC_ERR_INVALID_HANDLE);
227                             }
228                             if (!val)
229                             {
230 ms.aruran      1.25             PEG_METHOD_EXIT();
231 venkat.puvvada 1.24             CMReturn( CMPI_RC_ERR_INVALID_PARAMETER);
232                             }
233                             if (pos<dta->value.uint32)
234                             {
235                                 if ((dta->type&~CMPI_ARRAY)==type)
236                                 {
237                                     dta[pos+1].state=CMPI_goodValue;
238 kumpf          1.27                 if (type == CMPI_chars)
239                                     {
240 marek          1.29                     // Store char* as CMPIString internally, this frees us from
241                                         // doing explicit memory management for char*.
242                                         dta[pos+1].value.string = reinterpret_cast<CMPIString*>(
243                                             new CMPI_Object((const char*) val));
244                                         dta[pos+1].type = CMPI_string;
245 kumpf          1.27                 }
246                                     else
247                                     {
248                                         dta[pos+1].value = *val;
249                                     }
250 ms.aruran      1.25                 PEG_METHOD_EXIT();
251 venkat.puvvada 1.24                 CMReturn(CMPI_RC_OK);
252                                 }
253                                 else
254                                 {
255                                     char msg[512];
256                                     sprintf(msg,"arraySetElementAt(): CMPI_RC_ERR_TYPE_MISMATCH."
257 kavita.gupta   1.26                     " Is %u - should be %u",
258 kumpf          1.28                     (unsigned int)type, (unsigned int)dta->type);
259 ms.aruran      1.25                 PEG_METHOD_EXIT();
260 venkat.puvvada 1.24                 CMReturnWithString(
261                                         CMPI_RC_ERR_TYPE_MISMATCH,
262                                         reinterpret_cast<CMPIString*>(new CMPI_Object(msg)));
263                                 }
264                             }
265 ms.aruran      1.25         PEG_METHOD_EXIT();
266 venkat.puvvada 1.24         CMReturn(CMPI_RC_ERR_NO_SUCH_PROPERTY);
267                         }
268                     
269                         PEGASUS_STATIC CMPICount arrayGetSize(
270                             const CMPIArray* eArray,
271                             CMPIStatus* rc)
272                         {
273                             CMPIData *dta = (CMPIData*)eArray->hdl;
274                             if (!dta)
275                             {
276                                 CMSetStatus(rc, CMPI_RC_ERR_INVALID_HANDLE);
277                                 return 0;
278                             }
279                             CMSetStatus(rc,CMPI_RC_OK);
280                             return dta->value.uint32;
281                         }
282                     
283                         PEGASUS_STATIC CMPIType arrayGetType(
284                             const CMPIArray* eArray,
285                             CMPIStatus* rc)
286                         {
287 venkat.puvvada 1.24         CMPIData *dta = (CMPIData*)eArray->hdl;
288                             if (!dta)
289                             {
290                                 CMSetStatus(rc, CMPI_RC_ERR_INVALID_HANDLE);
291                                 return CMPI_null;
292                             }
293                             CMSetStatus(rc,CMPI_RC_OK);
294                             return dta->type;
295                         }
296                     }
297 schuur         1.1  
298 venkat.puvvada 1.24 static CMPIArrayFT array_FT =
299                     {
300                         CMPICurrentVersion,
301                         arrayRelease,
302                         arrayClone,
303                         arrayGetSize,
304                         arrayGetType,
305                         arrayGetElementAt,
306                         arraySetElementAt,
307 schuur         1.1  };
308                     
309 venkat.puvvada 1.24 CMPIArrayFT *CMPI_Array_Ftab = &array_FT;
310 schuur         1.1  
311                     PEGASUS_NAMESPACE_END
312                     
313                     
314                     
315                     

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2