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

  1 marek 1.1.2.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 marek 1.1.2.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               //%/////////////////////////////////////////////////////////////////////////////
 31               
 32               #include <Pegasus/Common/Config.h>
 33               #include <cstdlib>
 34               #include <cstdio>
 35               #include <Pegasus/Common/SCMOXmlWriter.h>
 36               
 37               PEGASUS_NAMESPACE_BEGIN
 38               
 39 marek 1.1.2.2 void SCMOXmlWriter::appendValueSCMOInstanceElement(
 40                   Buffer& out,
 41                   const SCMOInstance& scmoInstance)
 42               {
 43                   out << STRLIT("<VALUE.NAMEDINSTANCE>\n");
 44               
 45                   appendInstanceNameElement(out, scmoInstance);
 46                   appendInstanceElement(out, scmoInstance);
 47               
 48                   out << STRLIT("</VALUE.NAMEDINSTANCE>\n");
 49               }
 50               
 51               void SCMOXmlWriter::appendInstanceNameElement(
 52                   Buffer& out,
 53                   const SCMOInstance& scmoInstance)
 54               {
 55                   out << STRLIT("<INSTANCENAME CLASSNAME=\"");
 56                   Uint64 len;
 57                   const char * className = scmoInstance.getClassName_l(len);
 58                   out.append(className,len-1);
 59                   out << STRLIT("\">\n");
 60 marek 1.1.2.2 
 61                   for (Uint32 i = 0, n = scmoInstance.getKeyBindingCount(); i < n; i++)
 62                   {
 63                       const char * kbName;
 64                       const SCMBUnion * kbValue;
 65                       CIMType kbType;
 66                       Uint32 kbNameLen;
 67               
 68                       scmoInstance._getKeyBindingDataAtNodeIndex(
 69                           i,
 70                           &kbName,
 71                           kbNameLen,
 72                           kbType,
 73                           &kbValue);
 74               
 75                       out << STRLIT("<KEYBINDING NAME=\"");
 76                       out.append(kbName,kbNameLen-1);
 77                       out << STRLIT("\">\n");
 78               
 79                       if (kbType == CIMTYPE_REFERENCE)
 80                       {
 81 marek 1.1.2.2             /*
 82                           TODO: NEED RESOLvE the value down to a SCMO....
 83                           CIMObjectPath ref = keyBindings[i].getValue();
 84                           appendValueReferenceElement(out, ref, true);
 85                           */
 86                       }
 87                       else
 88                       {
 89                           out << STRLIT("<KEYVALUE VALUETYPE=\"");
 90                           out << xmlWriterKeyTypeStrings(kbType);
 91                           out << STRLIT("\">");
 92               
 93                           SCMOXmlWriter::appendSCMBUnion(
 94                               out,
 95                               *kbValue,
 96                               kbType,
 97                               scmoInstance.inst.base);
 98               
 99                           out << STRLIT("</KEYVALUE>\n");
100                       }
101                       out << STRLIT("</KEYBINDING>\n");
102 marek 1.1.2.2     }
103                   out << STRLIT("</INSTANCENAME>\n");
104               }
105               
106               //------------------------------------------------------------------------------
107               //
108               // appendInstanceElement()
109               //
110               //     <!ELEMENT INSTANCE
111               //         (QUALIFIER*,(PROPERTY|PROPERTY.ARRAY|PROPERTY.REFERENCE)*)>
112               //     <!ATTLIST INSTANCE
113               //         %ClassName;>
114               //
115               //------------------------------------------------------------------------------
116               void SCMOXmlWriter::appendInstanceElement(
117                   Buffer& out,
118                   const SCMOInstance& scmoInstance)
119               {
120                   // Class opening element:
121               
122                   out << STRLIT("<INSTANCE CLASSNAME=\"");
123 marek 1.1.2.2     Uint64 len;
124                   const char * className = scmoInstance.getClassName_l(len);
125                   out.append(className,len-1);
126                   out << STRLIT("\" >\n");
127               
128                   // Append Instance Qualifiers:
129                   if (scmoInstance.inst.hdr->flags.includeQualifiers)
130                   {
131                       SCMBClass_Main *classMain=scmoInstance.inst.hdr->theClass->cls.hdr;
132                       char* clsbase = scmoInstance.inst.hdr->theClass->cls.base;
133               
134                       SCMBQualifier *theArray =
135                           (SCMBQualifier*)&(clsbase[classMain->qualifierArray.start]);
136                       // need to iterate
137                       for (Uint32 i=0, n=classMain->numberOfQualifiers;i<n;i++)
138                       {
139                           SCMOXmlWriter::appendQualifierElement(out,theArray[i],clsbase);
140                       }
141                   }
142               
143                   // Append Properties:
144 marek 1.1.2.2     for (Uint32 i=0,k=scmoInstance.inst.hdr->numberProperties;i<k;i++)
145                   {
146                       if (scmoInstance.inst.hdr->flags.isFiltered &&
147                           !scmoInstance._isPropertyInFilter(i))
148                       {
149                           // Property is filtered, ignore and go to next
150                           continue;
151                       }
152                       else
153                       {
154                           SCMOXmlWriter::appendPropertyElement(out,scmoInstance,i);
155                       }
156                   }
157                   // Instance closing element:
158                   out << STRLIT("</INSTANCE>\n");
159               }
160               
161               //------------------------------------------------------------------------------
162               //
163               // appendQualifierElement()
164               //
165 marek 1.1.2.2 //     <!ELEMENT QUALIFIER (VALUE|VALUE.ARRAY)>
166               //     <!ATTLIST QUALIFIER
167               //              %CIMName;
168               //              %CIMType;               #REQUIRED
169               //              %Propagated;
170               //              %QualifierFlavor;>
171               //
172               //------------------------------------------------------------------------------
173               
174               void SCMOXmlWriter::appendQualifierElement(
175                   Buffer& out,
176                   const SCMBQualifier& theQualifier,
177                   const char* base)
178               {
179                   out << STRLIT("<QUALIFIER NAME=\"");
180                   if(theQualifier.name == QUALNAME_USERDEFINED)
181                   {
182                       if (theQualifier.userDefName.start)
183                       {
184                           out.append(
185                               &(base[theQualifier.userDefName.start]),
186 marek 1.1.2.2                 theQualifier.userDefName.length-1);
187                       }
188                   }
189                   else
190                   {
191                       out << SCMOClass::qualifierNameStrLit(theQualifier.name);
192                   }
193               
194                   out << STRLIT("\" ");
195               
196                   // Append type
197                   out << xmlWriterTypeStrings(theQualifier.value.valueType);
198                   // append PROPAGATED if set
199                   if (theQualifier.propagated)
200                   {
201                       out << STRLIT(" PROPAGATED=\"true\"");
202                   }
203                   // append flavor of the qualifier
204                   SCMOXmlWriter::appendQualifierFlavorEntity(
205                       out,
206                       CIMFlavor(theQualifier.flavor));
207 marek 1.1.2.2 
208                   out << STRLIT(">\n");
209                   // append the value of the qualifier
210               
211                   // TODO: Implement and call appendValueElement
212                   //SCMOXmlWriter::appendValueElement(out, theQualifier.value, clsbase);
213               
214                   out << STRLIT("</QUALIFIER>\n");
215               }
216               
217               //------------------------------------------------------------------------------
218               //
219               // appendPropertyElement()
220               //
221               //     <!ELEMENT PROPERTY (QUALIFIER*,VALUE?)>
222               //     <!ATTLIST PROPERTY
223               //              %CIMName;
224               //              %CIMType;           #REQUIRED
225               //              %ClassOrigin;
226               //              %Propagated;>
227               //
228 marek 1.1.2.2 //     <!ELEMENT PROPERTY.ARRAY (QUALIFIER*,VALUE.ARRAY?)>
229               //     <!ATTLIST PROPERTY.ARRAY
230               //              %CIMName;
231               //              %CIMType;           #REQUIRED
232               //              %ArraySize;
233               //              %ClassOrigin;
234               //              %Propagated;>
235               //
236               //     <!ELEMENT PROPERTY.REFERENCE (QUALIFIER*,VALUE.REFERENCE?)>
237               //     <!ATTLIST PROPERTY.REFERENCE
238               //              %CIMName;
239               //              %ReferenceClass;
240               //              %ClassOrigin;
241               //              %Propagated;>
242               //
243               //------------------------------------------------------------------------------
244               
245               void SCMOXmlWriter::appendPropertyElement(
246                   Buffer& out,
247                   const SCMOInstance& scmoInstance,
248                   Uint32 pos)
249 marek 1.1.2.2 {
250                   // Get most of the property data from the instance
251                   const char* propertyName;
252                   Uint32 propertyNameLen;
253                   CIMType propertyType;
254               
255                   // This is an absolute pointer at a SCMBValue
256                   SCMBValue * propertyValue;
257                   const char * propertyValueBase;
258                   // This is an absolute pointer at a SCMBValue
259                   SCMBClassProperty * propertyDef;
260                   // This is the absolute pointer at which the class info for the given
261                   // instance starts
262                   const char* clsbase = scmoInstance.inst.hdr->theClass->cls.base;
263               
264                   SCMO_RC rc = scmoInstance.getPropertyAt(
265                       pos,
266                       &propertyValue,
267                       &propertyValueBase,
268                       &propertyDef);
269               
270 marek 1.1.2.2     propertyType = propertyValue->valueType;
271               
272               
273                   if (propertyValue->flags.isArray)
274                   {
275 marek 1.1.2.3         out << STRLIT("<PROPERTY.ARRAY NAME=\"");
276 marek 1.1.2.2 
277 marek 1.1.2.3         out.append(
278                           &(clsbase[propertyDef->name.start]),
279                           propertyDef->name.length-1);
280               
281                       out << STRLIT("\" ");
282 marek 1.1.2.2         if (propertyType == CIMTYPE_OBJECT)
283                       {
284 marek 1.1.2.3 /*
285 marek 1.1.2.2             // If the property array type is CIMObject, then
286                           //    encode the property in CIM-XML as a string array with the
287                           //    EmbeddedObject attribute (there is not currently a CIM-XML
288                           //    "object" datatype)
289               
290                           Array<CIMObject> a;
291                           rep->getValue().get(a);
292                           out << STRLIT(" TYPE=\"string\"");
293                           // If the Embedded Object is an instance, always add the
294                           // EmbeddedObject attribute.
295                           if (a.size() > 0 && a[0].isInstance())
296                           {
297                               out << STRLIT(" EmbeddedObject=\"object\""
298                                             " EMBEDDEDOBJECT=\"object\"");
299                           }
300               #ifndef PEGASUS_SNIA_INTEROP_COMPATIBILITY
301                           else
302               #endif
303                           {
304                               // Else the Embedded Object is a class, always add the
305                               // EmbeddedObject qualifier.  Note that if the macro
306 marek 1.1.2.2                 // PEGASUS_SNIA_INTEROP_COMPATIBILITY is defined, then
307                               // the EmbeddedObject qualifier will always be added,
308                               // whether it's a class or an instance.
309                               if (rep->findQualifier(PEGASUS_QUALIFIERNAME_EMBEDDEDOBJECT)
310                                  == PEG_NOT_FOUND)
311                               {
312                                   // Note that addQualifiers() cannot be called on a const
313                                   // CIMQualifierRep.In this case we really do want to add
314                                   // the EmbeddedObject qualifier, so we cast away the
315                                   // constness.
316                                   CIMPropertyRep* tmpRep=const_cast<CIMPropertyRep*>(rep);
317                                   tmpRep->addQualifier(
318                                       CIMQualifier(PEGASUS_QUALIFIERNAME_EMBEDDEDOBJECT,
319                                                    true));
320                               }
321                           }
322 marek 1.1.2.3 */            
323 marek 1.1.2.2         }
324                       else if (propertyType == CIMTYPE_INSTANCE)
325                       {
326 marek 1.1.2.3 /*
327 marek 1.1.2.2             // If the property array type is CIMInstance, then
328                           //   encode the property in CIM-XML as a string array with the
329                           //   EmbeddedObject attribute (there is not currently a CIM-XML
330                           //   "instance" datatype)
331               
332                           Array<CIMInstance> a;
333                           rep->getValue().get(a);
334                           out << STRLIT(" TYPE=\"string\"");
335               
336                           // add the EmbeddedObject attribute
337                           if (a.size() > 0)
338                           {
339                               out << STRLIT(" EmbeddedObject=\"instance\""
340                                             " EMBEDDEDOBJECT=\"instance\"");
341               
342                               // Note that if the macro PEGASUS_SNIA_INTEROP_COMPATIBILITY
343                               // is defined, then the EmbeddedInstance qualifier will be
344                               // added
345               # ifdef PEGASUS_SNIA_INTEROP_COMPATIBILITY
346                               if (rep->findQualifier(
347                                       PEGASUS_QUALIFIERNAME_EMBEDDEDINSTANCE ==
348 marek 1.1.2.2                         PEG_NOT_FOUND)
349                               {
350                                   // Note that addQualifiers() cannot be called on a const
351                                   // CIMQualifierRep.In this case we really do want to add
352                                   // the EmbeddedInstance qualifier, so we cast away the
353                                   // constness.
354               
355                                   // For now, we assume that all the embedded instances in
356                                   // the array are of the same type
357                                   CIMPropertyRep* tmpRep=const_cast<CIMPropertyRep*>(rep);
358                                   tmpRep->addQualifier(CIMQualifier(
359                                       PEGASUS_QUALIFIERNAME_EMBEDDEDINSTANCE,
360                                       a[0].getClassName().getString()));
361                               }
362               # endif
363                           }
364 marek 1.1.2.3 */            
365 marek 1.1.2.2         }
366                       else
367 marek 1.1.2.3         {        
368 marek 1.1.2.2             out.append(' ');
369 marek 1.1.2.3             out << xmlWriterTypeStrings(propertyType);
370 marek 1.1.2.2         }
371 marek 1.1.2.3         
372                       Uint32 arraySize=propertyValue->valueArraySize;
373 marek 1.1.2.2 
374 marek 1.1.2.3         if (0 != arraySize)
375 marek 1.1.2.2         {
376 marek 1.1.2.3             out << STRLIT(" ARRAYSIZE=\"");
377                           SCMOXmlWriter::append(out, arraySize);
378 marek 1.1.2.2             out.append('"');
379                       }
380               
381 marek 1.1.2.3 
382                       if (scmoInstance.inst.hdr->flags.includeClassOrigin)
383 marek 1.1.2.2         {
384 marek 1.1.2.3             if (propertyDef->originClassName.start != 0)
385                           {
386                               out << STRLIT(" CLASSORIGIN=\"");
387                               out.append(
388                                   &(clsbase[propertyDef->originClassName.start]),
389                                   propertyDef->originClassName.length-1);
390                               out.append('"');
391                           }
392 marek 1.1.2.2         }
393 marek 1.1.2.3         if (propertyDef->flags.propagated)
394 marek 1.1.2.2         {
395                           out << STRLIT(" PROPAGATED=\"true\"");
396                       }
397               
398                       out << STRLIT(">\n");
399               
400 marek 1.1.2.3         // Append Instance Qualifiers:
401                       if (scmoInstance.inst.hdr->flags.includeQualifiers)
402                       {
403                           SCMBQualifier * theArray=
404                               (SCMBQualifier*)
405                                   &(clsbase[propertyDef->qualifierArray.start]);
406                           // need to iterate
407                           for (Uint32 i=0, n=propertyDef->numberOfQualifiers;i<n;i++)
408                           {
409                               SCMOXmlWriter::appendQualifierElement(
410                                   out,
411                                   theArray[i],
412                                   clsbase);
413                           }
414                       }
415 marek 1.1.2.2 
416 marek 1.1.2.3         SCMOXmlWriter::appendValueElement(out,*propertyValue,propertyValueBase);
417 marek 1.1.2.2 
418                       out << STRLIT("</PROPERTY.ARRAY>\n");
419                   }
420                   else if (propertyType == CIMTYPE_REFERENCE)
421                   {
422               /*
423                       out << STRLIT("<PROPERTY.REFERENCE"
424                                     " NAME=\"") << rep->getName() << STRLIT("\" ");
425               
426                       if (!rep->getReferenceClassName().isNull())
427                       {
428                           out << STRLIT(" REFERENCECLASS=\"")
429                               << rep->getReferenceClassName();
430                           out.append('"');
431                       }
432               
433                       if (!rep->getClassOrigin().isNull())
434                       {
435                           out << STRLIT(" CLASSORIGIN=\"") << rep->getClassOrigin();
436                           out.append('"');
437                       }
438 marek 1.1.2.2 
439                       if (rep->getPropagated())
440                       {
441                           out << STRLIT(" PROPAGATED=\"true\"");
442                       }
443               
444                       out << STRLIT(">\n");
445               
446                       for (Uint32 i = 0, n = rep->getQualifierCount(); i < n; i++)
447                           XmlWriter::appendQualifierElement(out, rep->getQualifier(i));
448               
449                       XmlWriter::appendValueElement(out, rep->getValue());
450               
451                       out << STRLIT("</PROPERTY.REFERENCE>\n");
452               */
453                   }
454                   else
455                   {
456                       out << STRLIT("<PROPERTY NAME=\"");
457               
458                       out.append(
459 marek 1.1.2.2             &(clsbase[propertyDef->name.start]),
460                           propertyDef->name.length-1);
461               
462                       out << STRLIT("\" ");
463               
464                       if (scmoInstance.inst.hdr->flags.includeClassOrigin)
465                       {
466                           if (propertyDef->originClassName.start != 0)
467                           {
468                               out << STRLIT(" CLASSORIGIN=\"");
469                               out.append(
470                                   &(clsbase[propertyDef->originClassName.start]),
471                                   propertyDef->originClassName.length-1);
472                               out.append('"');
473                           }
474                       }
475                       if (propertyDef->flags.propagated)
476                       {
477                           out << STRLIT(" PROPAGATED=\"true\"");
478                       }
479               
480 marek 1.1.2.2         if (propertyType == CIMTYPE_OBJECT)
481                       {
482               /*
483                           // If the property type is CIMObject, then
484                           //   encode the property in CIM-XML as a string with the
485                           //   EmbeddedObject attribute (there is not currently a CIM-XML
486                           //   "object" datatype)
487               
488                           CIMObject a;
489                           rep->getValue().get(a);
490                           out << STRLIT(" TYPE=\"string\"");
491               
492                           // If the Embedded Object is an instance, always add the
493                           // EmbeddedObject attribute.
494                           if (a.isInstance())
495                           {
496                               out << STRLIT(" EmbeddedObject=\"object\""
497                                             " EMBEDDEDOBJECT=\"object\"");
498                           }
499                           // Else the Embedded Object is a class, always add the
500                           // EmbeddedObject qualifier.
501 marek 1.1.2.2 #ifndef PEGASUS_SNIA_INTEROP_COMPATIBILITY
502                           else
503               #endif
504                           {
505                               // Note that if the macro PEGASUS_SNIA_INTEROP_COMPATIBILITY
506                               // is defined, then the EmbeddedObject qualifier will always
507                               // be added, whether it's a class or an instance.
508                               if (rep->findQualifier(PEGASUS_QUALIFIERNAME_EMBEDDEDOBJECT)
509                                   == PEG_NOT_FOUND)
510                               {
511                                   // Note that addQualifiers() cannot be called on a const
512                                   // CIMQualifierRep.  In this case we really do want to
513                                   // add the EmbeddedObject qualifier, so we cast away the
514                                   // constness.
515                                   CIMPropertyRep* tmpRep=const_cast<CIMPropertyRep*>(rep);
516                                   tmpRep->addQualifier(
517                                       CIMQualifier(PEGASUS_QUALIFIERNAME_EMBEDDEDOBJECT,
518                                                    true));
519                               }
520                           }
521               */
522 marek 1.1.2.2             }
523                           else if (propertyType == CIMTYPE_INSTANCE)
524                           {
525               /*
526                               CIMInstance a;
527                               rep->getValue().get(a);
528                               out << STRLIT(" TYPE=\"string\""
529                                             " EmbeddedObject=\"instance\""
530                                             " EMBEDDEDOBJECT=\"instance\"");
531               
532               # ifdef PEGASUS_SNIA_INTEROP_COMPATIBILITY
533                               if (rep->findQualifier(PEGASUS_QUALIFIERNAME_EMBEDDEDOBJECT)
534                                   == PEG_NOT_FOUND)
535                               {
536                                   // Note that addQualifiers() cannot be called on a const
537                                   // CIMQualifierRep.  In this case we really do want to add
538                                   // the EmbeddedInstance qualifier, so we cast away the
539                                   // constness.
540                                   CIMPropertyRep* tmpRep = const_cast<CIMPropertyRep*>(rep);
541                                   tmpRep->addQualifier(CIMQualifier(
542                                       PEGASUS_QUALIFIERNAME_EMBEDDEDINSTANCE,
543 marek 1.1.2.2                         a.getClassName().getString()));
544                               }
545               # endif
546               */
547                       }
548                       else
549                       {
550                           out.append(' ');
551                           out << xmlWriterTypeStrings(propertyType);
552                       }
553                       out << STRLIT(">\n");
554               
555                       // Append Instance Qualifiers:
556                       if (scmoInstance.inst.hdr->flags.includeQualifiers)
557                       {
558                           SCMBQualifier * theArray=
559                               (SCMBQualifier*)
560                                   &(clsbase[propertyDef->qualifierArray.start]);
561                           // need to iterate
562                           for (Uint32 i=0, n=propertyDef->numberOfQualifiers;i<n;i++)
563                           {
564 marek 1.1.2.2                 SCMOXmlWriter::appendQualifierElement(
565                                   out,
566                                   theArray[i],
567                                   clsbase);
568                           }
569                       }
570 marek 1.1.2.3         SCMOXmlWriter::appendValueElement(out,*propertyValue,propertyValueBase);
571 marek 1.1.2.2         out << STRLIT("</PROPERTY>\n");
572                   }
573               }
574               //------------------------------------------------------------------------------
575               //
576               // appendValueElement()
577               //
578               //    <!ELEMENT VALUE (#PCDATA)>
579               //    <!ELEMENT VALUE.ARRAY (VALUE*)>
580               //    <!ELEMENT VALUE.REFERENCE
581               //        (CLASSPATH|LOCALCLASSPATH|CLASSNAME|INSTANCEPATH|LOCALINSTANCEPATH|
582               //         INSTANCENAME)>
583               //    <!ELEMENT VALUE.REFARRAY (VALUE.REFERENCE*)>
584               //
585               //------------------------------------------------------------------------------
586               
587               void SCMOXmlWriter::appendValueElement(
588                   Buffer& out,
589                   SCMBValue & value,
590                   const char * base)
591               {
592 marek 1.1.2.2     if (value.flags.isNull)
593                   {
594                       return;
595                   }
596                   if (value.flags.isArray)
597                   {
598 marek 1.1.2.3         appendSCMBUnionArray(
599                           out,
600                           value.value,
601                           value.valueType,
602                           value.valueArraySize,
603                           base);
604 marek 1.1.2.2     }
605                   else if (value.valueType == CIMTYPE_REFERENCE)
606                   {
607               /*
608                       // Has to be separate because it uses VALUE.REFERENCE tag
609                       CIMObjectPath v;
610                       value.get(v);
611                       _xmlWritter_appendValue(out, v);
612               */
613                   }
614                   else
615                   {
616                       out << STRLIT("<VALUE>");
617               
618                       // Call function to write a SCMBUnion + type field
619                       appendSCMBUnion(out,value.value, value.valueType,base);
620               
621                       out << STRLIT("</VALUE>\n");
622                   }
623               }
624               
625 marek 1.1.2.2 void SCMOXmlWriter::appendSCMBUnion(
626                   Buffer& out,
627                   const SCMBUnion & u,
628                   const CIMType & valueType,
629                   const char * base)
630               {
631                   switch (valueType)
632                   {
633                       case CIMTYPE_BOOLEAN:
634                       {
635                           SCMOXmlWriter::append(out, u.simple.val.bin);
636                           break;
637                       }
638               
639                       case CIMTYPE_UINT8:
640                       {
641                           SCMOXmlWriter::append(out, u.simple.val.u8);
642                           break;
643                       }
644               
645                       case CIMTYPE_SINT8:
646 marek 1.1.2.2         {
647                           SCMOXmlWriter::append(out, u.simple.val.s8);
648                           break;
649                       }
650               
651                       case CIMTYPE_UINT16:
652                       {
653                           SCMOXmlWriter::append(out, u.simple.val.u16);
654                           break;
655                       }
656               
657                       case CIMTYPE_SINT16:
658                       {
659                           SCMOXmlWriter::append(out, u.simple.val.s16);
660                           break;
661                       }
662               
663                       case CIMTYPE_UINT32:
664                       {
665                           SCMOXmlWriter::append(out, u.simple.val.u32);
666                           break;
667 marek 1.1.2.2         }
668               
669                       case CIMTYPE_SINT32:
670                       {
671                           SCMOXmlWriter::append(out, u.simple.val.s32);
672                           break;
673                       }
674               
675                       case CIMTYPE_UINT64:
676                       {
677                           SCMOXmlWriter::append(out, u.simple.val.u64);
678                           break;
679                       }
680               
681                       case CIMTYPE_SINT64:
682                       {
683                           SCMOXmlWriter::append(out, u.simple.val.s64);
684                           break;
685                       }
686               
687                       case CIMTYPE_REAL32:
688 marek 1.1.2.2         {
689                           SCMOXmlWriter::append(out, u.simple.val.r32);
690                           break;
691                       }
692               
693                       case CIMTYPE_REAL64:
694                       {
695                           SCMOXmlWriter::append(out, u.simple.val.r64);
696                           break;
697                       }
698               
699                       case CIMTYPE_CHAR16:
700                       {
701                           SCMOXmlWriter::appendSpecial(
702                               out,
703                               u.simple.val.c16);
704                           break;
705                       }
706               
707                       case CIMTYPE_STRING:
708                       {
709 marek 1.1.2.2             SCMOXmlWriter::appendSpecial(
710                               out,
711                               &(base[u.stringValue.start]),
712                               u.stringValue.length-1);
713                           break;
714                       }
715               
716                       case CIMTYPE_DATETIME:
717                       {
718                           // an SCMBDateTime is a CIMDateTimeRep
719                           // this should help us to reuse existing optimized Datetime
720                           char buffer[26];
721                           _DateTimetoCStr(&(u.dateTimeValue), buffer);
722                           // datetime value is formatted with a \0 at end, ignore
723                           out.append(buffer,sizeof(buffer)-1);
724                           break;
725                       }
726               /*
727                       case CIMTYPE_OBJECT:
728                       {
729                           CIMObject v;
730 marek 1.1.2.2             value.get(v);
731                           _xmlWritter_appendValue(out, v);
732                           break;
733                       }
734                       case CIMTYPE_INSTANCE:
735                       {
736                           CIMInstance v;
737                           value.get(v);
738                           _xmlWritter_appendValue(out, v);
739                           break;
740                       }
741                       default:
742                           PEGASUS_ASSERT(false);
743               */
744                   }
745               }
746               
747 marek 1.1.2.3 void SCMOXmlWriter::appendSCMBUnionArray(
748                   Buffer& out,
749                   const SCMBUnion & u,
750                   const CIMType & valueType,
751                   Uint32 numElements,
752                   const char * base)
753               {
754                   SCMBUnion* arr = (SCMBUnion*) &(base[u.arrayValue.start]);
755                   switch (valueType)
756                   {
757                       case CIMTYPE_BOOLEAN:
758                       {
759                           out << STRLIT("<VALUE.ARRAY>\n");
760                           while (numElements--)
761                           {
762                               out << STRLIT("<VALUE>");
763                               SCMOXmlWriter::append(out, arr->simple.val.bin);
764                               arr++;
765                               out << STRLIT("</VALUE>\n");
766                           }
767                           out << STRLIT("</VALUE.ARRAY>\n");
768 marek 1.1.2.3             break;
769                       }
770                       case CIMTYPE_UINT8:
771                       {
772                           out << STRLIT("<VALUE.ARRAY>\n");
773                           while (numElements--)
774                           {
775                               out << STRLIT("<VALUE>");
776                               SCMOXmlWriter::append(out, arr->simple.val.u8);
777                               arr++;
778                               out << STRLIT("</VALUE>\n");
779                           }
780                           out << STRLIT("</VALUE.ARRAY>\n");
781                           break;
782                       }
783                   
784                       case CIMTYPE_SINT8:
785                       {
786                           out << STRLIT("<VALUE.ARRAY>\n");
787                           while (numElements--)
788                           {
789 marek 1.1.2.3                 out << STRLIT("<VALUE>");
790                               SCMOXmlWriter::append(out, arr->simple.val.s8);
791                               arr++;
792                               out << STRLIT("</VALUE>\n");
793                           }
794                           out << STRLIT("</VALUE.ARRAY>\n");
795                           break;
796                       }
797                   
798                       case CIMTYPE_UINT16:
799                       {
800                           out << STRLIT("<VALUE.ARRAY>\n");
801                           while (numElements--)
802                           {
803                               out << STRLIT("<VALUE>");
804                               SCMOXmlWriter::append(out, arr->simple.val.u16);
805                               arr++;
806                               out << STRLIT("</VALUE>\n");
807                           }
808                           out << STRLIT("</VALUE.ARRAY>\n");
809                           break;
810 marek 1.1.2.3         }
811                   
812                       case CIMTYPE_SINT16:
813                       {
814                           out << STRLIT("<VALUE.ARRAY>\n");
815                           while (numElements--)
816                           {
817                               out << STRLIT("<VALUE>");
818                               SCMOXmlWriter::append(out, arr->simple.val.s16);
819                               arr++;
820                               out << STRLIT("</VALUE>\n");
821                           }
822                           out << STRLIT("</VALUE.ARRAY>\n");
823                           break;
824                       }
825                   
826                       case CIMTYPE_UINT32:
827                       {
828                           out << STRLIT("<VALUE.ARRAY>\n");
829                           while (numElements--)
830                           {
831 marek 1.1.2.3                 out << STRLIT("<VALUE>");
832                               SCMOXmlWriter::append(out, arr->simple.val.u32);
833                               arr++;
834                               out << STRLIT("</VALUE>\n");
835                           }
836                           out << STRLIT("</VALUE.ARRAY>\n");
837                           break;
838                       }
839                   
840                       case CIMTYPE_SINT32:
841                       {
842                           out << STRLIT("<VALUE.ARRAY>\n");
843                           while (numElements--)
844                           {
845                               out << STRLIT("<VALUE>");
846                               SCMOXmlWriter::append(out, arr->simple.val.s32);
847                               arr++;
848                               out << STRLIT("</VALUE>\n");
849                           }
850                           out << STRLIT("</VALUE.ARRAY>\n");
851                           break;
852 marek 1.1.2.3         }
853                   
854                       case CIMTYPE_UINT64:
855                       {
856                           out << STRLIT("<VALUE.ARRAY>\n");
857                           while (numElements--)
858                           {
859                               out << STRLIT("<VALUE>");
860                               SCMOXmlWriter::append(out, arr->simple.val.u64);
861                               arr++;
862                               out << STRLIT("</VALUE>\n");
863                           }
864                           out << STRLIT("</VALUE.ARRAY>\n");
865                           break;
866                       }
867                   
868                       case CIMTYPE_SINT64:
869                       {
870                           out << STRLIT("<VALUE.ARRAY>\n");
871                           while (numElements--)
872                           {
873 marek 1.1.2.3                 out << STRLIT("<VALUE>");
874                               SCMOXmlWriter::append(out, arr->simple.val.s64);
875                               arr++;
876                               out << STRLIT("</VALUE>\n");
877                           }
878                           out << STRLIT("</VALUE.ARRAY>\n");
879                           break;
880                       }
881                   
882                       case CIMTYPE_REAL32:
883                       {
884                           out << STRLIT("<VALUE.ARRAY>\n");
885                           while (numElements--)
886                           {
887                               out << STRLIT("<VALUE>");
888                               SCMOXmlWriter::append(out, arr->simple.val.r32);
889                               arr++;
890                               out << STRLIT("</VALUE>\n");
891                           }
892                           out << STRLIT("</VALUE.ARRAY>\n");
893                           break;
894 marek 1.1.2.3         }
895                   
896                       case CIMTYPE_REAL64:
897                       {
898                           out << STRLIT("<VALUE.ARRAY>\n");
899                           while (numElements--)
900                           {
901                               out << STRLIT("<VALUE>");
902                               SCMOXmlWriter::append(out, arr->simple.val.r64);
903                               arr++;
904                               out << STRLIT("</VALUE>\n");
905                           }
906                           out << STRLIT("</VALUE.ARRAY>\n");
907                           break;
908                       }
909                   
910                       case CIMTYPE_CHAR16:
911                       {
912                           out << STRLIT("<VALUE.ARRAY>\n");
913                           while (numElements--)
914                           {
915 marek 1.1.2.3                 out << STRLIT("<VALUE>");
916                               SCMOXmlWriter::append(out, arr->simple.val.bin);
917                               SCMOXmlWriter::appendSpecial(out, arr->simple.val.c16);
918                               arr++;
919                               out << STRLIT("</VALUE>\n");
920                           }
921                           out << STRLIT("</VALUE.ARRAY>\n");
922                           break;
923                       }
924                   
925                       case CIMTYPE_STRING:
926                       {
927                           out << STRLIT("<VALUE.ARRAY>\n");
928                           while (numElements--)
929                           {
930                               out << STRLIT("<VALUE>");
931                               SCMOXmlWriter::appendSpecial(
932                                   out,
933                                   &(base[arr->stringValue.start]),
934                                   arr->stringValue.length-1);
935                               arr++;
936 marek 1.1.2.3                 out << STRLIT("</VALUE>\n");
937                           }
938                           out << STRLIT("</VALUE.ARRAY>\n");
939                           
940                           break;
941                       }
942                   
943                       case CIMTYPE_DATETIME:
944                       {
945                           out << STRLIT("<VALUE.ARRAY>\n");
946                           char buffer[26];
947                           while (numElements--)
948                           {
949                               out << STRLIT("<VALUE>");
950                               // an SCMBDateTime is a CIMDateTimeRep
951                               // this should help us to reuse existing optimized Datetime
952                               _DateTimetoCStr(&(arr->dateTimeValue), buffer);
953                               // datetime value is formatted with a \0 at end, ignore
954                               out.append(buffer,sizeof(buffer)-1);
955                               arr++;
956                               out << STRLIT("</VALUE>\n");
957 marek 1.1.2.3             }
958                           out << STRLIT("</VALUE.ARRAY>\n");        
959                           break;
960                       }        
961               /*
962                       case CIMTYPE_OBJECT:
963                       {
964                           CIMObject v;
965                           value.get(v);
966                           _xmlWritter_appendValue(out, v);
967                           break;
968                       }
969                       case CIMTYPE_INSTANCE:
970                       {
971                           CIMInstance v;
972                           value.get(v);
973                           _xmlWritter_appendValue(out, v);
974                           break;
975                       }
976                       default:
977                           PEGASUS_ASSERT(false);
978 marek 1.1.2.3 */
979                   }
980               
981               }
982               
983               
984 marek 1.1.2.2 
985 marek 1.1.2.1 PEGASUS_NAMESPACE_END

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2