1 mike 1.25 //%/////////////////////////////////////////////////////////////////////////////
|
2 mike 1.23 //
|
3 mike 1.25 // Copyright (c) 2000, 2001 BMC Software, Hewlett-Packard Company, IBM,
4 // The Open Group, Tivoli Systems
|
5 mike 1.23 //
6 // Permission is hereby granted, free of charge, to any person obtaining a copy
7 // of this software and associated documentation files (the "Software"), to
8 // deal in the Software without restriction, including without limitation the
9 // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
10 // sell copies of the Software, and to permit persons to whom the Software is
11 // furnished to do so, subject to the following conditions:
12 //
13 // THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN
14 // ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED
15 // "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
16 // LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
17 // PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
18 // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
19 // ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21 //
22 //==============================================================================
23 //
24 // Author: Mike Brasher (mbrasher@bmc.com)
25 //
|
26 mike 1.25 // Modified By: Carol Ann Krug Graves, Hewlett-Packard Company
27 // (carolann_graves@hp.com)
28 // Nitin Upasani, Hewlett-Packard Company (Nitin_Upasani@hp.com)
29 // Roger Kumpf, Hewlett-Packard Company (roger_kumpf@hp.com)
|
30 mike 1.23 //
31 //%/////////////////////////////////////////////////////////////////////////////
|
32 mday 1.45 #include <Pegasus/Common/Config.h>
|
33 mike 1.23 #include <cassert>
34 #include <cctype>
35 #include <cstdio>
36 #include <cstdlib>
|
37 ramnath 1.46 #if defined(PEGASUS_OS_TYPE_UNIX)
|
38 mday 1.45 #include <errno.h>
39 #endif
|
40 mike 1.23 #include "CIMName.h"
41 #include "XmlReader.h"
42 #include "XmlWriter.h"
43 #include "CIMQualifier.h"
44 #include "CIMQualifierDecl.h"
45 #include "CIMClass.h"
46 #include "CIMInstance.h"
47 #include "CIMObject.h"
|
48 mike 1.25 #include "CIMParamValue.h"
|
49 mike 1.23
|
50 mike 1.25 PEGASUS_USING_STD;
|
51 mike 1.23 PEGASUS_NAMESPACE_BEGIN
52
53 static const Uint32 MESSAGE_SIZE = 128;
54
55 //------------------------------------------------------------------------------
56 //
|
57 kumpf 1.49 // getXmlDeclaration()
58 //
59 // <?xml version="1.0" encoding="utf-8"?>
|
60 mike 1.23 //
61 //------------------------------------------------------------------------------
62
|
63 kumpf 1.49 void XmlReader::getXmlDeclaration(
|
64 mike 1.23 XmlParser& parser,
|
65 kumpf 1.49 const char*& xmlVersion,
66 const char*& xmlEncoding)
|
67 mike 1.23 {
|
68 kumpf 1.49 XmlEntry entry;
69
|
70 mike 1.23 if (!parser.next(entry) ||
71 entry.type != XmlEntry::XML_DECLARATION ||
72 strcmp(entry.text, "xml") != 0)
73 {
74 throw XmlValidationError(parser.getLine(),
75 "Expected <?xml ... ?> style declaration");
|
76 kumpf 1.49 }
77
78 if (!entry.getAttributeValue("version", xmlVersion))
79 throw XmlValidationError(
80 parser.getLine(), "missing xml.version attribute");
81
82 if (!entry.getAttributeValue("encoding", xmlEncoding))
83 {
84 // ATTN-RK-P3-20020403: Is there a default encoding?
|
85 mike 1.23 }
86 }
87
88 //------------------------------------------------------------------------------
89 //
|
90 mike 1.25 // testXmlDeclaration ()
91 //
92 //------------------------------------------------------------------------------
93
94 Boolean XmlReader::testXmlDeclaration (
95 XmlParser& parser,
96 XmlEntry& entry)
97 {
98 if (!parser.next (entry) ||
99 entry.type != XmlEntry::XML_DECLARATION ||
100 strcmp (entry.text, "xml") != 0)
101 {
102 parser.putBack (entry);
103 return false;
104 }
105
106 return true;
107 }
108
109 //------------------------------------------------------------------------------
110 //
|
111 mike 1.23 // expectStartTag()
112 //
113 //------------------------------------------------------------------------------
114
115 void XmlReader::expectStartTag(
116 XmlParser& parser,
117 XmlEntry& entry,
118 const char* tagName)
119 {
120 if (!parser.next(entry) ||
121 entry.type != XmlEntry::START_TAG ||
122 strcmp(entry.text, tagName) != 0)
123 {
124 char message[MESSAGE_SIZE];
125 sprintf(message, "Expected open of %s element", tagName);
126 throw XmlValidationError(parser.getLine(), message);
127 }
128 }
129
130 //------------------------------------------------------------------------------
131 //
132 mike 1.23 // expectEndTag()
133 //
134 //------------------------------------------------------------------------------
135
136 void XmlReader::expectEndTag(XmlParser& parser, const char* tagName)
137 {
138 XmlEntry entry;
139
140 if (!parser.next(entry) ||
141 entry.type != XmlEntry::END_TAG ||
142 strcmp(entry.text, tagName) != 0)
143 {
144 char message[MESSAGE_SIZE];
145 sprintf(message, "Expected close of %s element, got %s instead",
146 tagName,entry.text);
147 throw XmlValidationError(parser.getLine(), message);
148 }
149 }
150
151 //------------------------------------------------------------------------------
152 //
153 mike 1.23 // expectStartTagOrEmptyTag()
154 //
155 //------------------------------------------------------------------------------
156
157 void XmlReader::expectStartTagOrEmptyTag(
158 XmlParser& parser,
159 XmlEntry& entry,
160 const char* tagName)
161 {
162 if (!parser.next(entry) ||
163 (entry.type != XmlEntry::START_TAG &&
164 entry.type != XmlEntry::EMPTY_TAG) ||
165 strcmp(entry.text, tagName) != 0)
166 {
167 char message[MESSAGE_SIZE];
168 sprintf(message,
169 "Expected either open or open/close %s element", tagName);
170 throw XmlValidationError(parser.getLine(), message);
171 }
172 }
173
174 mike 1.23 //------------------------------------------------------------------------------
175 //
176 // expectContentOrCData()
177 //
178 //------------------------------------------------------------------------------
179
180 Boolean XmlReader::expectContentOrCData(
181 XmlParser& parser,
182 XmlEntry& entry)
183 {
184 if (!parser.next(entry) ||
185 (entry.type != XmlEntry::CONTENT &&
186 entry.type != XmlEntry::CDATA))
187 {
188 throw XmlValidationError(parser.getLine(),
189 "Expected content of CDATA");
190 }
191
192 return true;
193 }
194
195 mike 1.23 //------------------------------------------------------------------------------
196 //
197 // testStartTag()
198 //
199 //------------------------------------------------------------------------------
200
201 Boolean XmlReader::testStartTag(
202 XmlParser& parser,
203 XmlEntry& entry,
204 const char* tagName)
205 {
206 if (!parser.next(entry) ||
207 entry.type != XmlEntry::START_TAG ||
208 strcmp(entry.text, tagName) != 0)
209 {
210 parser.putBack(entry);
211 return false;
212 }
213
214 return true;
215 }
216 mike 1.23
217 //------------------------------------------------------------------------------
218 //
|
219 kumpf 1.48 // testEndTag()
|
220 mike 1.23 //
221 //------------------------------------------------------------------------------
222
223 Boolean XmlReader::testEndTag(XmlParser& parser, const char* tagName)
224 {
225 XmlEntry entry;
226
227 if (!parser.next(entry) ||
228 entry.type != XmlEntry::END_TAG ||
229 strcmp(entry.text, tagName) != 0)
230 {
231 parser.putBack(entry);
232 return false;
233 }
234
235 return true;
236 }
237
238 //------------------------------------------------------------------------------
239 //
240 // testStartTagOrEmptyTag()
241 mike 1.23 //
242 //------------------------------------------------------------------------------
243
244 Boolean XmlReader::testStartTagOrEmptyTag(
245 XmlParser& parser,
246 XmlEntry& entry,
247 const char* tagName)
248 {
249 if (!parser.next(entry) ||
250 (entry.type != XmlEntry::START_TAG &&
251 entry.type != XmlEntry::EMPTY_TAG) ||
252 strcmp(entry.text, tagName) != 0)
253 {
254 parser.putBack(entry);
255 return false;
256 }
257
258 return true;
259 }
260
261 //------------------------------------------------------------------------------
262 mike 1.23 //
263 // testContentOrCData()
264 //
265 //------------------------------------------------------------------------------
266
267 Boolean XmlReader::testContentOrCData(
268 XmlParser& parser,
269 XmlEntry& entry)
270 {
271 if (!parser.next(entry) ||
272 (entry.type != XmlEntry::CONTENT &&
273 entry.type != XmlEntry::CDATA))
274 {
275 parser.putBack(entry);
276 return false;
277 }
278
279 return true;
280 }
281
282 //------------------------------------------------------------------------------
283 mike 1.23 //
|
284 kumpf 1.34 // getCimStartTag()
|
285 mike 1.23 //
286 // <!ELEMENT CIM (MESSAGE|DECLARATION)>
287 // <!ATTRLIST CIM
288 // CIMVERSION CDATA #REQUIRED
289 // DTDVERSION CDATA #REQUIRED>
290 //
291 //------------------------------------------------------------------------------
292
|
293 kumpf 1.34 void XmlReader::getCimStartTag(
294 XmlParser& parser,
295 const char*& cimVersion,
296 const char*& dtdVersion)
|
297 mike 1.23 {
298 XmlEntry entry;
299 XmlReader::expectStartTag(parser, entry, "CIM");
300
301 if (!entry.getAttributeValue("CIMVERSION", cimVersion))
302 throw XmlValidationError(
303 parser.getLine(), "missing CIM.CIMVERSION attribute");
304
305 if (!entry.getAttributeValue("DTDVERSION", dtdVersion))
306 throw XmlValidationError(
307 parser.getLine(), "missing CIM.DTDVERSION attribute");
308 }
309
310 //------------------------------------------------------------------------------
311 //
312 // getCimNameAttribute()
313 //
314 // <!ENTITY % CIMName "NAME CDATA #REQUIRED">
315 //
316 //------------------------------------------------------------------------------
317
318 mike 1.23 String XmlReader::getCimNameAttribute(
319 Uint32 lineNumber,
320 const XmlEntry& entry,
321 const char* elementName,
322 Boolean acceptNull)
323 {
324 String name;
325
326 if (!entry.getAttributeValue("NAME", name))
327 {
328 char buffer[MESSAGE_SIZE];
329 sprintf(buffer, "missing %s.NAME attribute", elementName);
330 throw XmlValidationError(lineNumber, buffer);
331 }
332
333 if (acceptNull && name.size() == 0)
334 return name;
335
336 if (!CIMName::legal(name))
337 {
338 char buffer[MESSAGE_SIZE];
339 mike 1.23 sprintf(buffer, "Illegal value for %s.NAME attribute", elementName);
340 throw XmlSemanticError(lineNumber, buffer);
341 }
342
343 return name;
344 }
345
346 //------------------------------------------------------------------------------
347 //
348 // getClassNameAttribute()
349 //
350 // <!ENTITY % CIMName "CLASSNAME CDATA #REQUIRED">
351 //
352 //------------------------------------------------------------------------------
353
354 String XmlReader::getClassNameAttribute(
355 Uint32 lineNumber,
356 const XmlEntry& entry,
357 const char* elementName)
358 {
359 String name;
360 mike 1.23
361 if (!entry.getAttributeValue("CLASSNAME", name))
362 {
363 char buffer[MESSAGE_SIZE];
364 sprintf(buffer, "missing %s.CLASSNAME attribute", elementName);
365 throw XmlValidationError(lineNumber, buffer);
366 }
367
368 if (!CIMName::legal(name))
369 {
370 char buffer[MESSAGE_SIZE];
371 sprintf(buffer,
372 "Illegal value for %s.CLASSNAME attribute", elementName);
373 throw XmlSemanticError(lineNumber, buffer);
374 }
375
376 return name;
377 }
378
379 //------------------------------------------------------------------------------
380 //
381 mike 1.23 // getClassOriginAttribute()
382 //
383 // <!ENTITY % ClassOrigin "CLASSORIGIN CDATA #IMPLIED">
384 //
385 //------------------------------------------------------------------------------
386
387 String XmlReader::getClassOriginAttribute(
388 Uint32 lineNumber,
389 const XmlEntry& entry,
390 const char* tagName)
391 {
392 String name;
393
394 if (!entry.getAttributeValue("CLASSORIGIN", name))
395 return String();
396
397 if (!CIMName::legal(name))
398 {
399 char buffer[MESSAGE_SIZE];
400 sprintf(buffer,
401 "Illegal value for %s.CLASSORIGIN attribute", tagName);
402 mike 1.23 throw XmlSemanticError(lineNumber, buffer);
403 }
404
405 return name;
406 }
407
408 //------------------------------------------------------------------------------
409 //
410 // getReferenceClassAttribute()
411 //
412 // <!ENTITY % ReferenceClass "REFERENCECLASS CDATA #IMPLIED">
413 //
414 //------------------------------------------------------------------------------
415
416 String XmlReader::getReferenceClassAttribute(
417 Uint32 lineNumber,
418 const XmlEntry& entry,
419 const char* elementName)
420 {
421 String name;
422
423 mike 1.23 if (!entry.getAttributeValue("REFERENCECLASS", name))
424 return String();
425
426 if (!CIMName::legal(name))
427 {
428 char buffer[MESSAGE_SIZE];
429 sprintf(buffer,
430 "Illegal value for %s.REFERENCECLASS attribute", elementName);
431 throw XmlSemanticError(lineNumber, buffer);
432 }
433
434 return name;
435 }
436
437 //------------------------------------------------------------------------------
438 //
439 // getSuperClassAttribute()
440 //
441 // <!ENTITY % SuperClass "SUPERCLASS CDATA #IMPLIED">
442 //
443 //------------------------------------------------------------------------------
444 mike 1.23
445 String XmlReader::getSuperClassAttribute(
446 Uint32 lineNumber,
447 const XmlEntry& entry,
448 const char* tagName)
449 {
450 String superClass;
451
452 if (!entry.getAttributeValue("SUPERCLASS", superClass))
453 return String();
454
455 if (!CIMName::legal(superClass))
456 {
457 char buffer[MESSAGE_SIZE];
458 sprintf(
459 buffer, "Illegal value for %s.SUPERCLASS attribute", tagName);
460 throw XmlSemanticError(lineNumber, buffer);
461 }
462
463 return superClass;
464 }
465 mike 1.23
466 //------------------------------------------------------------------------------
467 //
468 // getCimTypeAttribute()
469 //
|
470 kumpf 1.26 // This method can be used to get a TYPE attribute or a PARAMTYPE attribute.
471 // The only significant difference is that PARAMTYPE may specify a value of
472 // "reference" type. This method recognizes these attributes by name, and
473 // does not allow a "TYPE" attribute to be of "reference" type.
474 //
|
475 mike 1.23 // <!ENTITY % CIMType "TYPE (boolean|string|char16|uint8|sint8|uint16
476 // |sint16|uint32|sint32|uint64|sint64|datetime|real32|real64)">
477 //
|
478 kumpf 1.26 // <!ENTITY % ParamType "PARAMTYPE (boolean|string|char16|uint8|sint8
479 // |uint16|sint16|uint32|sint32|uint64|sint64|datetime|real32|real64
480 // |reference)">
481 //
|
482 mike 1.23 //------------------------------------------------------------------------------
483
484 CIMType XmlReader::getCimTypeAttribute(
485 Uint32 lineNumber,
486 const XmlEntry& entry,
|
487 kumpf 1.26 const char* tagName,
488 const char* attributeName,
489 Boolean required)
|
490 mike 1.23 {
491 const char* typeName;
492
|
493 kumpf 1.26 if (!entry.getAttributeValue(attributeName, typeName))
|
494 mike 1.23 {
|
495 kumpf 1.26 if (required)
496 {
497 char message[MESSAGE_SIZE];
498 sprintf(message, "missing %s.%s attribute", tagName, attributeName);
499 throw XmlValidationError(lineNumber, message);
500 }
501 else
502 {
503 return CIMType::NONE;
504 }
|
505 mike 1.23 }
506
507 CIMType type = CIMType::NONE;
508
509 if (strcmp(typeName, "boolean") == 0)
510 type = CIMType::BOOLEAN;
511 else if (strcmp(typeName, "string") == 0)
512 type = CIMType::STRING;
513 else if (strcmp(typeName, "char16") == 0)
514 type = CIMType::CHAR16;
515 else if (strcmp(typeName, "uint8") == 0)
516 type = CIMType::UINT8;
517 else if (strcmp(typeName, "sint8") == 0)
518 type = CIMType::SINT8;
519 else if (strcmp(typeName, "uint16") == 0)
520 type = CIMType::UINT16;
521 else if (strcmp(typeName, "sint16") == 0)
522 type = CIMType::SINT16;
523 else if (strcmp(typeName, "uint32") == 0)
524 type = CIMType::UINT32;
525 else if (strcmp(typeName, "sint32") == 0)
526 mike 1.23 type = CIMType::SINT32;
527 else if (strcmp(typeName, "uint64") == 0)
528 type = CIMType::UINT64;
529 else if (strcmp(typeName, "sint64") == 0)
530 type = CIMType::SINT64;
531 else if (strcmp(typeName, "datetime") == 0)
532 type = CIMType::DATETIME;
533 else if (strcmp(typeName, "real32") == 0)
534 type = CIMType::REAL32;
535 else if (strcmp(typeName, "real64") == 0)
536 type = CIMType::REAL64;
|
537 kumpf 1.26 else if (strcmp(typeName, "reference") == 0)
538 type = CIMType::REFERENCE;
|
539 mike 1.23
|
540 kumpf 1.26 if ((type == CIMType::NONE) ||
541 ((type == CIMType::REFERENCE) &&
542 (strcmp(attributeName, "PARAMTYPE") != 0)))
|
543 mike 1.23 {
544 char message[MESSAGE_SIZE];
|
545 kumpf 1.26 sprintf(message, "Illegal value for %s.%s attribute", tagName,
546 attributeName);
|
547 mike 1.23 throw XmlSemanticError(lineNumber, message);
548 }
549
550 return type;
551 }
552
553 //------------------------------------------------------------------------------
554 //
555 // getCimBooleanAttribute()
556 //
557 //------------------------------------------------------------------------------
558
559 Boolean XmlReader::getCimBooleanAttribute(
560 Uint32 lineNumber,
561 const XmlEntry& entry,
562 const char* tagName,
563 const char* attributeName,
564 Boolean defaultValue,
565 Boolean required)
566 {
567 const char* tmp;
568 mike 1.23
569 if (!entry.getAttributeValue(attributeName, tmp))
570 {
571 if (!required)
572 return defaultValue;
573
574 char buffer[62];
575 sprintf(buffer, "missing required %s.%s attribute",
576 attributeName, tagName);
577
578 throw XmlValidationError(lineNumber, buffer);
579 }
580
581 if (strcmp(tmp, "true") == 0)
582 return true;
583 else if (strcmp(tmp, "false") == 0)
584 return false;
585
586 char buffer[62];
587 sprintf(buffer, "Bad %s.%s attribute value", attributeName, tagName);
588 throw XmlSemanticError(lineNumber, buffer);
589 mike 1.23 return false;
590 }
591
592 //------------------------------------------------------------------------------
593 //
594 // SringToReal()
595 //
596 // [ "+" | "-" ] *decimalDigit "." 1*decimalDigit
597 // [ ( "e" | "E" ) [ "+" | "-" ] 1*decimalDigit ]
598 //
599 //------------------------------------------------------------------------------
600
601 Boolean XmlReader::stringToReal(const char* stringValue, Real64& x)
602 {
|
603 kumpf 1.43 //
604 // Check the string against the DMTF-defined grammar
605 //
|
606 mike 1.23 const char* p = stringValue;
607
608 if (!*p)
609 return false;
610
611 // Skip optional sign:
612
613 if (*p == '+' || *p == '-')
614 p++;
615
616 // Skip optional first set of digits:
617
618 while (isdigit(*p))
619 p++;
620
621 // Test required dot:
622
623 if (*p++ != '.')
624 return false;
625
626 // One or more digits required:
627 mike 1.23
628 if (!isdigit(*p++))
629 return false;
630
631 while (isdigit(*p))
632 p++;
633
634 // If there is an exponent now:
635
636 if (*p)
637 {
638 // Test exponent:
639
640 if (*p != 'e' && *p != 'E')
641 return false;
642
643 p++;
644
645 // Skip optional sign:
646
647 if (*p == '+' || *p == '-')
648 mike 1.23 p++;
649
650 // One or more digits required:
651
652 if (!isdigit(*p++))
653 return false;
654
655 while (isdigit(*p))
656 p++;
657 }
658
659 if (*p)
660 return false;
661
|
662 kumpf 1.43 //
663 // Do the conversion
664 //
|
665 mike 1.23 char* end;
|
666 kumpf 1.43 errno = 0;
|
667 mike 1.23 x = strtod(stringValue, &end);
|
668 kumpf 1.43 if (*end || (errno == ERANGE))
669 {
670 return false;
671 }
672
|
673 mike 1.23 return true;
674 }
675
|
676 kumpf 1.41 inline Uint8 _hexCharToNumeric(const char c)
677 {
678 Uint8 n;
679
680 if (isdigit(c))
681 n = (c - '0');
682 else if (isupper(c))
683 n = (c - 'A' + 10);
684 else // if (islower(c))
685 n = (c - 'a' + 10);
686
687 return n;
688 }
689
|
690 mike 1.23 //------------------------------------------------------------------------------
691 //
692 // stringToSignedInteger
693 //
694 // [ "+" | "-" ] ( positiveDecimalDigit *decimalDigit | "0" )
|
695 kumpf 1.41 // or
696 // [ "+" | "-" ] ( "0x" | "0X" ) 1*hexDigit
|
697 mike 1.23 //
698 //------------------------------------------------------------------------------
699
700 Boolean XmlReader::stringToSignedInteger(
701 const char* stringValue,
702 Sint64& x)
703 {
704 x = 0;
705 const char* p = stringValue;
706
|
707 kumpf 1.41 if (!p || !*p)
|
708 mike 1.23 return false;
709
710 // Skip optional sign:
711
712 Boolean negative = *p == '-';
713
714 if (negative || *p == '+')
715 p++;
716
717 if (*p == '0')
|
718 kumpf 1.41 {
719 if ( (p[1] == 'x') || (p[1] == 'X') )
720 {
721 // Convert a hexadecimal string
|
722 mike 1.23
|
723 kumpf 1.41 // Skip over the "0x"
724 p+=2;
|
725 mike 1.23
|
726 kumpf 1.41 // At least one hexadecimal digit is required
727 if (!isxdigit(*p))
728 return false;
729
730 // Build the Sint64 as a negative number, regardless of the
731 // eventual sign (negative numbers can be bigger than positive ones)
732
733 // Add on each digit, checking for overflow errors
734 while (isxdigit(*p))
735 {
736 // Make sure we won't overflow when we multiply by 16
737 if (x < PEGASUS_LLONG_MIN/16)
738 {
739 return false;
740 }
741 x = x << 4;
742
743 // Make sure we don't overflow when we add the next digit
744 Sint64 newDigit = Sint64(_hexCharToNumeric(*p++));
745 if (PEGASUS_LLONG_MIN - x > -newDigit)
746 {
747 kumpf 1.41 return false;
748 }
749 x = x - newDigit;
750 }
751
752 // If we found a non-hexadecimal digit, report an error
753 if (*p)
754 return false;
755
756 // Return the integer to positive, if necessary, checking for an
757 // overflow error
758 if (!negative)
759 {
760 if (x == PEGASUS_LLONG_MIN)
761 {
762 return false;
763 }
764 x = -x;
765 }
766 return true;
767 }
768 kumpf 1.41 else
769 {
770 // A decimal string that starts with '0' must be exactly "0".
771 return p[1] == '\0';
772 }
773 }
|
774 mike 1.23
|
775 kumpf 1.41 // Expect a positive decimal digit:
|
776 mike 1.23
|
777 kumpf 1.41 // At least one decimal digit is required
778 if (!isdigit(*p))
779 return false;
780
781 // Build the Sint64 as a negative number, regardless of the
782 // eventual sign (negative numbers can be bigger than positive ones)
|
783 mike 1.23
|
784 kumpf 1.41 // Add on each digit, checking for overflow errors
|
785 mike 1.23 while (isdigit(*p))
|
786 kumpf 1.37 {
|
787 kumpf 1.41 // Make sure we won't overflow when we multiply by 10
|
788 kumpf 1.39 if (x < PEGASUS_LLONG_MIN/10)
|
789 kumpf 1.37 {
790 return false;
791 }
792 x = 10 * x;
|
793 kumpf 1.41
794 // Make sure we won't overflow when we add the next digit
795 Sint64 newDigit = (*p++ - '0');
|
796 mday 1.38 if (PEGASUS_LLONG_MIN - x > -newDigit)
|
797 kumpf 1.37 {
798 return false;
799 }
|
800 kumpf 1.41 x = x - newDigit;
|
801 kumpf 1.37 }
|
802 mike 1.23
|
803 kumpf 1.41 // If we found a non-decimal digit, report an error
804 if (*p)
805 return false;
806
807 // Return the integer to positive, if necessary, checking for an
808 // overflow error
|
809 kumpf 1.37 if (!negative)
810 {
|
811 mday 1.38 if (x == PEGASUS_LLONG_MIN)
|
812 kumpf 1.37 {
813 return false;
814 }
|
815 kumpf 1.41 x = -x;
|
816 kumpf 1.37 }
|
817 mike 1.23 return true;
818 }
819
820 //------------------------------------------------------------------------------
821 //
822 // stringToUnsignedInteger
823 //
|
824 kumpf 1.40 // ( positiveDecimalDigit *decimalDigit | "0" )
|
825 kumpf 1.41 // or
826 // ( "0x" | "0X" ) 1*hexDigit
|
827 mike 1.23 //
828 //------------------------------------------------------------------------------
829
830 Boolean XmlReader::stringToUnsignedInteger(
831 const char* stringValue,
832 Uint64& x)
833 {
834 x = 0;
835 const char* p = stringValue;
836
|
837 kumpf 1.41 if (!p || !*p)
|
838 mike 1.23 return false;
839
840 if (*p == '0')
|
841 kumpf 1.41 {
842 if ( (p[1] == 'x') || (p[1] == 'X') )
843 {
844 // Convert a hexadecimal string
|
845 mike 1.23
|
846 kumpf 1.41 // Skip over the "0x"
847 p+=2;
|
848 mike 1.23
|
849 kumpf 1.41 // At least one hexadecimal digit is required
850 if (!*p)
851 return false;
852
853 // Add on each digit, checking for overflow errors
854 while (isxdigit(*p))
855 {
856 // Make sure we won't overflow when we multiply by 16
857 if (x > PEGASUS_ULLONG_MAX/16)
858 {
859 return false;
860 }
861 x = x << 4;
862
863 // We can't overflow when we add the next digit
864 Uint64 newDigit = Uint64(_hexCharToNumeric(*p++));
865 if (PEGASUS_ULLONG_MAX - x < newDigit)
866 {
867 return false;
868 }
869 x = x + newDigit;
870 kumpf 1.41 }
871
872 // If we found a non-hexadecimal digit, report an error
873 if (*p)
874 return false;
|
875 mike 1.23
|
876 kumpf 1.41 return true;
877 }
878 else
879 {
880 // A decimal string that starts with '0' must be exactly "0".
881 return p[1] == '\0';
882 }
883 }
|
884 mike 1.23
|
885 kumpf 1.41 // Expect a positive decimal digit:
|
886 mike 1.23
|
887 kumpf 1.41 // Add on each digit, checking for overflow errors
|
888 mike 1.23 while (isdigit(*p))
|
889 kumpf 1.37 {
|
890 kumpf 1.41 // Make sure we won't overflow when we multiply by 10
|
891 kumpf 1.39 if (x > PEGASUS_ULLONG_MAX/10)
|
892 kumpf 1.37 {
893 return false;
894 }
895 x = 10 * x;
|
896 kumpf 1.41
897 // Make sure we won't overflow when we add the next digit
898 Uint64 newDigit = (*p++ - '0');
|
899 kumpf 1.39 if (PEGASUS_ULLONG_MAX - x < newDigit)
|
900 kumpf 1.37 {
901 return false;
902 }
|
903 kumpf 1.41 x = x + newDigit;
|
904 kumpf 1.37 }
|
905 kumpf 1.41
906 // If we found a non-decimal digit, report an error
907 if (*p)
908 return false;
|
909 mike 1.23
910 return true;
911 }
912
913 //------------------------------------------------------------------------------
914 //
915 // stringToValue()
916 //
|
917 karl 1.35 // Return: CIMValue. If the string input is zero length creates a CIMValue
918 // with value defined by the type. Else the value is inserted.
919 //
920 // Note that this does not set the CIMValue Null if the string is empty.
921 //
|
922 mike 1.23 //------------------------------------------------------------------------------
923
924 CIMValue XmlReader::stringToValue(
925 Uint32 lineNumber,
926 const char* valueString,
927 CIMType type)
928 {
929 // ATTN-B: accepting only UTF-8 for now! (affects string and char16):
930
|
931 karl 1.35 // Create value per type
|
932 mike 1.23 switch (type)
933 {
934 case CIMType::BOOLEAN:
935 {
936 if (CompareNoCase(valueString, "TRUE") == 0)
937 return CIMValue(true);
938 else if (CompareNoCase(valueString, "FALSE") == 0)
939 return CIMValue(false);
940 else
941 throw XmlSemanticError(
942 lineNumber, "Bad boolean value");
943 }
944
945 case CIMType::STRING:
946 {
947 return CIMValue(valueString);
948 }
949
950 case CIMType::CHAR16:
951 {
952 if (strlen(valueString) != 1)
953 mike 1.23 throw XmlSemanticError(lineNumber, "Bad char16 value");
954
955 return CIMValue(Char16(valueString[0]));
956 }
957
958 case CIMType::UINT8:
959 case CIMType::UINT16:
960 case CIMType::UINT32:
961 case CIMType::UINT64:
962 {
963 Uint64 x;
964
965 if (!stringToUnsignedInteger(valueString, x))
966 {
967 throw XmlSemanticError(
968 lineNumber, "Bad unsigned integer value");
969 }
970
971 switch (type)
972 {
|
973 kumpf 1.37 case CIMType::UINT8:
974 {
975 if (x >= (Uint64(1)<<8))
976 {
977 throw XmlSemanticError(
978 lineNumber, "Uint8 value out of range");
979 }
980 return CIMValue(Uint8(x));
981 }
982 case CIMType::UINT16:
983 {
984 if (x >= (Uint64(1)<<16))
985 {
986 throw XmlSemanticError(
987 lineNumber, "Uint16 value out of range");
988 }
989 return CIMValue(Uint16(x));
990 }
991 case CIMType::UINT32:
992 {
993 if (x >= (Uint64(1)<<32))
994 kumpf 1.37 {
995 throw XmlSemanticError(
996 lineNumber, "Uint32 value out of range");
997 }
998 return CIMValue(Uint32(x));
999 }
|
1000 mike 1.23 case CIMType::UINT64: return CIMValue(Uint64(x));
1001 default: break;
1002 }
1003 }
1004
1005 case CIMType::SINT8:
1006 case CIMType::SINT16:
1007 case CIMType::SINT32:
1008 case CIMType::SINT64:
1009 {
1010 Sint64 x;
1011
1012 if (!stringToSignedInteger(valueString, x))
1013 {
1014 throw XmlSemanticError(
1015 lineNumber, "Bad signed integer value");
1016 }
1017
1018 switch (type)
1019 {
|
1020 kumpf 1.37 case CIMType::SINT8:
1021 {
1022 if( (x >= (Sint64(1)<<7)) || (x < (-(Sint64(1)<<7))) )
1023 {
1024 throw XmlSemanticError(
1025 lineNumber, "Sint8 value out of range");
1026 }
1027 return CIMValue(Sint8(x));
1028 }
1029 case CIMType::SINT16:
1030 {
1031 if( (x >= (Sint64(1)<<15)) || (x < (-(Sint64(1)<<15))) )
1032 {
1033 throw XmlSemanticError(
1034 lineNumber, "Sint16 value out of range");
1035 }
1036 return CIMValue(Sint16(x));
1037 }
1038 case CIMType::SINT32:
1039 {
1040 if( (x >= (Sint64(1)<<31)) || (x < (-(Sint64(1)<<31))) )
1041 kumpf 1.37 {
1042 throw XmlSemanticError(
1043 lineNumber, "Sint32 value out of range");
1044 }
1045 return CIMValue(Sint32(x));
1046 }
|
1047 mike 1.23 case CIMType::SINT64: return CIMValue(Sint64(x));
1048 default: break;
1049 }
1050 }
1051
1052 case CIMType::DATETIME:
1053 {
1054 CIMDateTime tmp;
1055
1056 try
1057 {
1058 tmp.set(valueString);
1059 }
1060 catch (BadDateTimeFormat&)
1061 {
1062 throw XmlSemanticError(lineNumber, "Bad datetime value");
1063 }
1064
1065 return CIMValue(tmp);
1066 }
1067
1068 mike 1.23 case CIMType::REAL32:
1069 {
1070 Real64 x;
1071
1072 if (!stringToReal(valueString, x))
|
1073 kumpf 1.43 throw XmlSemanticError(lineNumber, "Bad real number value");
|
1074 mike 1.23
1075 return CIMValue(Real32(x));
1076 }
1077
1078 case CIMType::REAL64:
1079 {
1080 Real64 x;
1081
1082 if (!stringToReal(valueString, x))
|
1083 kumpf 1.43 throw XmlSemanticError(lineNumber, "Bad real number value");
|
1084 mike 1.23
1085 return CIMValue(x);
1086 }
1087
1088 default:
1089 break;
1090 }
1091
1092 throw XmlSemanticError(lineNumber, "malformed XML");
1093 return false;
1094 }
1095
1096 //------------------------------------------------------------------------------
1097 //
1098 // getValueElement()
1099 //
1100 // <!ELEMENT VALUE (#PCDATA)>
1101 //
|
1102 karl 1.35 // Return: false if no value element.
1103 //
|
1104 mike 1.23 //------------------------------------------------------------------------------
1105
1106 Boolean XmlReader::getValueElement(
1107 XmlParser& parser,
1108 CIMType type,
1109 CIMValue& value)
1110 {
|
1111 karl 1.35 // Get VALUE start tag: Return false if no VALUE start Tag
|
1112 mike 1.23
1113 XmlEntry entry;
1114 if (!testStartTagOrEmptyTag(parser, entry, "VALUE"))
1115 return false;
1116
1117 Boolean empty = entry.type == XmlEntry::EMPTY_TAG;
1118
1119 const char* valueString = "";
1120
1121 if (!empty)
1122 {
1123 if (testContentOrCData(parser, entry))
1124 valueString = entry.text;
1125
1126 expectEndTag(parser, "VALUE");
1127 }
1128
1129 value = stringToValue(parser.getLine(), valueString,type);
|
1130 karl 1.33
|
1131 mike 1.23 return true;
1132 }
1133
1134 //------------------------------------------------------------------------------
1135 //
1136 // getStringValueElement()
1137 //
1138 // <!ELEMENT VALUE (#PCDATA)>
1139 //
1140 //------------------------------------------------------------------------------
1141
1142 Boolean XmlReader::getStringValueElement(
1143 XmlParser& parser,
1144 String& str,
1145 Boolean required)
1146 {
1147 XmlEntry entry;
1148
1149 if (!testStartTagOrEmptyTag(parser, entry, "VALUE"))
1150 {
1151 if (required)
1152 mike 1.23 throw XmlValidationError(parser.getLine(),"Expected VALUE element");
1153 return false;
1154 }
1155
1156 Boolean empty = entry.type == XmlEntry::EMPTY_TAG;
1157
1158 const char* valueString = "";
1159
1160 if (!empty)
1161 {
1162 if (testContentOrCData(parser, entry))
1163 valueString = entry.text;
1164
1165 expectEndTag(parser, "VALUE");
1166 }
1167
1168 str = valueString;
1169 return true;
1170 }
1171
1172 //----------------------------------------------------------------------------
1173 mike 1.23 //
1174 // getPropertyValue
|
1175 kumpf 1.30 // Use: Decode property value from SetProperty request and
1176 // GetProperty response.
|
1177 mike 1.23 //
|
1178 kumpf 1.30 // PropertyValue is one of:
|
1179 mike 1.23 //
1180 //
|
1181 karl 1.33 // <!ELEMENT VALUE.ARRAY (VALUE*)>
1182 //
1183 // <!ELEMENT VALUE.REFERENCE (CLASSPATH|LOCALCLASSPATH|CLASSNAME|
|
1184 kumpf 1.30 // <!ELEMENT VALUE.ARRAY (VALUE*)>
1185 //
1186 // <!ELEMENT VALUE.REFERENCE (CLASSPATH|LOCALCLASSPATH|CLASSNAME|
|
1187 mike 1.23 // INSTANCEPATH|LOCALINSTANCEPATH|INSTANCENAME)>
1188 //
|
1189 kumpf 1.30 // <!ELEMENT VALUE.REFARRAY (VALUE.REFERENCE*)>
1190 //
|
1191 mike 1.23 //----------------------------------------------------------------------------
1192 Boolean XmlReader::getPropertyValue(
1193 XmlParser& parser,
1194 CIMValue& cimValue)
1195 {
|
1196 kumpf 1.30 // Can not test for value type, so assume String
1197 const CIMType type = CIMType::STRING;
|
1198 mike 1.23
|
1199 kumpf 1.30 // Test for VALUE element
|
1200 mike 1.23 if (XmlReader::getValueElement(parser, type, cimValue))
1201 {
1202 return true;
1203 }
1204
|
1205 kumpf 1.30 // Test for VALUE.ARRAY element
1206 if (XmlReader::getValueArrayElement(parser, type, cimValue))
1207 {
|
1208 mike 1.23 return true;
|
1209 kumpf 1.30 }
|
1210 mike 1.23
|
1211 kumpf 1.30 // Test for VALUE.REFERENCE element
|
1212 kumpf 1.54 CIMObjectPath reference;
|
1213 kumpf 1.30 if (XmlReader::getValueReferenceElement(parser, reference))
|
1214 mike 1.25 {
1215 cimValue.set(reference);
1216 return true;
1217 }
|
1218 mike 1.23
|
1219 kumpf 1.30 // Test for VALUE.REFARRAY element
1220 if (XmlReader::getValueReferenceArrayElement(parser, cimValue))
1221 {
1222 return true;
1223 }
1224
1225 return false;
|
1226 mike 1.23 }
1227
1228 //------------------------------------------------------------------------------
1229 //
1230 // stringArrayToValue()
1231 //
1232 //------------------------------------------------------------------------------
1233
1234 template<class T>
1235 CIMValue StringArrayToValueAux(
1236 Uint32 lineNumber,
1237 const Array<const char*>& stringArray,
1238 CIMType type,
1239 T*)
1240 {
1241 Array<T> array;
1242
1243 for (Uint32 i = 0, n = stringArray.size(); i < n; i++)
1244 {
1245 CIMValue value = XmlReader::stringToValue(
1246 lineNumber, stringArray[i], type);
1247 mike 1.23
1248 T x;
1249 value.get(x);
1250 array.append(x);
1251 }
1252
1253 return CIMValue(array);
1254 }
1255
1256 CIMValue XmlReader::stringArrayToValue(
1257 Uint32 lineNumber,
1258 const Array<const char*>& array,
1259 CIMType type)
1260 {
1261 switch (type)
1262 {
1263 case CIMType::BOOLEAN:
1264 return StringArrayToValueAux(lineNumber, array, type, (Boolean*)0);
1265
1266 case CIMType::STRING:
1267 return StringArrayToValueAux(lineNumber, array, type, (String*)0);
1268 mike 1.23
1269 case CIMType::CHAR16:
1270 return StringArrayToValueAux(lineNumber, array, type, (Char16*)0);
1271
1272 case CIMType::UINT8:
1273 return StringArrayToValueAux(lineNumber, array, type, (Uint8*)0);
1274
1275 case CIMType::UINT16:
1276 return StringArrayToValueAux(lineNumber, array, type, (Uint16*)0);
1277
1278 case CIMType::UINT32:
1279 return StringArrayToValueAux(lineNumber, array, type, (Uint32*)0);
1280
1281 case CIMType::UINT64:
1282 return StringArrayToValueAux(lineNumber, array, type, (Uint64*)0);
1283
1284 case CIMType::SINT8:
1285 return StringArrayToValueAux(lineNumber, array, type, (Sint8*)0);
1286
1287 case CIMType::SINT16:
1288 return StringArrayToValueAux(lineNumber, array, type, (Sint16*)0);
1289 mike 1.23
1290 case CIMType::SINT32:
1291 return StringArrayToValueAux(lineNumber, array, type, (Sint32*)0);
1292
1293 case CIMType::SINT64:
1294 return StringArrayToValueAux(lineNumber, array, type, (Sint64*)0);
1295
1296 case CIMType::DATETIME:
1297 return StringArrayToValueAux(lineNumber, array, type, (CIMDateTime*)0);
1298
1299 case CIMType::REAL32:
1300 return StringArrayToValueAux(lineNumber, array, type, (Real32*)0);
1301
1302 case CIMType::REAL64:
1303 return StringArrayToValueAux(lineNumber, array, type, (Real64*)0);
1304
1305 default:
1306 break;
1307 }
1308
1309 // Unreachable:
1310 mike 1.23 return CIMValue();
1311 }
1312
1313 //------------------------------------------------------------------------------
1314 //
1315 // getValueArrayElement()
1316 //
1317 // <!ELEMENT VALUE.ARRAY (VALUE*)>
1318 //
|
1319 karl 1.35 // Return: Boolean. Returns false if there is no VALUE.ARRAY start element
1320 //
|
1321 mike 1.23 //------------------------------------------------------------------------------
1322
1323 Boolean XmlReader::getValueArrayElement(
1324 XmlParser& parser,
1325 CIMType type,
1326 CIMValue& value)
1327 {
|
1328 karl 1.35 // Clears any values from the Array. Assumes this is array CIMValue
|
1329 mike 1.23 value.clear();
1330
1331 // Get VALUE.ARRAY open tag:
1332
1333 XmlEntry entry;
|
1334 kumpf 1.32 Array<const char*> stringArray;
|
1335 mike 1.23
|
1336 karl 1.35 // If no VALUE.ARRAY start tag, return false
|
1337 mike 1.23 if (!testStartTagOrEmptyTag(parser, entry, "VALUE.ARRAY"))
1338 return false;
|
1339 karl 1.33
|
1340 kumpf 1.32 if (entry.type != XmlEntry::EMPTY_TAG)
1341 {
1342 // For each VALUE element:
|
1343 mike 1.23
|
1344 kumpf 1.32 while (testStartTagOrEmptyTag(parser, entry, "VALUE"))
1345 {
1346 if (entry.type == XmlEntry::EMPTY_TAG)
1347 {
1348 stringArray.append("");
1349 continue;
1350 }
|
1351 mike 1.23
|
1352 kumpf 1.32 if (testContentOrCData(parser, entry))
1353 stringArray.append(entry.text);
1354 else
1355 stringArray.append("");
|
1356 mike 1.23
|
1357 kumpf 1.32 expectEndTag(parser, "VALUE");
1358 }
|
1359 mike 1.23
|
1360 kumpf 1.32 expectEndTag(parser, "VALUE.ARRAY");
|
1361 mike 1.23 }
1362
1363 value = stringArrayToValue(parser.getLine(), stringArray, type);
1364 return true;
1365 }
1366
1367 //------------------------------------------------------------------------------
1368 //
1369 // getFlavor()
1370 //
1371 // <!ENTITY % QualifierFlavor
1372 // "OVERRIDABLE (true|false) 'true'
1373 // TOSUBCLASS (true|false) 'true'
1374 // TOINSTANCE (true|false) 'false'
1375 // TRANSLATABLE (true|false) 'false'">
1376 //
1377 //------------------------------------------------------------------------------
1378
1379 Uint32 XmlReader::getFlavor(
1380 XmlEntry& entry,
1381 Uint32 lineNumber,
1382 mike 1.23 const char* tagName)
1383 {
1384 // Get QUALIFIER.OVERRIDABLE
1385
1386 Boolean overridable = getCimBooleanAttribute(
1387 lineNumber, entry, tagName, "OVERRIDABLE", true, false);
1388
1389 // Get QUALIFIER.TOSUBCLASS
1390
1391 Boolean toSubClass = getCimBooleanAttribute(
1392 lineNumber, entry, tagName, "TOSUBCLASS", true, false);
1393
1394 // Get QUALIFIER.TOINSTANCE
1395
1396 Boolean toInstance = getCimBooleanAttribute(
1397 lineNumber, entry, tagName, "TOINSTANCE", false, false);
1398
1399 // Get QUALIFIER.TRANSLATABLE
1400
1401 Boolean translatable = getCimBooleanAttribute(
1402 lineNumber, entry, tagName, "TRANSLATABLE", false, false);
1403 mike 1.23
|
1404 kumpf 1.44 // Start with CIMFlavor::NONE. Defaults are specified in the
1405 // getCimBooleanAttribute() calls above.
|
1406 kumpf 1.36 Uint32 flavor = CIMFlavor::NONE;
|
1407 mike 1.23
1408 if (overridable)
1409 flavor |= CIMFlavor::OVERRIDABLE;
|
1410 karl 1.47 else
1411 flavor |= CIMFlavor::DISABLEOVERRIDE;
|
1412 mike 1.23
1413 if (toSubClass)
1414 flavor |= CIMFlavor::TOSUBCLASS;
|
1415 karl 1.47 else
1416 flavor |= CIMFlavor::RESTRICTED;
|
1417 mike 1.23
1418 if (toInstance)
1419 flavor |= CIMFlavor::TOINSTANCE;
1420
1421 if (translatable)
1422 flavor |= CIMFlavor::TRANSLATABLE;
1423
1424 return flavor;
1425 }
1426
1427 //------------------------------------------------------------------------------
1428 //
1429 // getOptionalScope()
1430 //
1431 // DTD:
1432 // <!ELEMENT SCOPE EMPTY>
1433 // <!ATTLIST SCOPE
1434 // CLASS (true|false) 'false'
1435 // ASSOCIATION (true|false) 'false'
1436 // REFERENCE (true|false) 'false'
1437 // PROPERTY (true|false) 'false'
1438 mike 1.23 // METHOD (true|false) 'false'
1439 // PARAMETER (true|false) 'false'
1440 // INDICATION (true|false) 'false'>
1441 //
1442 //------------------------------------------------------------------------------
1443
1444 Uint32 XmlReader::getOptionalScope(XmlParser& parser)
1445 {
1446 XmlEntry entry;
1447
1448 if (!parser.next(entry))
1449 return false;
1450
1451 Boolean isEmptyTag = entry.type == XmlEntry::EMPTY_TAG;
1452
1453 if ((!isEmptyTag &&
1454 entry.type != XmlEntry::START_TAG) ||
1455 strcmp(entry.text, "SCOPE") != 0)
1456 {
1457 parser.putBack(entry);
1458 return 0;
1459 mike 1.23 }
1460
1461 Uint32 line = parser.getLine();
1462 Uint32 scope = 0;
1463
1464 if (getCimBooleanAttribute(line, entry, "SCOPE", "CLASS", false, false))
1465 scope |= CIMScope::CLASS;
1466
1467 if (getCimBooleanAttribute(
1468 line, entry, "SCOPE", "ASSOCIATION", false, false))
1469 scope |= CIMScope::ASSOCIATION;
1470
1471 if (getCimBooleanAttribute(
1472 line, entry, "SCOPE", "REFERENCE", false, false))
1473 scope |= CIMScope::REFERENCE;
1474
1475 if (getCimBooleanAttribute(line, entry, "SCOPE", "PROPERTY", false, false))
1476 scope |= CIMScope::PROPERTY;
1477
1478 if (getCimBooleanAttribute(line, entry, "SCOPE", "METHOD", false, false))
1479 scope |= CIMScope::METHOD;
1480 mike 1.23
1481 if (getCimBooleanAttribute(line, entry, "SCOPE", "PARAMETER", false, false))
1482 scope |= CIMScope::PARAMETER;
1483
1484 if (getCimBooleanAttribute(line, entry, "SCOPE", "INDICATION",false, false))
1485 scope |= CIMScope::INDICATION;
1486
1487 if (!isEmptyTag)
1488 expectEndTag(parser, "SCOPE");
1489
1490 return scope;
1491 }
1492
1493 //------------------------------------------------------------------------------
1494 //
1495 // getQualifierElement()
1496 //
|
1497 kumpf 1.52 // <!ELEMENT QUALIFIER (VALUE|VALUE.ARRAY)?>
|
1498 mike 1.23 // <!ATTLIST QUALIFIER
1499 // %CIMName;
1500 // %CIMType; #REQUIRED
1501 // %Propagated;
1502 // %QualifierFlavor;>
1503 //
1504 //------------------------------------------------------------------------------
1505
1506 Boolean XmlReader::getQualifierElement(
1507 XmlParser& parser,
1508 CIMQualifier& qualifier)
1509 {
1510 // Get QUALIFIER element:
1511
1512 XmlEntry entry;
1513 if (!testStartTag(parser, entry, "QUALIFIER"))
1514 return false;
1515
1516 // Get QUALIFIER.NAME attribute:
1517
1518 String name = getCimNameAttribute(parser.getLine(), entry, "QUALIFIER");
1519 mike 1.23
1520 // Get QUALIFIER.TYPE attribute:
1521
1522 CIMType type = getCimTypeAttribute(parser.getLine(), entry, "QUALIFIER");
1523
1524 // Get QUALIFIER.PROPAGATED
1525
1526 Boolean propagated = getCimBooleanAttribute(
1527 parser.getLine(), entry, "QUALIFIER", "PROPAGATED", false, false);
1528
1529 // Get flavor oriented attributes:
1530
1531 Uint32 flavor = getFlavor(entry, parser.getLine(), "QUALIFIER");
1532
1533 // Get VALUE or VALUE.ARRAY element:
1534
1535 CIMValue value;
1536
1537 if (!getValueElement(parser, type, value) &&
1538 !getValueArrayElement(parser, type, value))
1539 {
|
1540 kumpf 1.52 value.setNullValue(type, false);
|
1541 mike 1.23 }
1542
1543 // Expect </QUALIFIER>:
1544
1545 expectEndTag(parser, "QUALIFIER");
1546
1547 // Build qualifier:
1548
1549 qualifier = CIMQualifier(name, value, flavor, propagated);
1550 return true;
1551 }
1552
1553 //------------------------------------------------------------------------------
1554 //
1555 // getQualifierElements()
1556 //
1557 //------------------------------------------------------------------------------
1558
1559 template<class CONTAINER>
1560 void getQualifierElements(XmlParser& parser, CONTAINER& container)
1561 {
1562 mike 1.23 CIMQualifier qualifier;
1563
1564 while (XmlReader::getQualifierElement(parser, qualifier))
1565 {
1566 try
1567 {
1568 container.addQualifier(qualifier);
1569 }
1570 catch (AlreadyExists&)
1571 {
1572 throw XmlSemanticError(parser.getLine(), "duplicate qualifier");
1573 }
1574 }
1575 }
1576
1577 //------------------------------------------------------------------------------
1578 //
1579 // getPropertyElement()
1580 //
1581 // <!ELEMENT PROPERTY (QUALIFIER*,VALUE?)>
1582 // <!ATTLIST PROPERTY
1583 mike 1.23 // %CIMName;
1584 // %ClassOrigin;
1585 // %Propagated;
1586 // %CIMType; #REQUIRED>
1587 //
1588 //------------------------------------------------------------------------------
1589
1590 Boolean XmlReader::getPropertyElement(XmlParser& parser, CIMProperty& property)
1591 {
1592 XmlEntry entry;
1593
1594 if (!testStartTagOrEmptyTag(parser, entry, "PROPERTY"))
1595 return false;
1596
1597 Boolean empty = entry.type == XmlEntry::EMPTY_TAG;
1598
1599 // Get PROPERTY.NAME attribute:
1600
1601 String name = getCimNameAttribute(parser.getLine(), entry, "PROPERTY");
1602
1603 // Get PROPERTY.CLASSORIGIN attribute:
1604 mike 1.23
1605 String classOrigin =
1606 getClassOriginAttribute(parser.getLine(), entry, "PROPERTY");
1607
1608 // Get PROPERTY.PROPAGATED
1609
1610 Boolean propagated = getCimBooleanAttribute(
1611 parser.getLine(), entry, "PROPERTY", "PROPAGATED", false, false);
1612
1613 // Get PROPERTY.TYPE attribute:
1614
1615 CIMType type = getCimTypeAttribute(parser.getLine(), entry, "PROPERTY");
1616
|
1617 karl 1.35 // Create property: Sets type and !isarray
|
1618 mike 1.23
|
1619 kumpf 1.56 CIMValue value(type, false);
1620 property = CIMProperty(name, value, 0, String(), classOrigin, propagated);
|
1621 mike 1.23
1622 if (!empty)
1623 {
1624 // Get qualifiers:
1625
1626 getQualifierElements(parser, property);
1627
|
1628 karl 1.35 // Get value: Insert value if getValueElement exists (returns True)
|
1629 mike 1.23
1630 if (getValueElement(parser, type, value))
1631 property.setValue(value);
1632
1633 expectEndTag(parser, "PROPERTY");
1634 }
1635
1636 return true;
1637 }
1638
1639 //------------------------------------------------------------------------------
1640 //
1641 // getArraySizeAttribute()
1642 //
1643 // Returns true if able to get array-size. Note that array size will
1644 // always be a positive integer.
1645 //
1646 // <!ENTITY % ArraySize "ARRAYSIZE CDATA #IMPLIED">
1647 //
1648 //------------------------------------------------------------------------------
1649
1650 mike 1.23 Boolean XmlReader::getArraySizeAttribute(
1651 Uint32 lineNumber,
1652 const XmlEntry& entry,
1653 const char* tagName,
1654 Uint32& value)
1655 {
1656 const char* tmp;
1657
1658 if (!entry.getAttributeValue("ARRAYSIZE", tmp))
1659 return false;
1660
1661 Uint64 arraySize;
1662
1663 if (!stringToUnsignedInteger(tmp, arraySize) || arraySize == 0)
1664 {
1665 char message[128];
1666 sprintf(message, "Illegal value for %s.%s", tagName, "ARRAYSIZE");
1667 throw XmlSemanticError(lineNumber, message);
1668 }
1669
1670 value = Uint32(arraySize);
1671 mike 1.23 return true;
1672 }
1673
1674 //------------------------------------------------------------------------------
1675 //
1676 // getPropertyArrayElement()
1677 //
1678 // <!ELEMENT PROPERTY.ARRAY (QUALIFIER*,VALUE.ARRAY?)>
1679 // <!ATTLIST PROPERTY.ARRAY
1680 // %CIMName;
1681 // %CIMType; #REQUIRED
1682 // %ArraySize;
1683 // %ClassOrigin;
1684 // %Propagated;>
1685 //
1686 //------------------------------------------------------------------------------
1687
1688 Boolean XmlReader::getPropertyArrayElement(
1689 XmlParser& parser,
1690 CIMProperty& property)
1691 {
1692 mike 1.23 // Get PROPERTY element:
1693
1694 XmlEntry entry;
1695
1696 if (!testStartTagOrEmptyTag(parser, entry, "PROPERTY.ARRAY"))
1697 return false;
1698
1699 Boolean empty = entry.type == XmlEntry::EMPTY_TAG;
1700
1701 // Get PROPERTY.NAME attribute:
1702
1703 String name =
1704 getCimNameAttribute(parser.getLine(), entry, "PROPERTY.ARRAY");
1705
1706 // Get PROPERTY.TYPE attribute:
1707
1708 CIMType type = getCimTypeAttribute(parser.getLine(), entry, "PROPERTY.ARRAY");
1709
1710 // Get PROPERTY.ARRAYSIZE attribute:
1711
1712 Uint32 arraySize = 0;
1713 mike 1.23 getArraySizeAttribute(parser.getLine(), entry, "PROPERTY.ARRAY", arraySize);
1714
1715 // Get PROPERTY.CLASSORIGIN attribute:
1716
1717 String classOrigin
1718 = getClassOriginAttribute(parser.getLine(), entry, "PROPERTY.ARRAY");
1719
1720 // Get PROPERTY.ARRAY.PROPAGATED
1721
1722 Boolean propagated = getCimBooleanAttribute(
1723 parser.getLine(), entry, "PROPERTY.ARRAY", "PROPAGATED", false, false);
1724
1725 // Create property:
1726
|
1727 kumpf 1.56 CIMValue value(type, true, arraySize);
|
1728 mike 1.23 property = CIMProperty(
|
1729 kumpf 1.56 name, value, arraySize, String(), classOrigin, propagated);
|
1730 mike 1.23
1731 if (!empty)
1732 {
1733 // Get qualifiers:
1734
1735 getQualifierElements(parser, property);
1736
1737 // Get value:
1738
1739 if (getValueArrayElement(parser, type, value))
1740 {
1741 if (arraySize && arraySize != value.getArraySize())
1742 {
1743 throw XmlSemanticError(parser.getLine(),
1744 "ARRAYSIZE attribute and value-array size are different");
1745 }
1746
1747 property.setValue(value);
1748 }
1749
1750 expectEndTag(parser, "PROPERTY.ARRAY");
1751 mike 1.23 }
1752
1753 return true;
1754 }
1755
1756 //------------------------------------------------------------------------------
1757 //
1758 // getHostElement()
1759 //
1760 // <!ELEMENT HOST (#PCDATA)>
1761 //
1762 //------------------------------------------------------------------------------
1763
1764 Boolean XmlReader::getHostElement(
1765 XmlParser& parser,
1766 String& host)
1767 {
1768 XmlEntry entry;
1769
1770 if (!testStartTag(parser, entry, "HOST"))
1771 return false;
1772 mike 1.23
1773 if (!parser.next(entry) || entry.type != XmlEntry::CONTENT)
1774 {
1775 throw XmlValidationError(parser.getLine(),
1776 "expected content of HOST element");
1777 }
1778
1779 host = entry.text;
1780
1781 expectEndTag(parser, "HOST");
1782 return true;
1783 }
1784
1785 //------------------------------------------------------------------------------
1786 //
1787 // getNameSpaceElement()
1788 //
1789 // <!ELEMENT NAMESPACE EMPTY>
1790 // <!ATTLIST NAMESPACE %CIMName;>
1791 //
1792 //------------------------------------------------------------------------------
1793 mike 1.23
1794 Boolean XmlReader::getNameSpaceElement(
1795 XmlParser& parser,
1796 String& nameSpaceComponent)
1797 {
1798 XmlEntry entry;
1799
1800 if (!testStartTagOrEmptyTag(parser, entry, "NAMESPACE"))
1801 return false;
1802
1803 Boolean empty = entry.type == XmlEntry::EMPTY_TAG;
1804
1805 nameSpaceComponent = getCimNameAttribute(
1806 parser.getLine(), entry, "NAMESPACE");
1807
1808 if (!empty)
1809 expectEndTag(parser, "NAMESPACE");
1810
1811 return true;
1812 }
1813
1814 mike 1.23 //------------------------------------------------------------------------------
1815 //
1816 // getLocalNameSpacePathElement()
1817 //
1818 // <!ELEMENT LOCALNAMESPACEPATH (NAMESPACE+)>
1819 //
1820 //------------------------------------------------------------------------------
1821
1822 Boolean XmlReader::getLocalNameSpacePathElement(
1823 XmlParser& parser,
1824 String& nameSpace)
1825 {
1826 XmlEntry entry;
1827
1828 if (!testStartTag(parser, entry, "LOCALNAMESPACEPATH"))
1829 return false;
1830
1831 String nameSpaceComponent;
1832
1833 while (getNameSpaceElement(parser, nameSpaceComponent))
1834 {
1835 mike 1.23 if (nameSpace.size())
1836 nameSpace += '/';
1837
1838 nameSpace += nameSpaceComponent;
1839 }
1840
1841 if (!nameSpace.size())
1842 {
1843 throw XmlValidationError(parser.getLine(),
1844 "Expected one or more NAMESPACE elements within "
1845 "LOCALNAMESPACEPATH element");
1846 }
1847
1848 expectEndTag(parser, "LOCALNAMESPACEPATH");
1849 return true;
1850 }
1851
1852 //------------------------------------------------------------------------------
1853 //
1854 // getNameSpacePathElement()
1855 //
1856 mike 1.23 // <!ELEMENT NAMESPACEPATH (HOST,LOCALNAMESPACEPATH)>
1857 //
1858 //------------------------------------------------------------------------------
1859
1860 Boolean XmlReader::getNameSpacePathElement(
1861 XmlParser& parser,
1862 String& host,
1863 String& nameSpace)
1864 {
1865 host.clear();
1866 nameSpace.clear();
1867
1868 XmlEntry entry;
1869
1870 if (!testStartTag(parser, entry, "NAMESPACEPATH"))
1871 return false;
1872
1873 if (!getHostElement(parser, host))
1874 throw XmlValidationError(parser.getLine(), "expected HOST element");
1875
1876 if (!getLocalNameSpacePathElement(parser, nameSpace))
1877 mike 1.23 {
1878 throw XmlValidationError(parser.getLine(),
1879 "expected LOCALNAMESPACEPATH element");
1880 }
1881
1882 expectEndTag(parser, "NAMESPACEPATH");
1883
1884 return true;
1885 }
1886
1887 //------------------------------------------------------------------------------
1888 //
1889 // getClassNameElement()
1890 //
1891 // <!ELEMENT CLASSNAME EMPTY>
1892 // <!ATTLIST CLASSNAME %CIMName;>
1893 //
1894 //------------------------------------------------------------------------------
1895
1896 Boolean XmlReader::getClassNameElement(
1897 XmlParser& parser,
1898 mike 1.23 String& className,
1899 Boolean required)
1900 {
1901 XmlEntry entry;
1902
1903 if (!testStartTagOrEmptyTag(parser, entry, "CLASSNAME"))
1904 {
1905 if (required)
1906 {
1907 throw XmlValidationError(parser.getLine(),
1908 "expected CLASSNAME element");
1909 }
1910 else
1911 return false;
1912 }
1913
1914 Boolean empty = entry.type == XmlEntry::EMPTY_TAG;
1915
1916 className = getCimNameAttribute(
1917 parser.getLine(), entry, "CLASSNAME", true);
1918
1919 mike 1.23 if (!empty)
1920 expectEndTag(parser, "CLASSNAME");
1921
1922 return true;
1923 }
1924
1925 //------------------------------------------------------------------------------
1926 //
1927 // getValueTypeAttribute()
1928 //
1929 // VALUETYPE (string|boolean|numeric) 'string'
1930 //
1931 //------------------------------------------------------------------------------
1932
1933 KeyBinding::Type XmlReader::getValueTypeAttribute(
1934 Uint32 lineNumber,
1935 const XmlEntry& entry,
1936 const char* elementName)
1937 {
1938 String tmp;
1939
1940 mike 1.23 if (!entry.getAttributeValue("VALUETYPE", tmp))
1941 return KeyBinding::STRING;
1942
1943 if (String::equal(tmp, "string"))
1944 return KeyBinding::STRING;
1945 else if (String::equal(tmp, "boolean"))
1946 return KeyBinding::BOOLEAN;
1947 else if (String::equal(tmp, "numeric"))
1948 return KeyBinding::NUMERIC;
1949
1950 char buffer[MESSAGE_SIZE];
1951
1952 sprintf(buffer,
1953 "Illegal value for %s.VALUETYPE attribute; "
1954 "CIMValue must be one of \"string\", \"boolean\", or \"numeric\"",
1955 elementName);
1956
1957 throw XmlSemanticError(lineNumber, buffer);
1958 return KeyBinding::BOOLEAN;
1959 }
1960
1961 mike 1.23 //------------------------------------------------------------------------------
1962 //
1963 // getKeyValueElement()
1964 //
1965 // <!ELEMENT KEYVALUE (#PCDATA)>
1966 // <!ATTLIST KEYVALUE
1967 // VALUETYPE (string|boolean|numeric) 'string'>
1968 //
1969 //------------------------------------------------------------------------------
1970
1971 Boolean XmlReader::getKeyValueElement(
1972 XmlParser& parser,
1973 KeyBinding::Type& type,
1974 String& value)
1975 {
1976 XmlEntry entry;
1977
1978 if (!testStartTagOrEmptyTag(parser, entry, "KEYVALUE"))
1979 return false;
1980
1981 Boolean empty = entry.type == XmlEntry::EMPTY_TAG;
1982 mike 1.23
1983 type = getValueTypeAttribute(parser.getLine(), entry, "KEYVALUE");
1984
1985 value.clear();
1986
1987 if (!empty)
1988 {
1989 if (!parser.next(entry))
1990 throw XmlException(XmlException::UNCLOSED_TAGS, parser.getLine());
1991
1992 if (entry.type == XmlEntry::CONTENT)
1993 value = entry.text;
1994 else
1995 parser.putBack(entry);
1996
1997 expectEndTag(parser, "KEYVALUE");
1998 }
1999
2000 return true;
2001 }
2002
2003 mike 1.23 //------------------------------------------------------------------------------
2004 //
2005 // getKeyBindingElement()
2006 //
2007 // <!ELEMENT KEYBINDING (KEYVALUE|VALUE.REFERENCE)>
2008 // <!ATTLIST KEYBINDING
2009 // %CIMName;>
2010 //
2011 //------------------------------------------------------------------------------
2012
2013 Boolean XmlReader::getKeyBindingElement(
2014 XmlParser& parser,
2015 String& name,
2016 String& value,
2017 KeyBinding::Type& type)
2018 {
2019 XmlEntry entry;
2020
2021 if (!testStartTag(parser, entry, "KEYBINDING"))
2022 return false;
2023
2024 mike 1.23 name = getCimNameAttribute(parser.getLine(), entry, "KEYBINDING");
2025
2026 if (!getKeyValueElement(parser, type, value))
|
2027 mike 1.25 {
|
2028 kumpf 1.54 CIMObjectPath reference;
|
2029 mike 1.25
2030 if (!getValueReferenceElement(parser, reference))
2031 {
2032 throw XmlValidationError(parser.getLine(),
2033 "Expected KEYVALUE or VALUE.REFERENCE element");
2034 }
2035
2036 type = KeyBinding::REFERENCE;
2037 value = reference.toString();
2038 }
|
2039 mike 1.23
2040 expectEndTag(parser, "KEYBINDING");
2041 return true;
2042 }
2043
2044 //------------------------------------------------------------------------------
2045 //
2046 // getInstanceNameElement()
2047 //
2048 // <!ELEMENT INSTANCENAME (KEYBINDING*|KEYVALUE?|VALUE.REFERENCE?)>
2049 // <!ATTLIST INSTANCENAME
2050 // %ClassName;>
2051 //
|
2052 mike 1.25 // Note: An empty key name is used in the keyBinding when the INSTANCENAME is
2053 // specified using a KEYVALUE or a VALUE.REFERENCE.
|
2054 mike 1.23 //
2055 //------------------------------------------------------------------------------
2056
2057 Boolean XmlReader::getInstanceNameElement(
2058 XmlParser& parser,
2059 String& className,
2060 Array<KeyBinding>& keyBindings)
2061 {
2062 className.clear();
2063 keyBindings.clear();
2064
2065 XmlEntry entry;
2066
2067 if (!testStartTagOrEmptyTag(parser, entry, "INSTANCENAME"))
2068 return false;
2069
2070 Boolean empty = entry.type == XmlEntry::EMPTY_TAG;
2071
2072 className = getClassNameAttribute(parser.getLine(), entry, "INSTANCENAME");
2073
|
2074 mike 1.25 if (empty)
|
2075 mike 1.23 {
|
2076 mike 1.25 return true;
2077 }
|
2078 mike 1.23
|
2079 mike 1.25 String name;
2080 KeyBinding::Type type;
2081 String value;
|
2082 kumpf 1.54 CIMObjectPath reference;
|
2083 mike 1.25
2084 if (getKeyValueElement(parser, type, value))
2085 {
2086 // Use empty key name because none was specified
2087 keyBindings.append(KeyBinding(name, value, type));
2088 }
2089 else if (getValueReferenceElement(parser, reference))
2090 {
2091 // Use empty key name because none was specified
2092 type = KeyBinding::REFERENCE;
2093 value = reference.toString();
2094 keyBindings.append(KeyBinding(name, value, type));
2095 }
2096 else
2097 {
|
2098 mike 1.23 while (getKeyBindingElement(parser, name, value, type))
2099 keyBindings.append(KeyBinding(name, value, type));
|
2100 mike 1.25 }
|
2101 mike 1.23
|
2102 mike 1.25 expectEndTag(parser, "INSTANCENAME");
|
2103 mike 1.23
2104 return true;
2105 }
2106
2107 Boolean XmlReader::getInstanceNameElement(
2108 XmlParser& parser,
|
2109 kumpf 1.54 CIMObjectPath& instanceName)
|
2110 mike 1.23 {
2111 String className;
2112 Array<KeyBinding> keyBindings;
2113
2114 if (!XmlReader::getInstanceNameElement(parser, className, keyBindings))
2115 return false;
2116
2117 instanceName.set(String(), String(), className, keyBindings);
2118 return true;
2119 }
2120
2121 //------------------------------------------------------------------------------
2122 //
2123 // getInstancePathElement()
2124 //
2125 // <!ELEMENT INSTANCEPATH (NAMESPACEPATH,INSTANCENAME)>
2126 //
2127 //------------------------------------------------------------------------------
2128
2129 Boolean XmlReader::getInstancePathElement(
2130 XmlParser& parser,
|
2131 kumpf 1.54 CIMObjectPath& reference)
|
2132 mike 1.23 {
2133 XmlEntry entry;
2134
2135 if (!testStartTag(parser, entry, "INSTANCEPATH"))
2136 return false;
2137
2138 String host;
2139 String nameSpace;
2140
2141 if (!getNameSpacePathElement(parser, host, nameSpace))
2142 {
2143 throw XmlValidationError(parser.getLine(),
2144 "expected NAMESPACEPATH element");
2145 }
2146
2147 String className;
2148 Array<KeyBinding> keyBindings;
2149
2150 if (!getInstanceNameElement(parser, className, keyBindings))
2151 {
2152 throw XmlValidationError(parser.getLine(),
2153 mike 1.23 "expected INSTANCENAME element");
2154 }
2155
2156 reference.set(host, nameSpace, className, keyBindings);
2157
2158 expectEndTag(parser, "INSTANCEPATH");
2159 return true;
2160 }
2161
2162 //------------------------------------------------------------------------------
2163 //
2164 // getLocalInstancePathElement()
2165 //
2166 // <!ELEMENT LOCALINSTANCEPATH (NAMESPACEPATH,INSTANCENAME)>
2167 //
2168 //------------------------------------------------------------------------------
2169
2170 Boolean XmlReader::getLocalInstancePathElement(
2171 XmlParser& parser,
|
2172 kumpf 1.54 CIMObjectPath& reference)
|
2173 mike 1.23 {
2174 XmlEntry entry;
2175
2176 if (!testStartTag(parser, entry, "LOCALINSTANCEPATH"))
2177 return false;
2178
2179 String nameSpace;
2180
2181 if (!getLocalNameSpacePathElement(parser, nameSpace))
2182 {
2183 throw XmlValidationError(parser.getLine(),
2184 "expected LOCALNAMESPACEPATH element");
2185 }
2186
2187 String className;
2188 Array<KeyBinding> keyBindings;
2189
2190 if (!getInstanceNameElement(parser, className, keyBindings))
2191 {
2192 throw XmlValidationError(parser.getLine(),
2193 "expected INSTANCENAME element");
2194 mike 1.23 }
2195
2196 reference.set(String(), nameSpace, className, keyBindings);
2197
2198 expectEndTag(parser, "LOCALINSTANCEPATH");
2199 return true;
2200 }
2201
2202 //------------------------------------------------------------------------------
2203 //
2204 // getClassPathElement()
2205 //
2206 // <!ELEMENT CLASSPATH (NAMESPACEPATH,CLASSNAME)>
2207 //
2208 //------------------------------------------------------------------------------
2209
2210 Boolean XmlReader::getClassPathElement(
2211 XmlParser& parser,
|
2212 kumpf 1.54 CIMObjectPath& reference)
|
2213 mike 1.23 {
2214 XmlEntry entry;
2215
2216 if (!testStartTag(parser, entry, "CLASSPATH"))
2217 return false;
2218
2219 String host;
2220 String nameSpace;
2221
2222 if (!getNameSpacePathElement(parser, host, nameSpace))
2223 {
2224 throw XmlValidationError(parser.getLine(),
2225 "expected NAMESPACEPATH element");
2226 }
2227
2228 String className;
2229
2230 if (!getClassNameElement(parser, className))
2231 {
2232 throw XmlValidationError(parser.getLine(),
2233 "expected CLASSNAME element");
2234 mike 1.23 }
2235
2236 reference.set(host, nameSpace, className);
2237
2238 expectEndTag(parser, "CLASSPATH");
2239 return true;
2240 }
2241
2242 //------------------------------------------------------------------------------
2243 //
2244 // getLocalClassPathElement()
2245 //
2246 // <!ELEMENT LOCALCLASSPATH (LOCALNAMESPACEPATH,CLASSNAME)>
2247 //
2248 //------------------------------------------------------------------------------
2249
2250 Boolean XmlReader::getLocalClassPathElement(
2251 XmlParser& parser,
|
2252 kumpf 1.54 CIMObjectPath& reference)
|
2253 mike 1.23 {
2254 XmlEntry entry;
2255
2256 if (!testStartTag(parser, entry, "LOCALCLASSPATH"))
2257 return false;
2258
2259 String nameSpace;
2260
2261 if (!getLocalNameSpacePathElement(parser, nameSpace))
2262 {
2263 throw XmlValidationError(parser.getLine(),
2264 "expected LOCALNAMESPACEPATH element");
2265 }
2266
2267 String className;
2268
2269 if (!getClassNameElement(parser, className))
2270 {
2271 throw XmlValidationError(parser.getLine(),
2272 "expected CLASSNAME element");
2273 }
2274 mike 1.23
2275 reference.set(String(), nameSpace, className);
2276
2277 expectEndTag(parser, "LOCALCLASSPATH");
2278
2279 return true;
2280 }
2281
2282 //------------------------------------------------------------------------------
2283 //
2284 // getValueReferenceElement()
2285 //
2286 // <!ELEMENT VALUE.REFERENCE (CLASSPATH|LOCALCLASSPATH|CLASSNAME|
2287 // INSTANCEPATH|LOCALINSTANCEPATH|INSTANCENAME)>
2288 //
2289 //
2290 //------------------------------------------------------------------------------
2291
2292 Boolean XmlReader::getValueReferenceElement(
2293 XmlParser& parser,
|
2294 kumpf 1.54 CIMObjectPath& reference)
|
2295 mike 1.23 {
2296 XmlEntry entry;
2297
2298 if (!testStartTag(parser, entry, "VALUE.REFERENCE"))
2299 return false;
2300
2301 if (!parser.next(entry))
2302 throw XmlException(XmlException::UNCLOSED_TAGS, parser.getLine());
2303
2304 if (entry.type != XmlEntry::START_TAG &&
2305 entry.type != XmlEntry::EMPTY_TAG)
2306 {
2307 throw XmlValidationError(parser.getLine(),
2308 "Expected one of the following start tags: "
2309 "CLASSPATH, LOCALCLASSPATH, CLASSNAME, INSTANCEPATH, "
2310 "LOCALINSTANCEPATH, INSTANCENAME");
2311 }
2312
2313 if (strcmp(entry.text, "CLASSPATH") == 0)
2314 {
2315 parser.putBack(entry);
2316 mike 1.23 getClassPathElement(parser, reference);
2317 }
2318 else if (strcmp(entry.text, "LOCALCLASSPATH") == 0)
2319 {
2320 parser.putBack(entry);
2321 getLocalClassPathElement(parser, reference);
2322 }
2323 else if (strcmp(entry.text, "CLASSNAME") == 0)
2324 {
2325 parser.putBack(entry);
2326 String className;
2327 getClassNameElement(parser, className);
2328 reference.set(String(), String(), className);
2329 }
2330 else if (strcmp(entry.text, "INSTANCEPATH") == 0)
2331 {
2332 parser.putBack(entry);
2333 getInstancePathElement(parser, reference);
2334 }
2335 else if (strcmp(entry.text, "LOCALINSTANCEPATH") == 0)
2336 {
2337 mike 1.23 parser.putBack(entry);
2338 getLocalInstancePathElement(parser, reference);
2339 }
2340 else if (strcmp(entry.text, "INSTANCENAME") == 0)
2341 {
2342 parser.putBack(entry);
2343 String className;
2344 Array<KeyBinding> keyBindings;
2345 getInstanceNameElement(parser, className, keyBindings);
2346 reference.set(String(), String(), className, keyBindings);
2347 }
2348
2349 expectEndTag(parser, "VALUE.REFERENCE");
2350 return true;
2351 }
2352
2353 //------------------------------------------------------------------------------
2354 //
|
2355 kumpf 1.28 // getValueReferenceArrayElement()
2356 //
2357 // <!ELEMENT VALUE.REFARRAY (VALUE.REFERENCE*)>
2358 //
2359 //------------------------------------------------------------------------------
2360
2361 Boolean XmlReader::getValueReferenceArrayElement(
2362 XmlParser& parser,
2363 CIMValue& value)
2364 {
2365 XmlEntry entry;
|
2366 kumpf 1.54 Array<CIMObjectPath> referenceArray;
2367 CIMObjectPath reference;
|
2368 kumpf 1.28
2369 value.clear();
2370
2371 // Get VALUE.REFARRAY open tag:
2372
2373 if (!testStartTagOrEmptyTag(parser, entry, "VALUE.REFARRAY"))
2374 return false;
2375
|
2376 kumpf 1.32 if (entry.type != XmlEntry::EMPTY_TAG)
2377 {
2378 // For each VALUE.REFERENCE element:
|
2379 kumpf 1.28
|
2380 kumpf 1.32 while (getValueReferenceElement(parser, reference))
2381 {
2382 referenceArray.append(reference);
2383 }
|
2384 kumpf 1.28
|
2385 kumpf 1.32 expectEndTag(parser, "VALUE.REFARRAY");
|
2386 kumpf 1.28 }
2387
2388 value.set(referenceArray);
2389 return true;
2390 }
2391
2392 //------------------------------------------------------------------------------
2393 //
|
2394 mike 1.23 // getPropertyReferenceElement()
2395 //
2396 // <!ELEMENT PROPERTY.REFERENCE (QUALIFIER*,(VALUE.REFERENCE)?)>
2397 // <!ATTLIST PROPERTY.REFERENCE
2398 // %CIMName;
2399 // %ReferenceClass;
2400 // %ClassOrigin;
2401 // %Propagated;>
2402 //
2403 //------------------------------------------------------------------------------
2404
2405 Boolean XmlReader::getPropertyReferenceElement(
2406 XmlParser& parser,
2407 CIMProperty& property)
2408 {
2409 XmlEntry entry;
2410
2411 if (!testStartTagOrEmptyTag(parser, entry, "PROPERTY.REFERENCE"))
2412 return false;
2413
2414 Boolean empty = entry.type == XmlEntry::EMPTY_TAG;
2415 mike 1.23
2416 // Get PROPERTY.NAME attribute:
2417
2418 String name = getCimNameAttribute(
2419 parser.getLine(), entry, "PROPERTY.REFERENCE");
2420
2421 // Get PROPERTY.REFERENCECLASS attribute:
2422
2423 String referenceClass = getReferenceClassAttribute(
2424 parser.getLine(), entry, "PROPERTY.REFERENCE");
2425
2426 // Get PROPERTY.CLASSORIGIN attribute:
2427
2428 String classOrigin =
2429 getClassOriginAttribute(parser.getLine(), entry, "PROPERTY.REFERENCE");
2430
2431 // Get PROPERTY.PROPAGATED
2432
2433 Boolean propagated = getCimBooleanAttribute(parser.getLine(), entry,
2434 "PROPERTY.REFERENCE", "PROPAGATED", false, false);
2435
2436 mike 1.23 // Create property:
2437
|
2438 kumpf 1.51 CIMValue value = CIMValue(CIMType::REFERENCE, false, 0);
|
2439 kumpf 1.54 // value.set(CIMObjectPath());
|
2440 mike 1.23 property = CIMProperty(
2441 name, value, 0, referenceClass, classOrigin, propagated);
2442
2443 if (!empty)
2444 {
2445 getQualifierElements(parser, property);
2446
|
2447 kumpf 1.54 CIMObjectPath reference;
|
2448 mike 1.23
2449 if (getValueReferenceElement(parser, reference))
2450 property.setValue(reference);
2451
2452 expectEndTag(parser, "PROPERTY.REFERENCE");
2453 }
2454
2455 return true;
2456 }
2457
2458 //------------------------------------------------------------------------------
2459 //
2460 // GetPropertyElements()
2461 //
2462 //------------------------------------------------------------------------------
2463
2464 template<class CONTAINER>
2465 void GetPropertyElements(XmlParser& parser, CONTAINER& container)
2466 {
2467 CIMProperty property;
2468
2469 mike 1.23 while (XmlReader::getPropertyElement(parser, property) ||
2470 XmlReader::getPropertyArrayElement(parser, property) ||
2471 XmlReader::getPropertyReferenceElement(parser, property))
2472 {
2473 try
2474 {
2475 container.addProperty(property);
2476 }
2477 catch (AlreadyExists&)
2478 {
2479 throw XmlSemanticError(parser.getLine(), "duplicate property");
2480 }
2481 }
2482 }
2483
2484 //------------------------------------------------------------------------------
2485 //
2486 // getParameterElement()
2487 //
2488 // <!ELEMENT PARAMETER (QUALIFIER*)>
2489 // <!ATTLIST PARAMETER
2490 mike 1.23 // %CIMName;
2491 // %CIMType; #REQUIRED>
2492 //
2493 //------------------------------------------------------------------------------
2494
2495 Boolean XmlReader::getParameterElement(
2496 XmlParser& parser,
2497 CIMParameter& parameter)
2498 {
2499 XmlEntry entry;
2500
2501 if (!testStartTagOrEmptyTag(parser, entry, "PARAMETER"))
2502 return false;
2503
2504 Boolean empty = entry.type == XmlEntry::EMPTY_TAG;
2505
2506 // Get PARAMETER.NAME attribute:
2507
2508 String name = getCimNameAttribute(parser.getLine(), entry, "PARAMETER");
2509
2510 // Get PARAMETER.TYPE attribute:
2511 mike 1.23
2512 CIMType type = getCimTypeAttribute(parser.getLine(), entry, "PARAMETER");
2513
2514 // Create parameter:
2515
2516 parameter = CIMParameter(name, type);
2517
2518 if (!empty)
2519 {
2520 getQualifierElements(parser, parameter);
2521
2522 expectEndTag(parser, "PARAMETER");
2523 }
2524
2525 return true;
2526 }
2527
2528 //------------------------------------------------------------------------------
2529 //
2530 // getParameterArrayElement()
2531 //
2532 mike 1.23 // <!ELEMENT PARAMETER.ARRAY (QUALIFIER*)>
2533 // <!ATTLIST PARAMETER.ARRAY
2534 // %CIMName;
2535 // %CIMType; #REQUIRED
2536 // %ArraySize;>
2537 //
2538 //------------------------------------------------------------------------------
2539
2540 Boolean XmlReader::getParameterArrayElement(
2541 XmlParser& parser,
2542 CIMParameter& parameter)
2543 {
2544 XmlEntry entry;
2545
2546 if (!testStartTagOrEmptyTag(parser, entry, "PARAMETER.ARRAY"))
2547 return false;
2548
2549 Boolean empty = entry.type == XmlEntry::EMPTY_TAG;
2550
2551 // Get PARAMETER.ARRAY.NAME attribute:
2552
2553 mike 1.23 String name = getCimNameAttribute(
2554 parser.getLine(), entry, "PARAMETER.ARRAY");
2555
2556 // Get PARAMETER.ARRAY.TYPE attribute:
2557
2558 CIMType type = getCimTypeAttribute(parser.getLine(), entry, "PARAMETER.ARRAY");
2559
2560 // Get PARAMETER.ARRAYSIZE attribute:
2561
2562 Uint32 arraySize = 0;
2563 getArraySizeAttribute(parser.getLine(), entry, "PARAMETER.ARRAY",arraySize);
2564
2565 // Create parameter:
2566
2567 parameter = CIMParameter(name, type, true, arraySize);
2568
2569 if (!empty)
2570 {
2571 getQualifierElements(parser, parameter);
2572
2573 expectEndTag(parser, "PARAMETER.ARRAY");
2574 mike 1.23 }
2575
2576 return true;
2577 }
2578
2579 //------------------------------------------------------------------------------
2580 //
2581 // getParameterReferenceElement()
2582 //
2583 // <!ELEMENT PARAMETER.REFERENCE (QUALIFIER*)>
2584 // <!ATTLIST PARAMETER.REFERENCE
2585 // %CIMName;
2586 // %ReferenceClass;>
2587 //
2588 //------------------------------------------------------------------------------
2589
2590 Boolean XmlReader::getParameterReferenceElement(
2591 XmlParser& parser,
2592 CIMParameter& parameter)
2593 {
2594 XmlEntry entry;
2595 mike 1.23
2596 if (!testStartTagOrEmptyTag(parser, entry, "PARAMETER.REFERENCE"))
2597 return false;
2598
2599 Boolean empty = entry.type == XmlEntry::EMPTY_TAG;
2600
2601 // Get PARAMETER.NAME attribute:
2602
2603 String name = getCimNameAttribute(
2604 parser.getLine(), entry, "PARAMETER.REFERENCE");
2605
2606 // Get PARAMETER.REFERENCECLASS attribute:
2607
2608 String referenceClass = getReferenceClassAttribute(
2609 parser.getLine(), entry, "PARAMETER.REFERENCE");
2610
2611 // Create parameter:
2612
2613 parameter = CIMParameter(name, CIMType::REFERENCE, false, 0, referenceClass);
2614
2615 if (!empty)
2616 mike 1.23 {
2617 getQualifierElements(parser, parameter);
2618 expectEndTag(parser, "PARAMETER.REFERENCE");
2619 }
2620
2621 return true;
2622 }
2623
2624 //------------------------------------------------------------------------------
2625 //
|
2626 kumpf 1.26 // getParameterReferenceArrayElement()
2627 //
2628 // <!ELEMENT PARAMETER.REFARRAY (QUALIFIER*)>
2629 // <!ATTLIST PARAMETER.REFARRAY
2630 // %CIMName;
2631 // %ReferenceClass;
2632 // %ArraySize;>
2633 //
2634 //------------------------------------------------------------------------------
2635
2636 Boolean XmlReader::getParameterReferenceArrayElement(
2637 XmlParser& parser,
2638 CIMParameter& parameter)
2639 {
2640 XmlEntry entry;
2641
2642 if (!testStartTagOrEmptyTag(parser, entry, "PARAMETER.REFARRAY"))
2643 return false;
2644
2645 Boolean empty = entry.type == XmlEntry::EMPTY_TAG;
2646
2647 kumpf 1.26 // Get PARAMETER.NAME attribute:
2648
2649 String name = getCimNameAttribute(
2650 parser.getLine(), entry, "PARAMETER.REFARRAY");
2651
2652 // Get PARAMETER.REFERENCECLASS attribute:
2653
2654 String referenceClass = getReferenceClassAttribute(
2655 parser.getLine(), entry, "PARAMETER.REFARRAY");
2656
2657 // Get PARAMETER.ARRAYSIZE attribute:
2658
2659 Uint32 arraySize = 0;
2660 getArraySizeAttribute(parser.getLine(), entry, "PARAMETER.REFARRAY",
2661 arraySize);
2662
2663 // Create parameter:
2664
2665 parameter = CIMParameter(name, CIMType::REFERENCE, true, arraySize,
2666 referenceClass);
2667
2668 kumpf 1.26 if (!empty)
2669 {
2670 getQualifierElements(parser, parameter);
2671 expectEndTag(parser, "PARAMETER.REFARRAY");
2672 }
2673
2674 return true;
2675 }
2676
2677 //------------------------------------------------------------------------------
2678 //
|
2679 mike 1.23 // GetParameterElements()
2680 //
2681 //------------------------------------------------------------------------------
2682
2683 template<class CONTAINER>
2684 void GetParameterElements(XmlParser& parser, CONTAINER& container)
2685 {
2686 CIMParameter parameter;
2687
2688 while (XmlReader::getParameterElement(parser, parameter) ||
2689 XmlReader::getParameterArrayElement(parser, parameter) ||
|
2690 kumpf 1.26 XmlReader::getParameterReferenceElement(parser, parameter) ||
2691 XmlReader::getParameterReferenceArrayElement(parser, parameter))
|
2692 mike 1.23 {
2693 try
2694 {
2695 container.addParameter(parameter);
2696 }
2697 catch (AlreadyExists&)
2698 {
2699 throw XmlSemanticError(parser.getLine(), "duplicate parameter");
2700 }
2701 }
2702 }
2703
2704 //------------------------------------------------------------------------------
2705 //
2706 // getQualifierDeclElement()
2707 //
2708 // <!ELEMENT QUALIFIER.DECLARATION (SCOPE?,(VALUE|VALUE.ARRAY)?)>
2709 // <!ATTLIST QUALIFIER.DECLARATION
2710 // %CIMName;
2711 // %CIMType; #REQUIRED
2712 // ISARRAY (true|false) #IMPLIED
2713 mike 1.23 // %ArraySize;
2714 // %QualifierFlavor;>
2715 //
2716 //------------------------------------------------------------------------------
2717
2718 Boolean XmlReader::getQualifierDeclElement(
2719 XmlParser& parser,
2720 CIMQualifierDecl& qualifierDecl)
2721 {
2722 XmlEntry entry;
2723
2724 if (!testStartTagOrEmptyTag(parser, entry, "QUALIFIER.DECLARATION"))
2725 return false;
2726
2727 Boolean empty = entry.type == XmlEntry::EMPTY_TAG;
2728
2729 // Get NAME attribute:
2730
2731 String name = getCimNameAttribute(
2732 parser.getLine(), entry, "QUALIFIER.DECLARATION");
2733
2734 mike 1.23 // Get TYPE attribute:
2735
2736 CIMType type = getCimTypeAttribute(
2737 parser.getLine(), entry, "QUALIFIER.DECLARATION");
2738
2739 // Get ISARRAY attribute:
2740
|
2741 mike 1.25 Boolean isArray = getCimBooleanAttribute(
2742 parser.getLine(), entry, "QUALIFIER.DECLARATION", "ISARRAY",
2743 false, false);
|
2744 mike 1.23
2745 // Get ARRAYSIZE attribute:
2746
2747 Uint32 arraySize = 0;
2748 Boolean gotArraySize = getArraySizeAttribute(parser.getLine(),
2749 entry, "QUALIFIER.DECLARATION", arraySize);
2750
2751 // Get flavor oriented attributes:
2752
2753 Uint32 flavor = getFlavor(entry,parser.getLine(), "QUALIFIER.DECLARATION");
2754
2755 // No need to look for interior elements if empty tag:
2756
2757 Uint32 scope = CIMScope::NONE;
2758 CIMValue value;
2759
2760 if (!empty)
2761 {
2762 // Get the option SCOPE element:
2763
2764 scope = getOptionalScope(parser);
2765 mike 1.23
2766 // Get VALUE or VALUE.ARRAY element:
2767
2768 if (getValueArrayElement(parser, type, value))
2769 {
2770 if (!isArray)
2771 {
2772 throw XmlSemanticError(parser.getLine(),
2773 "VALUE.ARRAY element encountered without "
2774 "ISARRAY attribute");
2775 }
2776
2777 if (arraySize && arraySize != value.getArraySize())
2778 {
2779 throw XmlSemanticError(parser.getLine(),
2780 "VALUE.ARRAY size is not the same as "
2781 "ARRAYSIZE attribute");
2782 }
2783 }
2784 else if (getValueElement(parser, type, value))
2785 {
2786 mike 1.23 if (isArray)
2787 {
2788 throw XmlSemanticError(parser.getLine(),
2789 "ISARRAY attribute used but VALUE element encountered");
2790 }
2791 }
2792
2793 // Now get the closing tag:
2794
2795 expectEndTag(parser, "QUALIFIER.DECLARATION");
2796 }
2797
2798 if (value.getType() == CIMType::NONE)
2799 {
2800 if (isArray)
2801 value.setNullValue(type, true, arraySize);
2802 else
2803 value.setNullValue(type, false);
2804 }
2805
2806 CIMQualifierDecl tmp(name, value, scope, flavor, arraySize);
2807 mike 1.23 qualifierDecl = CIMQualifierDecl(name, value, scope, flavor, arraySize);
2808 return true;
2809 }
2810
2811 //------------------------------------------------------------------------------
2812 // getMethodElement()
2813 //
2814 // <!ELEMENT METHOD (QUALIFIER*,(PARAMETER|PARAMETER.REFERENCE|
2815 // PARAMETER.ARRAY|PARAMETER.REFARRAY)*)>
2816 // <!ATTLIST METHOD
2817 // %CIMName;
2818 // %CIMType; #IMPLIED
2819 // %ClassOrigin;
2820 // %Propagated;>
2821 //
2822 //------------------------------------------------------------------------------
2823
2824 Boolean XmlReader::getMethodElement(XmlParser& parser, CIMMethod& method)
2825 {
2826 XmlEntry entry;
2827
2828 mike 1.23 if (!testStartTagOrEmptyTag(parser, entry, "METHOD"))
2829 return false;
2830
2831 Boolean empty = entry.type == XmlEntry::EMPTY_TAG;
2832
2833 String name = getCimNameAttribute(parser.getLine(), entry, "PROPERTY");
2834
2835 CIMType type = getCimTypeAttribute(parser.getLine(), entry, "PROPERTY");
2836
2837 String classOrigin =
2838 getClassOriginAttribute(parser.getLine(), entry, "PROPERTY");
2839
2840 Boolean propagated = getCimBooleanAttribute(
2841 parser.getLine(), entry, "PROPERTY", "PROPAGATED", false, false);
2842
2843 method = CIMMethod(name, type, classOrigin, propagated);
2844
2845 if (!empty)
2846 {
|
2847 kumpf 1.26 // ATTN-RK-P2-20020219: Decoding algorithm must not depend on the
2848 // ordering of qualifiers and parameters.
|
2849 mike 1.23 getQualifierElements(parser, method);
2850
2851 GetParameterElements(parser, method);
2852
2853 expectEndTag(parser, "METHOD");
2854 }
2855
2856 return true;
2857 }
2858
2859 //------------------------------------------------------------------------------
2860 // getClassElement()
2861 //
2862 // <!ELEMENT CLASS (QUALIFIER*,
2863 // (PROPERTY|PROPERTY.ARRAY|PROPERTY.REFERENCE)*,METHOD*)>
2864 // <!ATTLIST CLASS %CIMName; %SuperClass;>
2865 //
2866 //------------------------------------------------------------------------------
2867
2868 Boolean XmlReader::getClassElement(XmlParser& parser, CIMClass& cimClass)
2869 {
2870 mike 1.23 XmlEntry entry;
2871
2872 if (!testStartTag(parser, entry, "CLASS"))
2873 return false;
2874
2875 String name = getCimNameAttribute(parser.getLine(), entry, "CLASS");
2876
2877 String superClass = getSuperClassAttribute(parser.getLine(), entry,"CLASS");
2878
2879 cimClass = CIMClass(name, superClass);
2880
2881 // Get QUALIFIER elements:
2882
2883 getQualifierElements(parser, cimClass);
2884
2885 // Get PROPERTY elements:
2886
2887 GetPropertyElements(parser, cimClass);
2888
2889 // Get METHOD elements:
2890
2891 mike 1.23 CIMMethod method;
2892
2893 while (getMethodElement(parser, method))
2894 cimClass.addMethod(method);
2895
2896 // Get CLASS end tag:
2897
2898 expectEndTag(parser, "CLASS");
2899
2900 return true;
2901 }
2902
2903 //------------------------------------------------------------------------------
2904 // getInstanceElement()
2905 //
2906 // <!ELEMENT INSTANCE (QUALIFIER*,
2907 // (PROPERTY|PROPERTY.ARRAY|PROPERTY.REFERENCE)*) >
2908 // <!ATTLIST INSTANCE
2909 // %ClassName;>
2910 //
2911 //------------------------------------------------------------------------------
2912 mike 1.23
2913 Boolean XmlReader::getInstanceElement(
2914 XmlParser& parser,
2915 CIMInstance& cimInstance)
2916 {
2917 XmlEntry entry;
2918
2919 if (!testStartTag(parser, entry, "INSTANCE"))
2920 return false;
2921
2922 String className = getClassNameAttribute(
2923 parser.getLine(), entry, "INSTANCE");
2924
2925 cimInstance = CIMInstance(className);
2926
2927 // Get QUALIFIER elements:
2928
2929 getQualifierElements(parser, cimInstance);
2930
2931 // Get PROPERTY elements:
2932
2933 mike 1.23 GetPropertyElements(parser, cimInstance);
2934
2935 // Get INSTANCE end tag:
2936
2937 expectEndTag(parser, "INSTANCE");
2938
2939 return true;
2940 }
2941
2942 //------------------------------------------------------------------------------
|
2943 mike 1.25 // getNamedInstanceElement()
2944 //
2945 // <!ELEMENT VALUE.NAMEDINSTANCE (INSTANCENAME,INSTANCE)>
2946 //
2947 //------------------------------------------------------------------------------
2948
2949 Boolean XmlReader::getNamedInstanceElement(
2950 XmlParser& parser,
|
2951 kumpf 1.55 CIMInstance& namedInstance)
|
2952 mike 1.25 {
2953 XmlEntry entry;
2954
2955 if (!testStartTag(parser, entry, "VALUE.NAMEDINSTANCE"))
2956 return false;
2957
|
2958 kumpf 1.54 CIMObjectPath instanceName;
|
2959 mike 1.25
2960 // Get INSTANCENAME elements:
2961
2962 if (!getInstanceNameElement(parser, instanceName))
2963 {
2964 throw XmlValidationError(parser.getLine(),
2965 "expected INSTANCENAME element");
2966 }
2967
2968 // Get INSTANCE elements:
2969
|
2970 kumpf 1.55 if (!getInstanceElement(parser, namedInstance))
|
2971 mike 1.25 {
2972 throw XmlValidationError(parser.getLine(),
2973 "expected INSTANCE element");
2974 }
2975
2976 // Get VALUE.NAMEDINSTANCE end tag:
2977
2978 expectEndTag(parser, "VALUE.NAMEDINSTANCE");
2979
|
2980 kumpf 1.55 namedInstance.setPath (instanceName);
|
2981 mike 1.25
2982 return true;
2983 }
2984
2985 //------------------------------------------------------------------------------
|
2986 mike 1.23 //
2987 // getObject()
2988 //
2989 //------------------------------------------------------------------------------
2990
2991 void XmlReader::getObject(XmlParser& parser, CIMClass& x)
2992 {
2993 if (!getClassElement(parser, x))
2994 {
2995 throw XmlValidationError(parser.getLine(),
2996 "expected CLASS element");
2997 }
2998 }
2999
3000 //------------------------------------------------------------------------------
3001 //
3002 // getObject()
3003 //
3004 //------------------------------------------------------------------------------
3005
3006 void XmlReader::getObject(XmlParser& parser, CIMInstance& x)
3007 mike 1.23 {
3008 if (!getInstanceElement(parser, x))
3009 {
3010 throw XmlValidationError(parser.getLine(),
3011 "expected INSTANCE element");
3012 }
3013 }
3014
3015 //------------------------------------------------------------------------------
3016 //
3017 // getObject()
3018 //
3019 //------------------------------------------------------------------------------
3020
3021 void XmlReader::getObject(XmlParser& parser, CIMQualifierDecl& x)
3022 {
3023 if (!getQualifierDeclElement(parser, x))
3024 {
3025 throw XmlValidationError(parser.getLine(),
3026 "expected QUALIFIER.DECLARATION element");
3027 }
3028 mike 1.23 }
3029
3030 //------------------------------------------------------------------------------
3031 //
3032 // getMessageStartTag()
3033 //
3034 //------------------------------------------------------------------------------
3035
3036 Boolean XmlReader::getMessageStartTag(
3037 XmlParser& parser,
3038 String& id,
|
3039 kumpf 1.34 String& protocolVersion)
|
3040 mike 1.23 {
3041 XmlEntry entry;
3042
3043 if (!testStartTag(parser, entry, "MESSAGE"))
3044 return false;
3045
3046 // Get MESSAGE.ID:
3047
3048 if (!entry.getAttributeValue("ID", id))
3049 throw XmlValidationError(parser.getLine(),
3050 "Bad or missing MESSAGE.ID attribute");
3051
3052 // Get MESSAGE.PROTOCOLVERSION:
3053
3054 if (!entry.getAttributeValue("PROTOCOLVERSION", protocolVersion))
3055 throw XmlValidationError(parser.getLine(),
3056 "Bad or missing MESSAGE.PROTOCOLVERSION attribute");
3057
3058 return true;
3059 }
3060
3061 mike 1.23 //------------------------------------------------------------------------------
3062 //
3063 // getIMethodCallStartTag()
3064 //
3065 //------------------------------------------------------------------------------
3066
3067 Boolean XmlReader::getIMethodCallStartTag(
3068 XmlParser& parser,
3069 const char*& name)
3070 {
3071 XmlEntry entry;
3072
3073 if (!testStartTag(parser, entry, "IMETHODCALL"))
3074 return false;
3075
3076 // Get IMETHODCALL.NAME attribute:
3077
3078 if (!entry.getAttributeValue("NAME", name))
3079 throw XmlValidationError(parser.getLine(),
3080 "Missing IMETHODCALL.NAME attribute");
3081
3082 mike 1.23 return true;
3083 }
3084
3085 //------------------------------------------------------------------------------
3086 //
3087 // getIMethodResponseStartTag()
3088 //
3089 //------------------------------------------------------------------------------
3090
3091 Boolean XmlReader::getIMethodResponseStartTag(
3092 XmlParser& parser,
3093 const char*& name)
3094 {
3095 XmlEntry entry;
3096
3097 if (!testStartTag(parser, entry, "IMETHODRESPONSE"))
3098 return false;
3099
3100 // Get IMETHODRESPONSE.NAME attribute:
3101
3102 if (!entry.getAttributeValue("NAME", name))
3103 mike 1.23 throw XmlValidationError(parser.getLine(),
3104 "Missing IMETHODRESPONSE.NAME attribute");
3105
3106 return true;
3107 }
3108
3109 //------------------------------------------------------------------------------
3110 //
3111 // getIParamValueTag()
3112 //
3113 //------------------------------------------------------------------------------
3114
3115 Boolean XmlReader::getIParamValueTag(
3116 XmlParser& parser,
3117 const char*& name)
3118 {
3119 XmlEntry entry;
3120
3121 if (!testStartTag(parser, entry, "IPARAMVALUE"))
3122 return false;
3123
3124 mike 1.23 // Get IPARAMVALUE.NAME attribute:
3125
3126 if (!entry.getAttributeValue("NAME", name))
3127 throw XmlValidationError(parser.getLine(),
3128 "Missing IPARAMVALUE.NAME attribute");
3129
3130 return true;
3131 }
3132
3133 //------------------------------------------------------------------------------
3134 //
3135 // getBooleanValueElement()
3136 //
3137 // Get an elements like: "<VALUE>FALSE</VALUE>"
3138 //
3139 //------------------------------------------------------------------------------
3140
3141 Boolean XmlReader::getBooleanValueElement(
3142 XmlParser& parser,
3143 Boolean& result,
3144 Boolean required)
3145 mike 1.23 {
3146 XmlEntry entry;
3147
3148 if (!testStartTag(parser, entry, "VALUE"))
3149 {
3150 if (required)
3151 {
3152 throw XmlValidationError(parser.getLine(),
3153 "Expected VALUE element");
3154 }
3155 return false;
3156 }
3157
3158 expectContentOrCData(parser, entry);
3159
|
3160 mike 1.25 if (CompareNoCase(entry.text, "TRUE") == 0)
|
3161 mike 1.23 result = true;
|
3162 mike 1.25 else if (CompareNoCase(entry.text, "FALSE") == 0)
|
3163 mike 1.23 result = false;
3164 else
3165 throw XmlSemanticError(parser.getLine(),
3166 "Bad value for VALUE element: must be \"TRUE\" or \"FALSE\"");
3167
3168 expectEndTag(parser, "VALUE");
3169
3170 return true;
3171 }
3172
3173 //------------------------------------------------------------------------------
3174 //
3175 // getErrorElement()
3176 //
3177 // <!ELEMENT ERROR EMPTY>
3178 // <!ATTLIST ERROR
3179 // CODE CDATA #REQUIRED
3180 // DESCRIPTION CDATA #IMPLIED>
3181 //
3182 //------------------------------------------------------------------------------
3183
3184 mike 1.23 Boolean XmlReader::getErrorElement(
3185 XmlParser& parser,
|
3186 kumpf 1.50 CIMException& cimException,
|
3187 mike 1.23 Boolean required)
3188 {
3189 XmlEntry entry;
3190
3191 if (!testStartTagOrEmptyTag(parser, entry, "ERROR"))
3192 {
3193 if (required)
3194 throw XmlValidationError(parser.getLine(),"Expected ERROR element");
3195 return false;
3196 }
3197
3198 Boolean empty = entry.type == XmlEntry::EMPTY_TAG;
3199
3200 // Get ERROR.CODE
3201
3202 Uint32 tmpCode;
3203
3204 if (!entry.getAttributeValue("CODE", tmpCode))
3205 throw XmlValidationError(
3206 parser.getLine(), "missing ERROR.CODE attribute");
3207
|
3208 kumpf 1.50 // Get ERROR.DESCRIPTION:
|
3209 mike 1.23
|
3210 kumpf 1.50 String tmpDescription;
|
3211 mike 1.23
|
3212 kumpf 1.50 entry.getAttributeValue("DESCRIPTION", tmpDescription);
|
3213 mike 1.23
3214 if (!empty)
3215 expectEndTag(parser, "ERROR");
3216
|
3217 kumpf 1.50 cimException = PEGASUS_CIM_EXCEPTION(CIMStatusCode(tmpCode), tmpDescription);
|
3218 mike 1.23 return true;
3219 }
3220
3221
3222 //------------------------------------------------------------------------------
|
3223 kumpf 1.48 // getValueObjectElement()
3224 //
3225 // <!ELEMENT VALUE.OBJECT (CLASS|INSTANCE)>
3226 //
3227 //------------------------------------------------------------------------------
3228
3229 Boolean XmlReader::getValueObjectElement(
3230 XmlParser& parser,
3231 CIMObject& object)
3232 {
3233 XmlEntry entry;
3234
3235 if (!testStartTag(parser, entry, "VALUE.OBJECT"))
3236 return false;
3237
3238 CIMInstance cimInstance;
3239 CIMClass cimClass;
3240
3241 if (XmlReader::getInstanceElement(parser, cimInstance))
3242 {
3243 object = CIMObject(cimInstance);
3244 kumpf 1.48 }
3245 else if (!XmlReader::getClassElement(parser, cimClass))
3246 {
3247 object = CIMObject(cimClass);
3248 }
3249 else
3250 {
3251 throw XmlValidationError(parser.getLine(),
3252 "Expected INSTANCE or CLASS element");
3253 }
3254
3255 expectEndTag(parser, "VALUE.OBJECT");
3256
3257 return true;
3258 }
3259
3260 //------------------------------------------------------------------------------
3261 // getValueObjectWithPathElement()
|
3262 mike 1.23 //
3263 // <!ELEMENT VALUE.OBJECTWITHPATH ((CLASSPATH,CLASS)|(INSTANCEPATH,INSTANCE))>
3264 //
3265 //------------------------------------------------------------------------------
3266
|
3267 kumpf 1.48 Boolean XmlReader::getValueObjectWithPathElement(
|
3268 mike 1.23 XmlParser& parser,
3269 CIMObjectWithPath& objectWithPath)
3270 {
3271 XmlEntry entry;
3272
3273 if (!testStartTag(parser, entry, "VALUE.OBJECTWITHPATH"))
3274 return false;
3275
|
3276 kumpf 1.54 CIMObjectPath reference;
|
3277 mike 1.23 Boolean isInstance = false;
3278
3279 if (XmlReader::getInstancePathElement(parser, reference))
3280 isInstance = true;
3281 else if (!XmlReader::getClassPathElement(parser, reference))
3282 {
|
3283 kumpf 1.48 throw XmlValidationError(parser.getLine(),
3284 "Expected INSTANCEPATH or CLASSPATH element");
|
3285 mike 1.23 }
3286
3287 if (isInstance)
3288 {
3289 CIMInstance cimInstance;
3290
3291 if (!XmlReader::getInstanceElement(parser, cimInstance))
3292 {
3293 throw XmlValidationError(parser.getLine(),
|
3294 kumpf 1.48 "Expected INSTANCE element");
|
3295 mike 1.23 }
3296 objectWithPath.set(reference, CIMObject(cimInstance));
3297 }
3298 else
3299 {
3300 CIMClass cimClass;
3301
3302 if (!XmlReader::getClassElement(parser, cimClass))
3303 {
3304 throw XmlValidationError(parser.getLine(),
3305 "Expected CLASS element");
3306 }
3307 objectWithPath.set(reference, CIMObject(cimClass));
3308 }
3309
3310 expectEndTag(parser, "VALUE.OBJECTWITHPATH");
3311
3312 return true;
|
3313 kumpf 1.48 }
3314
3315 //------------------------------------------------------------------------------
3316 // getValueObjectWithLocalPathElement()
3317 //
3318 // <!ELEMENT VALUE.OBJECTWITHLOCALPATH
3319 // ((LOCALCLASSPATH,CLASS)|(LOCALINSTANCEPATH,INSTANCE))>
3320 //
3321 //------------------------------------------------------------------------------
3322
3323 Boolean XmlReader::getValueObjectWithLocalPathElement(
3324 XmlParser& parser,
3325 CIMObjectWithPath& objectWithPath)
3326 {
3327 XmlEntry entry;
3328
3329 if (!testStartTag(parser, entry, "VALUE.OBJECTWITHLOCALPATH"))
3330 return false;
3331
|
3332 kumpf 1.54 CIMObjectPath reference;
|
3333 kumpf 1.48 Boolean isInstance = false;
3334
3335 if (XmlReader::getLocalInstancePathElement(parser, reference))
3336 isInstance = true;
3337 else if (!XmlReader::getLocalClassPathElement(parser, reference))
3338 {
3339 throw XmlValidationError(parser.getLine(),
3340 "Expected LOCALINSTANCEPATH or LOCALCLASSPATH element");
3341 }
3342
3343 if (isInstance)
3344 {
3345 CIMInstance cimInstance;
3346
3347 if (!XmlReader::getInstanceElement(parser, cimInstance))
3348 {
3349 throw XmlValidationError(parser.getLine(),
3350 "Expected INSTANCE element");
3351 }
3352 objectWithPath.set(reference, CIMObject(cimInstance));
3353 }
3354 kumpf 1.48 else
3355 {
3356 CIMClass cimClass;
3357
3358 if (!XmlReader::getClassElement(parser, cimClass))
3359 {
3360 throw XmlValidationError(parser.getLine(),
3361 "Expected CLASS element");
3362 }
3363 objectWithPath.set(reference, CIMObject(cimClass));
3364 }
3365
3366 expectEndTag(parser, "VALUE.OBJECTWITHLOCALPATH");
3367
3368 return true;
3369 }
3370
3371 //------------------------------------------------------------------------------
3372 // getObjectArray()
3373 //
3374 // <object>
3375 kumpf 1.48 // (VALUE.OBJECT|VALUE.OBJECTWITHLOCALPATH|VALUE.OBJECTWITHPATH)
3376 //
3377 //------------------------------------------------------------------------------
3378
3379 void XmlReader::getObjectArray(
3380 XmlParser& parser,
3381 Array<CIMObjectWithPath>& objectArray)
3382 {
3383 CIMObject object;
3384 CIMObjectWithPath objectWithPath;
3385
3386 objectArray.clear();
3387
3388 if (getValueObjectElement(parser, object))
3389 {
|
3390 kumpf 1.54 objectArray.append(CIMObjectWithPath(CIMObjectPath(), object));
|
3391 kumpf 1.48 while (getValueObjectElement(parser, object))
|
3392 kumpf 1.54 objectArray.append(CIMObjectWithPath(CIMObjectPath(), object));
|
3393 kumpf 1.48 }
3394 else if (getValueObjectWithPathElement(parser, objectWithPath))
3395 {
3396 objectArray.append(objectWithPath);
3397 while (getValueObjectWithPathElement(parser, objectWithPath))
3398 objectArray.append(objectWithPath);
3399 }
3400 else if (getValueObjectWithLocalPathElement(parser, objectWithPath))
3401 {
3402 objectArray.append(objectWithPath);
3403 while (getValueObjectWithLocalPathElement(parser, objectWithPath))
3404 objectArray.append(objectWithPath);
3405 }
|
3406 mike 1.23 }
3407
3408 //------------------------------------------------------------------------------
3409 //
3410 // <objectName>: (CLASSNAME|INSTANCENAME)
3411 //
3412 //------------------------------------------------------------------------------
3413
3414 Boolean XmlReader::getObjectNameElement(
3415 XmlParser& parser,
|
3416 kumpf 1.54 CIMObjectPath& objectName)
|
3417 mike 1.23 {
3418 String className;
3419
3420 if (getClassNameElement(parser, className, false))
3421 {
3422 objectName.set(String(), String(), className);
3423 return true;
3424 }
3425 else if (getInstanceNameElement(parser, objectName))
3426 return true;
3427 else
3428 {
3429 throw XmlValidationError(parser.getLine(),
3430 "expected CLASSNAME or INSTANCENAME element");
3431 }
3432
3433 return false;
3434 }
3435
3436 //------------------------------------------------------------------------------
3437 //
3438 mike 1.23 // <!ELEMENT OBJECTPATH (INSTANCEPATH|CLASSPATH)>
3439 //
3440 //------------------------------------------------------------------------------
3441
3442 Boolean XmlReader::getObjectPathElement(
3443 XmlParser& parser,
|
3444 kumpf 1.54 CIMObjectPath& objectPath)
|
3445 mike 1.23 {
3446 XmlEntry entry;
3447
3448 if (!testStartTag(parser, entry, "OBJECTPATH"))
3449 return false;
3450
3451 if (getClassPathElement(parser, objectPath))
3452 {
3453 expectEndTag(parser, "OBJECTPATH");
3454 return true;
3455 }
3456 else if (getInstancePathElement(parser, objectPath))
3457 {
3458 expectEndTag(parser, "OBJECTPATH");
3459 return true;
3460 }
3461 else
3462 {
3463 throw XmlValidationError(parser.getLine(),
3464 "expected INSTANCEPATH or CLASSPATH element");
3465 }
3466 mike 1.23
|
3467 mike 1.24 PEGASUS_UNREACHABLE ( return false; )
|
3468 mike 1.25 }
3469
3470 //------------------------------------------------------------------------------
3471 //
3472 // getEMethodCallStartTag()
3473 //
3474 //------------------------------------------------------------------------------
3475
3476 Boolean XmlReader::getEMethodCallStartTag(
3477 XmlParser& parser,
3478 const char*& name)
3479 {
3480 XmlEntry entry;
3481
3482 if (!testStartTag(parser, entry, "EXPMETHODCALL"))
3483 return false;
3484
3485 // Get EXPMETHODCALL.NAME attribute:
3486
3487 if (!entry.getAttributeValue("NAME", name))
3488 throw XmlValidationError(parser.getLine(),
3489 mike 1.25 "Missing EXPMETHODCALL.NAME attribute");
3490
3491 return true;
3492 }
3493
3494 //------------------------------------------------------------------------------
3495 //
3496 // getEMethodResponseStartTag()
3497 //
3498 //------------------------------------------------------------------------------
3499
3500 Boolean XmlReader::getEMethodResponseStartTag(
3501 XmlParser& parser,
3502 const char*& name)
3503 {
3504 XmlEntry entry;
3505
3506 if (!testStartTag(parser, entry, "EXPMETHODRESPONSE"))
3507 return false;
3508
3509 // Get EXPMETHODRESPONSE.NAME attribute:
3510 mike 1.25
3511 if (!entry.getAttributeValue("NAME", name))
3512 throw XmlValidationError(parser.getLine(),
3513 "Missing EXPMETHODRESPONSE.NAME attribute");
3514
3515 return true;
3516 }
3517
3518 //------------------------------------------------------------------------------
3519 //
3520 // getMethodCallStartTag()
3521 //
3522 //------------------------------------------------------------------------------
3523
3524 Boolean XmlReader::getMethodCallStartTag(
3525 XmlParser& parser,
3526 const char*& name)
3527 {
3528 XmlEntry entry;
3529
3530 if (!testStartTag(parser, entry, "METHODCALL"))
3531 mike 1.25 return false;
3532
3533 // Get METHODCALL.NAME attribute:
3534
3535 if (!entry.getAttributeValue("NAME", name))
3536 throw XmlValidationError(parser.getLine(),
3537 "Missing METHODCALL.NAME attribute");
3538
3539 return true;
3540 }
3541
3542 //------------------------------------------------------------------------------
3543 //
3544 // getMethodResponseStartTag()
3545 //
3546 //------------------------------------------------------------------------------
3547
3548 Boolean XmlReader::getMethodResponseStartTag(
3549 XmlParser& parser,
3550 const char*& name)
3551 {
3552 mike 1.25 XmlEntry entry;
3553
3554 if (!testStartTag(parser, entry, "METHODRESPONSE"))
3555 return false;
3556
3557 // Get METHODRESPONSE.NAME attribute:
3558
3559 if (!entry.getAttributeValue("NAME", name))
3560 throw XmlValidationError(parser.getLine(),
3561 "Missing METHODRESPONSE.NAME attribute");
3562
3563 return true;
3564 }
3565
3566 //------------------------------------------------------------------------------
3567 //
|
3568 kumpf 1.26 // getParamValueElement()
3569 //
3570 // <!ELEMENT PARAMVALUE (VALUE|VALUE.REFERENCE|VALUE.ARRAY|VALUE.REFARRAY)?>
3571 // <!ATTLIST PARAMVALUE
3572 // %CIMName;
3573 // %ParamType;>
|
3574 mike 1.25 //
3575 //------------------------------------------------------------------------------
3576
|
3577 kumpf 1.26 Boolean XmlReader::getParamValueElement(
|
3578 mike 1.25 XmlParser& parser,
|
3579 kumpf 1.26 CIMParamValue& paramValue)
|
3580 mike 1.25 {
3581 XmlEntry entry;
|
3582 kumpf 1.26 const char* name;
3583 CIMType type;
3584 CIMValue value;
|
3585 mike 1.25
|
3586 kumpf 1.26 if (!testStartTagOrEmptyTag(parser, entry, "PARAMVALUE"))
|
3587 mike 1.25 return false;
3588
|
3589 kumpf 1.26 Boolean empty = entry.type == XmlEntry::EMPTY_TAG;
3590
3591 // Get PARAMVALUE.NAME attribute:
|
3592 mike 1.25
3593 if (!entry.getAttributeValue("NAME", name))
3594 throw XmlValidationError(parser.getLine(),
3595 "Missing PARAMVALUE.NAME attribute");
|
3596 kumpf 1.26
3597 // Get PARAMVALUE.PARAMTYPE attribute:
3598
3599 type = getCimTypeAttribute(parser.getLine(), entry, "PARAMVALUE",
3600 "PARAMTYPE", false);
3601
3602 if (!empty)
3603 {
3604 // Parse VALUE.REFERENCE and VALUE.REFARRAY type
3605 if ( (type == CIMType::REFERENCE) || (type == CIMType::NONE) )
3606 {
|
3607 kumpf 1.54 CIMObjectPath reference;
|
3608 kumpf 1.26 if (XmlReader::getValueReferenceElement(parser, reference))
3609 {
3610 value.set(reference);
3611 type = CIMType::REFERENCE;
3612 }
|
3613 kumpf 1.28 else if (XmlReader::getValueReferenceArrayElement(parser, value))
3614 {
3615 type = CIMType::REFERENCE;
3616 }
|
3617 kumpf 1.27 // If type==reference but no VALUE.REFERENCE found, use null value
|
3618 kumpf 1.26 }
3619
3620 // Parse non-reference value
3621 if ( type != CIMType::REFERENCE )
3622 {
3623 // If we don't know what type the value is, read it as a String
3624 CIMType effectiveType = type;
3625 if ( effectiveType == CIMType::NONE)
3626 {
3627 effectiveType = CIMType::STRING;
3628 }
3629
3630 if ( !XmlReader::getValueArrayElement(parser, effectiveType, value) &&
3631 !XmlReader::getValueElement(parser, effectiveType, value) )
3632 {
3633 value.clear(); // Isn't necessary; should already be cleared
3634 }
3635 }
3636
3637 expectEndTag(parser, "PARAMVALUE");
3638 }
3639 kumpf 1.26
|
3640 kumpf 1.31 paramValue = CIMParamValue(name, value, Boolean(type!=CIMType::NONE));
|
3641 kumpf 1.27
3642 return true;
3643 }
3644
3645 //------------------------------------------------------------------------------
3646 //
3647 // getReturnValueElement()
3648 //
3649 // <!ELEMENT RETURNVALUE (VALUE|VALUE.REFERENCE)>
3650 // <!ATTLIST RETURNVALUE
3651 // %ParamType;>
3652 //
3653 //------------------------------------------------------------------------------
3654
3655 Boolean XmlReader::getReturnValueElement(
3656 XmlParser& parser,
3657 CIMValue& returnValue)
3658 {
3659 XmlEntry entry;
3660 CIMType type;
3661 CIMValue value;
3662 kumpf 1.27
3663 if (!testStartTag(parser, entry, "RETURNVALUE"))
3664 return false;
3665
3666 // Get RETURNVALUE.PARAMTYPE attribute:
3667 // NOTE: Array type return values are not allowed (2/20/02)
3668
3669 type = getCimTypeAttribute(parser.getLine(), entry, "RETURNVALUE",
3670 "PARAMTYPE", false);
3671
3672 // Parse VALUE.REFERENCE type
3673 if ( (type == CIMType::REFERENCE) || (type == CIMType::NONE) )
3674 {
|
3675 kumpf 1.54 CIMObjectPath reference;
|
3676 kumpf 1.27 if (XmlReader::getValueReferenceElement(parser, reference))
3677 {
3678 returnValue.set(reference);
3679 type = CIMType::REFERENCE;
3680 }
3681 else if (type == CIMType::REFERENCE)
3682 {
3683 throw XmlValidationError(parser.getLine(),
3684 "expected VALUE.REFERENCE element");
3685 }
3686 }
3687
3688 // Parse non-reference return value
3689 if ( type != CIMType::REFERENCE )
3690 {
3691 // If we don't know what type the value is, read it as a String
3692 if ( type == CIMType::NONE)
3693 {
3694 type = CIMType::STRING;
3695 }
3696
3697 kumpf 1.27 if ( !XmlReader::getValueElement(parser, type, returnValue) )
3698 {
3699 throw XmlValidationError(parser.getLine(),
3700 "expected VALUE element");
3701 }
3702 }
3703
3704 expectEndTag(parser, "RETURNVALUE");
|
3705 mike 1.25
3706 return true;
|
3707 mike 1.23 }
3708
3709 PEGASUS_NAMESPACE_END
|