1 mike 1.1 //BEGIN_LICENSE
2 //
3 // Copyright (c) 2000 The Open Group, BMC Software, Tivoli Systems, IBM
4 //
5 // Permission is hereby granted, free of charge, to any person obtaining a
6 // copy of this software and associated documentation files (the "Software"),
7 // to deal in the Software without restriction, including without limitation
8 // the rights to use, copy, modify, merge, publish, distribute, sublicense,
9 // and/or sell copies of the Software, and to permit persons to whom the
10 // Software is furnished to do so, subject to the following conditions:
11 //
12 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
13 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
14 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
15 // THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
16 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
17 // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
18 // DEALINGS IN THE SOFTWARE.
19 //
20 //END_LICENSE
21 //BEGIN_HISTORY
22 mike 1.1 //
23 // Author:
24 //
|
25 mike 1.2 // $Log: XmlReader.cpp,v $
|
26 karl 1.8 // Revision 1.7 2001/04/13 21:53:47 karl
27 // add get and set property
28 //
|
29 karl 1.7 // Revision 1.6 2001/04/08 01:13:22 mike
30 // Changed "ConstCIM" to "CIMConst"
31 //
|
32 mike 1.5 // Revision 1.4 2001/02/26 04:33:28 mike
33 // Fixed many places where cim names were be compared with operator==(String,String).
34 // Changed all of these to use CIMName::equal()
35 //
|
36 mike 1.4 // Revision 1.3 2001/02/19 01:47:16 mike
|
37 mike 1.6 // Renamed names of the form CIMConst to CIMConst.
|
38 mike 1.4 //
|
39 mike 1.3 // Revision 1.2 2001/02/16 02:06:07 mike
40 // Renamed many classes and headers.
41 //
|
42 mike 1.2 // Revision 1.1.1.1 2001/01/14 19:53:32 mike
43 // Pegasus import
44 //
|
45 mike 1.1 //
46 //END_HISTORY
47
48 #include <cassert>
49 #include <cctype>
50 #include <cstdio>
51 #include <cstdlib>
|
52 mike 1.2 #include "CIMName.h"
|
53 mike 1.1 #include "XmlReader.h"
54 #include "XmlWriter.h"
|
55 mike 1.2 #include "CIMQualifier.h"
56 #include "CIMQualifierDecl.h"
57 #include "CIMClass.h"
58 #include "CIMInstance.h"
|
59 mike 1.1
60 PEGASUS_NAMESPACE_BEGIN
|
61 karl 1.8 //debug
62 #include <iostream>
63 using namespace std;
|
64 mike 1.1
65 static const Uint32 MESSAGE_SIZE = 128;
66
67 //------------------------------------------------------------------------------
68 //
69 // expectXmlDeclaration()
70 //
71 //------------------------------------------------------------------------------
72
73 void XmlReader::expectXmlDeclaration(
74 XmlParser& parser,
75 XmlEntry& entry)
76 {
77 if (!parser.next(entry) ||
78 entry.type != XmlEntry::XML_DECLARATION ||
79 strcmp(entry.text, "xml") != 0)
80 {
81 throw XmlValidationError(parser.getLine(),
82 "Expected <?xml ... ?> style declaration");
83 }
84 }
85 mike 1.1
86 //------------------------------------------------------------------------------
87 //
88 // expectStartTag()
89 //
90 //------------------------------------------------------------------------------
91
92 void XmlReader::expectStartTag(
93 XmlParser& parser,
94 XmlEntry& entry,
95 const char* tagName)
96 {
97 if (!parser.next(entry) ||
98 entry.type != XmlEntry::START_TAG ||
99 strcmp(entry.text, tagName) != 0)
100 {
101 char message[MESSAGE_SIZE];
102 sprintf(message, "Expected open of %s element", tagName);
103 throw XmlValidationError(parser.getLine(), message);
104 }
105 }
106 mike 1.1
107 //------------------------------------------------------------------------------
108 //
109 // expectEndTag()
110 //
111 //------------------------------------------------------------------------------
112
113 void XmlReader::expectEndTag(XmlParser& parser, const char* tagName)
114 {
115 XmlEntry entry;
116
117 if (!parser.next(entry) ||
118 entry.type != XmlEntry::END_TAG ||
119 strcmp(entry.text, tagName) != 0)
120 {
121 char message[MESSAGE_SIZE];
122 sprintf(message, "Expected close of %s element", tagName);
123 throw XmlValidationError(parser.getLine(), message);
124 }
125 }
126
127 mike 1.1 //------------------------------------------------------------------------------
128 //
129 // expectStartTagOrEmptyTag()
130 //
131 //------------------------------------------------------------------------------
132
133 void XmlReader::expectStartTagOrEmptyTag(
134 XmlParser& parser,
135 XmlEntry& entry,
136 const char* tagName)
137 {
138 if (!parser.next(entry) ||
139 (entry.type != XmlEntry::START_TAG &&
140 entry.type != XmlEntry::EMPTY_TAG) ||
141 strcmp(entry.text, tagName) != 0)
142 {
143 char message[MESSAGE_SIZE];
144 sprintf(message,
145 "Expected either open or open/close %s element", tagName);
146 throw XmlValidationError(parser.getLine(), message);
147 }
148 mike 1.1 }
149
150 //------------------------------------------------------------------------------
151 //
152 // expectContentOrCData()
153 //
154 //------------------------------------------------------------------------------
155
156 Boolean XmlReader::expectContentOrCData(
157 XmlParser& parser,
158 XmlEntry& entry)
159 {
160 if (!parser.next(entry) ||
161 (entry.type != XmlEntry::CONTENT &&
162 entry.type != XmlEntry::CDATA))
163 {
164 throw XmlValidationError(parser.getLine(),
165 "Expected content of CDATA");
166 }
167
168 return true;
169 mike 1.1 }
170
171 //------------------------------------------------------------------------------
172 //
173 // testStartTag()
174 //
175 //------------------------------------------------------------------------------
176
177 Boolean XmlReader::testStartTag(
178 XmlParser& parser,
179 XmlEntry& entry,
180 const char* tagName)
181 {
182 if (!parser.next(entry) ||
183 entry.type != XmlEntry::START_TAG ||
184 strcmp(entry.text, tagName) != 0)
185 {
186 parser.putBack(entry);
187 return false;
188 }
189
190 mike 1.1 return true;
191 }
192
193 //------------------------------------------------------------------------------
194 //
195 // testEndTag>()
196 //
197 //------------------------------------------------------------------------------
198
199 Boolean XmlReader::testEndTag(XmlParser& parser, const char* tagName)
200 {
201 XmlEntry entry;
202
203 if (!parser.next(entry) ||
204 entry.type != XmlEntry::END_TAG ||
205 strcmp(entry.text, tagName) != 0)
206 {
207 parser.putBack(entry);
208 return false;
209 }
210
211 mike 1.1 return true;
212 }
213
214 //------------------------------------------------------------------------------
215 //
216 // testStartTagOrEmptyTag()
217 //
218 //------------------------------------------------------------------------------
219
220 Boolean XmlReader::testStartTagOrEmptyTag(
221 XmlParser& parser,
222 XmlEntry& entry,
223 const char* tagName)
224 {
225 if (!parser.next(entry) ||
226 (entry.type != XmlEntry::START_TAG &&
227 entry.type != XmlEntry::EMPTY_TAG) ||
228 strcmp(entry.text, tagName) != 0)
229 {
230 parser.putBack(entry);
231 return false;
232 mike 1.1 }
233
234 return true;
235 }
236
237 //------------------------------------------------------------------------------
238 //
239 // testContentOrCData()
240 //
241 //------------------------------------------------------------------------------
242
243 Boolean XmlReader::testContentOrCData(
244 XmlParser& parser,
245 XmlEntry& entry)
246 {
247 if (!parser.next(entry) ||
248 (entry.type != XmlEntry::CONTENT &&
249 entry.type != XmlEntry::CDATA))
250 {
251 parser.putBack(entry);
252 return false;
253 mike 1.1 }
254
255 return true;
256 }
257
258 //------------------------------------------------------------------------------
259 //
260 // testCimStartTag()
261 //
262 // <!ELEMENT CIM (MESSAGE|DECLARATION)>
263 // <!ATTRLIST CIM
264 // CIMVERSION CDATA #REQUIRED
265 // DTDVERSION CDATA #REQUIRED>
266 //
267 //------------------------------------------------------------------------------
268
269 void XmlReader::testCimStartTag(XmlParser& parser)
270 {
271 XmlEntry entry;
272 XmlReader::expectStartTag(parser, entry, "CIM");
273
274 mike 1.1 const char* cimVersion;
275
276 if (!entry.getAttributeValue("CIMVERSION", cimVersion))
277 throw XmlValidationError(
278 parser.getLine(), "missing CIM.CIMVERSION attribute");
279
280 if (strcmp(cimVersion, "2.0") != 0)
281 throw XmlValidationError(parser.getLine(),
282 "CIM.CIMVERSION attribute must be \"2.0\"");
283
284 const char* dtdVersion;
285
286 if (!entry.getAttributeValue("DTDVERSION", dtdVersion))
287 throw XmlValidationError(
288 parser.getLine(), "missing CIM.DTDVERSION attribute");
289
290 if (strcmp(dtdVersion, "2.0") != 0)
291 throw XmlValidationError(parser.getLine(),
292 "CIM.DTDVERSION attribute must be \"2.0\"");
293 }
294
295 mike 1.1 //------------------------------------------------------------------------------
296 //
297 // getIsArrayAttribute()
298 //
299 //------------------------------------------------------------------------------
300
301 Boolean XmlReader::getIsArrayAttribute(
302 Uint32 lineNumber,
303 const XmlEntry& entry,
304 const char* tagName,
305 Boolean& value)
306 {
307 const char* tmp;
308
309 if (!entry.getAttributeValue("ISARRAY", tmp))
310 return false;
311
312 if (strcmp(tmp, "true") == 0)
313 {
314 value = true;
315 return true;
316 mike 1.1 }
317 else if (strcmp(tmp, "false") == 0)
318 {
319 value = false;
320 return true;
321 }
322
323 char buffer[62];
324 sprintf(buffer, "Bad %s.%s attribute value", "ISARRAY", tagName);
325 throw XmlSemanticError(lineNumber, buffer);
326 return false;
327 }
328
329 //------------------------------------------------------------------------------
330 //
331 // getCimNameAttribute()
332 //
333 // <!ENTITY % CIMName "NAME CDATA #REQUIRED">
334 //
335 //------------------------------------------------------------------------------
336
337 mike 1.1 String XmlReader::getCimNameAttribute(
338 Uint32 lineNumber,
339 const XmlEntry& entry,
340 const char* elementName,
341 Boolean acceptNull)
342 {
343 String name;
344
345 if (!entry.getAttributeValue("NAME", name))
346 {
347 char buffer[MESSAGE_SIZE];
348 sprintf(buffer, "missing %s.NAME attribute", elementName);
349 throw XmlValidationError(lineNumber, buffer);
350 }
351
352 if (acceptNull && name.getLength() == 0)
353 return name;
354
|
355 mike 1.2 if (!CIMName::legal(name))
|
356 mike 1.1 {
357 char buffer[MESSAGE_SIZE];
358 sprintf(buffer, "Illegal value for %s.NAME attribute", elementName);
359 throw XmlSemanticError(lineNumber, buffer);
360 }
361
362 return name;
363 }
364
365 //------------------------------------------------------------------------------
366 //
367 // getClassNameAttribute()
368 //
369 // <!ENTITY % CIMName "CLASSNAME CDATA #REQUIRED">
370 //
371 //------------------------------------------------------------------------------
372
373 String XmlReader::getClassNameAttribute(
374 Uint32 lineNumber,
375 const XmlEntry& entry,
376 const char* elementName)
377 mike 1.1 {
378 String name;
379
380 if (!entry.getAttributeValue("CLASSNAME", name))
381 {
382 char buffer[MESSAGE_SIZE];
383 sprintf(buffer, "missing %s.CLASSNAME attribute", elementName);
384 throw XmlValidationError(lineNumber, buffer);
385 }
386
|
387 mike 1.2 if (!CIMName::legal(name))
|
388 mike 1.1 {
389 char buffer[MESSAGE_SIZE];
390 sprintf(buffer,
391 "Illegal value for %s.CLASSNAME attribute", elementName);
392 throw XmlSemanticError(lineNumber, buffer);
393 }
394
395 return name;
396 }
397
398 //------------------------------------------------------------------------------
399 //
400 // getClassOriginAttribute()
401 //
402 // <!ENTITY % ClassOrigin "CLASSORIGIN CDATA #IMPLIED">
403 //
404 //------------------------------------------------------------------------------
405
406 String XmlReader::getClassOriginAttribute(
407 Uint32 lineNumber,
408 const XmlEntry& entry,
409 mike 1.1 const char* tagName)
410 {
411 String name;
412
413 if (!entry.getAttributeValue("CLASSORIGIN", name))
414 return String();
415
|
416 mike 1.2 if (!CIMName::legal(name))
|
417 mike 1.1 {
418 char buffer[MESSAGE_SIZE];
419 sprintf(buffer,
420 "Illegal value for %s.CLASSORIGIN attribute", tagName);
421 throw XmlSemanticError(lineNumber, buffer);
422 }
423
424 return name;
425 }
426
427 //------------------------------------------------------------------------------
428 //
429 // getReferenceClassAttribute()
430 //
431 // <!ENTITY % ReferenceClass "REFERENCECLASS CDATA #IMPLIED">
432 //
433 //------------------------------------------------------------------------------
434
435 String XmlReader::getReferenceClassAttribute(
436 Uint32 lineNumber,
437 const XmlEntry& entry,
438 mike 1.1 const char* elementName)
439 {
440 String name;
441
442 if (!entry.getAttributeValue("REFERENCECLASS", name))
443 return String();
444
|
445 mike 1.2 if (!CIMName::legal(name))
|
446 mike 1.1 {
447 char buffer[MESSAGE_SIZE];
448 sprintf(buffer,
449 "Illegal value for %s.REFERENCECLASS attribute", elementName);
450 throw XmlSemanticError(lineNumber, buffer);
451 }
452
453 return name;
454 }
455
456 //------------------------------------------------------------------------------
457 //
458 // getSuperClassAttribute()
459 //
460 // <!ENTITY % SuperClass "SUPERCLASS CDATA #IMPLIED">
461 //
462 //------------------------------------------------------------------------------
463
464 String XmlReader::getSuperClassAttribute(
465 Uint32 lineNumber,
466 const XmlEntry& entry,
467 mike 1.1 const char* tagName)
468 {
469 String superClass;
470
471 if (!entry.getAttributeValue("SUPERCLASS", superClass))
472 return String();
473
|
474 mike 1.2 if (!CIMName::legal(superClass))
|
475 mike 1.1 {
476 char buffer[MESSAGE_SIZE];
477 sprintf(
478 buffer, "Illegal value for %s.SUPERCLASS attribute", tagName);
479 throw XmlSemanticError(lineNumber, buffer);
480 }
481
482 return superClass;
483 }
484
485 //------------------------------------------------------------------------------
486 //
487 // getCimTypeAttribute()
488 //
489 // <!ENTITY % CIMType "TYPE (boolean|string|char16|uint8|sint8|uint16
490 // |sint16|uint32|sint32|uint64|sint64|datetime|real32|real64)">
491 //
492 //------------------------------------------------------------------------------
493
|
494 mike 1.2 CIMType XmlReader::getCimTypeAttribute(
|
495 mike 1.1 Uint32 lineNumber,
496 const XmlEntry& entry,
497 const char* tagName)
498 {
499 const char* typeName;
500
501 if (!entry.getAttributeValue("TYPE", typeName))
502 {
503 char message[MESSAGE_SIZE];
504 sprintf(message, "missing %s.TYPE attribute", tagName);
505 throw XmlValidationError(lineNumber, message);
506 }
507
|
508 mike 1.2 CIMType type = CIMType::NONE;
|
509 mike 1.1
510 if (strcmp(typeName, "boolean") == 0)
|
511 mike 1.2 type = CIMType::BOOLEAN;
|
512 mike 1.1 else if (strcmp(typeName, "string") == 0)
|
513 mike 1.2 type = CIMType::STRING;
|
514 mike 1.1 else if (strcmp(typeName, "char16") == 0)
|
515 mike 1.2 type = CIMType::CHAR16;
|
516 mike 1.1 else if (strcmp(typeName, "uint8") == 0)
|
517 mike 1.2 type = CIMType::UINT8;
|
518 mike 1.1 else if (strcmp(typeName, "sint8") == 0)
|
519 mike 1.2 type = CIMType::SINT8;
|
520 mike 1.1 else if (strcmp(typeName, "uint16") == 0)
|
521 mike 1.2 type = CIMType::UINT16;
|
522 mike 1.1 else if (strcmp(typeName, "sint16") == 0)
|
523 mike 1.2 type = CIMType::SINT16;
|
524 mike 1.1 else if (strcmp(typeName, "uint32") == 0)
|
525 mike 1.2 type = CIMType::UINT32;
|
526 mike 1.1 else if (strcmp(typeName, "sint32") == 0)
|
527 mike 1.2 type = CIMType::SINT32;
|
528 mike 1.1 else if (strcmp(typeName, "uint64") == 0)
|
529 mike 1.2 type = CIMType::UINT64;
|
530 mike 1.1 else if (strcmp(typeName, "sint64") == 0)
|
531 mike 1.2 type = CIMType::SINT64;
|
532 mike 1.1 else if (strcmp(typeName, "datetime") == 0)
|
533 mike 1.2 type = CIMType::DATETIME;
|
534 mike 1.1 else if (strcmp(typeName, "real32") == 0)
|
535 mike 1.2 type = CIMType::REAL32;
|
536 mike 1.1 else if (strcmp(typeName, "real64") == 0)
|
537 mike 1.2 type = CIMType::REAL64;
|
538 mike 1.1 else if (strcmp(typeName, "reference") == 0)
|
539 mike 1.2 type = CIMType::REFERENCE;
|
540 mike 1.1
541 // ATTN: "reference" is not legal according to the DTD; however, it is
542 // used by the XML version of the CIM schema.
543
|
544 mike 1.2 if (type == CIMType::NONE)
|
545 mike 1.1 {
546 char message[MESSAGE_SIZE];
547 sprintf(message, "Illegal value for %s.TYPE attribute", tagName);
548 throw XmlSemanticError(lineNumber, message);
549 }
550
551 return type;
552 }
553
554 //------------------------------------------------------------------------------
555 //
556 // getCimBooleanAttribute()
557 //
558 //------------------------------------------------------------------------------
559
560 Boolean XmlReader::getCimBooleanAttribute(
561 Uint32 lineNumber,
562 const XmlEntry& entry,
563 const char* tagName,
564 const char* attributeName,
565 Boolean defaultValue,
566 mike 1.1 Boolean required)
567 {
568 const char* tmp;
569
570 if (!entry.getAttributeValue(attributeName, tmp))
571 {
572 if (!required)
573 return defaultValue;
574
575 char buffer[62];
576 sprintf(buffer, "missing required %s.%s attribute",
577 attributeName, tagName);
578
579 throw XmlValidationError(lineNumber, buffer);
580 }
581
582 if (strcmp(tmp, "true") == 0)
583 return true;
584 else if (strcmp(tmp, "false") == 0)
585 return false;
586
587 mike 1.1 char buffer[62];
588 sprintf(buffer, "Bad %s.%s attribute value", attributeName, tagName);
589 throw XmlSemanticError(lineNumber, buffer);
590 return false;
591 }
592
593 //------------------------------------------------------------------------------
594 //
595 // SringToReal()
596 //
597 // [ "+" | "-" ] *decimalDigit "." 1*decimalDigit
598 // [ ( "e" | "E" ) [ "+" | "-" ] 1*decimalDigit ]
599 //
600 //------------------------------------------------------------------------------
601
602 Boolean XmlReader::stringToReal(const char* stringValue, Real64& x)
603 {
604 const char* p = stringValue;
605
606 if (!*p)
607 return false;
608 mike 1.1
609 // Skip optional sign:
610
611 if (*p == '+' || *p == '-')
612 p++;
613
614 // Skip optional first set of digits:
615
616 while (isdigit(*p))
617 p++;
618
619 // Test required dot:
620
621 if (*p++ != '.')
622 return false;
623
624 // One or more digits required:
625
626 if (!isdigit(*p++))
627 return false;
628
629 mike 1.1 while (isdigit(*p))
630 p++;
631
632 // If there is an exponent now:
633
634 if (*p)
635 {
636 // Test exponent:
637
638 if (*p != 'e' && *p != 'E')
639 return false;
640
641 p++;
642
643 // Skip optional sign:
644
645 if (*p == '+' || *p == '-')
646 p++;
647
648 // One or more digits required:
649
650 mike 1.1 if (!isdigit(*p++))
651 return false;
652
653 while (isdigit(*p))
654 p++;
655 }
656
657 if (*p)
658 return false;
659
660 char* end;
661 x = strtod(stringValue, &end);
662 return true;
663 }
664
665 //------------------------------------------------------------------------------
666 //
667 // stringToSignedInteger
668 //
669 // [ "+" | "-" ] ( positiveDecimalDigit *decimalDigit | "0" )
670 //
671 mike 1.1 // ATTN-B: handle conversion from hexadecimal.
672 //------------------------------------------------------------------------------
673
674 Boolean XmlReader::stringToSignedInteger(
675 const char* stringValue,
676 Sint64& x)
677 {
678 x = 0;
679 const char* p = stringValue;
680
681 if (!*p)
682 return false;
683
684 // Skip optional sign:
685
686 Boolean negative = *p == '-';
687
688 if (negative || *p == '+')
689 p++;
690
691 // If the next thing is a zero, then it must be the last:
692 mike 1.1
693 if (*p == '0')
694 return p[1] == '\0';
695
696 // Expect a positive decimal digit:
697
698 const char* first = p;
699
700 if (!isdigit(*p) || *p == '0')
701 return false;
702
703 p++;
704
705 // Expect zero or more digits:
706
707 while (isdigit(*p))
708 p++;
709
710 if (*p)
711 return false;
712
713 mike 1.1 const char* last = p;
714
715 while (first != last)
716 x = 10 * x + (*first++ - '0');
717
718 if (negative)
719 x = -x;
720
721 return true;
722 }
723
724 //------------------------------------------------------------------------------
725 //
726 // stringToUnsignedInteger
727 //
728 // [ "+" | "-" ] ( positiveDecimalDigit *decimalDigit | "0" )
729 //
730 // ATTN-B: handle conversion from hexadecimal.
731 //------------------------------------------------------------------------------
732
733 Boolean XmlReader::stringToUnsignedInteger(
734 mike 1.1 const char* stringValue,
735 Uint64& x)
736 {
737 x = 0;
738 const char* p = stringValue;
739
740 if (!*p)
741 return false;
742
743 // Skip optional sign:
744
745 if (*p == '-')
746 return false;
747
748 if (*p == '+')
749 p++;
750
751 // If the next thing is a zero, then it must be the last:
752
753 if (*p == '0')
754 return p[1] == '\0';
755 mike 1.1
756 // Expect a positive decimal digit:
757
758 const char* first = p;
759
760 if (!isdigit(*p) || *p == '0')
761 return false;
762
763 p++;
764
765 // Expect zero or more digits:
766
767 while (isdigit(*p))
768 p++;
769
770 if (*p)
771 return false;
772
773 const char* last = p;
774
775 while (first != last)
776 mike 1.1 x = 10 * x + (*first++ - '0');
777
778 return true;
779 }
780
781 //------------------------------------------------------------------------------
782 //
783 // stringToValue()
784 //
785 // ATTN-C: note that integers are truncated without warning. What should be
786 // done in this case? In C they are truncated without warning by design.
787 //
788 //------------------------------------------------------------------------------
789
|
790 mike 1.2 CIMValue XmlReader::stringToValue(
|
791 mike 1.1 Uint32 lineNumber,
792 const char* valueString,
|
793 mike 1.2 CIMType type)
|
794 mike 1.1 {
795 // ATTN-B: accepting only UTF-8 for now! (affects string and char16):
796
797 switch (type)
798 {
|
799 mike 1.2 case CIMType::BOOLEAN:
|
800 mike 1.1 {
801 if (strcmp(valueString, "TRUE") == 0)
|
802 mike 1.2 return CIMValue(true);
|
803 mike 1.1 else if (strcmp(valueString, "FALSE") == 0)
|
804 mike 1.2 return CIMValue(false);
|
805 mike 1.1 else
806 throw XmlSemanticError(
807 lineNumber, "Bad boolean value");
808 }
809
|
810 mike 1.2 case CIMType::STRING:
|
811 mike 1.1 {
|
812 mike 1.2 return CIMValue(valueString);
|
813 mike 1.1 }
814
|
815 mike 1.2 case CIMType::CHAR16:
|
816 mike 1.1 {
817 if (strlen(valueString) != 1)
818 throw XmlSemanticError(lineNumber, "Bad char16 value");
819
|
820 mike 1.2 return CIMValue(Char16(valueString[0]));
|
821 mike 1.1 }
822
|
823 mike 1.2 case CIMType::UINT8:
824 case CIMType::UINT16:
825 case CIMType::UINT32:
826 case CIMType::UINT64:
|
827 mike 1.1 {
828 Uint64 x;
829
830 if (!stringToUnsignedInteger(valueString, x))
831 {
832 throw XmlSemanticError(
833 lineNumber, "Bad unsigned integer value");
834 }
835
836 switch (type)
837 {
|
838 mike 1.2 case CIMType::UINT8: return CIMValue(Uint8(x));
839 case CIMType::UINT16: return CIMValue(Uint16(x));
840 case CIMType::UINT32: return CIMValue(Uint32(x));
841 case CIMType::UINT64: return CIMValue(Uint64(x));
|
842 mike 1.1 default: break;
843 }
844 }
845
|
846 mike 1.2 case CIMType::SINT8:
847 case CIMType::SINT16:
848 case CIMType::SINT32:
849 case CIMType::SINT64:
|
850 mike 1.1 {
851 Sint64 x;
852
853 if (!stringToSignedInteger(valueString, x))
854 {
855 throw XmlSemanticError(
856 lineNumber, "Bad signed integer value");
857 }
858
859 switch (type)
860 {
|
861 mike 1.2 case CIMType::SINT8: return CIMValue(Sint8(x));
862 case CIMType::SINT16: return CIMValue(Sint16(x));
863 case CIMType::SINT32: return CIMValue(Sint32(x));
864 case CIMType::SINT64: return CIMValue(Sint64(x));
|
865 mike 1.1 default: break;
866 }
867 }
868
|
869 mike 1.2 case CIMType::DATETIME:
|
870 mike 1.1 {
|
871 mike 1.2 CIMDateTime tmp;
|
872 mike 1.1
873 try
874 {
875 tmp.set(valueString);
876 }
877 catch (BadDateTimeFormat&)
878 {
879 throw XmlSemanticError(lineNumber, "Bad datetime value");
880 }
881
|
882 mike 1.2 return CIMValue(tmp);
|
883 mike 1.1 }
884
|
885 mike 1.2 case CIMType::REAL32:
|
886 mike 1.1 {
887 Real64 x;
888
889 if (!stringToReal(valueString, x))
890 throw XmlSemanticError(lineNumber, "Bad real value");
891
|
892 mike 1.2 return CIMValue(Real32(x));
|
893 mike 1.1 }
894
|
895 mike 1.2 case CIMType::REAL64:
|
896 mike 1.1 {
897 Real64 x;
898
899 if (!stringToReal(valueString, x))
900 throw XmlSemanticError(lineNumber, "Bad real value");
901
|
902 mike 1.2 return CIMValue(x);
|
903 mike 1.1 }
904
905 default:
906 break;
907 }
908
909 throw XmlSemanticError(lineNumber, "malformed XML");
910 return false;
911 }
912
913 //------------------------------------------------------------------------------
914 //
915 // getValueElement()
916 //
917 // <!ELEMENT VALUE (#PCDATA)>
918 //
919 //------------------------------------------------------------------------------
920
921 Boolean XmlReader::getValueElement(
922 XmlParser& parser,
|
923 mike 1.2 CIMType type,
924 CIMValue& value)
|
925 mike 1.1 {
926 // Get VALUE start tag:
927
928 XmlEntry entry;
929 if (!testStartTagOrEmptyTag(parser, entry, "VALUE"))
930 return false;
931
932 Boolean empty = entry.type == XmlEntry::EMPTY_TAG;
933
934 // Get VALUE content:
935
936 const char* valueString = "";
|
937 karl 1.8 // cout << "DEBUG XMLReader:getValueElement " << __LINE__ ;
|
938 mike 1.1
939 if (!empty)
940 {
941 if (testContentOrCData(parser, entry))
942 valueString = entry.text;
|
943 karl 1.8 //cout << "DEBUG XMLReader:getValueElement " << __LINE__
944 // << " valueString " << valueString ;
|
945 mike 1.1
946 expectEndTag(parser, "VALUE");
947 }
948
949 value = stringToValue(parser.getLine(), valueString,type);
|
950 karl 1.8 //cout << "DEBUG XMLReader:getValueElement " << __LINE__
951 // << " value " << value;
|
952 mike 1.1 return true;
|
953 karl 1.7 }
954
|
955 karl 1.8
|
956 karl 1.7 //----------------------------------------------------------------------------
957 //
958 // getPropertyValue
|
959 karl 1.8 // Use: Decode property value from getPropertyResponse
|
960 karl 1.7 // Expect (ERROR|IRETURNVALUE).!ELEMENT VALUE (#PCDATA)>
961 //
962 // PropertyValue:
963 // <!ELEMENT VALUE>
964 //
965 // <!ELEMENT VALUE.ARRAY (VALUE*)>
966 //
967 // <!ELEMENT VALUE.REFERENCE (CLASSPATH|LOCALCLASSPATH|CLASSNAME|
968 // INSTANCEPATH|LOCALINSTANCEPATH|INSTANCENAME)>
969 //
970 //----------------------------------------------------------------------------
971 Boolean XmlReader::getPropertyValue(
972 XmlParser& parser,
973 CIMValue& cimValue)
974 {
975 //Test for Element value type
976 CIMType type = CIMType::STRING;
|
977 karl 1.8
|
978 karl 1.7 if (XmlReader::getValueElement(parser, type, cimValue))
|
979 karl 1.8 {
980 //cout << "DEBUG xmlReader::getPropertyValue " << __LINE__
981 // << " CimValue = " << cimValue.toString << endl;
|
982 karl 1.7 return true;
|
983 karl 1.8 }
|
984 karl 1.7
985 //Test for Element.array value
986 if(XmlReader::getValueArrayElement(parser, type, cimValue))
987 return true;
988
989 // Test for Value.reference type
990 // ATTN:This returns a different type (CIMReference)
991 // ATTN: Possibly change to simply return result after
992 // we figure out the type differences.
993
994 CIMReference reference;
995 if(XmlReader::getValueReferenceElement(parser, reference))
996 return true;
997
998 return false;
|
999 mike 1.1 }
1000
1001 //------------------------------------------------------------------------------
1002 //
1003 // stringArrayToValue()
1004 //
1005 //------------------------------------------------------------------------------
1006
1007 template<class T>
|
1008 mike 1.2 CIMValue StringArrayToValueAux(
|
1009 mike 1.1 Uint32 lineNumber,
1010 const Array<const char*>& stringArray,
|
1011 mike 1.2 CIMType type,
|
1012 mike 1.1 T*)
1013 {
1014 Array<T> array;
1015
1016 for (Uint32 i = 0, n = stringArray.getSize(); i < n; i++)
1017 {
|
1018 mike 1.2 CIMValue value = XmlReader::stringToValue(
|
1019 mike 1.1 lineNumber, stringArray[i], type);
1020
1021 T x;
1022 value.get(x);
1023 array.append(x);
1024 }
1025
|
1026 mike 1.2 return CIMValue(array);
|
1027 mike 1.1 }
1028
|
1029 mike 1.2 CIMValue XmlReader::stringArrayToValue(
|
1030 mike 1.1 Uint32 lineNumber,
1031 const Array<const char*>& array,
|
1032 mike 1.2 CIMType type)
|
1033 mike 1.1 {
1034 switch (type)
1035 {
|
1036 mike 1.2 case CIMType::BOOLEAN:
|
1037 mike 1.1 return StringArrayToValueAux(lineNumber, array, type, (Boolean*)0);
1038
|
1039 mike 1.2 case CIMType::STRING:
|
1040 mike 1.1 return StringArrayToValueAux(lineNumber, array, type, (String*)0);
1041
|
1042 mike 1.2 case CIMType::CHAR16:
|
1043 mike 1.1 return StringArrayToValueAux(lineNumber, array, type, (Char16*)0);
1044
|
1045 mike 1.2 case CIMType::UINT8:
|
1046 mike 1.1 return StringArrayToValueAux(lineNumber, array, type, (Uint8*)0);
1047
|
1048 mike 1.2 case CIMType::UINT16:
|
1049 mike 1.1 return StringArrayToValueAux(lineNumber, array, type, (Uint16*)0);
1050
|
1051 mike 1.2 case CIMType::UINT32:
|
1052 mike 1.1 return StringArrayToValueAux(lineNumber, array, type, (Uint32*)0);
1053
|
1054 mike 1.2 case CIMType::UINT64:
|
1055 mike 1.1 return StringArrayToValueAux(lineNumber, array, type, (Uint64*)0);
1056
|
1057 mike 1.2 case CIMType::SINT8:
|
1058 mike 1.1 return StringArrayToValueAux(lineNumber, array, type, (Sint8*)0);
1059
|
1060 mike 1.2 case CIMType::SINT16:
|
1061 mike 1.1 return StringArrayToValueAux(lineNumber, array, type, (Sint16*)0);
1062
|
1063 mike 1.2 case CIMType::SINT32:
|
1064 mike 1.1 return StringArrayToValueAux(lineNumber, array, type, (Sint32*)0);
1065
|
1066 mike 1.2 case CIMType::SINT64:
|
1067 mike 1.1 return StringArrayToValueAux(lineNumber, array, type, (Sint64*)0);
1068
|
1069 mike 1.2 case CIMType::DATETIME:
1070 return StringArrayToValueAux(lineNumber, array, type, (CIMDateTime*)0);
|
1071 mike 1.1
|
1072 mike 1.2 case CIMType::REAL32:
|
1073 mike 1.1 return StringArrayToValueAux(lineNumber, array, type, (Real32*)0);
1074
|
1075 mike 1.2 case CIMType::REAL64:
|
1076 mike 1.1 return StringArrayToValueAux(lineNumber, array, type, (Real64*)0);
1077
1078 default:
1079 break;
1080 }
1081
1082 // Unreachable:
|
1083 mike 1.2 return CIMValue();
|
1084 mike 1.1 }
1085
1086 //------------------------------------------------------------------------------
1087 //
1088 // getValueArrayElement()
1089 //
1090 // <!ELEMENT VALUE.ARRAY (VALUE*)>
1091 //
1092 //------------------------------------------------------------------------------
1093
1094 Boolean XmlReader::getValueArrayElement(
1095 XmlParser& parser,
|
1096 mike 1.2 CIMType type,
1097 CIMValue& value)
|
1098 mike 1.1 {
1099 value.clear();
1100
1101 // Get VALUE.ARRAY open tag:
1102
1103 XmlEntry entry;
1104
1105 if (!testStartTagOrEmptyTag(parser, entry, "VALUE.ARRAY"))
1106 return false;
1107
1108 if (entry.type == XmlEntry::EMPTY_TAG)
1109 return true;
1110
1111 // For each VALUE element:
1112
1113 Array<const char*> stringArray;
1114
1115 while (testStartTagOrEmptyTag(parser, entry, "VALUE"))
1116 {
1117 if (entry.type == XmlEntry::EMPTY_TAG)
1118 {
1119 mike 1.1 stringArray.append("");
1120 continue;
1121 }
1122
1123 if (testContentOrCData(parser, entry))
1124 stringArray.append(entry.text);
1125 else
1126 stringArray.append("");
1127
1128 expectEndTag(parser, "VALUE");
1129 }
1130
1131 expectEndTag(parser, "VALUE.ARRAY");
1132
1133 value = stringArrayToValue(parser.getLine(), stringArray, type);
1134 return true;
1135 }
1136
1137 //------------------------------------------------------------------------------
1138 //
1139 // getFlavor()
1140 mike 1.1 //
1141 // <!ENTITY % QualifierFlavor
1142 // "OVERRIDABLE (true|false) 'true'
1143 // TOSUBCLASS (true|false) 'true'
1144 // TOINSTANCE (true|false) 'false'
1145 // TRANSLATABLE (true|false) 'false'">
1146 //
1147 //------------------------------------------------------------------------------
1148
1149 Uint32 XmlReader::getFlavor(
1150 XmlEntry& entry,
1151 Uint32 lineNumber,
1152 const char* tagName)
1153 {
1154 // Get QUALIFIER.OVERRIDABLE
1155
1156 Boolean overridable = getCimBooleanAttribute(
1157 lineNumber, entry, tagName, "OVERRIDABLE", true, false);
1158
1159 // Get QUALIFIER.TOSUBCLASS
1160
1161 mike 1.1 Boolean toSubClass = getCimBooleanAttribute(
1162 lineNumber, entry, tagName, "TOSUBCLASS", true, false);
1163
1164 // Get QUALIFIER.TOINSTANCE
1165
1166 Boolean toInstance = getCimBooleanAttribute(
1167 lineNumber, entry, tagName, "TOINSTANCE", false, false);
1168
1169 // Get QUALIFIER.TRANSLATABLE
1170
1171 Boolean translatable = getCimBooleanAttribute(
1172 lineNumber, entry, tagName, "TRANSLATABLE", false, false);
1173
1174 Uint32 flavor = 0;
1175
1176 if (overridable)
|
1177 mike 1.2 flavor |= CIMFlavor::OVERRIDABLE;
|
1178 mike 1.1
1179 if (toSubClass)
|
1180 mike 1.2 flavor |= CIMFlavor::TOSUBCLASS;
|
1181 mike 1.1
1182 if (toInstance)
|
1183 mike 1.2 flavor |= CIMFlavor::TOINSTANCE;
|
1184 mike 1.1
1185 if (translatable)
|
1186 mike 1.2 flavor |= CIMFlavor::TRANSLATABLE;
|
1187 mike 1.1
1188 return flavor;
1189 }
1190
1191 //------------------------------------------------------------------------------
1192 //
1193 // getOptionalScope()
1194 //
1195 // DTD:
1196 // <!ELEMENT SCOPE EMPTY>
1197 // <!ATTLIST SCOPE
1198 // CLASS (true|false) 'false'
1199 // ASSOCIATION (true|false) 'false'
1200 // REFERENCE (true|false) 'false'
1201 // PROPERTY (true|false) 'false'
1202 // METHOD (true|false) 'false'
1203 // PARAMETER (true|false) 'false'
1204 // INDICATION (true|false) 'false'>
1205 //
1206 //------------------------------------------------------------------------------
1207
1208 mike 1.1 Uint32 XmlReader::getOptionalScope(XmlParser& parser)
1209 {
1210 XmlEntry entry;
1211
1212 if (!parser.next(entry))
1213 return false;
1214
1215 Boolean isEmptyTag = entry.type == XmlEntry::EMPTY_TAG;
1216
1217 if ((!isEmptyTag &&
1218 entry.type != XmlEntry::START_TAG) ||
1219 strcmp(entry.text, "SCOPE") != 0)
1220 {
1221 parser.putBack(entry);
1222 return 0;
1223 }
1224
1225 Uint32 line = parser.getLine();
1226 Uint32 scope = 0;
1227
1228 if (getCimBooleanAttribute(line, entry, "SCOPE", "CLASS", false, false))
|
1229 mike 1.2 scope |= CIMScope::CLASS;
|
1230 mike 1.1
1231 if (getCimBooleanAttribute(
1232 line, entry, "SCOPE", "ASSOCIATION", false, false))
|
1233 mike 1.2 scope |= CIMScope::ASSOCIATION;
|
1234 mike 1.1
1235 if (getCimBooleanAttribute(
1236 line, entry, "SCOPE", "REFERENCE", false, false))
|
1237 mike 1.2 scope |= CIMScope::REFERENCE;
|
1238 mike 1.1
1239 if (getCimBooleanAttribute(line, entry, "SCOPE", "PROPERTY", false, false))
|
1240 mike 1.2 scope |= CIMScope::PROPERTY;
|
1241 mike 1.1
1242 if (getCimBooleanAttribute(line, entry, "SCOPE", "METHOD", false, false))
|
1243 mike 1.2 scope |= CIMScope::METHOD;
|
1244 mike 1.1
1245 if (getCimBooleanAttribute(line, entry, "SCOPE", "PARAMETER", false, false))
|
1246 mike 1.2 scope |= CIMScope::PARAMETER;
|
1247 mike 1.1
1248 if (getCimBooleanAttribute(line, entry, "SCOPE", "INDICATION",false, false))
|
1249 mike 1.2 scope |= CIMScope::INDICATION;
|
1250 mike 1.1
1251 if (!isEmptyTag)
1252 expectEndTag(parser, "SCOPE");
1253
1254 return scope;
1255 }
1256
1257 //------------------------------------------------------------------------------
1258 //
1259 // getQualifierElement()
1260 //
1261 // <!ELEMENT QUALIFIER (VALUE|VALUE.ARRAY)>
1262 // <!ATTLIST QUALIFIER
1263 // %CIMName;
1264 // %CIMType; #REQUIRED
1265 // %Propagated;
1266 // %QualifierFlavor;>
1267 //
1268 //------------------------------------------------------------------------------
1269
1270 Boolean XmlReader::getQualifierElement(
1271 mike 1.1 XmlParser& parser,
|
1272 mike 1.2 CIMQualifier& qualifier)
|
1273 mike 1.1 {
1274 // Get QUALIFIER element:
1275
1276 XmlEntry entry;
1277 if (!testStartTag(parser, entry, "QUALIFIER"))
1278 return false;
1279
1280 // Get QUALIFIER.NAME attribute:
1281
1282 String name = getCimNameAttribute(parser.getLine(), entry, "QUALIFIER");
1283
1284 // Get QUALIFIER.TYPE attribute:
1285
|
1286 mike 1.2 CIMType type = getCimTypeAttribute(parser.getLine(), entry, "QUALIFIER");
|
1287 mike 1.1
1288 // Get QUALIFIER.PROPAGATED
1289
1290 Boolean propagated = getCimBooleanAttribute(
1291 parser.getLine(), entry, "QUALIFIER", "PROPAGATED", false, false);
1292
1293 // Get flavor oriented attributes:
1294
1295 Uint32 flavor = getFlavor(entry, parser.getLine(), "QUALIFIER");
1296
1297 // Get VALUE or VALUE.ARRAY element:
1298
|
1299 mike 1.2 CIMValue value;
|
1300 mike 1.1
1301 if (!getValueElement(parser, type, value) &&
1302 !getValueArrayElement(parser, type, value))
1303 {
1304 throw XmlSemanticError(parser.getLine(),
1305 "Expected VALUE or VALUE.ARRAY element");
1306 }
1307
1308 // Expect </QUALIFIER>:
1309
1310 expectEndTag(parser, "QUALIFIER");
1311
1312 // Build qualifier:
1313
|
1314 mike 1.2 qualifier = CIMQualifier(name, value, flavor, propagated);
|
1315 mike 1.1 return true;
1316 }
1317
1318 //------------------------------------------------------------------------------
1319 //
1320 // getQualifierElements()
1321 //
1322 //------------------------------------------------------------------------------
1323
1324 template<class CONTAINER>
1325 void getQualifierElements(XmlParser& parser, CONTAINER& container)
1326 {
|
1327 mike 1.2 CIMQualifier qualifier;
|
1328 mike 1.1
1329 while (XmlReader::getQualifierElement(parser, qualifier))
1330 {
1331 try
1332 {
1333 container.addQualifier(qualifier);
1334 }
1335 catch (AlreadyExists&)
1336 {
1337 throw XmlSemanticError(parser.getLine(), "duplicate qualifier");
1338 }
1339 }
1340 }
1341
1342 //------------------------------------------------------------------------------
1343 //
1344 // getPropertyElement()
1345 //
1346 // <!ELEMENT PROPERTY (QUALIFIER*,VALUE?)>
1347 // <!ATTLIST PROPERTY
1348 // %CIMName;
1349 mike 1.1 // %ClassOrigin;
1350 // %Propagated;
1351 // %CIMType; #REQUIRED>
1352 //
1353 //------------------------------------------------------------------------------
1354
|
1355 mike 1.2 Boolean XmlReader::getPropertyElement(XmlParser& parser, CIMProperty& property)
|
1356 mike 1.1 {
1357 XmlEntry entry;
1358
1359 if (!testStartTagOrEmptyTag(parser, entry, "PROPERTY"))
1360 return false;
1361
1362 Boolean empty = entry.type == XmlEntry::EMPTY_TAG;
1363
1364 // Get PROPERTY.NAME attribute:
1365
1366 String name = getCimNameAttribute(parser.getLine(), entry, "PROPERTY");
1367
1368 // Get PROPERTY.CLASSORIGIN attribute:
1369
1370 String classOrigin =
1371 getClassOriginAttribute(parser.getLine(), entry, "PROPERTY");
1372
1373 // Get PROPERTY.PROPAGATED
1374
1375 Boolean propagated = getCimBooleanAttribute(
1376 parser.getLine(), entry, "PROPERTY", "PROPAGATED", false, false);
1377 mike 1.1
1378 // Get PROPERTY.TYPE attribute:
1379
|
1380 mike 1.2 CIMType type = getCimTypeAttribute(parser.getLine(), entry, "PROPERTY");
|
1381 mike 1.1
1382 // Create property:
1383
|
1384 mike 1.2 CIMValue value;
|
1385 mike 1.1 value.setNullValue(type, false);
|
1386 mike 1.2 property = CIMProperty(
|
1387 mike 1.1 name, value, 0, String(), classOrigin, propagated);
1388
1389 if (!empty)
1390 {
1391 // Get qualifiers:
1392
1393 getQualifierElements(parser, property);
1394
1395 // Get value:
1396
1397 if (getValueElement(parser, type, value))
1398 property.setValue(value);
1399
1400 expectEndTag(parser, "PROPERTY");
1401 }
1402
1403 return true;
1404 }
1405
1406 //------------------------------------------------------------------------------
1407 //
1408 mike 1.1 // getArraySizeAttribute()
1409 //
1410 // Returns true if able to get array-size. Note that array size will
1411 // always be a positive integer.
1412 //
1413 // <!ENTITY % ArraySize "ARRAYSIZE CDATA #IMPLIED">
1414 //
1415 //------------------------------------------------------------------------------
1416
1417 Boolean XmlReader::getArraySizeAttribute(
1418 Uint32 lineNumber,
1419 const XmlEntry& entry,
1420 const char* tagName,
1421 Uint32& value)
1422 {
1423 const char* tmp;
1424
1425 if (!entry.getAttributeValue("ARRAYSIZE", tmp))
1426 return false;
1427
1428 Uint64 arraySize;
1429 mike 1.1
1430 if (!stringToUnsignedInteger(tmp, arraySize) || arraySize == 0)
1431 {
1432 char message[128];
1433 sprintf(message, "Illegal value for %s.%s", tagName, "ARRAYSIZE");
1434 throw XmlSemanticError(lineNumber, message);
1435 }
1436
1437 value = Uint32(arraySize);
1438 return true;
1439 }
1440
1441 //------------------------------------------------------------------------------
1442 //
1443 // getPropertyArrayElement()
1444 //
1445 // <!ELEMENT PROPERTY.ARRAY (QUALIFIER*,VALUE.ARRAY?)>
1446 // <!ATTLIST PROPERTY.ARRAY
1447 // %CIMName;
1448 // %CIMType; #REQUIRED
1449 // %ArraySize;
1450 mike 1.1 // %ClassOrigin;
1451 // %Propagated;>
1452 //
1453 //------------------------------------------------------------------------------
1454
1455 Boolean XmlReader::getPropertyArrayElement(
1456 XmlParser& parser,
|
1457 mike 1.2 CIMProperty& property)
|
1458 mike 1.1 {
1459 // Get PROPERTY element:
1460
1461 XmlEntry entry;
1462
1463 if (!testStartTagOrEmptyTag(parser, entry, "PROPERTY.ARRAY"))
1464 return false;
1465
1466 Boolean empty = entry.type == XmlEntry::EMPTY_TAG;
1467
1468 // Get PROPERTY.NAME attribute:
1469
1470 String name =
1471 getCimNameAttribute(parser.getLine(), entry, "PROPERTY.ARRAY");
1472
1473 // Get PROPERTY.TYPE attribute:
1474
|
1475 mike 1.2 CIMType type = getCimTypeAttribute(parser.getLine(), entry, "PROPERTY.ARRAY");
|
1476 mike 1.1
1477 // Get PROPERTY.ARRAYSIZE attribute:
1478
1479 Uint32 arraySize = 0;
1480 getArraySizeAttribute(parser.getLine(), entry, "PROPERTY.ARRAY", arraySize);
1481
1482 // Get PROPERTY.CLASSORIGIN attribute:
1483
1484 String classOrigin
1485 = getClassOriginAttribute(parser.getLine(), entry, "PROPERTY.ARRAY");
1486
1487 // Get PROPERTY.ARRAY.PROPAGATED
1488
1489 Boolean propagated = getCimBooleanAttribute(
1490 parser.getLine(), entry, "PROPERTY.ARRAY", "PROPAGATED", false, false);
1491
1492 // Create property:
1493
|
1494 mike 1.2 CIMValue nullValue;
|
1495 mike 1.1 nullValue.setNullValue(type, true, arraySize);
|
1496 mike 1.2 property = CIMProperty(
|
1497 mike 1.1 name, nullValue, arraySize, String(), classOrigin, propagated);
1498
1499 if (!empty)
1500 {
1501 // Get qualifiers:
1502
1503 getQualifierElements(parser, property);
1504
1505 // Get value:
1506
|
1507 mike 1.2 CIMValue value;
|
1508 mike 1.1
1509 if (getValueArrayElement(parser, type, value))
1510 {
1511 if (arraySize && arraySize != value.getArraySize())
1512 {
1513 throw XmlSemanticError(parser.getLine(),
1514 "ARRAYSIZE attribute and value-array size are different");
1515 }
1516
1517 property.setValue(value);
1518 }
1519
1520 expectEndTag(parser, "PROPERTY.ARRAY");
1521 }
1522
1523 return true;
1524 }
1525
1526 //------------------------------------------------------------------------------
1527 //
1528 // getHostElement()
1529 mike 1.1 //
1530 // <!ELEMENT HOST (#PCDATA)>
1531 //
1532 //------------------------------------------------------------------------------
1533
1534 Boolean XmlReader::getHostElement(
1535 XmlParser& parser,
1536 String& host)
1537 {
1538 XmlEntry entry;
1539
1540 if (!testStartTag(parser, entry, "HOST"))
1541 return false;
1542
1543 if (!parser.next(entry) || entry.type != XmlEntry::CONTENT)
1544 {
1545 throw XmlValidationError(parser.getLine(),
1546 "expected content of HOST element");
1547 }
1548
1549 host = entry.text;
1550 mike 1.1
1551 expectEndTag(parser, "HOST");
1552 return true;
1553 }
1554
1555 //------------------------------------------------------------------------------
1556 //
1557 // getNameSpaceElement()
1558 //
1559 // <!ELEMENT NAMESPACE EMPTY>
1560 // <!ATTLIST NAMESPACE %CIMName;>
1561 //
1562 //------------------------------------------------------------------------------
1563
1564 Boolean XmlReader::getNameSpaceElement(
1565 XmlParser& parser,
1566 String& nameSpaceComponent)
1567 {
1568 XmlEntry entry;
1569
1570 if (!testStartTagOrEmptyTag(parser, entry, "NAMESPACE"))
1571 mike 1.1 return false;
1572
1573 Boolean empty = entry.type == XmlEntry::EMPTY_TAG;
1574
1575 nameSpaceComponent = getCimNameAttribute(
1576 parser.getLine(), entry, "NAMESPACE");
1577
1578 if (!empty)
1579 expectEndTag(parser, "NAMESPACE");
1580
1581 return true;
1582 }
1583
1584 //------------------------------------------------------------------------------
1585 //
1586 // getLocalNameSpacePathElement()
1587 //
1588 // <!ELEMENT LOCALNAMESPACEPATH (NAMESPACE+)>
1589 //
1590 //------------------------------------------------------------------------------
1591
1592 mike 1.1 Boolean XmlReader::getLocalNameSpacePathElement(
1593 XmlParser& parser,
1594 String& nameSpace)
1595 {
1596 XmlEntry entry;
1597
1598 if (!testStartTag(parser, entry, "LOCALNAMESPACEPATH"))
1599 return false;
1600
1601 String nameSpaceComponent;
1602
1603 while (getNameSpaceElement(parser, nameSpaceComponent))
1604 {
1605 if (nameSpace.getLength())
1606 nameSpace += '/';
1607
1608 nameSpace += nameSpaceComponent;
1609 }
1610
1611 if (!nameSpace.getLength())
1612 {
1613 mike 1.1 throw XmlValidationError(parser.getLine(),
1614 "Expected one or more NAMESPACE elements within "
1615 "LOCALNAMESPACEPATH element");
1616 }
1617
1618 expectEndTag(parser, "LOCALNAMESPACEPATH");
1619 return true;
1620 }
1621
1622 //------------------------------------------------------------------------------
1623 //
1624 // getNameSpacePathElement()
1625 //
1626 // <!ELEMENT NAMESPACEPATH (HOST,LOCALNAMESPACEPATH)>
1627 //
1628 //------------------------------------------------------------------------------
1629
1630 Boolean XmlReader::getNameSpacePathElement(
1631 XmlParser& parser,
1632 String& host,
1633 String& nameSpace)
1634 mike 1.1 {
1635 host.clear();
1636 nameSpace.clear();
1637
1638 XmlEntry entry;
1639
1640 if (!testStartTag(parser, entry, "NAMESPACEPATH"))
1641 return false;
1642
1643 if (!getHostElement(parser, host))
1644 throw XmlValidationError(parser.getLine(), "expected HOST element");
1645
1646 if (!getLocalNameSpacePathElement(parser, nameSpace))
1647 {
1648 throw XmlValidationError(parser.getLine(),
1649 "expected LOCALNAMESPACEPATH element");
1650 }
1651
1652 expectEndTag(parser, "NAMESPACEPATH");
1653
1654 return true;
1655 mike 1.1 }
1656
1657 //------------------------------------------------------------------------------
1658 //
1659 // getClassNameElement()
1660 //
1661 // <!ELEMENT CLASSNAME EMPTY>
1662 // <!ATTLIST CLASSNAME %CIMName;>
1663 //
1664 //------------------------------------------------------------------------------
1665
1666 Boolean XmlReader::getClassNameElement(
1667 XmlParser& parser,
1668 String& className,
1669 Boolean required)
1670 {
1671 XmlEntry entry;
1672
1673 if (!testStartTagOrEmptyTag(parser, entry, "CLASSNAME"))
1674 {
1675 if (required)
1676 mike 1.1 {
1677 throw XmlValidationError(parser.getLine(),
1678 "expected CLASSNAME element");
1679 }
1680 else
1681 return false;
1682 }
1683
1684 Boolean empty = entry.type == XmlEntry::EMPTY_TAG;
1685
1686 className = getCimNameAttribute(
1687 parser.getLine(), entry, "CLASSNAME", true);
1688
1689 if (!empty)
1690 expectEndTag(parser, "CLASSNAME");
1691
1692 return true;
1693 }
1694
1695 //------------------------------------------------------------------------------
1696 //
1697 mike 1.1 // getValueTypeAttribute()
1698 //
1699 // VALUETYPE (string|boolean|numeric) 'string'
1700 //
1701 //------------------------------------------------------------------------------
1702
|
1703 mike 1.2 KeyBinding::CIMType XmlReader::getValueTypeAttribute(
|
1704 mike 1.1 Uint32 lineNumber,
1705 const XmlEntry& entry,
1706 const char* elementName)
1707 {
1708 String tmp;
1709
1710 if (!entry.getAttributeValue("VALUETYPE", tmp))
1711 return KeyBinding::STRING;
1712
|
1713 mike 1.4 if (String::equal(tmp, "string"))
|
1714 mike 1.1 return KeyBinding::STRING;
|
1715 mike 1.4 else if (String::equal(tmp, "boolean"))
|
1716 mike 1.1 return KeyBinding::BOOLEAN;
|
1717 mike 1.4 else if (String::equal(tmp, "numeric"))
|
1718 mike 1.1 return KeyBinding::NUMERIC;
1719
1720 char buffer[MESSAGE_SIZE];
1721
1722 sprintf(buffer,
1723 "Illegal value for %s.VALUETYPE attribute; "
|
1724 mike 1.2 "CIMValue must be one of \"string\", \"boolean\", or \"numeric\"",
|
1725 mike 1.1 elementName);
1726
1727 throw XmlSemanticError(lineNumber, buffer);
1728 return KeyBinding::BOOLEAN;
1729 }
1730
1731 //------------------------------------------------------------------------------
1732 //
1733 // getKeyValueElement()
1734 //
1735 // <!ELEMENT KEYVALUE (#PCDATA)>
1736 // <!ATTLIST KEYVALUE
1737 // VALUETYPE (string|boolean|numeric) 'string'>
1738 //
1739 // ATTN-B: VALUE.REFERENCE ignored above; can't understand why it is needed!
1740 //
1741 //------------------------------------------------------------------------------
1742
1743 Boolean XmlReader::getKeyValueElement(
1744 XmlParser& parser,
|
1745 mike 1.2 KeyBinding::CIMType& type,
|
1746 mike 1.1 String& value)
1747 {
1748 XmlEntry entry;
1749
1750 if (!testStartTagOrEmptyTag(parser, entry, "KEYVALUE"))
1751 return false;
1752
1753 Boolean empty = entry.type == XmlEntry::EMPTY_TAG;
1754
1755 type = getValueTypeAttribute(parser.getLine(), entry, "KEYVALUE");
1756
1757 value.clear();
1758
1759 if (!empty)
1760 {
1761 if (!parser.next(entry))
1762 throw XmlException(XmlException::UNCLOSED_TAGS, parser.getLine());
1763
1764 if (entry.type == XmlEntry::CONTENT)
1765 value = entry.text;
1766 else
1767 mike 1.1 parser.putBack(entry);
1768
1769 expectEndTag(parser, "KEYVALUE");
1770 }
1771
1772 return true;
1773 }
1774
1775 //------------------------------------------------------------------------------
1776 //
1777 // getKeyBindingElement()
1778 //
1779 // <!ELEMENT KEYBINDING (KEYVALUE|VALUE.REFERENCE)>
1780 // <!ATTLIST KEYBINDING
1781 // %CIMName;>
1782 //
1783 // ATTN-B: VALUE.REFERENCE ignored above; can't understand why it is needed!
1784 //
1785 //------------------------------------------------------------------------------
1786
1787 Boolean XmlReader::getKeyBindingElement(
1788 mike 1.1 XmlParser& parser,
1789 String& name,
1790 String& value,
|
1791 mike 1.2 KeyBinding::CIMType& type)
|
1792 mike 1.1 {
1793 XmlEntry entry;
1794
1795 if (!testStartTag(parser, entry, "KEYBINDING"))
1796 return false;
1797
1798 name = getCimNameAttribute(parser.getLine(), entry, "KEYBINDING");
1799
1800 if (!getKeyValueElement(parser, type, value))
1801 throw XmlValidationError(parser.getLine(), "Expected KEYVALUE element");
1802
1803 expectEndTag(parser, "KEYBINDING");
1804 return true;
1805 }
1806
1807 //------------------------------------------------------------------------------
1808 //
1809 // getInstanceNameElement()
1810 //
1811 // <!ELEMENT INSTANCENAME (KEYBINDING*|KEYVALUE?|VALUE.REFERENCE?)>
1812 // <!ATTLIST INSTANCENAME
1813 mike 1.1 // %ClassName;>
1814 //
1815 // ATTN-B: VALUE.REFERENCE sub-element not accepted yet.
1816 // ATTN-B: KEYVALUE sub-element nothandled yet.
1817 //
1818 //------------------------------------------------------------------------------
1819
1820 Boolean XmlReader::getInstanceNameElement(
1821 XmlParser& parser,
1822 String& className,
1823 Array<KeyBinding>& keyBindings)
1824 {
1825 className.clear();
1826 keyBindings.clear();
1827
1828 XmlEntry entry;
1829
1830 if (!testStartTagOrEmptyTag(parser, entry, "INSTANCENAME"))
1831 return false;
1832
1833 Boolean empty = entry.type == XmlEntry::EMPTY_TAG;
1834 mike 1.1
1835 className = getClassNameAttribute(parser.getLine(), entry, "INSTANCENAME");
1836
1837 if (!empty)
1838 {
1839 String name;
|
1840 mike 1.2 KeyBinding::CIMType type;
|
1841 mike 1.1 String value;
1842
1843 while (getKeyBindingElement(parser, name, value, type))
1844 keyBindings.append(KeyBinding(name, value, type));
1845
1846 if (!empty)
1847 expectEndTag(parser, "INSTANCENAME");
1848 }
1849
1850 return true;
1851 }
1852
1853 //------------------------------------------------------------------------------
1854 //
1855 // getInstancePathElement()
1856 //
1857 // <!ELEMENT INSTANCEPATH (NAMESPACEPATH,INSTANCENAME)>
1858 //
1859 //------------------------------------------------------------------------------
1860
1861 Boolean XmlReader::getInstancePathElement(
1862 mike 1.1 XmlParser& parser,
|
1863 mike 1.2 CIMReference& reference)
|
1864 mike 1.1 {
1865 XmlEntry entry;
1866
1867 if (!testStartTag(parser, entry, "INSTANCEPATH"))
1868 return false;
1869
1870 String host;
1871 String nameSpace;
1872
1873 if (!getNameSpacePathElement(parser, host, nameSpace))
1874 {
1875 throw XmlValidationError(parser.getLine(),
1876 "expected NAMESPACEPATH element");
1877 }
1878
1879 String className;
1880 Array<KeyBinding> keyBindings;
1881
1882 if (!getInstanceNameElement(parser, className, keyBindings))
1883 {
1884 throw XmlValidationError(parser.getLine(),
1885 mike 1.1 "expected INSTANCENAME element");
1886 }
1887
1888 reference.set(host, nameSpace, className, keyBindings);
1889
1890 expectEndTag(parser, "INSTANCEPATH");
1891 return true;
1892 }
1893
1894 //------------------------------------------------------------------------------
1895 //
1896 // getLocalInstancePathElement()
1897 //
1898 // <!ELEMENT LOCALINSTANCEPATH (NAMESPACEPATH,INSTANCENAME)>
1899 //
1900 //------------------------------------------------------------------------------
1901
1902 Boolean XmlReader::getLocalInstancePathElement(
1903 XmlParser& parser,
|
1904 mike 1.2 CIMReference& reference)
|
1905 mike 1.1 {
1906 XmlEntry entry;
1907
1908 if (!testStartTag(parser, entry, "LOCALINSTANCEPATH"))
1909 return false;
1910
1911 String nameSpace;
1912
1913 if (!getLocalNameSpacePathElement(parser, nameSpace))
1914 {
1915 throw XmlValidationError(parser.getLine(),
1916 "expected LOCALNAMESPACEPATH element");
1917 }
1918
1919 String className;
1920 Array<KeyBinding> keyBindings;
1921
1922 if (!getInstanceNameElement(parser, className, keyBindings))
1923 {
1924 throw XmlValidationError(parser.getLine(),
1925 "expected INSTANCENAME element");
1926 mike 1.1 }
1927
1928 reference.set(String(), nameSpace, className, keyBindings);
1929
1930 expectEndTag(parser, "LOCALINSTANCEPATH");
1931 return true;
1932 }
1933
1934 //------------------------------------------------------------------------------
1935 //
1936 // getClassPathElement()
1937 //
1938 // <!ELEMENT CLASSPATH (NAMESPACEPATH,CLASSNAME)>
1939 //
1940 //------------------------------------------------------------------------------
1941
1942 Boolean XmlReader::getClassPathElement(
1943 XmlParser& parser,
|
1944 mike 1.2 CIMReference& reference)
|
1945 mike 1.1 {
1946 XmlEntry entry;
1947
1948 if (!testStartTag(parser, entry, "CLASSPATH"))
1949 return false;
1950
1951 String host;
1952 String nameSpace;
1953
1954 if (!getNameSpacePathElement(parser, host, nameSpace))
1955 {
1956 throw XmlValidationError(parser.getLine(),
1957 "expected NAMESPACEPATH element");
1958 }
1959
1960 String className;
1961
1962 if (!getClassNameElement(parser, className))
1963 {
1964 throw XmlValidationError(parser.getLine(),
1965 "expected CLASSNAME element");
1966 mike 1.1 }
1967
1968 reference.set(host, nameSpace, className);
1969
1970 expectEndTag(parser, "CLASSPATH");
1971 return true;
1972 }
1973
1974 //------------------------------------------------------------------------------
1975 //
1976 // getLocalClassPathElement()
1977 //
1978 // <!ELEMENT LOCALCLASSPATH (LOCALNAMESPACEPATH,CLASSNAME)>
1979 //
1980 //------------------------------------------------------------------------------
1981
1982 Boolean XmlReader::getLocalClassPathElement(
1983 XmlParser& parser,
|
1984 mike 1.2 CIMReference& reference)
|
1985 mike 1.1 {
1986 XmlEntry entry;
1987
1988 if (!testStartTag(parser, entry, "LOCALCLASSPATH"))
1989 return false;
1990
1991 String nameSpace;
1992
1993 if (!getLocalNameSpacePathElement(parser, nameSpace))
1994 {
1995 throw XmlValidationError(parser.getLine(),
1996 "expected LOCALNAMESPACEPATH element");
1997 }
1998
1999 String className;
2000
2001 if (!getClassNameElement(parser, className))
2002 {
2003 throw XmlValidationError(parser.getLine(),
2004 "expected CLASSNAME element");
2005 }
2006 mike 1.1
2007 reference.set(String(), nameSpace, className);
2008
2009 expectEndTag(parser, "LOCALCLASSPATH");
2010
2011 return true;
2012 }
2013
2014 //------------------------------------------------------------------------------
2015 //
2016 // getValueReferenceElement()
2017 //
2018 // <!ELEMENT VALUE.REFERENCE (CLASSPATH|LOCALCLASSPATH|CLASSNAME|
2019 // INSTANCEPATH|LOCALINSTANCEPATH|INSTANCENAME)>
2020 //
2021 //
2022 //------------------------------------------------------------------------------
2023
2024 Boolean XmlReader::getValueReferenceElement(
2025 XmlParser& parser,
|
2026 mike 1.2 CIMReference& reference)
|
2027 mike 1.1 {
2028 XmlEntry entry;
2029
2030 if (!testStartTag(parser, entry, "VALUE.REFERENCE"))
2031 return false;
2032
2033 if (!parser.next(entry))
2034 throw XmlException(XmlException::UNCLOSED_TAGS, parser.getLine());
2035
2036 if (entry.type != XmlEntry::START_TAG &&
2037 entry.type != XmlEntry::EMPTY_TAG)
2038 {
2039 throw XmlValidationError(parser.getLine(),
2040 "Expected one of the following start tags: "
2041 "CLASSPATH, LOCALCLASSPATH, CLASSNAME, INSTANCEPATH, "
2042 "LOCALINSTANCEPATH, INSTANCENAME");
2043 }
2044
2045 if (strcmp(entry.text, "CLASSPATH") == 0)
2046 {
2047 parser.putBack(entry);
2048 mike 1.1 getClassPathElement(parser, reference);
2049 }
2050 else if (strcmp(entry.text, "LOCALCLASSPATH") == 0)
2051 {
2052 parser.putBack(entry);
2053 getLocalClassPathElement(parser, reference);
2054 }
2055 else if (strcmp(entry.text, "CLASSNAME") == 0)
2056 {
2057 parser.putBack(entry);
2058 String className;
2059 getClassNameElement(parser, className);
2060 reference.set(String(), String(), className);
2061 }
2062 else if (strcmp(entry.text, "INSTANCEPATH") == 0)
2063 {
2064 parser.putBack(entry);
2065 getInstancePathElement(parser, reference);
2066 }
2067 else if (strcmp(entry.text, "LOCALINSTANCEPATH") == 0)
2068 {
2069 mike 1.1 parser.putBack(entry);
2070 getLocalInstancePathElement(parser, reference);
2071 }
2072 else if (strcmp(entry.text, "INSTANCENAME") == 0)
2073 {
2074 parser.putBack(entry);
2075 String className;
2076 Array<KeyBinding> keyBindings;
2077 getInstanceNameElement(parser, className, keyBindings);
2078 reference.set(String(), String(), className, keyBindings);
2079 }
2080
2081 expectEndTag(parser, "VALUE.REFERENCE");
2082 return true;
2083 }
2084
2085 //------------------------------------------------------------------------------
2086 //
2087 // getPropertyReferenceElement()
2088 //
2089 // <!ELEMENT PROPERTY.REFERENCE (QUALIFIER*,(VALUE.REFERENCE)?)>
2090 mike 1.1 // <!ATTLIST PROPERTY.REFERENCE
2091 // %CIMName;
2092 // %ReferenceClass;
2093 // %ClassOrigin;
2094 // %Propagated;>
2095 //
2096 //------------------------------------------------------------------------------
2097
2098 Boolean XmlReader::getPropertyReferenceElement(
2099 XmlParser& parser,
|
2100 mike 1.2 CIMProperty& property)
|
2101 mike 1.1 {
2102 XmlEntry entry;
2103
2104 if (!testStartTagOrEmptyTag(parser, entry, "PROPERTY.REFERENCE"))
2105 return false;
2106
2107 Boolean empty = entry.type == XmlEntry::EMPTY_TAG;
2108
2109 // Get PROPERTY.NAME attribute:
2110
2111 String name = getCimNameAttribute(
2112 parser.getLine(), entry, "PROPERTY.REFERENCE");
2113
2114 // Get PROPERTY.REFERENCECLASS attribute:
2115
2116 String referenceClass = getReferenceClassAttribute(
2117 parser.getLine(), entry, "PROPERTY.REFERENCE");
2118
2119 // Get PROPERTY.CLASSORIGIN attribute:
2120
2121 String classOrigin =
2122 mike 1.1 getClassOriginAttribute(parser.getLine(), entry, "PROPERTY.REFERENCE");
2123
2124 // Get PROPERTY.PROPAGATED
2125
2126 Boolean propagated = getCimBooleanAttribute(parser.getLine(), entry,
2127 "PROPERTY.REFERENCE", "PROPAGATED", false, false);
2128
2129 // Create property:
2130
|
2131 mike 1.2 CIMValue value;
2132 value.set(CIMReference());
2133 property = CIMProperty(
|
2134 mike 1.1 name, value, 0, referenceClass, classOrigin, propagated);
2135
2136 if (!empty)
2137 {
2138 getQualifierElements(parser, property);
2139
|
2140 mike 1.2 CIMReference reference;
|
2141 mike 1.1
2142 if (getValueReferenceElement(parser, reference))
2143 property.setValue(reference);
2144
2145 expectEndTag(parser, "PROPERTY.REFERENCE");
2146 }
2147
2148 return true;
2149 }
2150
2151 //------------------------------------------------------------------------------
2152 //
2153 // GetPropertyElements()
2154 //
2155 //------------------------------------------------------------------------------
2156
2157 template<class CONTAINER>
2158 void GetPropertyElements(XmlParser& parser, CONTAINER& container)
2159 {
|
2160 mike 1.2 CIMProperty property;
|
2161 mike 1.1
2162 while (XmlReader::getPropertyElement(parser, property) ||
2163 XmlReader::getPropertyArrayElement(parser, property) ||
2164 XmlReader::getPropertyReferenceElement(parser, property))
2165 {
2166 try
2167 {
2168 container.addProperty(property);
2169 }
2170 catch (AlreadyExists&)
2171 {
2172 throw XmlSemanticError(parser.getLine(), "duplicate property");
2173 }
2174 }
2175 }
2176
2177 //------------------------------------------------------------------------------
2178 //
2179 // getParameterElement()
2180 //
2181 // <!ELEMENT PARAMETER (QUALIFIER*)>
2182 mike 1.1 // <!ATTLIST PARAMETER
2183 // %CIMName;
2184 // %CIMType; #REQUIRED>
2185 //
2186 //------------------------------------------------------------------------------
2187
2188 Boolean XmlReader::getParameterElement(
2189 XmlParser& parser,
|
2190 mike 1.2 CIMParameter& parameter)
|
2191 mike 1.1 {
2192 XmlEntry entry;
2193
2194 if (!testStartTagOrEmptyTag(parser, entry, "PARAMETER"))
2195 return false;
2196
2197 Boolean empty = entry.type == XmlEntry::EMPTY_TAG;
2198
2199 // Get PARAMETER.NAME attribute:
2200
2201 String name = getCimNameAttribute(parser.getLine(), entry, "PARAMETER");
2202
2203 // Get PARAMETER.TYPE attribute:
2204
|
2205 mike 1.2 CIMType type = getCimTypeAttribute(parser.getLine(), entry, "PARAMETER");
|
2206 mike 1.1
2207 // Create parameter:
2208
|
2209 mike 1.2 parameter = CIMParameter(name, type);
|
2210 mike 1.1
2211 if (!empty)
2212 {
2213 getQualifierElements(parser, parameter);
2214
2215 expectEndTag(parser, "PARAMETER");
2216 }
2217
2218 return true;
2219 }
2220
2221 //------------------------------------------------------------------------------
2222 //
2223 // getParameterArrayElement()
2224 //
2225 // <!ELEMENT PARAMETER.ARRAY (QUALIFIER*)>
2226 // <!ATTLIST PARAMETER.ARRAY
2227 // %CIMName;
2228 // %CIMType; #REQUIRED
2229 // %ArraySize;>
2230 //
2231 mike 1.1 //------------------------------------------------------------------------------
2232
2233 Boolean XmlReader::getParameterArrayElement(
2234 XmlParser& parser,
|
2235 mike 1.2 CIMParameter& parameter)
|
2236 mike 1.1 {
2237 XmlEntry entry;
2238
2239 if (!testStartTagOrEmptyTag(parser, entry, "PARAMETER.ARRAY"))
2240 return false;
2241
2242 Boolean empty = entry.type == XmlEntry::EMPTY_TAG;
2243
2244 // Get PARAMETER.ARRAY.NAME attribute:
2245
2246 String name = getCimNameAttribute(
2247 parser.getLine(), entry, "PARAMETER.ARRAY");
2248
2249 // Get PARAMETER.ARRAY.TYPE attribute:
2250
|
2251 mike 1.2 CIMType type = getCimTypeAttribute(parser.getLine(), entry, "PARAMETER.ARRAY");
|
2252 mike 1.1
2253 // Get PARAMETER.ARRAYSIZE attribute:
2254
2255 Uint32 arraySize = 0;
2256 getArraySizeAttribute(parser.getLine(), entry, "PARAMETER.ARRAY",arraySize);
2257
2258 // Create parameter:
2259
|
2260 mike 1.2 parameter = CIMParameter(name, type, true, arraySize);
|
2261 mike 1.1
2262 if (!empty)
2263 {
2264 getQualifierElements(parser, parameter);
2265
2266 expectEndTag(parser, "PARAMETER.ARRAY");
2267 }
2268
2269 return true;
2270 }
2271
2272 //------------------------------------------------------------------------------
2273 //
2274 // getParameterReferenceElement()
2275 //
2276 // <!ELEMENT PARAMETER.REFERENCE (QUALIFIER*)>
2277 // <!ATTLIST PARAMETER.REFERENCE
2278 // %CIMName;
2279 // %ReferenceClass;>
2280 //
2281 //------------------------------------------------------------------------------
2282 mike 1.1
2283 Boolean XmlReader::getParameterReferenceElement(
2284 XmlParser& parser,
|
2285 mike 1.2 CIMParameter& parameter)
|
2286 mike 1.1 {
2287 XmlEntry entry;
2288
2289 if (!testStartTagOrEmptyTag(parser, entry, "PARAMETER.REFERENCE"))
2290 return false;
2291
2292 Boolean empty = entry.type == XmlEntry::EMPTY_TAG;
2293
2294 // Get PARAMETER.NAME attribute:
2295
2296 String name = getCimNameAttribute(
2297 parser.getLine(), entry, "PARAMETER.REFERENCE");
2298
2299 // Get PARAMETER.REFERENCECLASS attribute:
2300
2301 String referenceClass = getReferenceClassAttribute(
2302 parser.getLine(), entry, "PARAMETER.REFERENCE");
2303
2304 // Create parameter:
2305
|
2306 mike 1.2 parameter = CIMParameter(name, CIMType::REFERENCE, false, 0, referenceClass);
|
2307 mike 1.1
2308 if (!empty)
2309 {
2310 getQualifierElements(parser, parameter);
2311 expectEndTag(parser, "PARAMETER.REFERENCE");
2312 }
2313
2314 return true;
2315 }
2316
2317 //------------------------------------------------------------------------------
2318 //
2319 // GetParameterElements()
2320 //
2321 //------------------------------------------------------------------------------
2322
2323 template<class CONTAINER>
2324 void GetParameterElements(XmlParser& parser, CONTAINER& container)
2325 {
|
2326 mike 1.2 CIMParameter parameter;
|
2327 mike 1.1
2328 while (XmlReader::getParameterElement(parser, parameter) ||
2329 XmlReader::getParameterArrayElement(parser, parameter) ||
2330 XmlReader::getParameterReferenceElement(parser, parameter))
2331 {
2332 try
2333 {
2334 container.addParameter(parameter);
2335 }
2336 catch (AlreadyExists&)
2337 {
2338 throw XmlSemanticError(parser.getLine(), "duplicate parameter");
2339 }
2340 }
2341 }
2342
2343 //------------------------------------------------------------------------------
2344 //
2345 // getQualifierDeclElement()
2346 //
2347 // <!ELEMENT QUALIFIER.DECLARATION (SCOPE?,(VALUE|VALUE.ARRAY)?)>
2348 mike 1.1 // <!ATTLIST QUALIFIER.DECLARATION
2349 // %CIMName;
2350 // %CIMType; #REQUIRED
2351 // ISARRAY (true|false) #IMPLIED
2352 // %ArraySize;
2353 // %QualifierFlavor;>
2354 //
2355 //------------------------------------------------------------------------------
2356
2357 Boolean XmlReader::getQualifierDeclElement(
2358 XmlParser& parser,
|
2359 mike 1.2 CIMQualifierDecl& qualifierDecl)
|
2360 mike 1.1 {
2361 XmlEntry entry;
2362
2363 if (!testStartTagOrEmptyTag(parser, entry, "QUALIFIER.DECLARATION"))
2364 return false;
2365
2366 Boolean empty = entry.type == XmlEntry::EMPTY_TAG;
2367
2368 // Get NAME attribute:
2369
2370 String name = getCimNameAttribute(
2371 parser.getLine(), entry, "QUALIFIER.DECLARATION");
2372
2373 // Get TYPE attribute:
2374
|
2375 mike 1.2 CIMType type = getCimTypeAttribute(
|
2376 mike 1.1 parser.getLine(), entry, "QUALIFIER.DECLARATION");
2377
2378 // Get ISARRAY attribute:
2379
2380 Boolean isArray = false;
2381 getIsArrayAttribute(
2382 parser.getLine(), entry, "QUALIFIER.DECLARATION", isArray);
2383
2384 // Get ARRAYSIZE attribute:
2385
2386 Uint32 arraySize = 0;
2387 Boolean gotArraySize = getArraySizeAttribute(parser.getLine(),
2388 entry, "QUALIFIER.DECLARATION", arraySize);
2389
2390 // Get flavor oriented attributes:
2391
2392 Uint32 flavor = getFlavor(entry,parser.getLine(), "QUALIFIER.DECLARATION");
2393
2394 // No need to look for interior elements if empty tag:
2395
|
2396 mike 1.2 Uint32 scope = CIMScope::NONE;
2397 CIMValue value;
|
2398 mike 1.1
2399 if (!empty)
2400 {
2401 // Get the option SCOPE element:
2402
2403 scope = getOptionalScope(parser);
2404
2405 // Get VALUE or VALUE.ARRAY element:
2406
2407 if (getValueArrayElement(parser, type, value))
2408 {
2409 if (!isArray)
2410 {
2411 throw XmlSemanticError(parser.getLine(),
2412 "VALUE.ARRAY element encountered without "
2413 "ISARRAY attribute");
2414 }
2415
2416 if (arraySize && arraySize != value.getArraySize())
2417 {
2418 throw XmlSemanticError(parser.getLine(),
2419 mike 1.1 "VALUE.ARRAY size is not the same as "
2420 "ARRAYSIZE attribute");
2421 }
2422 }
2423 else if (getValueElement(parser, type, value))
2424 {
2425 if (isArray)
2426 {
2427 throw XmlSemanticError(parser.getLine(),
2428 "ISARRAY attribute used but VALUE element encountered");
2429 }
2430 }
2431
2432 // Now get the closing tag:
2433
2434 expectEndTag(parser, "QUALIFIER.DECLARATION");
2435 }
2436
|
2437 mike 1.2 if (value.getType() == CIMType::NONE)
|
2438 mike 1.1 {
2439 if (isArray)
2440 value.setNullValue(type, true, arraySize);
2441 else
2442 value.setNullValue(type, false);
2443 }
2444
|
2445 mike 1.2 CIMQualifierDecl tmp(name, value, scope, flavor, arraySize);
2446 qualifierDecl = CIMQualifierDecl(name, value, scope, flavor, arraySize);
|
2447 mike 1.1 return true;
2448 }
2449
2450 //------------------------------------------------------------------------------
2451 // getMethodElement()
2452 //
2453 // <!ELEMENT METHOD (QUALIFIER*,(PARAMETER|PARAMETER.REFERENCE|
2454 // PARAMETER.ARRAY|PARAMETER.REFARRAY)*)>
2455 // <!ATTLIST METHOD
2456 // %CIMName;
2457 // %CIMType; #IMPLIED
2458 // %ClassOrigin;
2459 // %Propagated;>
2460 //
2461 //------------------------------------------------------------------------------
2462
|
2463 mike 1.2 Boolean XmlReader::getMethodElement(XmlParser& parser, CIMMethod& method)
|
2464 mike 1.1 {
2465 XmlEntry entry;
2466
2467 if (!testStartTagOrEmptyTag(parser, entry, "METHOD"))
2468 return false;
2469
2470 Boolean empty = entry.type == XmlEntry::EMPTY_TAG;
2471
2472 String name = getCimNameAttribute(parser.getLine(), entry, "PROPERTY");
2473
|
2474 mike 1.2 CIMType type = getCimTypeAttribute(parser.getLine(), entry, "PROPERTY");
|
2475 mike 1.1
2476 String classOrigin =
2477 getClassOriginAttribute(parser.getLine(), entry, "PROPERTY");
2478
2479 Boolean propagated = getCimBooleanAttribute(
2480 parser.getLine(), entry, "PROPERTY", "PROPAGATED", false, false);
2481
|
2482 mike 1.2 method = CIMMethod(name, type, classOrigin, propagated);
|
2483 mike 1.1
2484 if (!empty)
2485 {
2486 getQualifierElements(parser, method);
2487
2488 GetParameterElements(parser, method);
2489
2490 expectEndTag(parser, "METHOD");
2491 }
2492
2493 return true;
2494 }
2495
2496 //------------------------------------------------------------------------------
2497 // getClassElement()
2498 //
2499 // <!ELEMENT CLASS (QUALIFIER*,
2500 // (PROPERTY|PROPERTY.ARRAY|PROPERTY.REFERENCE)*,METHOD*)>
2501 // <!ATTLIST CLASS %CIMName; %SuperClass;>
2502 //
2503 //------------------------------------------------------------------------------
2504 mike 1.1
|
2505 mike 1.3 Boolean XmlReader::getClassElement(XmlParser& parser, CIMClass& cimClass)
|
2506 mike 1.1 {
2507 XmlEntry entry;
2508
2509 if (!testStartTag(parser, entry, "CLASS"))
2510 return false;
2511
2512 String name = getCimNameAttribute(parser.getLine(), entry, "CLASS");
2513
2514 String superClass = getSuperClassAttribute(parser.getLine(), entry,"CLASS");
2515
|
2516 mike 1.3 cimClass = CIMClass(name, superClass);
|
2517 mike 1.1
2518 // Get QUALIFIER elements:
2519
|
2520 mike 1.3 getQualifierElements(parser, cimClass);
|
2521 mike 1.1
2522 // Get PROPERTY elements:
2523
|
2524 mike 1.3 GetPropertyElements(parser, cimClass);
|
2525 mike 1.1
2526 // Get METHOD elements:
2527
|
2528 mike 1.2 CIMMethod method;
|
2529 mike 1.1
2530 while (getMethodElement(parser, method))
|
2531 mike 1.3 cimClass.addMethod(method);
|
2532 mike 1.1
2533 // Get CLASS end tag:
2534
2535 expectEndTag(parser, "CLASS");
2536
2537 return true;
2538 }
2539
2540 //------------------------------------------------------------------------------
2541 // getInstanceElement()
2542 //
2543 // <!ELEMENT INSTANCE (QUALIFIER*,
2544 // (PROPERTY|PROPERTY.ARRAY|PROPERTY.REFERENCE)*) >
2545 // <!ATTLIST INSTANCE
2546 // %ClassName;>
2547 //
2548 //------------------------------------------------------------------------------
2549
2550 Boolean XmlReader::getInstanceElement(
2551 XmlParser& parser,
|
2552 mike 1.3 CIMInstance& cimInstance)
|
2553 mike 1.1 {
2554 XmlEntry entry;
2555
2556 if (!testStartTag(parser, entry, "INSTANCE"))
2557 return false;
2558
2559 String className = getClassNameAttribute(
2560 parser.getLine(), entry, "INSTANCE");
2561
|
2562 mike 1.3 cimInstance = CIMInstance(className);
|
2563 mike 1.1
2564 // Get QUALIFIER elements:
2565
|
2566 mike 1.3 getQualifierElements(parser, cimInstance);
|
2567 mike 1.1
2568 // Get PROPERTY elements:
2569
|
2570 mike 1.3 GetPropertyElements(parser, cimInstance);
|
2571 mike 1.1
2572 // Get INSTANCE end tag:
2573
2574 expectEndTag(parser, "INSTANCE");
2575
2576 return true;
2577 }
2578
2579 //------------------------------------------------------------------------------
2580 //
2581 // getMessageStartTag()
2582 //
2583 //------------------------------------------------------------------------------
2584
2585 Boolean XmlReader::getMessageStartTag(
2586 XmlParser& parser,
2587 Uint32& id,
2588 const char*& protocolVersion)
2589 {
2590 XmlEntry entry;
2591
2592 mike 1.1 if (!testStartTag(parser, entry, "MESSAGE"))
2593 return false;
2594
2595 // Get MESSAGE.ID:
2596
2597 if (!entry.getAttributeValue("ID", id))
2598 throw XmlValidationError(parser.getLine(),
2599 "Bad or missing MESSAGE.ID attribute");
2600
2601 // Get MESSAGE.PROTOCOLVERSION:
2602
2603 if (!entry.getAttributeValue("PROTOCOLVERSION", protocolVersion))
2604 throw XmlValidationError(parser.getLine(),
2605 "Bad or missing MESSAGE.ID attribute");
2606
2607 return true;
2608 }
2609
2610 //------------------------------------------------------------------------------
2611 //
2612 // getIMethodCallStartTag()
2613 mike 1.1 //
2614 //------------------------------------------------------------------------------
2615
2616 Boolean XmlReader::getIMethodCallStartTag(
2617 XmlParser& parser,
2618 const char*& name)
2619 {
2620 XmlEntry entry;
2621
2622 if (!testStartTag(parser, entry, "IMETHODCALL"))
2623 return false;
2624
2625 // Get IMETHODCALL.NAME attribute:
2626
2627 if (!entry.getAttributeValue("NAME", name))
2628 throw XmlValidationError(parser.getLine(),
2629 "Missing IMETHODCALL.NAME attribute");
2630
2631 return true;
2632 }
2633
2634 mike 1.1 //------------------------------------------------------------------------------
2635 //
2636 // getIMethodResponseStartTag()
2637 //
2638 //------------------------------------------------------------------------------
2639
2640 Boolean XmlReader::getIMethodResponseStartTag(
2641 XmlParser& parser,
2642 const char*& name)
2643 {
2644 XmlEntry entry;
2645
2646 if (!testStartTag(parser, entry, "IMETHODRESPONSE"))
2647 return false;
2648
2649 // Get IMETHODRESPONSE.NAME attribute:
2650
2651 if (!entry.getAttributeValue("NAME", name))
2652 throw XmlValidationError(parser.getLine(),
2653 "Missing IMETHODRESPONSE.NAME attribute");
2654
2655 mike 1.1 return true;
2656 }
2657
2658 //------------------------------------------------------------------------------
2659 //
2660 // getIParamValueTag()
2661 //
2662 //------------------------------------------------------------------------------
2663
2664 Boolean XmlReader::getIParamValueTag(
2665 XmlParser& parser,
2666 const char*& name)
2667 {
2668 XmlEntry entry;
2669
2670 if (!testStartTag(parser, entry, "IPARAMVALUE"))
2671 return false;
2672
2673 // Get IPARAMVALUE.NAME attribute:
2674
2675 if (!entry.getAttributeValue("NAME", name))
2676 mike 1.1 throw XmlValidationError(parser.getLine(),
2677 "Missing IPARAMVALUE.NAME attribute");
2678
2679 return true;
2680 }
2681
2682 //------------------------------------------------------------------------------
2683 //
2684 // getBooleanValueElement()
2685 //
2686 // Get an elements like: "<VALUE>FALSE</VALUE>"
2687 //
2688 //------------------------------------------------------------------------------
2689
2690 Boolean XmlReader::getBooleanValueElement(
2691 XmlParser& parser,
2692 Boolean& result,
2693 Boolean required)
2694 {
2695 XmlEntry entry;
2696
2697 mike 1.1 if (!testStartTag(parser, entry, "VALUE"))
2698 {
2699 if (required)
2700 {
2701 throw XmlValidationError(parser.getLine(),
2702 "Expected VALUE element");
2703 }
2704 return false;
2705 }
2706
2707 expectContentOrCData(parser, entry);
2708
2709 if (strcmp(entry.text, "TRUE") == 0)
2710 result = true;
2711 else if (strcmp(entry.text, "FALSE") == 0)
2712 result = false;
2713 else
2714 throw XmlSemanticError(parser.getLine(),
2715 "Bad value for VALUE element: must be \"TRUE\" or \"FALSE\"");
2716
2717 expectEndTag(parser, "VALUE");
2718 mike 1.1
2719 return true;
2720 }
|
2721 karl 1.8
2722
2723
2724
2725
|
2726 mike 1.1
2727 //------------------------------------------------------------------------------
2728 //
2729 // getErrorElement()
2730 //
2731 // <!ELEMENT ERROR EMPTY>
2732 // <!ATTLIST ERROR
2733 // CODE CDATA #REQUIRED
2734 // DESCRIPTION CDATA #IMPLIED>
2735 //
2736 //------------------------------------------------------------------------------
2737
2738 Boolean XmlReader::getErrorElement(
2739 XmlParser& parser,
|
2740 mike 1.5 CIMException::Code& code,
|
2741 mike 1.1 const char*& description,
2742 Boolean required)
2743 {
2744 XmlEntry entry;
2745
2746 if (!testStartTagOrEmptyTag(parser, entry, "ERROR"))
2747 {
2748 if (required)
2749 throw XmlValidationError(parser.getLine(),"Expected ERROR element");
2750 return false;
2751 }
2752
2753 Boolean empty = entry.type == XmlEntry::EMPTY_TAG;
2754
2755 // Get ERROR.CODE
2756
2757 Uint32 tmpCode;
2758
2759 if (!entry.getAttributeValue("CODE", tmpCode))
2760 throw XmlValidationError(
2761 parser.getLine(), "missing ERROR.CODE attribute");
2762 mike 1.1
|
2763 mike 1.5 code = CIMException::Code(tmpCode);
|
2764 mike 1.1
2765 // Get ERROR.DESCRIPTION:
2766
2767 description = "";
2768 entry.getAttributeValue("DESCRIPTION", description);
2769
2770 if (!empty)
2771 expectEndTag(parser, "ERROR");
2772
2773 return true;
2774 }
2775
2776 PEGASUS_NAMESPACE_END
|