(file) Return to CIMResponseData.h CVS log (file) (dir) Up to [Pegasus] / pegasus / src / Pegasus / Common

  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 */

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2