1 r.kieninger 1.1 //%LICENSE////////////////////////////////////////////////////////////////
2 //
3 // 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 //
10 // 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 //
17 // The above copyright notice and this permission notice shall be included
18 // in all copies or substantial portions of the Software.
19 //
20 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
21 // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22 r.kieninger 1.1 // 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 //
28 //////////////////////////////////////////////////////////////////////////
29 //
|
30 karl 1.6.2.4 // Class CIMResponseData encapsulates the possible types of response data
31 // representations and supplies conversion methods between these types.
32 // PEP#348 - The CMPI infrastructure using SCMO (Single Chunk Memory Objects)
33 // describes its usage in the server flow.
34 // The design document can be found on the OpenPegasus website openpegasus.org
35 // at https://collaboration.opengroup.org/pegasus/pp/documents/21210/PEP_348.pdf
36 //
|
37 r.kieninger 1.1 //%/////////////////////////////////////////////////////////////////////////////
38
|
39 thilo.boehm 1.4 #ifndef Pegasus_CIMResponseData_h
|
40 r.kieninger 1.1 #define Pegasus_CIMResponseData_h
41
42 #include <Pegasus/Common/Config.h>
43 #include <Pegasus/Common/CIMInstance.h>
44 #include <Pegasus/Common/Linkage.h>
45 #include <Pegasus/Common/CIMBuffer.h>
|
46 thilo.boehm 1.4 #include <Pegasus/Common/SCMOClass.h>
47 #include <Pegasus/Common/SCMOInstance.h>
48 #include <Pegasus/Common/SCMODump.h>
|
49 karl 1.6.2.5 #include <Pegasus/Common/Mutex.h> // KS_TODO Remove
|
50 karl 1.6.2.1 #include <Pegasus/Common/Magic.h>
|
51 r.kieninger 1.1
52 PEGASUS_NAMESPACE_BEGIN
|
53 karl 1.6.2.1 PEGASUS_USING_STD;
|
54 karl 1.6.2.3
|
55 r.kieninger 1.1 typedef Array<Sint8> ArraySint8;
56 #define PEGASUS_ARRAY_T ArraySint8
57 # include <Pegasus/Common/ArrayInter.h>
58 #undef PEGASUS_ARRAY_T
59
|
60 karl 1.6.2.4 //// KS_TODO REMOVE THIS _Temp test for size validity DELETE when done
|
61 karl 1.6.2.8 //// With development of pull extensions that use the size() function
|
62 karl 1.6.2.11 #define TEST_SIZE_VALID PEGASUS_ASSERT(sizeValid());
63 ////#define TEST_SIZE_VALID
|
64 karl 1.6.2.4 /*
|
65 karl 1.6.2.11 #define TEST_SIZE_VALID {printf("TEST_SIZE_VALID Error line %u\n",__LINE__); \
|
66 karl 1.6.2.4 PEGASUS_ASSERT(sizeValid());}
|
67 karl 1.6.2.11 #define TEST_SIZE_VALID {if(!sizeValid(){
68 printf("TEST_SIZE_VALID Error line %u\n",__LINE__);
|
69 karl 1.6.2.4 PEGASUS_ASSERT(false);}}
70 */
|
71 thilo.boehm 1.4 class PEGASUS_COMMON_LINKAGE CIMResponseData
|
72 r.kieninger 1.1 {
73 public:
74
|
75 thilo.boehm 1.4 enum ResponseDataEncoding {
76 RESP_ENC_CIM = 1,
77 RESP_ENC_BINARY = 2,
78 RESP_ENC_XML = 4,
79 RESP_ENC_SCMO = 8
80 };
|
81 r.kieninger 1.1
|
82 thilo.boehm 1.4 enum ResponseDataContent {
83 RESP_INSTNAMES = 1,
84 RESP_INSTANCES = 2,
85 RESP_INSTANCE = 3,
86 RESP_OBJECTS = 4,
87 RESP_OBJECTPATHS = 5
88 };
|
89 karl 1.6.2.2 //includeClassOrigin & _includeQualifiers are set to true by default.
90 //_propertyList is initialized to an empty propertylist to enable
|
91 karl 1.6.2.4 // sending all properties by default. _isClassOperation set false and
92 // only reset by selected operations (ex. associator response builder)
|
93 thilo.boehm 1.4 CIMResponseData(ResponseDataContent content):
|
94 karl 1.6.2.4 _encoding(0),_dataType(content),_size(0), _includeQualifiers(true),
95 _includeClassOrigin(true),
96 _isClassOperation(false),
97 _propertyList(CIMPropertyList())
|
98 karl 1.6.2.2 {
|
99 karl 1.6.2.5 /// KS_TODO the following is all test code.
|
100 karl 1.6.2.8 PEGASUS_DEBUG_ASSERT(valid()); // KS_TEMP KS_TODO DELETE THIS
|
101 karl 1.6.2.4 size();
|
102 karl 1.6.2.2 }
|
103 r.kieninger 1.1
|
104 marek 1.5 CIMResponseData(const CIMResponseData & x):
105 _encoding(x._encoding),
|
106 karl 1.6.2.2 _mapObjectsToIntances(x._mapObjectsToIntances),
|
107 marek 1.5 _dataType(x._dataType),
|
108 karl 1.6.2.1 _size(x._size),
|
109 marek 1.5 _referencesData(x._referencesData),
110 _instanceData(x._instanceData),
111 _hostsData(x._hostsData),
112 _nameSpacesData(x._nameSpacesData),
113 _binaryData(x._binaryData),
114 _defaultNamespace(x._defaultNamespace),
115 _defaultHostname(x._defaultHostname),
116 _instanceNames(x._instanceNames),
117 _instances(x._instances),
118 _objects(x._objects),
|
119 karl 1.6.2.2 _scmoInstances(x._scmoInstances),
120 _includeQualifiers(x._includeQualifiers),
121 _includeClassOrigin(x._includeClassOrigin),
|
122 karl 1.6.2.4 _isClassOperation(x._isClassOperation),
|
123 karl 1.6.2.2 _propertyList(x._propertyList),
124 _magic(x._magic)
125 {
|
126 karl 1.6.2.8 PEGASUS_DEBUG_ASSERT(valid()); // KS_TEMP
|
127 karl 1.6.2.2 }
|
128 r.kieninger 1.1
|
129 karl 1.6.2.1 // Construct an empty object. Issue here in that we would like to
130 // assure that this is invalid but if we add the _dataType parameter
131 // it must be a valid one. The alternative would be to define an
132 // invalid enum but that would cost us in all case/if statements.
|
133 karl 1.6.2.2 // Therefore up to the user to create and then use correctly.
134 // KS_TODO fix this so that the empty state is somehow protected.
|
135 karl 1.6.2.1 CIMResponseData():
|
136 karl 1.6.2.2 _encoding(0),_mapObjectsToIntances(false), _size(0),
137 _includeQualifiers(true), _includeClassOrigin(true),
138 _propertyList(CIMPropertyList())
|
139 karl 1.6.2.3 {
|
140 karl 1.6.2.8
141 PEGASUS_DEBUG_ASSERT(valid()); // KS_TEMP
|
142 karl 1.6.2.3 }
|
143 karl 1.6.2.1
144 /**
145 * Move CIM objects from another CIMResponse data object to this
146 * CIMResponseData object. Moves the number of objects defined
147 * in the count parameter from one to another. They are removed
148 * from the from object and inserted into the to object.
149 *
150 * @param CIMResponseData from which the objects are moved
151 * @param count Uint32 count of objects to move
152 * @return - Actual number of objects moved.
153 */
154 Uint32 moveObjects(CIMResponseData & x, Uint32 count);
155
156 /**
157 * Return count of the number of CIM objects in the
158 * CIMResponseData object
159 * @return Uint32 The count of the number of CIM objects
160 * (instances, paths, or objects)in the CIMResponsedata object
161 */
162 Uint32 size();
163
|
164 karl 1.6.2.9 /** Set the internal size variable based on the current count
165 * of what is in the CIMResponseData. This operation
166 * required after users have played with the arrays. See
167 * CQLOperationRequestDispatcher for example */
168
169 void setSize();
170
171 /** Determine if there is any binary content in the CIM
172 ResponseData object
173 @return Boolean true if binary data exists in content.
174 */
175 Boolean hasBinaryData() const;
176
|
177 thilo.boehm 1.4 ~CIMResponseData()
|
178 r.kieninger 1.3 {
179 }
180
|
181 karl 1.6.2.4 // Issue with pull and other operations
|
182 karl 1.6.2.1 // in that the other assoc operations return objects and objectPaths
|
183 karl 1.6.2.4 // and the pulls return instances and instancePaths. The pull operation
|
184 karl 1.6.2.1 // must be able to handle either so we use this to reset the datatype
185 // KS_TODO -- This should check size and only allow if nothing in the
186 // object.
187 Boolean setDataType(ResponseDataContent content)
188 {
|
189 karl 1.6.2.8 PEGASUS_DEBUG_ASSERT(valid());
|
190 karl 1.6.2.2 PEGASUS_ASSERT(_size == 0); // KS_TODO_TEMP or debug mode.
|
191 karl 1.6.2.1 _dataType = content;
192 return true;
193 }
194
195 // get the datatype property
196 ResponseDataContent getResponseDataContent()
197 {
|
198 karl 1.6.2.8 PEGASUS_DEBUG_ASSERT(valid()); // KS_TEMP KS_TODO
|
199 karl 1.6.2.1 return _dataType;
200 }
|
201 thilo.boehm 1.4 // C++ objects interface handling
|
202 r.kieninger 1.1
|
203 thilo.boehm 1.4 // Instance Names handling
204 Array<CIMObjectPath>& getInstanceNames();
|
205 r.kieninger 1.1
|
206 thilo.boehm 1.4 void setInstanceNames(const Array<CIMObjectPath>& x)
|
207 r.kieninger 1.1 {
|
208 karl 1.6.2.6 //// AutoMutex autoMut(testLock);
|
209 thilo.boehm 1.4 _instanceNames=x;
210 _encoding |= RESP_ENC_CIM;
|
211 karl 1.6.2.1 _size += x.size();
|
212 r.kieninger 1.1 }
213
|
214 thilo.boehm 1.4 // Instance handling
215 CIMInstance& getInstance();
|
216 r.kieninger 1.1
|
217 thilo.boehm 1.4 void setInstance(const CIMInstance& x)
|
218 r.kieninger 1.1 {
|
219 karl 1.6.2.6 //// AutoMutex autoMut(testLock);
|
220 karl 1.6.2.11 TEST_SIZE_VALID;
|
221 thilo.boehm 1.4 _instances.clear();
222 _instances.append(x);
|
223 karl 1.6.2.1 _size++;
|
224 thilo.boehm 1.4 _encoding |= RESP_ENC_CIM;
|
225 karl 1.6.2.2
|
226 karl 1.6.2.11 TEST_SIZE_VALID;
|
227 r.kieninger 1.1 }
228
|
229 thilo.boehm 1.4 // Instances handling
230 Array<CIMInstance>& getInstances();
231
|
232 karl 1.6.2.1 // Get an array of CIMInstances from the CIMResponseData converting from
233 // any of the internal forms to the C++ format. This will also convert
234 // CIMObjects to CIMInstances if there are any CIMObjects.
235 // NOTE: This is a temporary solution to satisfy the BinaryCodec passing
236 // of data to the client where the data could be either instances or
237 // objects. The correct solution is to convert back when the provider, etc.
238 // returns the data to the server. We must convert to that solution but
239 // this keeps the BinaryCodec working for the moment.
240 // Expect that this will be used only in CIMCLient.cpp
241 Array<CIMInstance>& getInstancesFromInstancesOrObjects();
242
|
243 thilo.boehm 1.4 void setInstances(const Array<CIMInstance>& x)
|
244 r.kieninger 1.1 {
|
245 karl 1.6.2.6 //// AutoMutex autoMut(testLock);
|
246 karl 1.6.2.11 TEST_SIZE_VALID;
|
247 thilo.boehm 1.4 _instances=x;
248 _encoding |= RESP_ENC_CIM;
|
249 karl 1.6.2.1 _size += x.size();
|
250 karl 1.6.2.11 TEST_SIZE_VALID;
|
251 r.kieninger 1.1 }
|
252 karl 1.6.2.2
|
253 thilo.boehm 1.4 void appendInstance(const CIMInstance& x)
|
254 r.kieninger 1.1 {
|
255 karl 1.6.2.6 //// AutoMutex autoMut(testLock);
|
256 karl 1.6.2.8 PEGASUS_DEBUG_ASSERT(valid());
|
257 thilo.boehm 1.4 _instances.append(x);
258 _encoding |= RESP_ENC_CIM;
|
259 karl 1.6.2.1 _size += 1;
260 }
261
262 void appendInstances(const Array<CIMInstance>& x)
263 {
|
264 karl 1.6.2.6 //// AutoMutex autoMut(testLock);
|
265 karl 1.6.2.8 PEGASUS_DEBUG_ASSERT(valid());
|
266 karl 1.6.2.1 _instances.appendArray(x);
267 _encoding |= RESP_ENC_CIM;
268 _size += x.size();
|
269 r.kieninger 1.1 }
270
|
271 thilo.boehm 1.4 // Objects handling
272 Array<CIMObject>& getObjects();
273 void setObjects(const Array<CIMObject>& x)
|
274 r.kieninger 1.1 {
|
275 karl 1.6.2.6 //// AutoMutex autoMut(testLock);
|
276 karl 1.6.2.8 PEGASUS_DEBUG_ASSERT(valid());
|
277 thilo.boehm 1.4 _objects=x;
278 _encoding |= RESP_ENC_CIM;
|
279 karl 1.6.2.1 _size += x.size();
|
280 r.kieninger 1.1 }
|
281 thilo.boehm 1.4 void appendObject(const CIMObject& x)
|
282 r.kieninger 1.3 {
|
283 karl 1.6.2.6 //// AutoMutex autoMut(testLock);
|
284 karl 1.6.2.8 PEGASUS_DEBUG_ASSERT(valid());
|
285 thilo.boehm 1.4 _objects.append(x);
286 _encoding |= RESP_ENC_CIM;
|
287 karl 1.6.2.1 _size += 1;
|
288 r.kieninger 1.3 }
289
|
290 thilo.boehm 1.4 // SCMO representation, single instance stored as one element array
291 // object paths are represented as SCMOInstance
292 Array<SCMOInstance>& getSCMO();
|
293 r.kieninger 1.1
|
294 thilo.boehm 1.4 void setSCMO(const Array<SCMOInstance>& x);
|
295 r.kieninger 1.1
|
296 thilo.boehm 1.4 void appendSCMO(const Array<SCMOInstance>& x)
|
297 r.kieninger 1.1 {
|
298 karl 1.6.2.6 //// AutoMutex autoMut(testLock);
|
299 karl 1.6.2.8 PEGASUS_DEBUG_ASSERT(valid());
|
300 thilo.boehm 1.4 _scmoInstances.appendArray(x);
301 _encoding |= RESP_ENC_SCMO;
|
302 karl 1.6.2.1 _size += x.size();
|
303 r.kieninger 1.1 }
304
|
305 thilo.boehm 1.4 Array<Uint8>& getBinary();
|
306 karl 1.6
307 // Set the binary stream in the CIMBuffer into the CIMResponseData
308 bool setBinary(CIMBuffer& in);
309
310 // Set any data from the CIMBuffer remaining after the current CIMBuffer
311 // position pointer into the CIMResponseData Object.
312 bool setRemainingBinaryData(CIMBuffer& in);
|
313 r.kieninger 1.1
|
314 thilo.boehm 1.4 // Xml data is unformatted, no need to differentiate between instance
315 // instances and object paths or objects
316 bool setXml(CIMBuffer& in);
|
317 r.kieninger 1.1
|
318 thilo.boehm 1.4 // function used by OperationAggregator to aggregate response data in a
319 // single ResponseData object
320 void appendResponseData(const CIMResponseData & x);
|
321 r.kieninger 1.1
|
322 thilo.boehm 1.4 // Function used by CMPI layer to complete the namespace on all data held
323 // Input (x) has to have a valid namespace
324 void completeNamespace(const SCMOInstance * x);
|
325 r.kieninger 1.1
|
326 thilo.boehm 1.4 // Function primarily used by CIMOperationRequestDispatcher to complete
327 // namespace and hostname on a,an,r and rn operations in the
|
328 karl 1.6.2.9 // OperationAggregator. Note that behavior is different for pull operations
|
329 thilo.boehm 1.4 void completeHostNameAndNamespace(
330 const String & hn,
|
331 karl 1.6.2.9 const CIMNamespaceName & ns,
332 Boolean isPullOperation = false);
|
333 r.kieninger 1.3
|
334 thilo.boehm 1.4 // Encoding responses
|
335 r.kieninger 1.1
|
336 karl 1.6.2.1 // Encode the CIMResponse data into binary format used with Provider Agents
337 // and OP Clients in the provider CIMBuffer
|
338 thilo.boehm 1.4 void encodeBinaryResponse(CIMBuffer& out);
|
339 karl 1.6.2.1
340 // Encode the CIMResponse data into Xml format used with Provider Agents
341 // only in the provided CIMBuffer
|
342 thilo.boehm 1.4 void encodeInternalXmlResponse(CIMBuffer& out);
|
343 karl 1.6.2.1
344 // Encode the CIMResponse data into official Xml format(CIM over Http)
345 // used to communicate to clients in the provided CIMBuffer.
346 //Note that the pull responses requires a flag.
347 void encodeXmlResponse(Buffer& out, Boolean isPull);
348
349 // diagnostic tests magic number in context to see if valid object
|
350 karl 1.6.2.7 Boolean valid() const;
|
351 r.kieninger 1.1
|
352 karl 1.6.2.2 // official Xml format(CIM over Http) used to communicate to clients
353 void encodeXmlResponse(Buffer& out);
|
354 karl 1.6.2.4
355 //This function is called from buildResponce to set CIMResponcedata
|
356 karl 1.6.2.2 //with respective values of IncludeQualifiers,IncludeClassOrigin and
357 //propertyFilter.
358 void setRequestProperties(
359 const Boolean includeQualifiers,
360 const Boolean includeClassOrigin,
361 const CIMPropertyList& propertyList);
362
|
363 karl 1.6.2.4 // Used with association and reference operations (i.e. operations that
364 // return CIMObject or CIMObjectPath to set a parameter to define whether
365 // responseData is for operation on a class or instance.
366 // Allows building the correct path (classPath or instancePath) and
367 // object type (Class or Instance) on response.
368 void setIsClassOperation(Boolean b);
369
|
370 karl 1.6.2.2 void setPropertyList(const CIMPropertyList& propertyList)
371 {
372 _propertyList = propertyList;
373 }
374 CIMPropertyList & getPropertyList()
375 {
376 return _propertyList;
377 }
378
|
379 karl 1.6.2.4 bool sizeValid(); //KS_TEMP KS_TODO REMOVE
|
380 karl 1.6.2.2
|
381 karl 1.6.2.9 void traceResponseData(); // KS_TODO Diagnostic. remove
382
|
383 karl 1.6.2.10 void resolveBinaryToSCMO();
384
|
385 r.kieninger 1.1 private:
386
|
387 thilo.boehm 1.4 // helper functions to transform different formats into one-another
388 // functions work on the internal data and calling of them should be
389 // avoided
390
391 void _resolveToCIM();
392 void _resolveToSCMO();
393
|
394 karl 1.6.2.10 void _resolveBinaryToSCMO();
|
395 thilo.boehm 1.4
396 void _resolveXmlToSCMO();
397 void _resolveXmlToCIM();
398
399 void _resolveSCMOToCIM();
400 void _resolveCIMToSCMO();
401
402 // Helper functions for this class only, do NOT externalize
403 SCMOInstance _getSCMOFromCIMInstance(const CIMInstance& cimInst);
404 SCMOInstance _getSCMOFromCIMObject(const CIMObject& cimObj);
405 SCMOInstance _getSCMOFromCIMObjectPath(const CIMObjectPath& cimPath);
406 SCMOClass* _getSCMOClass(const char* ns,const char* cls);
|
407 karl 1.6.2.4 void _deserializeInstance(Uint32 idx,CIMInstance& cimInstance);
408 void _deserializeObject(Uint32 idx,CIMObject& cimObject);
409 Boolean _deserializeReference(Uint32 idx,CIMObjectPath& cimObjectPath);
410 Boolean _deserializeInstanceName(Uint32 idx,CIMObjectPath& cimObjectPath);
|
411 thilo.boehm 1.4
|
412 karl 1.6.2.9 // Bitflags in this integer reflect what data representation types
|
413 thilo.boehm 1.4 // are currently stored in this CIMResponseData object
414 Uint32 _encoding;
415
|
416 karl 1.6.2.1 // Special flag to handle the case where binary data in passed through the
417 // system but must be mapped to instances in the getInstances. This
418 // accounts for only one case today, binary data in the BinaryCodec
419 Boolean _mapObjectsToIntances;
420
|
421 thilo.boehm 1.4 // Storing type of data in this enumeration
422 ResponseDataContent _dataType;
423
|
424 karl 1.6.2.1 // Count of objects stored in this CIMResponseData object. This is the
425 // accumulated count of objects stored in all of the data
|
426 karl 1.6.2.8 // representations. Note that there are a couple of cases where the
427 // CIMResponseData can be used in a way that makes this not 100% accurate.
|
428 karl 1.6.2.1 Uint32 _size;
429
|
430 thilo.boehm 1.4 // unused arrays are represented by ArrayRepBase _empty_rep
431 // which is a 16 byte large static shared across all of them
432 // so, even though this object looks large, it holds just
433 // 2 integer and 9 pointers
|
434 r.kieninger 1.1
435 // For XML encoding.
436 Array<ArraySint8> _referencesData;
|
437 thilo.boehm 1.4 Array<ArraySint8> _instanceData;
|
438 r.kieninger 1.1 Array<String> _hostsData;
439 Array<CIMNamespaceName> _nameSpacesData;
440
441 // For binary encoding.
442 Array<Uint8> _binaryData;
|
443 thilo.boehm 1.4 CIMNamespaceName _defaultNamespace;
444 String _defaultHostname;
445
446 // Default C++ encoding
447 Array<CIMObjectPath> _instanceNames;
448 Array<CIMInstance> _instances;
449 Array<CIMObject> _objects;
450
451 // SCMO encoding
452 Array<SCMOInstance> _scmoInstances;
|
453 karl 1.6.2.4
454 // Request characteristics that are carried through operation for
455 // modification of response generation.
456 Boolean _includeQualifiers;
|
457 karl 1.6.2.2 Boolean _includeClassOrigin;
|
458 karl 1.6.2.4 // Defines whether response CIMObjects or ObjectPaths are class or instance.
459 // because associators, etc. operations provide both class and instance
460 // responses. Default is false and should only be set to true by
461 // operation requests such as associators (which could return either
462 // instances or classes) when the operation is to return class information.
463 Boolean _isClassOperation;
|
464 karl 1.6.2.2 CIMPropertyList _propertyList;
|
465 r.kieninger 1.1
|
466 karl 1.6.2.8 // Function lock used for debugging cases where there might have been an
467 // issue with multithreading and CIMResponseData.
468 //// KS_TODO remove before pull checkin
|
469 karl 1.6.2.5 Mutex testLock;
470
|
471 karl 1.6.2.1 // magic number to use with valid function to confirm validity
472 // of response data.
473 Magic<0x57D11323> _magic;
|
474 r.kieninger 1.1 };
475
476 PEGASUS_NAMESPACE_END
477
478 #endif /* Pegasus_CIMResponseData_h */
|