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

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2