1 karl 1.116 //%2006////////////////////////////////////////////////////////////////////////
|
2 mike 1.23 //
|
3 karl 1.105 // Copyright (c) 2000, 2001, 2002 BMC Software; Hewlett-Packard Development
4 // Company, L.P.; IBM Corp.; The Open Group; Tivoli Systems.
5 // Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L.P.;
|
6 karl 1.94 // IBM Corp.; EMC Corporation, The Open Group.
|
7 karl 1.105 // Copyright (c) 2004 BMC Software; Hewlett-Packard Development Company, L.P.;
8 // IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group.
|
9 karl 1.106 // Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.;
10 // EMC Corporation; VERITAS Software Corporation; The Open Group.
|
11 karl 1.116 // Copyright (c) 2006 Hewlett-Packard Development Company, L.P.; IBM Corp.;
12 // EMC Corporation; Symantec Corporation; The Open Group.
|
13 mike 1.23 //
14 // Permission is hereby granted, free of charge, to any person obtaining a copy
|
15 kumpf 1.58 // of this software and associated documentation files (the "Software"), to
16 // deal in the Software without restriction, including without limitation the
17 // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
18 mike 1.23 // sell copies of the Software, and to permit persons to whom the Software is
19 // furnished to do so, subject to the following conditions:
20 //
|
21 kumpf 1.58 // THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN
|
22 mike 1.23 // ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED
23 // "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
|
24 kumpf 1.58 // LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
25 // PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
26 // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
27 mike 1.23 // ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
28 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
29 //
30 //==============================================================================
31 //
32 // Author: Mike Brasher (mbrasher@bmc.com)
33 //
|
34 mike 1.25 // Modified By: Carol Ann Krug Graves, Hewlett-Packard Company
35 // (carolann_graves@hp.com)
36 // Nitin Upasani, Hewlett-Packard Company (Nitin_Upasani@hp.com)
37 // Roger Kumpf, Hewlett-Packard Company (roger_kumpf@hp.com)
|
38 gs.keenan 1.107 // Sean Keenan, Hewlett-Packard Company (sean.keenan@hp.com)
|
39 joyce.j 1.112 // Josephine Eskaline Joyce, IBM (jojustin@in.ibm.com) for Bug#3103
|
40 mike 1.23 //
41 //%/////////////////////////////////////////////////////////////////////////////
|
42 mday 1.45 #include <Pegasus/Common/Config.h>
|
43 mike 1.23 #include <cctype>
44 #include <cstdio>
45 #include <cstdlib>
|
46 gs.keenan 1.107 #if defined(PEGASUS_OS_TYPE_UNIX) || defined(PEGASUS_OS_VMS)
|
47 mday 1.45 #include <errno.h>
48 #endif
|
49 mike 1.23 #include "CIMName.h"
50 #include "XmlReader.h"
51 #include "XmlWriter.h"
52 #include "CIMQualifier.h"
53 #include "CIMQualifierDecl.h"
54 #include "CIMClass.h"
55 #include "CIMInstance.h"
56 #include "CIMObject.h"
|
57 mike 1.25 #include "CIMParamValue.h"
|
58 kumpf 1.72 #include "System.h"
|
59 humberto 1.91 #include "XmlConstants.h"
|
60 david 1.86 #ifdef PEGASUS_PLATFORM_OS400_ISERIES_IBM
61 #include "OS400ConvertChar.h"
62 #endif
|
63 humberto 1.85 // l10n
64 #include <Pegasus/Common/MessageLoader.h>
|
65 joyce.j 1.112 #include <Pegasus/Common/AutoPtr.h>
|
66 r.kieninger 1.115 #include "CIMNameUnchecked.h"
|
67 humberto 1.85
|
68 kumpf 1.82 #define PEGASUS_SINT64_MIN (PEGASUS_SINT64_LITERAL(0x8000000000000000))
|
69 kumpf 1.74 #define PEGASUS_UINT64_MAX PEGASUS_UINT64_LITERAL(0xFFFFFFFFFFFFFFFF)
|
70 kumpf 1.68
|
71 mike 1.25 PEGASUS_USING_STD;
|
72 mike 1.23 PEGASUS_NAMESPACE_BEGIN
73
74 static const Uint32 MESSAGE_SIZE = 128;
75
76 //------------------------------------------------------------------------------
77 //
|
78 kumpf 1.49 // getXmlDeclaration()
79 //
80 // <?xml version="1.0" encoding="utf-8"?>
|
81 mike 1.23 //
82 //------------------------------------------------------------------------------
83
|
84 kumpf 1.49 void XmlReader::getXmlDeclaration(
|
85 mike 1.23 XmlParser& parser,
|
86 kumpf 1.49 const char*& xmlVersion,
87 const char*& xmlEncoding)
|
88 mike 1.23 {
|
89 kumpf 1.49 XmlEntry entry;
90
|
91 mike 1.23 if (!parser.next(entry) ||
92 entry.type != XmlEntry::XML_DECLARATION ||
93 strcmp(entry.text, "xml") != 0)
94 {
|
95 humberto 1.85
96 // l10n
97
98 // throw XmlValidationError(parser.getLine(),
99 // "Expected <?xml ... ?> style declaration");
100
101 MessageLoaderParms mlParms("Common.XmlReader.EXPECTED_XML_STYLE",
|
102 humberto 1.87 "Expected <?xml ... ?> style declaration");
|
103 humberto 1.85
104 throw XmlValidationError(parser.getLine(), mlParms);
105
|
106 kumpf 1.49 }
107
|
108 humberto 1.85 if (!entry.getAttributeValue("version", xmlVersion)) {
109
110 // l10n
111
112 // throw XmlValidationError(
113 // parser.getLine(), "missing xml.version attribute");
114
|
115 humberto 1.87 MessageLoaderParms mlParms("Common.XmlReader.MISSING_XML_ATTRIBUTE",
116 "missing xml.version attribute");
|
117 humberto 1.85
118 throw XmlValidationError(parser.getLine(), mlParms);
119 }
|
120 kumpf 1.49
121 if (!entry.getAttributeValue("encoding", xmlEncoding))
122 {
123 // ATTN-RK-P3-20020403: Is there a default encoding?
|
124 mike 1.23 }
125 }
126
127 //------------------------------------------------------------------------------
128 //
|
129 mike 1.25 // testXmlDeclaration ()
130 //
131 //------------------------------------------------------------------------------
132
133 Boolean XmlReader::testXmlDeclaration (
134 XmlParser& parser,
135 XmlEntry& entry)
136 {
137 if (!parser.next (entry) ||
138 entry.type != XmlEntry::XML_DECLARATION ||
139 strcmp (entry.text, "xml") != 0)
140 {
141 parser.putBack (entry);
142 return false;
143 }
144
145 return true;
146 }
147
148 //------------------------------------------------------------------------------
149 //
|
150 mike 1.23 // expectStartTag()
151 //
152 //------------------------------------------------------------------------------
153
154 void XmlReader::expectStartTag(
155 XmlParser& parser,
156 XmlEntry& entry,
157 const char* tagName)
158 {
159 if (!parser.next(entry) ||
160 entry.type != XmlEntry::START_TAG ||
161 strcmp(entry.text, tagName) != 0)
162 {
|
163 humberto 1.85 // l10n
164
165 // char message[MESSAGE_SIZE];
166 // sprintf(message, "Expected open of %s element", tagName);
167 // throw XmlValidationError(parser.getLine(), message);
168
169 MessageLoaderParms mlParms("Common.XmlReader.EXPECTED_OPEN",
170 "Expected open of $0 element",
171 tagName);
172
173 throw XmlValidationError(parser.getLine(), mlParms);
|
174 mike 1.23 }
175 }
176
177 //------------------------------------------------------------------------------
178 //
179 // expectEndTag()
180 //
181 //------------------------------------------------------------------------------
182
183 void XmlReader::expectEndTag(XmlParser& parser, const char* tagName)
184 {
185 XmlEntry entry;
186
187 if (!parser.next(entry) ||
188 entry.type != XmlEntry::END_TAG ||
189 strcmp(entry.text, tagName) != 0)
190 {
|
191 humberto 1.85
192 // l10n
193
194 // char message[MESSAGE_SIZE];
195 // sprintf(message, "Expected close of %s element, got %s instead",
196 // tagName,entry.text);
197 // throw XmlValidationError(parser.getLine(), message);
198
199 MessageLoaderParms mlParms("Common.XmlReader.EXPECTED_CLOSE",
200 "Expected close of $0 element, got $1 instead",
201 tagName,entry.text);
202
203 throw XmlValidationError(parser.getLine(), mlParms);
|
204 mike 1.23 }
205 }
206
207 //------------------------------------------------------------------------------
208 //
209 // expectStartTagOrEmptyTag()
210 //
211 //------------------------------------------------------------------------------
212
213 void XmlReader::expectStartTagOrEmptyTag(
214 XmlParser& parser,
215 XmlEntry& entry,
216 const char* tagName)
217 {
218 if (!parser.next(entry) ||
219 (entry.type != XmlEntry::START_TAG &&
220 entry.type != XmlEntry::EMPTY_TAG) ||
221 strcmp(entry.text, tagName) != 0)
222 {
|
223 humberto 1.85 // l10n
224
225 // char message[MESSAGE_SIZE];
226 // sprintf(message,
227 // "Expected either open or open/close %s element", tagName);
228 // throw XmlValidationError(parser.getLine(), message);
229
230 MessageLoaderParms mlParms("Common.XmlReader.EXPECTED_OPENCLOSE",
231 "Expected either open or open/close $0 element",
232 tagName);
233
234 throw XmlValidationError(parser.getLine(), mlParms);
|
235 mike 1.23 }
236 }
237
238 //------------------------------------------------------------------------------
239 //
240 // expectContentOrCData()
241 //
242 //------------------------------------------------------------------------------
243
244 Boolean XmlReader::expectContentOrCData(
245 XmlParser& parser,
246 XmlEntry& entry)
247 {
248 if (!parser.next(entry) ||
249 (entry.type != XmlEntry::CONTENT &&
250 entry.type != XmlEntry::CDATA))
251 {
|
252 humberto 1.85 // l10n
253
254 // throw XmlValidationError(parser.getLine(),
255 // "Expected content of CDATA");
256
257 MessageLoaderParms mlParms("Common.XmlReader.EXPECTED_CDATA",
|
258 humberto 1.87 "Expected content of CDATA");
|
259 humberto 1.85
260 throw XmlValidationError(parser.getLine(), mlParms);
261
|
262 mike 1.23 }
263
264 return true;
265 }
266
267 //------------------------------------------------------------------------------
268 //
269 // testStartTag()
270 //
271 //------------------------------------------------------------------------------
272
273 Boolean XmlReader::testStartTag(
274 XmlParser& parser,
275 XmlEntry& entry,
276 const char* tagName)
277 {
278 if (!parser.next(entry) ||
279 entry.type != XmlEntry::START_TAG ||
280 strcmp(entry.text, tagName) != 0)
281 {
282 parser.putBack(entry);
283 mike 1.23 return false;
284 }
285
286 return true;
287 }
288
289 //------------------------------------------------------------------------------
290 //
|
291 kumpf 1.48 // testEndTag()
|
292 mike 1.23 //
293 //------------------------------------------------------------------------------
294
295 Boolean XmlReader::testEndTag(XmlParser& parser, const char* tagName)
296 {
297 XmlEntry entry;
298
299 if (!parser.next(entry) ||
300 entry.type != XmlEntry::END_TAG ||
301 strcmp(entry.text, tagName) != 0)
302 {
303 parser.putBack(entry);
304 return false;
305 }
306
307 return true;
308 }
309
310 //------------------------------------------------------------------------------
311 //
312 // testStartTagOrEmptyTag()
313 mike 1.23 //
314 //------------------------------------------------------------------------------
315
316 Boolean XmlReader::testStartTagOrEmptyTag(
317 XmlParser& parser,
318 XmlEntry& entry,
319 const char* tagName)
320 {
321 if (!parser.next(entry) ||
|
322 dave.sudlik 1.111 (entry.type != XmlEntry::START_TAG &&
323 entry.type != XmlEntry::EMPTY_TAG) ||
324 strcmp(entry.text, tagName) != 0)
|
325 mike 1.23 {
|
326 dave.sudlik 1.111 parser.putBack(entry);
327 return false;
|
328 mike 1.23 }
329
330 return true;
331 }
332
333 //------------------------------------------------------------------------------
334 //
|
335 kumpf 1.95 // testStartTagOrEmptyTag()
336 //
337 //------------------------------------------------------------------------------
338
339 Boolean XmlReader::testStartTagOrEmptyTag(
340 XmlParser& parser,
341 XmlEntry& entry)
342 {
343 if (!parser.next(entry) ||
344 (entry.type != XmlEntry::START_TAG &&
345 entry.type != XmlEntry::EMPTY_TAG))
346 {
347 parser.putBack(entry);
348 return false;
349 }
350
351 return true;
352 }
353
354 //------------------------------------------------------------------------------
355 //
|
356 mike 1.23 // testContentOrCData()
357 //
358 //------------------------------------------------------------------------------
359
360 Boolean XmlReader::testContentOrCData(
361 XmlParser& parser,
362 XmlEntry& entry)
363 {
364 if (!parser.next(entry) ||
365 (entry.type != XmlEntry::CONTENT &&
366 entry.type != XmlEntry::CDATA))
367 {
368 parser.putBack(entry);
369 return false;
370 }
371
372 return true;
373 }
374
375 //------------------------------------------------------------------------------
376 //
|
377 kumpf 1.34 // getCimStartTag()
|
378 mike 1.23 //
379 // <!ELEMENT CIM (MESSAGE|DECLARATION)>
380 // <!ATTRLIST CIM
381 // CIMVERSION CDATA #REQUIRED
382 // DTDVERSION CDATA #REQUIRED>
383 //
384 //------------------------------------------------------------------------------
385
|
386 kumpf 1.34 void XmlReader::getCimStartTag(
387 XmlParser& parser,
388 const char*& cimVersion,
389 const char*& dtdVersion)
|
390 mike 1.23 {
391 XmlEntry entry;
392 XmlReader::expectStartTag(parser, entry, "CIM");
393
|
394 humberto 1.85 if (!entry.getAttributeValue("CIMVERSION", cimVersion)) {
395
396 // l10n
397
398 // throw XmlValidationError(
399 // parser.getLine(), "missing CIM.CIMVERSION attribute");
400
|
401 humberto 1.87 MessageLoaderParms mlParms("Common.XmlReader.MISSING_CIMVERSION_ATTRIBUTE",
402 "missing CIM.CIMVERSION attribute");
|
403 humberto 1.85
404 throw XmlValidationError(parser.getLine(), mlParms);
405 }
406
407 if (!entry.getAttributeValue("DTDVERSION", dtdVersion)){
408
409 // l10n
410
411 // throw XmlValidationError(
412 // parser.getLine(), "missing CIM.DTDVERSION attribute");
413
|
414 humberto 1.87 MessageLoaderParms mlParms("Common.XmlReader.MISSING_DTDVERSION_ATTRIBUTE",
415 "missing CIM.DTDVERSION attribute");
|
416 humberto 1.85
417 throw XmlValidationError(parser.getLine(), mlParms);
418 }
|
419 mike 1.23 }
420
421 //------------------------------------------------------------------------------
422 //
423 // getCimNameAttribute()
424 //
425 // <!ENTITY % CIMName "NAME CDATA #REQUIRED">
426 //
427 //------------------------------------------------------------------------------
428
|
429 kumpf 1.74 CIMName XmlReader::getCimNameAttribute(
|
430 mike 1.23 Uint32 lineNumber,
431 const XmlEntry& entry,
432 const char* elementName,
433 Boolean acceptNull)
434 {
435 String name;
436
437 if (!entry.getAttributeValue("NAME", name))
|
438 humberto 1.85 {
439
440 // l10n
441
442 // char buffer[MESSAGE_SIZE];
443 // sprintf(buffer, "missing %s.NAME attribute", elementName);
444 // throw XmlValidationError(lineNumber, buffer);
445
|
446 mike 1.23 char buffer[MESSAGE_SIZE];
|
447 humberto 1.85 sprintf(buffer, "%s.NAME", elementName);
448 MessageLoaderParms mlParms("Common.XmlReader.MISSING_ATTRIBUTE",
449 "missing $0 attribute",
450 buffer);
451
452 throw XmlValidationError(lineNumber, mlParms);
|
453 mike 1.23 }
454
455 if (acceptNull && name.size() == 0)
|
456 kumpf 1.74 return CIMName ();
|
457 karl 1.78
|
458 mike 1.23 if (!CIMName::legal(name))
459 {
|
460 karl 1.78 #ifdef PEGASUS_SNIA_INTEROP_TEST
461 // In testing, replace illegal CIMName with this value to avoid the
462 // exception and let xml parsing continue. THIS IS TEMP.
463 name = "BADNAMESUBSTITUTEDBYPEGASUSCLIENT";
464 #else
|
465 humberto 1.85
466 // l10n
467
468 // char buffer[MESSAGE_SIZE];
469 // sprintf(buffer, "Illegal value for %s.NAME attribute", elementName);
470 // throw XmlSemanticError(lineNumber, buffer);
471
472 char buffer[MESSAGE_SIZE];
473 sprintf(buffer, "%s.NAME", elementName);
474
475 MessageLoaderParms mlParms("Common.XmlReader.ILLEGAL_VALUE_FOR_ATTRIBUTE",
476 "Illegal value for $0 attribute",
477 buffer);
478
479 throw XmlSemanticError(lineNumber, mlParms);
480
|
481 karl 1.78 #endif
|
482 mike 1.23 }
|
483 r.kieninger 1.115 return CIMNameUnchecked(name);
|
484 mike 1.23 }
485
486 //------------------------------------------------------------------------------
487 //
488 // getClassNameAttribute()
489 //
490 // <!ENTITY % CIMName "CLASSNAME CDATA #REQUIRED">
491 //
492 //------------------------------------------------------------------------------
493
494 String XmlReader::getClassNameAttribute(
495 Uint32 lineNumber,
496 const XmlEntry& entry,
497 const char* elementName)
498 {
499 String name;
500
501 if (!entry.getAttributeValue("CLASSNAME", name))
502 {
|
503 humberto 1.85
504
505 // l10n
506
507 // char buffer[MESSAGE_SIZE];
508 // sprintf(buffer, "missing %s.CLASSNAME attribute", elementName);
509 // throw XmlValidationError(lineNumber, buffer);
510
511 char buffer[MESSAGE_SIZE];
512 sprintf(buffer, "%s.CLASSNAME", elementName);
513
514 MessageLoaderParms mlParms("Common.XmlReader.MISSING_ATTRIBUTE",
515 "missing $0 attribute",
516 buffer);
517
518 throw XmlValidationError(lineNumber, mlParms);
519
|
520 mike 1.23 }
521
522 if (!CIMName::legal(name))
523 {
|
524 humberto 1.85 // l10n
525
526 // char buffer[MESSAGE_SIZE];
527 // sprintf(buffer,
528 // "Illegal value for %s.CLASSNAME attribute", elementName);
529 // throw XmlSemanticError(lineNumber, buffer);
530
531 char buffer[MESSAGE_SIZE];
532 sprintf(buffer, "%s.CLASSNAME", elementName);
533
534 MessageLoaderParms mlParms("Common.XmlReader.ILLEGAL_VALUE_FOR_ATTRIBUTE",
535 "Illegal value for $0 attribute",
536 buffer);
537
538 throw XmlSemanticError(lineNumber, mlParms);
539
|
540 mike 1.23 }
541
542 return name;
543 }
544
545 //------------------------------------------------------------------------------
546 //
547 // getClassOriginAttribute()
548 //
549 // <!ENTITY % ClassOrigin "CLASSORIGIN CDATA #IMPLIED">
550 //
551 //------------------------------------------------------------------------------
552
|
553 kumpf 1.62 CIMName XmlReader::getClassOriginAttribute(
|
554 mike 1.23 Uint32 lineNumber,
555 const XmlEntry& entry,
556 const char* tagName)
557 {
558 String name;
559
560 if (!entry.getAttributeValue("CLASSORIGIN", name))
|
561 kumpf 1.62 return CIMName();
|
562 mike 1.23
563 if (!CIMName::legal(name))
564 {
|
565 humberto 1.85 // l10n
566
567 // char buffer[MESSAGE_SIZE];
568 // sprintf(buffer,
569 // "Illegal value for %s.CLASSORIGIN attribute", tagName);
570 // throw XmlSemanticError(lineNumber, buffer);
571
572 char buffer[MESSAGE_SIZE];
573 sprintf(buffer, "%s.CLASSORIGIN", tagName);
574
575 MessageLoaderParms mlParms("Common.XmlReader.ILLEGAL_VALUE_FOR_ATTRIBUTE",
576 "Illegal value for $0 attribute",
577 buffer);
578
579 throw XmlSemanticError(lineNumber, mlParms);
|
580 mike 1.23 }
581
582 return name;
583 }
584
585 //------------------------------------------------------------------------------
586 //
|
587 dave.sudlik 1.109 // getEmbeddedObjectAttribute()
588 //
589 // <!ENTITY % EmbeddedObject "EMBEDDEDOBJECT (object | instance) #IMPLIED">
590 //
591 //------------------------------------------------------------------------------
592
593 String XmlReader::getEmbeddedObjectAttribute(
594 Uint32 lineNumber,
595 const XmlEntry& entry,
596 const char* elementName)
597 {
598 String embeddedObject;
599
600 if (!entry.getAttributeValue("EMBEDDEDOBJECT", embeddedObject))
601 return String();
602
603 // The embeddedObject attribute, if present, must have the string
604 // value "object" or "instance".
605 if (!(String::equal(embeddedObject, "object") ||
606 String::equal(embeddedObject, "instance")
607 )
608 dave.sudlik 1.109 )
609 {
610 // l10n
611
612 // char buffer[MESSAGE_SIZE];
613 // sprintf(buffer,
614 // "Illegal value for %s.EMBEDDEDOBJECT attribute", elementName);
615 // throw XmlSemanticError(lineNumber, buffer);
616
617 char buffer[MESSAGE_SIZE];
618 sprintf(buffer, "%s.EMBEDDEDOBJECT", elementName);
619
620 MessageLoaderParms mlParms("Common.XmlReader.ILLEGAL_VALUE_FOR_ATTRIBUTE",
621 "Illegal value for $0 attribute",
622 buffer);
623
624 throw XmlSemanticError(lineNumber, mlParms);
625
626 }
627
628 return embeddedObject;
629 dave.sudlik 1.109 }
630
631 //------------------------------------------------------------------------------
632 //
|
633 mike 1.23 // getReferenceClassAttribute()
634 //
635 // <!ENTITY % ReferenceClass "REFERENCECLASS CDATA #IMPLIED">
636 //
637 //------------------------------------------------------------------------------
638
|
639 kumpf 1.62 CIMName XmlReader::getReferenceClassAttribute(
|
640 mike 1.23 Uint32 lineNumber,
641 const XmlEntry& entry,
642 const char* elementName)
643 {
644 String name;
645
646 if (!entry.getAttributeValue("REFERENCECLASS", name))
|
647 kumpf 1.62 return CIMName();
|
648 mike 1.23
649 if (!CIMName::legal(name))
650 {
|
651 karl 1.79 #ifdef PEGASUS_SNIA_INTEROP_TEST
652 name = "PEGASUS_SUBSTITUED_THIS_FOR_BAD_NAME";
653 return name;
654 #endif
|
655 humberto 1.85
656 // l10n
657
658 // char buffer[MESSAGE_SIZE];
659 // sprintf(buffer,
660 // "Illegal value for %s.REFERENCECLASS attribute", elementName);
661 // throw XmlSemanticError(lineNumber, buffer);
662
663 char buffer[MESSAGE_SIZE];
664 sprintf(buffer, "%s.REFERENCECLASS", elementName);
665
666 MessageLoaderParms mlParms("Common.XmlReader.ILLEGAL_VALUE_FOR_ATTRIBUTE",
667 "Illegal value for $0 attribute",
668 buffer);
669
670 throw XmlSemanticError(lineNumber, mlParms);
|
671 mike 1.23 }
672
673 return name;
674 }
675
676 //------------------------------------------------------------------------------
677 //
678 // getSuperClassAttribute()
679 //
680 // <!ENTITY % SuperClass "SUPERCLASS CDATA #IMPLIED">
681 //
682 //------------------------------------------------------------------------------
683
|
684 kumpf 1.62 CIMName XmlReader::getSuperClassAttribute(
|
685 mike 1.23 Uint32 lineNumber,
686 const XmlEntry& entry,
687 const char* tagName)
688 {
689 String superClass;
690
691 if (!entry.getAttributeValue("SUPERCLASS", superClass))
|
692 kumpf 1.62 return CIMName();
|
693 mike 1.23
694 if (!CIMName::legal(superClass))
695 {
|
696 humberto 1.85
697 // l10n
698
699 // char buffer[MESSAGE_SIZE];
700 // sprintf(
701 // buffer, "Illegal value for %s.SUPERCLASS attribute", tagName);
702 // throw XmlSemanticError(lineNumber, buffer);
703
704 char buffer[MESSAGE_SIZE];
705 sprintf(buffer, "%s.SUPERCLASS", tagName);
706
707 MessageLoaderParms mlParms("Common.XmlReader.ILLEGAL_VALUE_FOR_ATTRIBUTE",
708 "Illegal value for $0 attribute",
709 buffer);
710
711 throw XmlSemanticError(lineNumber, mlParms);
|
712 mike 1.23 }
713
714 return superClass;
715 }
716
717 //------------------------------------------------------------------------------
718 //
719 // getCimTypeAttribute()
720 //
|
721 kumpf 1.26 // This method can be used to get a TYPE attribute or a PARAMTYPE attribute.
722 // The only significant difference is that PARAMTYPE may specify a value of
723 // "reference" type. This method recognizes these attributes by name, and
724 // does not allow a "TYPE" attribute to be of "reference" type.
725 //
|
726 mike 1.23 // <!ENTITY % CIMType "TYPE (boolean|string|char16|uint8|sint8|uint16
727 // |sint16|uint32|sint32|uint64|sint64|datetime|real32|real64)">
728 //
|
729 kumpf 1.26 // <!ENTITY % ParamType "PARAMTYPE (boolean|string|char16|uint8|sint8
730 // |uint16|sint16|uint32|sint32|uint64|sint64|datetime|real32|real64
731 // |reference)">
732 //
|
733 mike 1.23 //------------------------------------------------------------------------------
734
|
735 kumpf 1.67 Boolean XmlReader::getCimTypeAttribute(
|
736 mike 1.23 Uint32 lineNumber,
737 const XmlEntry& entry,
|
738 kumpf 1.67 CIMType& cimType, // Output parameter
|
739 kumpf 1.26 const char* tagName,
740 const char* attributeName,
741 Boolean required)
|
742 mike 1.23 {
743 const char* typeName;
744
|
745 kumpf 1.26 if (!entry.getAttributeValue(attributeName, typeName))
|
746 mike 1.23 {
|
747 kumpf 1.26 if (required)
748 {
|
749 humberto 1.85
750 // l10n
751
752 // char message[MESSAGE_SIZE];
753 // sprintf(message, "missing %s.%s attribute", tagName, attributeName);
754 // throw XmlValidationError(lineNumber, message);
755
756 char message[MESSAGE_SIZE];
757 sprintf(message, "%s.%s", tagName, attributeName);
758
759 MessageLoaderParms mlParms("Common.XmlReader.MISSING_ATTRIBUTE",
760 "missing $0 attribute",
761 message);
762
763 throw XmlValidationError(lineNumber, mlParms);
764
|
765 kumpf 1.26 }
766 else
|
767 humberto 1.85 {
|
768 kumpf 1.67 return false;
|
769 humberto 1.85 }
|
770 mike 1.23 }
771
|
772 kumpf 1.67 CIMType type = CIMTYPE_BOOLEAN;
773 Boolean unrecognizedType = false;
|
774 mike 1.23
775 if (strcmp(typeName, "boolean") == 0)
|
776 kumpf 1.61 type = CIMTYPE_BOOLEAN;
|
777 mike 1.23 else if (strcmp(typeName, "string") == 0)
|
778 kumpf 1.61 type = CIMTYPE_STRING;
|
779 mike 1.23 else if (strcmp(typeName, "char16") == 0)
|
780 kumpf 1.61 type = CIMTYPE_CHAR16;
|
781 mike 1.23 else if (strcmp(typeName, "uint8") == 0)
|
782 kumpf 1.61 type = CIMTYPE_UINT8;
|
783 mike 1.23 else if (strcmp(typeName, "sint8") == 0)
|
784 kumpf 1.61 type = CIMTYPE_SINT8;
|
785 mike 1.23 else if (strcmp(typeName, "uint16") == 0)
|
786 kumpf 1.61 type = CIMTYPE_UINT16;
|
787 mike 1.23 else if (strcmp(typeName, "sint16") == 0)
|
788 kumpf 1.61 type = CIMTYPE_SINT16;
|
789 mike 1.23 else if (strcmp(typeName, "uint32") == 0)
|
790 kumpf 1.61 type = CIMTYPE_UINT32;
|
791 mike 1.23 else if (strcmp(typeName, "sint32") == 0)
|
792 kumpf 1.61 type = CIMTYPE_SINT32;
|
793 mike 1.23 else if (strcmp(typeName, "uint64") == 0)
|
794 kumpf 1.61 type = CIMTYPE_UINT64;
|
795 mike 1.23 else if (strcmp(typeName, "sint64") == 0)
|
796 kumpf 1.61 type = CIMTYPE_SINT64;
|
797 mike 1.23 else if (strcmp(typeName, "datetime") == 0)
|
798 kumpf 1.61 type = CIMTYPE_DATETIME;
|
799 mike 1.23 else if (strcmp(typeName, "real32") == 0)
|
800 kumpf 1.61 type = CIMTYPE_REAL32;
|
801 mike 1.23 else if (strcmp(typeName, "real64") == 0)
|
802 kumpf 1.61 type = CIMTYPE_REAL64;
|
803 kumpf 1.26 else if (strcmp(typeName, "reference") == 0)
|
804 kumpf 1.61 type = CIMTYPE_REFERENCE;
|
805 dave.sudlik 1.109 // PEP 194:
806 // Note that "object" (ie. CIMTYPE_OBJECT) is not a real CIM datatype, just a
807 // Pegasus internal representation of an embedded object, so it won't be found here.
|
808 kumpf 1.67 else unrecognizedType = true;
|
809 mike 1.23
|
810 kumpf 1.67 if (unrecognizedType ||
|
811 kumpf 1.61 ((type == CIMTYPE_REFERENCE) &&
|
812 kumpf 1.26 (strcmp(attributeName, "PARAMTYPE") != 0)))
|
813 mike 1.23 {
|
814 humberto 1.85 // l10n
815
816 // char message[MESSAGE_SIZE];
817 // sprintf(message, "Illegal value for %s.%s attribute", tagName,
818 // attributeName);
819 // throw XmlSemanticError(lineNumber, message);
820
821 char buffer[MESSAGE_SIZE];
822 sprintf(buffer, "%s.%s", tagName, attributeName);
823
824 MessageLoaderParms mlParms("Common.XmlReader.ILLEGAL_VALUE_FOR_ATTRIBUTE",
825 "Illegal value for $0 attribute",
826 buffer);
827
828 throw XmlSemanticError(lineNumber, mlParms);
|
829 mike 1.23 }
830
|
831 kumpf 1.67 cimType = type;
832 return true;
|
833 mike 1.23 }
834
835 //------------------------------------------------------------------------------
836 //
837 // getCimBooleanAttribute()
838 //
839 //------------------------------------------------------------------------------
840
841 Boolean XmlReader::getCimBooleanAttribute(
842 Uint32 lineNumber,
843 const XmlEntry& entry,
844 const char* tagName,
845 const char* attributeName,
846 Boolean defaultValue,
847 Boolean required)
848 {
849 const char* tmp;
850
851 if (!entry.getAttributeValue(attributeName, tmp))
852 {
853 if (!required)
854 mike 1.23 return defaultValue;
855
|
856 humberto 1.85 // l10n
857
858 // char buffer[62];
859 // sprintf(buffer, "missing required %s.%s attribute",
860 // attributeName, tagName);
861
862 // throw XmlValidationError(lineNumber, buffer);
863
|
864 mike 1.23 char buffer[62];
|
865 humberto 1.85 sprintf(buffer, "%s.%s", attributeName, tagName);
|
866 mike 1.23
|
867 humberto 1.85 MessageLoaderParms mlParms("Common.XmlReader.MISSING_REQUIRED_ATTRIBUTE",
868 "missing required $0 attribute",
869 buffer);
870
871 throw XmlValidationError(lineNumber, mlParms);
|
872 mike 1.23 }
873
874 if (strcmp(tmp, "true") == 0)
875 return true;
876 else if (strcmp(tmp, "false") == 0)
877 return false;
878
|
879 humberto 1.85 // l10n
880
881 // char buffer[62];
882 // sprintf(buffer, "Invalid %s.%s attribute value", attributeName, tagName);
883 // throw XmlSemanticError(lineNumber, buffer);
884
|
885 mike 1.23 char buffer[62];
|
886 humberto 1.85 sprintf(buffer, "%s.%s", attributeName, tagName);
887
888 MessageLoaderParms mlParms("Common.XmlReader.INVALID_ATTRIBUTE",
889 "Invalid $0 attribute value",
890 buffer);
891
892 throw XmlSemanticError(lineNumber, mlParms);
893
|
894 mike 1.23 return false;
895 }
896
897 //------------------------------------------------------------------------------
898 //
899 // SringToReal()
900 //
901 // [ "+" | "-" ] *decimalDigit "." 1*decimalDigit
902 // [ ( "e" | "E" ) [ "+" | "-" ] 1*decimalDigit ]
903 //
904 //------------------------------------------------------------------------------
905
906 Boolean XmlReader::stringToReal(const char* stringValue, Real64& x)
907 {
|
908 kumpf 1.43 //
909 // Check the string against the DMTF-defined grammar
910 //
|
911 mike 1.23 const char* p = stringValue;
912
913 if (!*p)
914 return false;
915
916 // Skip optional sign:
917
918 if (*p == '+' || *p == '-')
919 p++;
920
921 // Skip optional first set of digits:
922
923 while (isdigit(*p))
924 p++;
925
926 // Test required dot:
927
928 if (*p++ != '.')
929 return false;
930
931 // One or more digits required:
932 mike 1.23
933 if (!isdigit(*p++))
934 return false;
935
936 while (isdigit(*p))
937 p++;
938
939 // If there is an exponent now:
940
941 if (*p)
942 {
943 // Test exponent:
944
945 if (*p != 'e' && *p != 'E')
946 return false;
947
948 p++;
949
950 // Skip optional sign:
951
952 if (*p == '+' || *p == '-')
953 mike 1.23 p++;
954
955 // One or more digits required:
956
957 if (!isdigit(*p++))
958 return false;
959
960 while (isdigit(*p))
961 p++;
962 }
963
964 if (*p)
965 return false;
966
|
967 kumpf 1.43 //
968 // Do the conversion
969 //
|
970 mike 1.23 char* end;
|
971 kumpf 1.43 errno = 0;
|
972 mike 1.23 x = strtod(stringValue, &end);
|
973 kumpf 1.43 if (*end || (errno == ERANGE))
974 {
975 return false;
976 }
977
|
978 mike 1.23 return true;
979 }
980
|
981 s.hills 1.93 inline Uint8 _xmlReader_hexCharToNumeric(const char c)
|
982 kumpf 1.41 {
983 Uint8 n;
984
985 if (isdigit(c))
986 n = (c - '0');
987 else if (isupper(c))
988 n = (c - 'A' + 10);
989 else // if (islower(c))
990 n = (c - 'a' + 10);
991
992 return n;
|
993 kumpf 1.82 }
994
995 // See http://www.ietf.org/rfc/rfc2396.txt section 2
|
996 chuck 1.88 //
997 // Also see the "CIM Operations over HTTP" spec, section 3.3.2 and
998 // 3.3.3, for the treatment of non US-ASCII chars (UTF-8)
|
999 kumpf 1.82 String XmlReader::decodeURICharacters(String uriString)
1000 {
1001 Uint32 i;
1002
|
1003 chuck 1.88 Array<Uint8> utf8Chars;
1004
|
1005 kumpf 1.82 for (i=0; i<uriString.size(); i++)
1006 {
1007 if (uriString[i] == '%')
1008 {
1009 if (i+2 >= uriString.size())
1010 {
|
1011 humberto 1.85 // l10n
1012
1013 // throw ParseError("Invalid URI encoding");
1014
|
1015 humberto 1.87 MessageLoaderParms mlParms("Common.XmlReader.INVALID_URI_ENCODING",
1016 "Invalid URI encoding");
|
1017 humberto 1.85
1018 throw ParseError(MessageLoader::getMessage(mlParms));
1019
|
1020 kumpf 1.82 }
1021
|
1022 s.hills 1.93 Uint8 digit1 = _xmlReader_hexCharToNumeric(char(uriString[++i]));
1023 Uint8 digit2 = _xmlReader_hexCharToNumeric(char(uriString[++i]));
|
1024 kumpf 1.82 if ( (digit1 > 15) || (digit2 > 15) )
1025 {
|
1026 humberto 1.85 // l10n
1027
1028 // throw ParseError("Invalid URI encoding");
1029
|
1030 humberto 1.87 MessageLoaderParms mlParms("Common.XmlReader.INVALID_URI_ENCODING",
1031 "Invalid URI encoding");
|
1032 humberto 1.85
1033 throw ParseError(MessageLoader::getMessage(mlParms));
|
1034 kumpf 1.82 }
1035
1036 Uint16 decodedChar = Uint16(digit1<<4) + Uint16(digit2);
|
1037 chuck 1.88 utf8Chars.append((Uint8)decodedChar);
|
1038 kumpf 1.82 }
1039 else
1040 {
|
1041 chuck 1.88 utf8Chars.append((Uint8)uriString[i]);
|
1042 kumpf 1.82 }
1043 }
1044
|
1045 chuck 1.88 // If there was a string to decode...
1046 if (uriString.size() > 0)
1047 {
1048 // Convert UTF-8 to UTF-16 and return the String
1049 utf8Chars.append('\0');
|
1050 chuck 1.98 return String((char *)utf8Chars.getData());
|
1051 chuck 1.88 }
1052 else
1053 {
1054 return String();
1055 }
|
1056 kumpf 1.41 }
1057
|
1058 mike 1.23 //------------------------------------------------------------------------------
1059 //
1060 // stringToSignedInteger
1061 //
1062 // [ "+" | "-" ] ( positiveDecimalDigit *decimalDigit | "0" )
|
1063 kumpf 1.41 // or
1064 // [ "+" | "-" ] ( "0x" | "0X" ) 1*hexDigit
|
1065 mike 1.23 //
1066 //------------------------------------------------------------------------------
1067
1068 Boolean XmlReader::stringToSignedInteger(
1069 const char* stringValue,
1070 Sint64& x)
1071 {
1072 x = 0;
1073 const char* p = stringValue;
1074
|
1075 kumpf 1.41 if (!p || !*p)
|
1076 mike 1.23 return false;
1077
1078 // Skip optional sign:
1079
1080 Boolean negative = *p == '-';
1081
1082 if (negative || *p == '+')
1083 p++;
1084
1085 if (*p == '0')
|
1086 kumpf 1.41 {
1087 if ( (p[1] == 'x') || (p[1] == 'X') )
1088 {
1089 // Convert a hexadecimal string
|
1090 mike 1.23
|
1091 kumpf 1.41 // Skip over the "0x"
1092 p+=2;
|
1093 mike 1.23
|
1094 kumpf 1.41 // At least one hexadecimal digit is required
1095 if (!isxdigit(*p))
1096 return false;
1097
1098 // Build the Sint64 as a negative number, regardless of the
1099 // eventual sign (negative numbers can be bigger than positive ones)
1100
1101 // Add on each digit, checking for overflow errors
1102 while (isxdigit(*p))
1103 {
1104 // Make sure we won't overflow when we multiply by 16
|
1105 kumpf 1.68 if (x < PEGASUS_SINT64_MIN/16)
|
1106 kumpf 1.41 {
1107 return false;
1108 }
1109 x = x << 4;
1110
1111 // Make sure we don't overflow when we add the next digit
|
1112 s.hills 1.93 Sint64 newDigit = Sint64(_xmlReader_hexCharToNumeric(*p++));
|
1113 kumpf 1.68 if (PEGASUS_SINT64_MIN - x > -newDigit)
|
1114 kumpf 1.41 {
1115 return false;
1116 }
1117 x = x - newDigit;
1118 }
1119
1120 // If we found a non-hexadecimal digit, report an error
1121 if (*p)
1122 return false;
1123
1124 // Return the integer to positive, if necessary, checking for an
1125 // overflow error
1126 if (!negative)
1127 {
|
1128 kumpf 1.68 if (x == PEGASUS_SINT64_MIN)
|
1129 kumpf 1.41 {
1130 return false;
1131 }
1132 x = -x;
1133 }
1134 return true;
1135 }
1136 else
1137 {
1138 // A decimal string that starts with '0' must be exactly "0".
1139 return p[1] == '\0';
1140 }
1141 }
|
1142 mike 1.23
|
1143 kumpf 1.41 // Expect a positive decimal digit:
|
1144 mike 1.23
|
1145 kumpf 1.41 // At least one decimal digit is required
1146 if (!isdigit(*p))
1147 return false;
1148
1149 // Build the Sint64 as a negative number, regardless of the
1150 // eventual sign (negative numbers can be bigger than positive ones)
|
1151 mike 1.23
|
1152 kumpf 1.41 // Add on each digit, checking for overflow errors
|
1153 mike 1.23 while (isdigit(*p))
|
1154 kumpf 1.37 {
|
1155 kumpf 1.41 // Make sure we won't overflow when we multiply by 10
|
1156 kumpf 1.68 if (x < PEGASUS_SINT64_MIN/10)
|
1157 kumpf 1.37 {
1158 return false;
1159 }
1160 x = 10 * x;
|
1161 kumpf 1.41
1162 // Make sure we won't overflow when we add the next digit
1163 Sint64 newDigit = (*p++ - '0');
|
1164 kumpf 1.68 if (PEGASUS_SINT64_MIN - x > -newDigit)
|
1165 kumpf 1.37 {
1166 return false;
1167 }
|
1168 kumpf 1.41 x = x - newDigit;
|
1169 kumpf 1.37 }
|
1170 mike 1.23
|
1171 kumpf 1.41 // If we found a non-decimal digit, report an error
1172 if (*p)
1173 return false;
1174
1175 // Return the integer to positive, if necessary, checking for an
1176 // overflow error
|
1177 kumpf 1.37 if (!negative)
1178 {
|
1179 kumpf 1.68 if (x == PEGASUS_SINT64_MIN)
|
1180 kumpf 1.37 {
1181 return false;
1182 }
|
1183 kumpf 1.41 x = -x;
|
1184 kumpf 1.37 }
|
1185 mike 1.23 return true;
1186 }
1187
1188 //------------------------------------------------------------------------------
1189 //
1190 // stringToUnsignedInteger
1191 //
|
1192 kumpf 1.40 // ( positiveDecimalDigit *decimalDigit | "0" )
|
1193 kumpf 1.41 // or
1194 // ( "0x" | "0X" ) 1*hexDigit
|
1195 mike 1.23 //
1196 //------------------------------------------------------------------------------
1197
1198 Boolean XmlReader::stringToUnsignedInteger(
1199 const char* stringValue,
1200 Uint64& x)
1201 {
1202 x = 0;
1203 const char* p = stringValue;
1204
|
1205 kumpf 1.41 if (!p || !*p)
|
1206 mike 1.23 return false;
1207
1208 if (*p == '0')
|
1209 kumpf 1.41 {
1210 if ( (p[1] == 'x') || (p[1] == 'X') )
1211 {
1212 // Convert a hexadecimal string
|
1213 mike 1.23
|
1214 kumpf 1.41 // Skip over the "0x"
1215 p+=2;
|
1216 mike 1.23
|
1217 kumpf 1.41 // At least one hexadecimal digit is required
1218 if (!*p)
1219 return false;
1220
1221 // Add on each digit, checking for overflow errors
1222 while (isxdigit(*p))
1223 {
1224 // Make sure we won't overflow when we multiply by 16
|
1225 kumpf 1.68 if (x > PEGASUS_UINT64_MAX/16)
|
1226 kumpf 1.41 {
1227 return false;
1228 }
1229 x = x << 4;
1230
1231 // We can't overflow when we add the next digit
|
1232 s.hills 1.93 Uint64 newDigit = Uint64(_xmlReader_hexCharToNumeric(*p++));
|
1233 kumpf 1.68 if (PEGASUS_UINT64_MAX - x < newDigit)
|
1234 kumpf 1.41 {
1235 return false;
1236 }
1237 x = x + newDigit;
1238 }
1239
1240 // If we found a non-hexadecimal digit, report an error
1241 if (*p)
1242 return false;
|
1243 mike 1.23
|
1244 kumpf 1.41 return true;
1245 }
1246 else
1247 {
1248 // A decimal string that starts with '0' must be exactly "0".
1249 return p[1] == '\0';
1250 }
1251 }
|
1252 mike 1.23
|
1253 kumpf 1.41 // Expect a positive decimal digit:
|
1254 mike 1.23
|
1255 kumpf 1.41 // Add on each digit, checking for overflow errors
|
1256 mike 1.23 while (isdigit(*p))
|
1257 kumpf 1.37 {
|
1258 kumpf 1.41 // Make sure we won't overflow when we multiply by 10
|
1259 kumpf 1.68 if (x > PEGASUS_UINT64_MAX/10)
|
1260 kumpf 1.37 {
1261 return false;
1262 }
1263 x = 10 * x;
|
1264 kumpf 1.41
1265 // Make sure we won't overflow when we add the next digit
1266 Uint64 newDigit = (*p++ - '0');
|
1267 kumpf 1.68 if (PEGASUS_UINT64_MAX - x < newDigit)
|
1268 kumpf 1.37 {
1269 return false;
1270 }
|
1271 kumpf 1.41 x = x + newDigit;
|
1272 kumpf 1.37 }
|
1273 kumpf 1.41
1274 // If we found a non-decimal digit, report an error
1275 if (*p)
1276 return false;
|
1277 mike 1.23
1278 return true;
1279 }
1280
1281 //------------------------------------------------------------------------------
1282 //
1283 // stringToValue()
1284 //
|
1285 karl 1.35 // Return: CIMValue. If the string input is zero length creates a CIMValue
1286 // with value defined by the type. Else the value is inserted.
1287 //
1288 // Note that this does not set the CIMValue Null if the string is empty.
1289 //
|
1290 mike 1.23 //------------------------------------------------------------------------------
1291
1292 CIMValue XmlReader::stringToValue(
1293 Uint32 lineNumber,
1294 const char* valueString,
1295 CIMType type)
1296 {
1297 // ATTN-B: accepting only UTF-8 for now! (affects string and char16):
1298
|
1299 karl 1.35 // Create value per type
|
1300 mike 1.23 switch (type)
1301 {
|
1302 kumpf 1.61 case CIMTYPE_BOOLEAN:
|
1303 mike 1.23 {
|
1304 kumpf 1.72 if (System::strcasecmp(valueString, "TRUE") == 0)
|
1305 mike 1.23 return CIMValue(true);
|
1306 kumpf 1.72 else if (System::strcasecmp(valueString, "FALSE") == 0)
|
1307 mike 1.23 return CIMValue(false);
|
1308 humberto 1.85 else {
1309
1310 // l10n
1311
1312 // throw XmlSemanticError(
1313 // lineNumber, "Invalid boolean value");
1314
|
1315 humberto 1.87 MessageLoaderParms mlParms("Common.XmlReader.INVALID_BOOLEAN_VALUE",
1316 "Invalid boolean value");
|
1317 humberto 1.85
1318 throw XmlSemanticError(lineNumber, mlParms);
1319
1320 }
|
1321 mike 1.23 }
1322
|
1323 kumpf 1.61 case CIMTYPE_STRING:
|
1324 mike 1.23 {
|
1325 chuck 1.98 return CIMValue(String(valueString));
|
1326 mike 1.23 }
1327
|
1328 kumpf 1.61 case CIMTYPE_CHAR16:
|
1329 mike 1.23 {
|
1330 chuck 1.88
1331 // remove this test, utf-8 can be up to 6 bytes per char
1332 /*
|
1333 humberto 1.85 if (strlen(valueString) != 1) {
|
1334 chuck 1.88 // l10n
|
1335 humberto 1.85
|
1336 chuck 1.88 // throw XmlSemanticError(lineNumber, "Invalid char16 value");
1337
1338 MessageLoaderParms mlParms("Common.XmlReader.INVALID_CHAR16_VALUE",
1339 "Invalid char16 value");
1340
1341 throw XmlSemanticError(lineNumber, mlParms);
1342 }
1343 */
1344 // Converts UTF-8 to UTF-16
|
1345 chuck 1.98 String tmp(valueString);
|
1346 chuck 1.88 if (tmp.size() != 1)
1347 {
|
1348 humberto 1.85 // l10n
1349
1350 // throw XmlSemanticError(lineNumber, "Invalid char16 value");
1351
|
1352 humberto 1.87 MessageLoaderParms mlParms("Common.XmlReader.INVALID_CHAR16_VALUE",
1353 "Invalid char16 value");
|
1354 humberto 1.85
1355 throw XmlSemanticError(lineNumber, mlParms);
|
1356 chuck 1.88 }
|
1357 mike 1.23
|
1358 chuck 1.88 return CIMValue(tmp[0]);
|
1359 mike 1.23 }
1360
|
1361 kumpf 1.61 case CIMTYPE_UINT8:
1362 case CIMTYPE_UINT16:
1363 case CIMTYPE_UINT32:
1364 case CIMTYPE_UINT64:
|
1365 mike 1.23 {
1366 Uint64 x;
1367
1368 if (!stringToUnsignedInteger(valueString, x))
1369 {
|
1370 humberto 1.85
1371 // l10n
1372
1373 // throw XmlSemanticError(
1374 // lineNumber, "Invalid unsigned integer value");
1375
|
1376 humberto 1.87 MessageLoaderParms mlParms("Common.XmlReader.INVALID_UI_VALUE",
1377 "Invalid unsigned integer value");
|
1378 humberto 1.85
1379 throw XmlSemanticError(lineNumber, mlParms);
1380
|
1381 mike 1.23 }
1382
1383 switch (type)
1384 {
|
1385 kumpf 1.61 case CIMTYPE_UINT8:
|
1386 kumpf 1.37 {
1387 if (x >= (Uint64(1)<<8))
1388 {
|
1389 humberto 1.85
1390 // l10n
1391
1392 // throw XmlSemanticError(
1393 // lineNumber, "Uint8 value out of range");
1394
|
1395 humberto 1.87 MessageLoaderParms mlParms("Common.XmlReader.U8_VALUE_OUT_OF_RANGE",
1396 "Uint8 value out of range");
|
1397 humberto 1.85
1398 throw XmlSemanticError(lineNumber, mlParms);
|
1399 kumpf 1.37 }
1400 return CIMValue(Uint8(x));
1401 }
|
1402 kumpf 1.61 case CIMTYPE_UINT16:
|
1403 kumpf 1.37 {
1404 if (x >= (Uint64(1)<<16))
1405 {
|
1406 humberto 1.85
1407 // l10n
1408
1409 // throw XmlSemanticError(
1410 // lineNumber, "Uint16 value out of range");
1411
|
1412 humberto 1.87 MessageLoaderParms mlParms("Common.XmlReader.U16_VALUE_OUT_OF_RANGE",
1413 "Uint16 value out of range");
|
1414 humberto 1.85
1415 throw XmlSemanticError(lineNumber, mlParms);
1416
|
1417 kumpf 1.37 }
1418 return CIMValue(Uint16(x));
1419 }
|
1420 kumpf 1.61 case CIMTYPE_UINT32:
|
1421 kumpf 1.37 {
1422 if (x >= (Uint64(1)<<32))
1423 {
|
1424 humberto 1.85
1425 // l10n
1426
1427 // throw XmlSemanticError(
1428 // lineNumber, "Uint32 value out of range");
1429
|
1430 humberto 1.87 MessageLoaderParms mlParms("Common.XmlReader.U32_VALUE_OUT_OF_RANGE",
1431 "Uint32 value out of range");
|
1432 humberto 1.85
1433 throw XmlSemanticError(lineNumber, mlParms);
|
1434 kumpf 1.37 }
1435 return CIMValue(Uint32(x));
1436 }
|
1437 kumpf 1.61 case CIMTYPE_UINT64: return CIMValue(Uint64(x));
|
1438 mike 1.23 default: break;
1439 }
1440 }
1441
|
1442 kumpf 1.61 case CIMTYPE_SINT8:
1443 case CIMTYPE_SINT16:
1444 case CIMTYPE_SINT32:
1445 case CIMTYPE_SINT64:
|
1446 mike 1.23 {
1447 Sint64 x;
1448
1449 if (!stringToSignedInteger(valueString, x))
1450 {
|
1451 humberto 1.85
1452 // l10n
1453
1454 // throw XmlSemanticError(
1455 // lineNumber, "Invalid signed integer value");
1456
|
1457 humberto 1.87 MessageLoaderParms mlParms("Common.XmlReader.INVALID_SI_VALUE",
1458 "Invalid signed integer value");
|
1459 humberto 1.85
1460 throw XmlSemanticError(lineNumber, mlParms);
1461
|
1462 mike 1.23 }
1463
1464 switch (type)
1465 {
|
1466 kumpf 1.61 case CIMTYPE_SINT8:
|
1467 kumpf 1.37 {
1468 if( (x >= (Sint64(1)<<7)) || (x < (-(Sint64(1)<<7))) )
1469 {
|
1470 humberto 1.85
1471 // l10n
1472
1473 // throw XmlSemanticError(
1474 // lineNumber, "Sint8 value out of range");
1475
|
1476 humberto 1.87 MessageLoaderParms mlParms("Common.XmlReader.S8_VALUE_OUT_OF_RANGE",
1477 "Sint8 value out of range");
|
1478 humberto 1.85
1479 throw XmlSemanticError(lineNumber, mlParms);
|
1480 kumpf 1.37 }
1481 return CIMValue(Sint8(x));
1482 }
|
1483 kumpf 1.61 case CIMTYPE_SINT16:
|
1484 kumpf 1.37 {
1485 if( (x >= (Sint64(1)<<15)) || (x < (-(Sint64(1)<<15))) )
1486 {
|
1487 humberto 1.85
1488 // l10n
1489
1490 // throw XmlSemanticError(
1491 // lineNumber, "Sint16 value out of range");
1492
|
1493 humberto 1.87 MessageLoaderParms mlParms("Common.XmlReader.S16_VALUE_OUT_OF_RANGE",
1494 "Sint16 value out of range");
|
1495 humberto 1.85
1496 throw XmlSemanticError(lineNumber, mlParms);
|
1497 kumpf 1.37 }
1498 return CIMValue(Sint16(x));
1499 }
|
1500 kumpf 1.61 case CIMTYPE_SINT32:
|
1501 kumpf 1.37 {
1502 if( (x >= (Sint64(1)<<31)) || (x < (-(Sint64(1)<<31))) )
1503 {
|
1504 humberto 1.85
1505 // l10n
1506
1507 // throw XmlSemanticError(
1508 // lineNumber, "Sint32 value out of range");
1509
|
1510 humberto 1.87 MessageLoaderParms mlParms("Common.XmlReader.S32_VALUE_OUT_OF_RANGE",
1511 "Sint32 value out of range");
|
1512 humberto 1.85
1513 throw XmlSemanticError(lineNumber, mlParms);
|
1514 kumpf 1.37 }
1515 return CIMValue(Sint32(x));
1516 }
|
1517 kumpf 1.61 case CIMTYPE_SINT64: return CIMValue(Sint64(x));
|
1518 mike 1.23 default: break;
1519 }
1520 }
1521
|
1522 kumpf 1.61 case CIMTYPE_DATETIME:
|
1523 mike 1.23 {
1524 CIMDateTime tmp;
1525
1526 try
1527 {
|
1528 karl 1.76 // KS 20021002 - Exception if no datatime value. Test for
1529 // zero length and leave the NULL value in the variable
1530 // Bugzilla 137 Adds the following if line.
|
1531 karl 1.78 // Expect this to become permanent but test only for now
|
1532 karl 1.76 #ifdef PEGASUS_SNIA_INTEROP_TEST
1533 if (strlen(valueString) != 0)
1534 #endif
|
1535 karl 1.77 tmp.set(valueString);
|
1536 mike 1.23 }
|
1537 kumpf 1.66 catch (InvalidDateTimeFormatException&)
|
1538 mike 1.23 {
|
1539 humberto 1.85
1540 // l10n
1541
1542 // throw XmlSemanticError(lineNumber, "Invalid datetime value");
1543
|
1544 humberto 1.87 MessageLoaderParms mlParms("Common.XmlReader.INVALID_DATETIME_VALUE",
1545 "Invalid datetime value");
|
1546 humberto 1.85
1547 throw XmlSemanticError(lineNumber, mlParms);
|
1548 mike 1.23 }
1549
1550 return CIMValue(tmp);
1551 }
1552
|
1553 kumpf 1.61 case CIMTYPE_REAL32:
|
1554 mike 1.23 {
1555 Real64 x;
1556
|
1557 humberto 1.85 if (!stringToReal(valueString, x)) {
1558
1559 // l10n
1560
1561 // throw XmlSemanticError(lineNumber, "Invalid real number value");
|
1562 mike 1.23
|
1563 humberto 1.87 MessageLoaderParms mlParms("Common.XmlReader.INVALID_RN_VALUE",
1564 "Invalid real number value");
|
1565 humberto 1.85
1566 throw XmlSemanticError(lineNumber, mlParms);
1567 }
|
1568 mike 1.23 return CIMValue(Real32(x));
1569 }
1570
|
1571 kumpf 1.61 case CIMTYPE_REAL64:
|
1572 mike 1.23 {
1573 Real64 x;
1574
|
1575 humberto 1.85 if (!stringToReal(valueString, x)) {
1576
1577 // l10n
1578
1579 // throw XmlSemanticError(lineNumber, "Invalid real number value");
|
1580 mike 1.23
|
1581 humberto 1.87 MessageLoaderParms mlParms("Common.XmlReader.INVALID_RN_VALUE",
1582 "Invalid real number value");
|
1583 humberto 1.85
1584 throw XmlSemanticError(lineNumber, mlParms);
1585 }
|
1586 mike 1.23 return CIMValue(x);
1587 }
1588
|
1589 dave.sudlik 1.109 // PEP 194:
1590 // Note that "object" (ie. CIMTYPE_OBJECT) is not a real CIM datatype, but just a
1591 // Pegasus internal representation of an embedded object. However, this case is
1592 // used when decoding string representations of embedded objects.
1593 case CIMTYPE_OBJECT:
1594 {
1595 CIMObject x;
1596
1597 if (*valueString == '\0')
1598 {
|
1599 dave.sudlik 1.117 return CIMValue(CIMTYPE_OBJECT, false, 0);
|
1600 dave.sudlik 1.109 }
1601 else
1602 {
1603 // Convert the non-NULL string to a CIMObject (containing either a
1604 // CIMInstance or a CIMClass).
1605
|
1606 dave.sudlik 1.111 // First we need to create a new "temporary" XmlParser that is
|
1607 dave.sudlik 1.109 // just the value of the Embedded Object in String representation.
|
1608 joyce.j 1.112 AutoArrayPtr<char> tmp_buffer(new char[strlen(valueString) + 1]);
1609 strcpy(tmp_buffer.get(), valueString);
1610 XmlParser tmp_parser(tmp_buffer.get());
|
1611 dave.sudlik 1.109
1612 // The next bit of logic constructs a CIMObject from the Embedded Object String.
1613 // It is similar to the method XmlReader::getValueObjectElement().
1614 CIMInstance cimInstance;
1615 CIMClass cimClass;
1616
1617 if (XmlReader::getInstanceElement(tmp_parser, cimInstance))
1618 {
1619 x = CIMObject(cimInstance);
1620 }
1621 else if (XmlReader::getClassElement(tmp_parser, cimClass))
1622 {
1623 x = CIMObject(cimClass);
1624 }
1625 else
1626 {
1627 // l10n
1628
1629 // throw XmlValidationError(parser.getLine(),
1630 // "Expected INSTANCE or CLASS element");
1631
1632 dave.sudlik 1.109 MessageLoaderParms mlParms("Common.XmlReader.EXPECTED_INSTANCE_OR_CLASS_ELEMENT",
1633 "Expected INSTANCE or CLASS element"); // change "element" to "embedded object"
1634
1635 throw XmlValidationError(lineNumber, mlParms);
1636
1637 }
|
1638 dave.sudlik 1.111 // Ok, now we can delete the storage for the temporary XmlParser.
|
1639 joyce.j 1.112 tmp_buffer.reset();
|
1640 dave.sudlik 1.109 }
1641 return CIMValue(x);
1642 }
1643
|
1644 mike 1.23 default:
1645 break;
1646 }
1647
|
1648 humberto 1.85 // l10n
1649
1650 // throw XmlSemanticError(lineNumber, "malformed XML");
1651
1652 MessageLoaderParms mlParms("Common.XmlReader.MALFORMED_XML",
1653 "malformed XML");
1654
1655 throw XmlSemanticError(lineNumber, mlParms);
1656
|
1657 mike 1.23 return false;
1658 }
1659
1660 //------------------------------------------------------------------------------
1661 //
|
1662 kumpf 1.95 // skipElement()
1663 //
1664 //------------------------------------------------------------------------------
1665 void XmlReader::skipElement(
1666 XmlParser& parser,
1667 XmlEntry& entry)
1668 {
1669 const char * tag_name = entry.text;
1670
1671 if (entry.type == XmlEntry::EMPTY_TAG)
1672 {
1673 return;
1674 }
1675
1676 while (testStartTagOrEmptyTag(parser, entry))
1677 {
1678 skipElement(parser, entry);
1679 }
1680
1681 if (testContentOrCData(parser, entry))
1682 {
1683 kumpf 1.95 ; // skip
1684 }
1685
1686 expectEndTag(parser, tag_name);
1687 return;
1688 }
1689
1690 //------------------------------------------------------------------------------
1691 //
|
1692 mike 1.23 // getValueElement()
1693 //
1694 // <!ELEMENT VALUE (#PCDATA)>
1695 //
|
1696 karl 1.35 // Return: false if no value element.
1697 //
|
1698 mike 1.23 //------------------------------------------------------------------------------
1699
1700 Boolean XmlReader::getValueElement(
1701 XmlParser& parser,
1702 CIMType type,
1703 CIMValue& value)
1704 {
|
1705 karl 1.35 // Get VALUE start tag: Return false if no VALUE start Tag
|
1706 mike 1.23
1707 XmlEntry entry;
1708 if (!testStartTagOrEmptyTag(parser, entry, "VALUE"))
|
1709 dave.sudlik 1.111 {
1710 return false;
1711 }
|
1712 mike 1.23
1713 Boolean empty = entry.type == XmlEntry::EMPTY_TAG;
1714
|
1715 dave.sudlik 1.111 const char* valueString = "";
|
1716 dave.sudlik 1.109
|
1717 dave.sudlik 1.111 if (!empty)
|
1718 mike 1.23 {
|
1719 dave.sudlik 1.111 if (testContentOrCData(parser, entry))
|
1720 dave.sudlik 1.109 {
1721 valueString = entry.text;
|
1722 dave.sudlik 1.111 }
|
1723 mike 1.23
|
1724 dave.sudlik 1.109 expectEndTag(parser, "VALUE");
|
1725 mike 1.23 }
|
1726 dave.sudlik 1.111 #ifdef PEGASUS_SNIA_INTEROP_TEST
1727 // KS 20021004 - tries to put value in even if empty.
1728 // Think this is general problem with empty value
1729 // Need to check meaning of (#PCDATA) - Does it allow empty.
1730 // Bugzilla tbd
1731 if (!empty)
1732 #endif
1733 value = stringToValue(parser.getLine(), valueString,type);
|
1734 karl 1.33
|
1735 mike 1.23 return true;
1736 }
1737
1738 //------------------------------------------------------------------------------
1739 //
1740 // getStringValueElement()
1741 //
1742 // <!ELEMENT VALUE (#PCDATA)>
1743 //
1744 //------------------------------------------------------------------------------
1745
1746 Boolean XmlReader::getStringValueElement(
1747 XmlParser& parser,
1748 String& str,
1749 Boolean required)
1750 {
1751 XmlEntry entry;
1752
1753 if (!testStartTagOrEmptyTag(parser, entry, "VALUE"))
1754 {
|
1755 humberto 1.85 if (required) {
1756
1757 // l10n
1758
1759 // throw XmlValidationError(parser.getLine(),"Expected VALUE element");
1760
|
1761 humberto 1.87 MessageLoaderParms mlParms("Common.XmlReader.EXPECTED_VALUE_ELEMENT",
1762 "Expected VALUE element");
|
1763 humberto 1.85
1764 throw XmlValidationError(parser.getLine(), mlParms);
1765
1766
1767 }
1768 return false;
|
1769 mike 1.23 }
1770
1771 Boolean empty = entry.type == XmlEntry::EMPTY_TAG;
1772
1773 const char* valueString = "";
1774
1775 if (!empty)
1776 {
1777 if (testContentOrCData(parser, entry))
1778 valueString = entry.text;
1779
1780 expectEndTag(parser, "VALUE");
1781 }
1782
|
1783 chuck 1.98 str = String(valueString);
|
1784 mike 1.23 return true;
1785 }
1786
1787 //----------------------------------------------------------------------------
1788 //
1789 // getPropertyValue
|
1790 kumpf 1.30 // Use: Decode property value from SetProperty request and
1791 // GetProperty response.
|
1792 mike 1.23 //
|
1793 kumpf 1.30 // PropertyValue is one of:
|
1794 mike 1.23 //
1795 //
|
1796 karl 1.33 // <!ELEMENT VALUE.ARRAY (VALUE*)>
1797 //
1798 // <!ELEMENT VALUE.REFERENCE (CLASSPATH|LOCALCLASSPATH|CLASSNAME|
|
1799 kumpf 1.30 // <!ELEMENT VALUE.ARRAY (VALUE*)>
1800 //
1801 // <!ELEMENT VALUE.REFERENCE (CLASSPATH|LOCALCLASSPATH|CLASSNAME|
|
1802 mike 1.23 // INSTANCEPATH|LOCALINSTANCEPATH|INSTANCENAME)>
1803 //
|
1804 kumpf 1.30 // <!ELEMENT VALUE.REFARRAY (VALUE.REFERENCE*)>
1805 //
|
1806 mike 1.23 //----------------------------------------------------------------------------
1807 Boolean XmlReader::getPropertyValue(
1808 XmlParser& parser,
1809 CIMValue& cimValue)
1810 {
|
1811 kumpf 1.30 // Can not test for value type, so assume String
|
1812 kumpf 1.61 const CIMType type = CIMTYPE_STRING;
|
1813 mike 1.23
|
1814 kumpf 1.30 // Test for VALUE element
|
1815 mike 1.23 if (XmlReader::getValueElement(parser, type, cimValue))
1816 {
1817 return true;
1818 }
1819
|
1820 kumpf 1.30 // Test for VALUE.ARRAY element
1821 if (XmlReader::getValueArrayElement(parser, type, cimValue))
1822 {
|
1823 mike 1.23 return true;
|
1824 kumpf 1.30 }
|
1825 mike 1.23
|
1826 kumpf 1.30 // Test for VALUE.REFERENCE element
|
1827 kumpf 1.54 CIMObjectPath reference;
|
1828 kumpf 1.30 if (XmlReader::getValueReferenceElement(parser, reference))
|
1829 mike 1.25 {
1830 cimValue.set(reference);
1831 return true;
1832 }
|
1833 mike 1.23
|
1834 kumpf 1.30 // Test for VALUE.REFARRAY element
1835 if (XmlReader::getValueReferenceArrayElement(parser, cimValue))
1836 {
1837 return true;
1838 }
1839
1840 return false;
|
1841 mike 1.23 }
1842
1843 //------------------------------------------------------------------------------
1844 //
1845 // stringArrayToValue()
1846 //
1847 //------------------------------------------------------------------------------
1848
1849 template<class T>
1850 CIMValue StringArrayToValueAux(
1851 Uint32 lineNumber,
1852 const Array<const char*>& stringArray,
1853 CIMType type,
1854 T*)
1855 {
1856 Array<T> array;
1857
1858 for (Uint32 i = 0, n = stringArray.size(); i < n; i++)
1859 {
1860 CIMValue value = XmlReader::stringToValue(
1861 lineNumber, stringArray[i], type);
1862 mike 1.23
1863 T x;
1864 value.get(x);
1865 array.append(x);
1866 }
1867
1868 return CIMValue(array);
1869 }
1870
1871 CIMValue XmlReader::stringArrayToValue(
1872 Uint32 lineNumber,
1873 const Array<const char*>& array,
1874 CIMType type)
1875 {
1876 switch (type)
1877 {
|
1878 kumpf 1.61 case CIMTYPE_BOOLEAN:
|
1879 mike 1.23 return StringArrayToValueAux(lineNumber, array, type, (Boolean*)0);
1880
|
1881 kumpf 1.61 case CIMTYPE_STRING:
|
1882 mike 1.23 return StringArrayToValueAux(lineNumber, array, type, (String*)0);
1883
|
1884 kumpf 1.61 case CIMTYPE_CHAR16:
|
1885 mike 1.23 return StringArrayToValueAux(lineNumber, array, type, (Char16*)0);
1886
|
1887 kumpf 1.61 case CIMTYPE_UINT8:
|
1888 mike 1.23 return StringArrayToValueAux(lineNumber, array, type, (Uint8*)0);
1889
|
1890 kumpf 1.61 case CIMTYPE_UINT16:
|
1891 mike 1.23 return StringArrayToValueAux(lineNumber, array, type, (Uint16*)0);
1892
|
1893 kumpf 1.61 case CIMTYPE_UINT32:
|
1894 mike 1.23 return StringArrayToValueAux(lineNumber, array, type, (Uint32*)0);
1895
|
1896 kumpf 1.61 case CIMTYPE_UINT64:
|
1897 mike 1.23 return StringArrayToValueAux(lineNumber, array, type, (Uint64*)0);
1898
|
1899 kumpf 1.61 case CIMTYPE_SINT8:
|
1900 mike 1.23 return StringArrayToValueAux(lineNumber, array, type, (Sint8*)0);
1901
|
1902 kumpf 1.61 case CIMTYPE_SINT16:
|
1903 mike 1.23 return StringArrayToValueAux(lineNumber, array, type, (Sint16*)0);
1904
|
1905 kumpf 1.61 case CIMTYPE_SINT32:
|
1906 mike 1.23 return StringArrayToValueAux(lineNumber, array, type, (Sint32*)0);
1907
|
1908 kumpf 1.61 case CIMTYPE_SINT64:
|
1909 mike 1.23 return StringArrayToValueAux(lineNumber, array, type, (Sint64*)0);
1910
|
1911 kumpf 1.61 case CIMTYPE_DATETIME:
|
1912 mike 1.23 return StringArrayToValueAux(lineNumber, array, type, (CIMDateTime*)0);
1913
|
1914 kumpf 1.61 case CIMTYPE_REAL32:
|
1915 mike 1.23 return StringArrayToValueAux(lineNumber, array, type, (Real32*)0);
1916
|
1917 kumpf 1.61 case CIMTYPE_REAL64:
|
1918 mike 1.23 return StringArrayToValueAux(lineNumber, array, type, (Real64*)0);
1919
|
1920 dave.sudlik 1.109 // PEP 194:
1921 // Note that "object" (ie. CIMTYPE_OBJECT) is not a real CIM datatype, but just a
1922 // Pegasus internal representation of an embedded object. However, this case is
1923 // used when decoding string representations of embedded objects.
1924 case CIMTYPE_OBJECT:
1925 return StringArrayToValueAux(lineNumber, array, type, (CIMObject*)0);
1926
|
1927 mike 1.23 default:
1928 break;
1929 }
1930
1931 // Unreachable:
1932 return CIMValue();
1933 }
1934
1935 //------------------------------------------------------------------------------
1936 //
1937 // getValueArrayElement()
1938 //
1939 // <!ELEMENT VALUE.ARRAY (VALUE*)>
1940 //
|
1941 karl 1.35 // Return: Boolean. Returns false if there is no VALUE.ARRAY start element
1942 //
|
1943 mike 1.23 //------------------------------------------------------------------------------
1944
1945 Boolean XmlReader::getValueArrayElement(
1946 XmlParser& parser,
1947 CIMType type,
1948 CIMValue& value)
1949 {
|
1950 karl 1.35 // Clears any values from the Array. Assumes this is array CIMValue
|
1951 mike 1.23 value.clear();
1952
1953 // Get VALUE.ARRAY open tag:
1954
1955 XmlEntry entry;
|
1956 dave.sudlik 1.111 Array<const char*> stringArray;
|
1957 mike 1.23
|
1958 karl 1.35 // If no VALUE.ARRAY start tag, return false
|
1959 mike 1.23 if (!testStartTagOrEmptyTag(parser, entry, "VALUE.ARRAY"))
1960 return false;
|
1961 karl 1.33
|
1962 kumpf 1.32 if (entry.type != XmlEntry::EMPTY_TAG)
1963 {
|
1964 dave.sudlik 1.111 // For each VALUE element:
1965
1966 while (testStartTagOrEmptyTag(parser, entry, "VALUE"))
|
1967 dave.sudlik 1.109 {
|
1968 dave.sudlik 1.111 if (entry.type == XmlEntry::EMPTY_TAG)
|
1969 dave.sudlik 1.109 {
|
1970 dave.sudlik 1.111 stringArray.append("");
1971 continue;
1972 }
|
1973 mike 1.23
|
1974 dave.sudlik 1.111 if (testContentOrCData(parser, entry))
1975 stringArray.append(entry.text);
1976 else
1977 stringArray.append("");
|
1978 dave.sudlik 1.109
|
1979 dave.sudlik 1.111 expectEndTag(parser, "VALUE");
|
1980 dave.sudlik 1.109 }
|
1981 mike 1.23
|
1982 kumpf 1.32 expectEndTag(parser, "VALUE.ARRAY");
|
1983 mike 1.23 }
1984
|
1985 dave.sudlik 1.111 value = stringArrayToValue(parser.getLine(), stringArray, type);
|
1986 mike 1.23 return true;
1987 }
1988
1989 //------------------------------------------------------------------------------
1990 //
1991 // getFlavor()
1992 //
1993 // <!ENTITY % QualifierFlavor
1994 // "OVERRIDABLE (true|false) 'true'
1995 // TOSUBCLASS (true|false) 'true'
1996 // TOINSTANCE (true|false) 'false'
1997 // TRANSLATABLE (true|false) 'false'">
1998 //
1999 //------------------------------------------------------------------------------
2000
|
2001 kumpf 1.64 CIMFlavor XmlReader::getFlavor(
|
2002 mike 1.23 XmlEntry& entry,
2003 Uint32 lineNumber,
2004 const char* tagName)
2005 {
2006 // Get QUALIFIER.OVERRIDABLE
2007
2008 Boolean overridable = getCimBooleanAttribute(
2009 lineNumber, entry, tagName, "OVERRIDABLE", true, false);
2010
2011 // Get QUALIFIER.TOSUBCLASS
2012
2013 Boolean toSubClass = getCimBooleanAttribute(
2014 lineNumber, entry, tagName, "TOSUBCLASS", true, false);
2015
2016 // Get QUALIFIER.TOINSTANCE
2017
2018 Boolean toInstance = getCimBooleanAttribute(
2019 lineNumber, entry, tagName, "TOINSTANCE", false, false);
2020
2021 // Get QUALIFIER.TRANSLATABLE
2022
2023 mike 1.23 Boolean translatable = getCimBooleanAttribute(
2024 lineNumber, entry, tagName, "TRANSLATABLE", false, false);
2025
|
2026 kumpf 1.44 // Start with CIMFlavor::NONE. Defaults are specified in the
2027 // getCimBooleanAttribute() calls above.
|
2028 kumpf 1.64 CIMFlavor flavor = CIMFlavor (CIMFlavor::NONE);
|
2029 mike 1.23
2030 if (overridable)
|
2031 kumpf 1.64 flavor.addFlavor (CIMFlavor::OVERRIDABLE);
2032 else
2033 flavor.addFlavor (CIMFlavor::DISABLEOVERRIDE);
|
2034 mike 1.23
2035 if (toSubClass)
|
2036 kumpf 1.64 flavor.addFlavor (CIMFlavor::TOSUBCLASS);
2037 else
2038 flavor.addFlavor (CIMFlavor::RESTRICTED);
|
2039 mike 1.23
2040 if (toInstance)
|
2041 kumpf 1.64 flavor.addFlavor (CIMFlavor::TOINSTANCE);
|
2042 mike 1.23
2043 if (translatable)
|
2044 kumpf 1.64 flavor.addFlavor (CIMFlavor::TRANSLATABLE);
|
2045 mike 1.23
2046 return flavor;
2047 }
2048
2049 //------------------------------------------------------------------------------
2050 //
2051 // getOptionalScope()
2052 //
2053 // DTD:
2054 // <!ELEMENT SCOPE EMPTY>
2055 // <!ATTLIST SCOPE
2056 // CLASS (true|false) 'false'
2057 // ASSOCIATION (true|false) 'false'
2058 // REFERENCE (true|false) 'false'
2059 // PROPERTY (true|false) 'false'
2060 // METHOD (true|false) 'false'
2061 // PARAMETER (true|false) 'false'
2062 // INDICATION (true|false) 'false'>
2063 //
2064 //------------------------------------------------------------------------------
2065
|
2066 kumpf 1.63 CIMScope XmlReader::getOptionalScope(XmlParser& parser)
|
2067 mike 1.23 {
2068 XmlEntry entry;
|
2069 kumpf 1.65 CIMScope scope;
|
2070 mike 1.23
2071 if (!parser.next(entry))
|
2072 kumpf 1.65 return scope; // No SCOPE element found; return the empty scope
|
2073 mike 1.23
2074 Boolean isEmptyTag = entry.type == XmlEntry::EMPTY_TAG;
2075
2076 if ((!isEmptyTag &&
2077 entry.type != XmlEntry::START_TAG) ||
2078 strcmp(entry.text, "SCOPE") != 0)
2079 {
|
2080 kumpf 1.65 // No SCOPE element found; return the empty scope
|
2081 mike 1.23 parser.putBack(entry);
|
2082 kumpf 1.65 return scope;
|
2083 mike 1.23 }
2084
2085 Uint32 line = parser.getLine();
2086
2087 if (getCimBooleanAttribute(line, entry, "SCOPE", "CLASS", false, false))
|
2088 kumpf 1.63 scope.addScope (CIMScope::CLASS);
|
2089 mike 1.23
2090 if (getCimBooleanAttribute(
2091 line, entry, "SCOPE", "ASSOCIATION", false, false))
|
2092 kumpf 1.63 scope.addScope (CIMScope::ASSOCIATION);
|
2093 mike 1.23
2094 if (getCimBooleanAttribute(
2095 line, entry, "SCOPE", "REFERENCE", false, false))
|
2096 kumpf 1.63 scope.addScope (CIMScope::REFERENCE);
|
2097 mike 1.23
2098 if (getCimBooleanAttribute(line, entry, "SCOPE", "PROPERTY", false, false))
|
2099 kumpf 1.63 scope.addScope (CIMScope::PROPERTY);
|
2100 mike 1.23
2101 if (getCimBooleanAttribute(line, entry, "SCOPE", "METHOD", false, false))
|
2102 kumpf 1.63 scope.addScope (CIMScope::METHOD);
|
2103 mike 1.23
2104 if (getCimBooleanAttribute(line, entry, "SCOPE", "PARAMETER", false, false))
|
2105 kumpf 1.63 scope.addScope (CIMScope::PARAMETER);
|
2106 mike 1.23
2107 if (getCimBooleanAttribute(line, entry, "SCOPE", "INDICATION",false, false))
|
2108 kumpf 1.63 scope.addScope (CIMScope::INDICATION);
|
2109 mike 1.23
2110 if (!isEmptyTag)
2111 expectEndTag(parser, "SCOPE");
2112
2113 return scope;
2114 }
2115
2116 //------------------------------------------------------------------------------
2117 //
2118 // getQualifierElement()
2119 //
|
2120 kumpf 1.52 // <!ELEMENT QUALIFIER (VALUE|VALUE.ARRAY)?>
|
2121 mike 1.23 // <!ATTLIST QUALIFIER
2122 // %CIMName;
2123 // %CIMType; #REQUIRED
2124 // %Propagated;
2125 // %QualifierFlavor;>
2126 //
2127 //------------------------------------------------------------------------------
2128
2129 Boolean XmlReader::getQualifierElement(
2130 XmlParser& parser,
2131 CIMQualifier& qualifier)
2132 {
2133 // Get QUALIFIER element:
2134
2135 XmlEntry entry;
|
2136 kumpf 1.103 if (!testStartTagOrEmptyTag(parser, entry, "QUALIFIER"))
|
2137 mike 1.23 return false;
2138
|
2139 kumpf 1.103 Boolean empty = entry.type == XmlEntry::EMPTY_TAG;
2140
|
2141 mike 1.23 // Get QUALIFIER.NAME attribute:
2142
|
2143 kumpf 1.74 CIMName name = getCimNameAttribute(parser.getLine(), entry, "QUALIFIER");
|
2144 mike 1.23
2145 // Get QUALIFIER.TYPE attribute:
2146
|
2147 kumpf 1.67 CIMType type;
2148 getCimTypeAttribute(parser.getLine(), entry, type, "QUALIFIER");
|
2149 mike 1.23
2150 // Get QUALIFIER.PROPAGATED
2151
2152 Boolean propagated = getCimBooleanAttribute(
2153 parser.getLine(), entry, "QUALIFIER", "PROPAGATED", false, false);
2154
2155 // Get flavor oriented attributes:
2156
|
2157 kumpf 1.64 CIMFlavor flavor = getFlavor(entry, parser.getLine(), "QUALIFIER");
|
2158 mike 1.23
2159 // Get VALUE or VALUE.ARRAY element:
2160
2161 CIMValue value;
2162
|
2163 kumpf 1.103 if (empty)
|
2164 mike 1.23 {
|
2165 kumpf 1.52 value.setNullValue(type, false);
|
2166 mike 1.23 }
|
2167 kumpf 1.103 else
2168 {
2169 if (!getValueElement(parser, type, value) &&
2170 !getValueArrayElement(parser, type, value))
2171 {
2172 value.setNullValue(type, false);
2173 }
|
2174 mike 1.23
|
2175 kumpf 1.103 // Expect </QUALIFIER>:
|
2176 mike 1.23
|
2177 kumpf 1.103 expectEndTag(parser, "QUALIFIER");
2178 }
|
2179 mike 1.23
2180 // Build qualifier:
2181
2182 qualifier = CIMQualifier(name, value, flavor, propagated);
2183 return true;
2184 }
2185
2186 //------------------------------------------------------------------------------
2187 //
2188 // getQualifierElements()
2189 //
2190 //------------------------------------------------------------------------------
2191
2192 template<class CONTAINER>
2193 void getQualifierElements(XmlParser& parser, CONTAINER& container)
2194 {
2195 CIMQualifier qualifier;
2196
2197 while (XmlReader::getQualifierElement(parser, qualifier))
2198 {
2199 try
2200 mike 1.23 {
2201 container.addQualifier(qualifier);
2202 }
|
2203 kumpf 1.66 catch (AlreadyExistsException&)
|
2204 mike 1.23 {
|
2205 humberto 1.85
2206 // l10n
2207
2208 // throw XmlSemanticError(parser.getLine(), "duplicate qualifier");
2209
|
2210 humberto 1.87 MessageLoaderParms mlParms("Common.XmlReader.DUPLICATE_QUALIFIER",
2211 "duplicate qualifier");
|
2212 humberto 1.85
2213 throw XmlSemanticError(parser.getLine(), mlParms);
|
2214 mike 1.23 }
2215 }
2216 }
2217
2218 //------------------------------------------------------------------------------
2219 //
2220 // getPropertyElement()
2221 //
2222 // <!ELEMENT PROPERTY (QUALIFIER*,VALUE?)>
2223 // <!ATTLIST PROPERTY
2224 // %CIMName;
2225 // %ClassOrigin;
2226 // %Propagated;
|
2227 dave.sudlik 1.109 // %EmbeddedObject; #IMPLIED
|
2228 mike 1.23 // %CIMType; #REQUIRED>
2229 //
2230 //------------------------------------------------------------------------------
2231
2232 Boolean XmlReader::getPropertyElement(XmlParser& parser, CIMProperty& property)
2233 {
2234 XmlEntry entry;
2235
2236 if (!testStartTagOrEmptyTag(parser, entry, "PROPERTY"))
2237 return false;
2238
2239 Boolean empty = entry.type == XmlEntry::EMPTY_TAG;
2240
2241 // Get PROPERTY.NAME attribute:
2242
|
2243 kumpf 1.74 CIMName name = getCimNameAttribute(parser.getLine(), entry, "PROPERTY");
|
2244 mike 1.23
2245 // Get PROPERTY.CLASSORIGIN attribute:
2246
|
2247 kumpf 1.62 CIMName classOrigin =
|
2248 mike 1.23 getClassOriginAttribute(parser.getLine(), entry, "PROPERTY");
2249
2250 // Get PROPERTY.PROPAGATED
2251
2252 Boolean propagated = getCimBooleanAttribute(
2253 parser.getLine(), entry, "PROPERTY", "PROPAGATED", false, false);
2254
|
2255 dave.sudlik 1.110 // Get PROPERTY.EMBEDDEDOBJECT attribute:
|
2256 dave.sudlik 1.109
2257 String embeddedObject = getEmbeddedObjectAttribute(
2258 parser.getLine(), entry, "PROPERTY");
2259
|
2260 mike 1.23 // Get PROPERTY.TYPE attribute:
2261
|
2262 kumpf 1.67 CIMType type;
2263 getCimTypeAttribute(parser.getLine(), entry, type, "PROPERTY");
|
2264 mike 1.23
|
2265 karl 1.35 // Create property: Sets type and !isarray
|
2266 mike 1.23
|
2267 kumpf 1.56 CIMValue value(type, false);
|
2268 kumpf 1.62 property = CIMProperty(name, value, 0, CIMName(), classOrigin, propagated);
|
2269 mike 1.23
2270 if (!empty)
2271 {
|
2272 dave.sudlik 1.109 // Get qualifiers. We need to do this before checking for the property as an
2273 // embedded object, because we need to also check for the EmbeddedObject qualifier.
2274 getQualifierElements(parser, property);
2275 }
|
2276 mike 1.23
|
2277 dave.sudlik 1.110 Boolean embeddedObjectQualifierValue = false;
2278 Uint32 ix = property.findQualifier(CIMName("EmbeddedObject"));
2279 if (ix != PEG_NOT_FOUND)
2280 {
2281 property.getQualifier(ix).getValue().get(embeddedObjectQualifierValue);
2282 }
2283
|
2284 dave.sudlik 1.109 // If the EMBEDDEDOBJECT attribute is present with value "object"
|
2285 dave.sudlik 1.110 // or the EmbeddedObject qualifier exists on this property with value "true"
|
2286 dave.sudlik 1.109 // then
2287 // Convert the EmbeddedObject-encoded string into a CIMObject
|
2288 dave.sudlik 1.110 if (String::equal(embeddedObject, "object") || embeddedObjectQualifierValue)
|
2289 dave.sudlik 1.109 {
2290 // The EMBEDDEDOBJECT attribute is only valid on Properties of type string
2291 if (type == CIMTYPE_STRING)
2292 {
2293 type = CIMTYPE_OBJECT;
2294 CIMValue new_value(type, false);
2295 CIMProperty new_property = CIMProperty(name, new_value, 0, CIMName(), classOrigin, propagated);
2296
2297 // Copy the qualifiers from the String property to the CIMObject property.
2298 for (Uint32 ix = 0; ix < property.getQualifierCount(); ++ix)
2299 {
2300 // All properties are copied, including the EmbeddedObject qualifier.
2301 // This way we don't have to keep track to know that the EmbeddedObject
2302 // qualifier needs to be added back during the encode step.
2303 new_property.addQualifier(property.getQualifier(ix));
2304 }
2305
|
2306 dave.sudlik 1.111 value = new_value;
2307 property = new_property;
|
2308 dave.sudlik 1.109 }
2309 else
2310 {
2311 // Error -- throw exception
2312 // (the EmbeddedObject attribute may be applied only to entities that have the type String)
2313
2314 // l10n
|
2315 mike 1.23
|
2316 dave.sudlik 1.109 // throw XmlValidationError(parser.getLine(),
2317 // "expected string type");
|
2318 mike 1.23
|
2319 dave.sudlik 1.109 MessageLoaderParms mlParms("Common.XmlReader.INVALID_EMBEDDEDOBJECT_TYPE",
2320 "The EMBEDDEDOBJECT attribute is only valid on string types.");
|
2321 mike 1.23
|
2322 dave.sudlik 1.109 throw XmlValidationError(parser.getLine(), mlParms);
2323 }
2324 }
2325
2326 // Continue on to get property value, if not empty.
2327 if (!empty)
2328 {
2329 if (getValueElement(parser, type, value))
2330 property.setValue(value);
2331 expectEndTag(parser, "PROPERTY");
|
2332 mike 1.23 }
2333
2334 return true;
2335 }
2336
2337 //------------------------------------------------------------------------------
2338 //
2339 // getArraySizeAttribute()
2340 //
2341 // Returns true if able to get array-size. Note that array size will
2342 // always be a positive integer.
2343 //
2344 // <!ENTITY % ArraySize "ARRAYSIZE CDATA #IMPLIED">
2345 //
2346 //------------------------------------------------------------------------------
2347
2348 Boolean XmlReader::getArraySizeAttribute(
2349 Uint32 lineNumber,
2350 const XmlEntry& entry,
2351 const char* tagName,
2352 Uint32& value)
2353 mike 1.23 {
2354 const char* tmp;
2355
2356 if (!entry.getAttributeValue("ARRAYSIZE", tmp))
2357 return false;
2358
2359 Uint64 arraySize;
2360
2361 if (!stringToUnsignedInteger(tmp, arraySize) || arraySize == 0)
2362 {
|
2363 humberto 1.85 // l10n
2364
2365 // char message[128];
2366 // sprintf(message, "Illegal value for %s.%s", tagName, "ARRAYSIZE");
2367 // throw XmlSemanticError(lineNumber, message);
2368
2369 char message[128];
2370 sprintf(message, "%s.%s", tagName, "ARRAYSIZE");
2371
2372 MessageLoaderParms mlParms("Common.XmlReader.ILLEGAL_VALUE",
2373 "Illegal value for $0",
2374 message);
2375
2376 throw XmlSemanticError(lineNumber, mlParms);
|
2377 mike 1.23 }
2378
2379 value = Uint32(arraySize);
2380 return true;
2381 }
2382
2383 //------------------------------------------------------------------------------
2384 //
2385 // getPropertyArrayElement()
2386 //
2387 // <!ELEMENT PROPERTY.ARRAY (QUALIFIER*,VALUE.ARRAY?)>
2388 // <!ATTLIST PROPERTY.ARRAY
2389 // %CIMName;
2390 // %CIMType; #REQUIRED
2391 // %ArraySize;
2392 // %ClassOrigin;
|
2393 dave.sudlik 1.109 // %Propagated;
2394 // %EmbeddedObject; #IMPLIED>
|
2395 mike 1.23 //
2396 //------------------------------------------------------------------------------
2397
2398 Boolean XmlReader::getPropertyArrayElement(
2399 XmlParser& parser,
2400 CIMProperty& property)
2401 {
2402 // Get PROPERTY element:
2403
2404 XmlEntry entry;
2405
2406 if (!testStartTagOrEmptyTag(parser, entry, "PROPERTY.ARRAY"))
2407 return false;
2408
2409 Boolean empty = entry.type == XmlEntry::EMPTY_TAG;
2410
2411 // Get PROPERTY.NAME attribute:
2412
|
2413 kumpf 1.74 CIMName name =
|
2414 mike 1.23 getCimNameAttribute(parser.getLine(), entry, "PROPERTY.ARRAY");
2415
2416 // Get PROPERTY.TYPE attribute:
2417
|
2418 kumpf 1.67 CIMType type;
2419 getCimTypeAttribute(parser.getLine(), entry, type, "PROPERTY.ARRAY");
|
2420 mike 1.23
2421 // Get PROPERTY.ARRAYSIZE attribute:
2422
2423 Uint32 arraySize = 0;
2424 getArraySizeAttribute(parser.getLine(), entry, "PROPERTY.ARRAY", arraySize);
2425
2426 // Get PROPERTY.CLASSORIGIN attribute:
2427
|
2428 dave.sudlik 1.109 CIMName classOrigin = getClassOriginAttribute(parser.getLine(), entry, "PROPERTY.ARRAY");
|
2429 mike 1.23
2430 // Get PROPERTY.ARRAY.PROPAGATED
2431
|
2432 dave.sudlik 1.109 Boolean propagated = getCimBooleanAttribute(parser.getLine()
2433 ,entry
2434 ,"PROPERTY.ARRAY"
2435 ,"PROPAGATED"
2436 ,false
2437 ,false);
2438
|
2439 dave.sudlik 1.110 // Get PROPERTY.EMBEDDEDOBJECT attribute:
|
2440 dave.sudlik 1.109
2441 String embeddedObject = getEmbeddedObjectAttribute(parser.getLine()
2442 ,entry
2443 ,"PROPERTY.ARRAY");
|
2444 mike 1.23
2445 // Create property:
2446
|
2447 kumpf 1.56 CIMValue value(type, true, arraySize);
|
2448 dave.sudlik 1.109 property = CIMProperty(name, value, arraySize, CIMName(), classOrigin, propagated);
|
2449 mike 1.23
2450 if (!empty)
2451 {
|
2452 dave.sudlik 1.109 // Get qualifiers:
2453 getQualifierElements(parser, property);
2454 }
|
2455 mike 1.23
|
2456 dave.sudlik 1.110 Boolean embeddedObjectQualifierValue = false;
2457 Uint32 ix = property.findQualifier(CIMName("EmbeddedObject"));
2458 if (ix != PEG_NOT_FOUND)
2459 {
2460 property.getQualifier(ix).getValue().get(embeddedObjectQualifierValue);
2461 }
2462
2463 // If the EMBEDDEDOBJECT attribute is present with value "object"
2464 // or the EmbeddedObject qualifier exists on this property with value "true"
|
2465 dave.sudlik 1.109 // then
2466 // Convert the EmbeddedObject-encoded string into a CIMObject
|
2467 dave.sudlik 1.110 if (String::equal(embeddedObject, "object") || embeddedObjectQualifierValue)
|
2468 dave.sudlik 1.109 {
2469 // The EMBEDDEDOBJECT attribute is only valid on Properties of type string
2470 if (type == CIMTYPE_STRING)
2471 {
2472 type = CIMTYPE_OBJECT;
2473 CIMValue new_value(type, true, arraySize);
2474 CIMProperty new_property = CIMProperty(name, new_value, arraySize, CIMName(), classOrigin, propagated);
2475
2476 // Copy the qualifiers from the String property to the CIMObject property.
2477 for (Uint32 ix = 0; ix < property.getQualifierCount(); ++ix)
2478 {
2479 // All properties are copied, including the EmbeddedObject qualifier.
2480 // This way we don't have to keep track to know that the EmbeddedObject
2481 // qualifier needs to be added back during the encode step.
2482 new_property.addQualifier(property.getQualifier(ix));
2483 }
2484
|
2485 dave.sudlik 1.111 value = new_value;
2486 property = new_property;
|
2487 dave.sudlik 1.109 }
2488 else
2489 {
2490 // Error -- throw exception
2491 // (the EmbeddedObject attribute may be applied only to entities that have the type String)
2492
2493 // l10n
2494
2495 // throw XmlValidationError(parser.getLine(),
2496 // "expected string type");
2497
2498 MessageLoaderParms mlParms("Common.XmlReader.INVALID_EMBEDDEDOBJECT_TYPE",
2499 "The EMBEDDEDOBJECT attribute is only valid on string types.");
|
2500 mike 1.23
|
2501 dave.sudlik 1.109 throw XmlValidationError(parser.getLine(), mlParms);
2502 }
2503 }
|
2504 mike 1.23
|
2505 dave.sudlik 1.109 // Continue on to get property array value, if not empty.
2506 // Else not an embedded object, if not empty, get the property array value.
2507 if (!empty)
2508 {
2509 if (getValueArrayElement(parser, type, value))
2510 {
2511 if (arraySize && arraySize != value.getArraySize())
2512 {
|
2513 humberto 1.85
|
2514 dave.sudlik 1.109 // l10n
|
2515 humberto 1.85
|
2516 dave.sudlik 1.109 // throw XmlSemanticError(parser.getLine(),
2517 // "ARRAYSIZE attribute and value-array size are different");
|
2518 humberto 1.85
|
2519 dave.sudlik 1.109 MessageLoaderParms mlParms("Common.XmlReader.ARRAY_SIZE_DIFFERENT",
2520 "ARRAYSIZE attribute and value-array size are different");
|
2521 mike 1.23
|
2522 dave.sudlik 1.109 throw XmlSemanticError(parser.getLine(), mlParms);
2523 }
|
2524 mike 1.23
|
2525 dave.sudlik 1.109 property.setValue(value);
2526 }
2527 expectEndTag(parser, "PROPERTY.ARRAY");
|
2528 mike 1.23 }
|
2529 dave.sudlik 1.109
|
2530 mike 1.23 return true;
2531 }
2532
2533 //------------------------------------------------------------------------------
2534 //
2535 // getHostElement()
2536 //
2537 // <!ELEMENT HOST (#PCDATA)>
2538 //
2539 //------------------------------------------------------------------------------
2540
2541 Boolean XmlReader::getHostElement(
2542 XmlParser& parser,
2543 String& host)
2544 {
2545 XmlEntry entry;
2546
2547 if (!testStartTag(parser, entry, "HOST"))
2548 return false;
|
2549 karl 1.78 #ifdef PEGASUS_SNIA_INTEROP_TEST
2550 // Temp code to allow empty HOST field.
2551 // SNIA CIMOMs return empty field particularly on enumerateinstance.
2552 // Simply substitute a string for the empty.
2553 if (!parser.next(entry))
2554 throw XmlException(XmlException::UNCLOSED_TAGS, parser.getLine());
2555
2556 if (entry.type == XmlEntry::CONTENT)
|
2557 chuck 1.98 host = String(entry.text);
|
2558 karl 1.78 else
2559 {
2560 parser.putBack(entry);
2561 host = "HOSTNAMEINSERTEDBYPEGASUSCLIENT";
2562 }
2563
2564 #else
|
2565 mike 1.23
2566 if (!parser.next(entry) || entry.type != XmlEntry::CONTENT)
2567 {
|
2568 humberto 1.85
2569 // l10n
2570
2571 // throw XmlValidationError(parser.getLine(),
2572 // "expected content of HOST element");
2573
2574 MessageLoaderParms mlParms("Common.XmlReader.EXPECTED_CONTENT_ELEMENT",
|
2575 humberto 1.87 "expected content of HOST element");
|
2576 humberto 1.85
2577 throw XmlValidationError(parser.getLine(), mlParms);
2578
|
2579 mike 1.23 }
2580
|
2581 chuck 1.98 host = String(entry.text);
|
2582 karl 1.78 #endif
|
2583 mike 1.23 expectEndTag(parser, "HOST");
2584 return true;
2585 }
2586
2587 //------------------------------------------------------------------------------
2588 //
2589 // getNameSpaceElement()
2590 //
2591 // <!ELEMENT NAMESPACE EMPTY>
2592 // <!ATTLIST NAMESPACE %CIMName;>
2593 //
2594 //------------------------------------------------------------------------------
2595
2596 Boolean XmlReader::getNameSpaceElement(
2597 XmlParser& parser,
|
2598 kumpf 1.74 CIMName& nameSpaceComponent)
|
2599 mike 1.23 {
2600 XmlEntry entry;
2601
2602 if (!testStartTagOrEmptyTag(parser, entry, "NAMESPACE"))
2603 return false;
2604
2605 Boolean empty = entry.type == XmlEntry::EMPTY_TAG;
2606
2607 nameSpaceComponent = getCimNameAttribute(
2608 parser.getLine(), entry, "NAMESPACE");
2609
2610 if (!empty)
2611 expectEndTag(parser, "NAMESPACE");
2612
2613 return true;
2614 }
2615
2616 //------------------------------------------------------------------------------
2617 //
2618 // getLocalNameSpacePathElement()
2619 //
2620 mike 1.23 // <!ELEMENT LOCALNAMESPACEPATH (NAMESPACE+)>
2621 //
2622 //------------------------------------------------------------------------------
2623
2624 Boolean XmlReader::getLocalNameSpacePathElement(
2625 XmlParser& parser,
2626 String& nameSpace)
2627 {
2628 XmlEntry entry;
2629
2630 if (!testStartTag(parser, entry, "LOCALNAMESPACEPATH"))
2631 return false;
2632
|
2633 kumpf 1.74 CIMName nameSpaceComponent;
|
2634 mike 1.23
2635 while (getNameSpaceElement(parser, nameSpaceComponent))
2636 {
2637 if (nameSpace.size())
|
2638 kumpf 1.71 nameSpace.append('/');
|
2639 mike 1.23
|
2640 kumpf 1.74 nameSpace.append(nameSpaceComponent.getString());
|
2641 mike 1.23 }
2642
2643 if (!nameSpace.size())
2644 {
|
2645 humberto 1.85
2646 // l10n
2647
2648 // throw XmlValidationError(parser.getLine(),
2649 // "Expected one or more NAMESPACE elements within "
2650 // "LOCALNAMESPACEPATH element");
2651
2652 MessageLoaderParms mlParms("Common.XmlReader.EXPECTED_NAMESPACE_ELEMENTS",
|
2653 humberto 1.87 "Expected one or more NAMESPACE elements within LOCALNAMESPACEPATH element");
|
2654 humberto 1.85
2655 throw XmlValidationError(parser.getLine(), mlParms);
2656
2657
|
2658 mike 1.23 }
2659
2660 expectEndTag(parser, "LOCALNAMESPACEPATH");
2661 return true;
2662 }
2663
2664 //------------------------------------------------------------------------------
2665 //
2666 // getNameSpacePathElement()
2667 //
2668 // <!ELEMENT NAMESPACEPATH (HOST,LOCALNAMESPACEPATH)>
2669 //
2670 //------------------------------------------------------------------------------
2671
2672 Boolean XmlReader::getNameSpacePathElement(
2673 XmlParser& parser,
2674 String& host,
2675 String& nameSpace)
2676 {
2677 host.clear();
2678 nameSpace.clear();
2679 mike 1.23
2680 XmlEntry entry;
2681
2682 if (!testStartTag(parser, entry, "NAMESPACEPATH"))
2683 return false;
2684
|
2685 humberto 1.85 if (!getHostElement(parser, host)) {
2686
2687 // l10n
2688
2689 // throw XmlValidationError(parser.getLine(), "expected HOST element");
2690
|
2691 humberto 1.87 MessageLoaderParms mlParms("Common.XmlReader.EXPECTED_HOST_ELEMENT",
2692 "expected HOST element");
|
2693 humberto 1.85
2694 throw XmlValidationError(parser.getLine(), mlParms);
2695 }
|
2696 mike 1.23
2697 if (!getLocalNameSpacePathElement(parser, nameSpace))
2698 {
|
2699 humberto 1.85
2700 // l10n
2701
2702 // throw XmlValidationError(parser.getLine(),
2703 // "expected LOCALNAMESPACEPATH element");
2704
|
2705 humberto 1.87 MessageLoaderParms mlParms("Common.XmlReader.EXPECTED_LOCALNAMESPACEPATH_ELEMENT",
2706 "expected LOCALNAMESPACEPATH element");
|
2707 humberto 1.85
2708 throw XmlValidationError(parser.getLine(), mlParms);
|
2709 mike 1.23 }
2710
2711 expectEndTag(parser, "NAMESPACEPATH");
2712
2713 return true;
2714 }
2715
2716 //------------------------------------------------------------------------------
2717 //
2718 // getClassNameElement()
2719 //
2720 // <!ELEMENT CLASSNAME EMPTY>
2721 // <!ATTLIST CLASSNAME %CIMName;>
2722 //
2723 //------------------------------------------------------------------------------
2724
2725 Boolean XmlReader::getClassNameElement(
2726 XmlParser& parser,
|
2727 kumpf 1.74 CIMName& className,
|
2728 mike 1.23 Boolean required)
2729 {
2730 XmlEntry entry;
2731
2732 if (!testStartTagOrEmptyTag(parser, entry, "CLASSNAME"))
2733 {
2734 if (required)
2735 {
|
2736 humberto 1.85
2737 // l10n
2738
2739 // throw XmlValidationError(parser.getLine(),
2740 // "expected CLASSNAME element");
2741
|
2742 humberto 1.87 MessageLoaderParms mlParms("Common.XmlReader.EXPECTED_CLASSNAME_ELEMENT",
2743 "expected CLASSNAME element");
|
2744 humberto 1.85
2745 throw XmlValidationError(parser.getLine(), mlParms);
|
2746 mike 1.23 }
2747 else
2748 return false;
2749 }
2750 Boolean empty = entry.type == XmlEntry::EMPTY_TAG;
2751
2752 className = getCimNameAttribute(
|
2753 kumpf 1.81 parser.getLine(), entry, "CLASSNAME", false);
|
2754 mike 1.23
2755 if (!empty)
2756 expectEndTag(parser, "CLASSNAME");
2757
2758 return true;
2759 }
2760
2761 //------------------------------------------------------------------------------
2762 //
2763 // getValueTypeAttribute()
2764 //
2765 // VALUETYPE (string|boolean|numeric) 'string'
2766 //
2767 //------------------------------------------------------------------------------
2768
|
2769 kumpf 1.73 CIMKeyBinding::Type XmlReader::getValueTypeAttribute(
|
2770 mike 1.23 Uint32 lineNumber,
2771 const XmlEntry& entry,
2772 const char* elementName)
2773 {
2774 String tmp;
2775
2776 if (!entry.getAttributeValue("VALUETYPE", tmp))
|
2777 kumpf 1.73 return CIMKeyBinding::STRING;
|
2778 mike 1.23
2779 if (String::equal(tmp, "string"))
|
2780 kumpf 1.73 return CIMKeyBinding::STRING;
|
2781 mike 1.23 else if (String::equal(tmp, "boolean"))
|
2782 kumpf 1.73 return CIMKeyBinding::BOOLEAN;
|
2783 mike 1.23 else if (String::equal(tmp, "numeric"))
|
2784 kumpf 1.73 return CIMKeyBinding::NUMERIC;
|
2785 mike 1.23
|
2786 humberto 1.85 // char buffer[MESSAGE_SIZE];
2787
2788 // sprintf(buffer,
2789 // "Illegal value for %s.VALUETYPE attribute; "
2790 // "CIMValue must be one of \"string\", \"boolean\", or \"numeric\"",
2791 // elementName);
2792
2793 // throw XmlSemanticError(lineNumber, buffer);
2794
2795
|
2796 mike 1.23 char buffer[MESSAGE_SIZE];
|
2797 humberto 1.85 sprintf(buffer, "%s.VALUETYPE", elementName);
2798
2799 MessageLoaderParms mlParms("Common.XmlReader.ILLEGAL_VALUE_FOR_CIMVALUE_ATTRIBUTE",
|
2800 humberto 1.87 "Illegal value for $0 attribute; CIMValue must be one of \"string\", \"boolean\", or \"numeric\"", buffer);
|
2801 humberto 1.85
2802 throw XmlSemanticError(lineNumber, mlParms);
|
2803 mike 1.23
|
2804 kumpf 1.73 return CIMKeyBinding::BOOLEAN;
|
2805 mike 1.23 }
2806
2807 //------------------------------------------------------------------------------
2808 //
2809 // getKeyValueElement()
2810 //
2811 // <!ELEMENT KEYVALUE (#PCDATA)>
2812 // <!ATTLIST KEYVALUE
2813 // VALUETYPE (string|boolean|numeric) 'string'>
2814 //
2815 //------------------------------------------------------------------------------
2816
2817 Boolean XmlReader::getKeyValueElement(
2818 XmlParser& parser,
|
2819 kumpf 1.73 CIMKeyBinding::Type& type,
|
2820 mike 1.23 String& value)
2821 {
2822 XmlEntry entry;
2823
2824 if (!testStartTagOrEmptyTag(parser, entry, "KEYVALUE"))
2825 return false;
2826
2827 Boolean empty = entry.type == XmlEntry::EMPTY_TAG;
2828
2829 type = getValueTypeAttribute(parser.getLine(), entry, "KEYVALUE");
2830
2831 value.clear();
2832
2833 if (!empty)
2834 {
2835 if (!parser.next(entry))
2836 throw XmlException(XmlException::UNCLOSED_TAGS, parser.getLine());
2837
2838 if (entry.type == XmlEntry::CONTENT)
|
2839 chuck 1.98 value = String(entry.text);
|
2840 mike 1.23 else
2841 parser.putBack(entry);
2842
2843 expectEndTag(parser, "KEYVALUE");
2844 }
2845
2846 return true;
2847 }
2848
2849 //------------------------------------------------------------------------------
2850 //
2851 // getKeyBindingElement()
2852 //
2853 // <!ELEMENT KEYBINDING (KEYVALUE|VALUE.REFERENCE)>
2854 // <!ATTLIST KEYBINDING
2855 // %CIMName;>
2856 //
2857 //------------------------------------------------------------------------------
2858
2859 Boolean XmlReader::getKeyBindingElement(
2860 XmlParser& parser,
|
2861 kumpf 1.74 CIMName& name,
|
2862 mike 1.23 String& value,
|
2863 kumpf 1.73 CIMKeyBinding::Type& type)
|
2864 mike 1.23 {
2865 XmlEntry entry;
2866
2867 if (!testStartTag(parser, entry, "KEYBINDING"))
2868 return false;
2869
2870 name = getCimNameAttribute(parser.getLine(), entry, "KEYBINDING");
2871
2872 if (!getKeyValueElement(parser, type, value))
|
2873 mike 1.25 {
|
2874 kumpf 1.54 CIMObjectPath reference;
|
2875 mike 1.25
2876 if (!getValueReferenceElement(parser, reference))
2877 {
|
2878 humberto 1.85
2879 // l10n
2880
2881 // throw XmlValidationError(parser.getLine(),
2882 // "Expected KEYVALUE or VALUE.REFERENCE element");
2883
|
2884 humberto 1.87 MessageLoaderParms mlParms("Common.XmlReader.EXPECTED_KEYVALUE_OR_REFERENCE_ELEMENT",
2885 "Expected KEYVALUE or VALUE.REFERENCE element");
|
2886 humberto 1.85
2887 throw XmlValidationError(parser.getLine(), mlParms);
|
2888 mike 1.25 }
2889
|
2890 kumpf 1.73 type = CIMKeyBinding::REFERENCE;
|
2891 mike 1.25 value = reference.toString();
2892 }
|
2893 mike 1.23
2894 expectEndTag(parser, "KEYBINDING");
2895 return true;
2896 }
2897
2898 //------------------------------------------------------------------------------
2899 //
2900 // getInstanceNameElement()
2901 //
2902 // <!ELEMENT INSTANCENAME (KEYBINDING*|KEYVALUE?|VALUE.REFERENCE?)>
2903 // <!ATTLIST INSTANCENAME
2904 // %ClassName;>
2905 //
|
2906 mike 1.25 // Note: An empty key name is used in the keyBinding when the INSTANCENAME is
2907 // specified using a KEYVALUE or a VALUE.REFERENCE.
|
2908 mike 1.23 //
2909 //------------------------------------------------------------------------------
2910
2911 Boolean XmlReader::getInstanceNameElement(
2912 XmlParser& parser,
2913 String& className,
|
2914 kumpf 1.73 Array<CIMKeyBinding>& keyBindings)
|
2915 mike 1.23 {
2916 className.clear();
2917 keyBindings.clear();
2918
2919 XmlEntry entry;
2920
2921 if (!testStartTagOrEmptyTag(parser, entry, "INSTANCENAME"))
2922 return false;
2923
2924 Boolean empty = entry.type == XmlEntry::EMPTY_TAG;
2925
2926 className = getClassNameAttribute(parser.getLine(), entry, "INSTANCENAME");
2927
|
2928 mike 1.25 if (empty)
|
2929 mike 1.23 {
|
2930 mike 1.25 return true;
2931 }
|
2932 mike 1.23
|
2933 kumpf 1.74 CIMName name;
|
2934 kumpf 1.73 CIMKeyBinding::Type type;
|
2935 mike 1.25 String value;
|
2936 kumpf 1.54 CIMObjectPath reference;
|
2937 mike 1.25
2938 if (getKeyValueElement(parser, type, value))
2939 {
2940 // Use empty key name because none was specified
|
2941 kumpf 1.73 keyBindings.append(CIMKeyBinding(name, value, type));
|
2942 mike 1.25 }
2943 else if (getValueReferenceElement(parser, reference))
2944 {
2945 // Use empty key name because none was specified
|
2946 kumpf 1.73 type = CIMKeyBinding::REFERENCE;
|
2947 mike 1.25 value = reference.toString();
|
2948 kumpf 1.73 keyBindings.append(CIMKeyBinding(name, value, type));
|
2949 mike 1.25 }
2950 else
2951 {
|
2952 mike 1.23 while (getKeyBindingElement(parser, name, value, type))
|
2953 kumpf 1.73 keyBindings.append(CIMKeyBinding(name, value, type));
|
2954 mike 1.25 }
|
2955 mike 1.23
|
2956 mike 1.25 expectEndTag(parser, "INSTANCENAME");
|
2957 mike 1.23
2958 return true;
2959 }
2960
2961 Boolean XmlReader::getInstanceNameElement(
2962 XmlParser& parser,
|
2963 kumpf 1.54 CIMObjectPath& instanceName)
|
2964 mike 1.23 {
2965 String className;
|
2966 kumpf 1.73 Array<CIMKeyBinding> keyBindings;
|
2967 mike 1.23
2968 if (!XmlReader::getInstanceNameElement(parser, className, keyBindings))
2969 return false;
2970
|
2971 kumpf 1.62 instanceName.set(String(), CIMNamespaceName(), className, keyBindings);
|
2972 mike 1.23 return true;
2973 }
2974
2975 //------------------------------------------------------------------------------
2976 //
2977 // getInstancePathElement()
2978 //
2979 // <!ELEMENT INSTANCEPATH (NAMESPACEPATH,INSTANCENAME)>
2980 //
2981 //------------------------------------------------------------------------------
2982
2983 Boolean XmlReader::getInstancePathElement(
2984 XmlParser& parser,
|
2985 kumpf 1.54 CIMObjectPath& reference)
|
2986 mike 1.23 {
2987 XmlEntry entry;
2988
2989 if (!testStartTag(parser, entry, "INSTANCEPATH"))
2990 return false;
2991
2992 String host;
2993 String nameSpace;
2994
2995 if (!getNameSpacePathElement(parser, host, nameSpace))
2996 {
|
2997 humberto 1.85
2998 // l10n
2999
3000 // throw XmlValidationError(parser.getLine(),
3001 // "expected NAMESPACEPATH element");
3002
|
3003 humberto 1.87 MessageLoaderParms mlParms("Common.XmlReader.EXPECTED_NAMESPACEPATH_ELEMENT",
3004 "expected NAMESPACEPATH element");
|
3005 humberto 1.85
3006 throw XmlValidationError(parser.getLine(), mlParms);
3007
|
3008 mike 1.23 }
3009
3010 String className;
|
3011 kumpf 1.73 Array<CIMKeyBinding> keyBindings;
|
3012 mike 1.23
3013 if (!getInstanceNameElement(parser, className, keyBindings))
3014 {
|
3015 humberto 1.85
3016 // l10n
3017
3018 // throw XmlValidationError(parser.getLine(),
3019 // "expected INSTANCENAME element");
3020
3021
|
3022 humberto 1.87 MessageLoaderParms mlParms("Common.XmlReader.EXPECTED_INSTANCENAME_ELEMENT",
3023 "expected INSTANCENAME element");
|
3024 humberto 1.85
3025 throw XmlValidationError(parser.getLine(), mlParms);
3026
|
3027 mike 1.23 }
3028
3029 reference.set(host, nameSpace, className, keyBindings);
3030
3031 expectEndTag(parser, "INSTANCEPATH");
3032 return true;
3033 }
3034
3035 //------------------------------------------------------------------------------
3036 //
3037 // getLocalInstancePathElement()
3038 //
3039 // <!ELEMENT LOCALINSTANCEPATH (NAMESPACEPATH,INSTANCENAME)>
3040 //
3041 //------------------------------------------------------------------------------
3042
3043 Boolean XmlReader::getLocalInstancePathElement(
3044 XmlParser& parser,
|
3045 kumpf 1.54 CIMObjectPath& reference)
|
3046 mike 1.23 {
3047 XmlEntry entry;
3048
3049 if (!testStartTag(parser, entry, "LOCALINSTANCEPATH"))
3050 return false;
3051
3052 String nameSpace;
3053
3054 if (!getLocalNameSpacePathElement(parser, nameSpace))
3055 {
|
3056 humberto 1.85
3057 // l10n
3058
3059 // throw XmlValidationError(parser.getLine(),
3060 // "expected LOCALNAMESPACEPATH element");
3061
|
3062 humberto 1.87 MessageLoaderParms mlParms("Common.XmlReader.EXPECTED_LOCALNAMESPACEPATH_ELEMENT",
3063 "expected LOCALNAMESPACEPATH element");
|
3064 humberto 1.85
3065 throw XmlValidationError(parser.getLine(), mlParms);
3066
|
3067 mike 1.23 }
3068
3069 String className;
|
3070 kumpf 1.73 Array<CIMKeyBinding> keyBindings;
|
3071 mike 1.23
3072 if (!getInstanceNameElement(parser, className, keyBindings))
3073 {
|
3074 humberto 1.85
3075 // l10n
3076
3077 // throw XmlValidationError(parser.getLine(),
3078 // "expected INSTANCENAME element");
3079
|
3080 humberto 1.87 MessageLoaderParms mlParms("Common.XmlReader.EXPECTED_INSTANCENAME_ELEMENT",
3081 "expected INSTANCENAME element");
|
3082 humberto 1.85
3083 throw XmlValidationError(parser.getLine(), mlParms);
3084
|
3085 mike 1.23 }
3086
3087 reference.set(String(), nameSpace, className, keyBindings);
3088
3089 expectEndTag(parser, "LOCALINSTANCEPATH");
3090 return true;
3091 }
3092
3093 //------------------------------------------------------------------------------
3094 //
3095 // getClassPathElement()
3096 //
3097 // <!ELEMENT CLASSPATH (NAMESPACEPATH,CLASSNAME)>
3098 //
3099 //------------------------------------------------------------------------------
3100
3101 Boolean XmlReader::getClassPathElement(
3102 XmlParser& parser,
|
3103 kumpf 1.54 CIMObjectPath& reference)
|
3104 mike 1.23 {
3105 XmlEntry entry;
3106
3107 if (!testStartTag(parser, entry, "CLASSPATH"))
3108 return false;
3109
3110 String host;
3111 String nameSpace;
3112
3113 if (!getNameSpacePathElement(parser, host, nameSpace))
3114 {
|
3115 humberto 1.85
3116 // l10n
3117
3118 // throw XmlValidationError(parser.getLine(),
3119 // "expected NAMESPACEPATH element");
3120
|
3121 humberto 1.87 MessageLoaderParms mlParms("Common.XmlReader.EXPECTED_NAMESPACEPATH_ELEMENT",
3122 "expected NAMESPACEPATH element");
|
3123 humberto 1.85
3124 throw XmlValidationError(parser.getLine(), mlParms);
3125
|
3126 mike 1.23 }
3127
|
3128 kumpf 1.74 CIMName className;
|
3129 mike 1.23
3130 if (!getClassNameElement(parser, className))
3131 {
|
3132 humberto 1.85
3133 // l10n
3134
3135 // throw XmlValidationError(parser.getLine(),
3136 // "expected CLASSNAME element");
3137
|
3138 humberto 1.87 MessageLoaderParms mlParms("Common.XmlReader.EXPECTED_CLASSNAME_ELEMENT",
3139 "expected CLASSNAME element");
|
3140 humberto 1.85
3141 throw XmlValidationError(parser.getLine(), mlParms);
3142
|
3143 mike 1.23 }
3144
3145 reference.set(host, nameSpace, className);
3146
3147 expectEndTag(parser, "CLASSPATH");
3148 return true;
3149 }
3150
3151 //------------------------------------------------------------------------------
3152 //
3153 // getLocalClassPathElement()
3154 //
3155 // <!ELEMENT LOCALCLASSPATH (LOCALNAMESPACEPATH,CLASSNAME)>
3156 //
3157 //------------------------------------------------------------------------------
3158
3159 Boolean XmlReader::getLocalClassPathElement(
3160 XmlParser& parser,
|
3161 kumpf 1.54 CIMObjectPath& reference)
|
3162 mike 1.23 {
3163 XmlEntry entry;
3164
3165 if (!testStartTag(parser, entry, "LOCALCLASSPATH"))
3166 return false;
3167
3168 String nameSpace;
3169
3170 if (!getLocalNameSpacePathElement(parser, nameSpace))
3171 {
|
3172 humberto 1.85
3173 // l10n
3174
3175 // throw XmlValidationError(parser.getLine(),
3176 // "expected LOCALNAMESPACEPATH element");
3177
|
3178 humberto 1.87 MessageLoaderParms mlParms("Common.XmlReader.EXPECTED_LOCALNAMESPACEPATH_ELEMENT",
3179 "expected LOCALNAMESPACEPATH element");
|
3180 humberto 1.85
3181 throw XmlValidationError(parser.getLine(), mlParms);
3182
|
3183 mike 1.23 }
3184
|
3185 kumpf 1.74 CIMName className;
|
3186 mike 1.23
3187 if (!getClassNameElement(parser, className))
3188 {
|
3189 humberto 1.85
3190 // l10n
3191
3192 // throw XmlValidationError(parser.getLine(),
3193 // "expected CLASSNAME element");
3194
|
3195 humberto 1.87 MessageLoaderParms mlParms("Common.XmlReader.EXPECTED_CLASSNAME_ELEMENT",
3196 "expected CLASSNAME element");
|
3197 humberto 1.85
3198 throw XmlValidationError(parser.getLine(), mlParms);
3199
|
3200 mike 1.23 }
3201
3202 reference.set(String(), nameSpace, className);
3203
3204 expectEndTag(parser, "LOCALCLASSPATH");
3205
3206 return true;
3207 }
3208
3209 //------------------------------------------------------------------------------
3210 //
3211 // getValueReferenceElement()
3212 //
3213 // <!ELEMENT VALUE.REFERENCE (CLASSPATH|LOCALCLASSPATH|CLASSNAME|
3214 // INSTANCEPATH|LOCALINSTANCEPATH|INSTANCENAME)>
3215 //
3216 //
3217 //------------------------------------------------------------------------------
3218
3219 Boolean XmlReader::getValueReferenceElement(
3220 XmlParser& parser,
|
3221 kumpf 1.54 CIMObjectPath& reference)
|
3222 mike 1.23 {
3223 XmlEntry entry;
3224
3225 if (!testStartTag(parser, entry, "VALUE.REFERENCE"))
3226 return false;
3227
3228 if (!parser.next(entry))
3229 throw XmlException(XmlException::UNCLOSED_TAGS, parser.getLine());
3230
3231 if (entry.type != XmlEntry::START_TAG &&
3232 entry.type != XmlEntry::EMPTY_TAG)
3233 {
|
3234 humberto 1.85
3235 // l10n
3236
3237 // throw XmlValidationError(parser.getLine(),
3238 // "Expected one of the following start tags: "
3239 // "CLASSPATH, LOCALCLASSPATH, CLASSNAME, INSTANCEPATH, "
3240 // "LOCALINSTANCEPATH, INSTANCENAME");
3241
3242 MessageLoaderParms mlParms("Common.XmlReader.EXPECTED_START_TAGS",
|
3243 humberto 1.87 "Expected one of the following start tags: CLASSPATH, LOCALCLASSPATH, CLASSNAME, INSTANCEPATH, LOCALINSTANCEPATH, INSTANCENAME");
|
3244 humberto 1.85
3245 throw XmlValidationError(parser.getLine(), mlParms);
3246
|
3247 mike 1.23 }
3248
3249 if (strcmp(entry.text, "CLASSPATH") == 0)
3250 {
3251 parser.putBack(entry);
3252 getClassPathElement(parser, reference);
3253 }
3254 else if (strcmp(entry.text, "LOCALCLASSPATH") == 0)
3255 {
3256 parser.putBack(entry);
3257 getLocalClassPathElement(parser, reference);
3258 }
3259 else if (strcmp(entry.text, "CLASSNAME") == 0)
3260 {
3261 parser.putBack(entry);
|
3262 kumpf 1.74 CIMName className;
|
3263 mike 1.23 getClassNameElement(parser, className);
|
3264 kumpf 1.62 reference.set(String(), CIMNamespaceName(), className);
|
3265 mike 1.23 }
3266 else if (strcmp(entry.text, "INSTANCEPATH") == 0)
3267 {
3268 parser.putBack(entry);
3269 getInstancePathElement(parser, reference);
3270 }
3271 else if (strcmp(entry.text, "LOCALINSTANCEPATH") == 0)
3272 {
3273 parser.putBack(entry);
3274 getLocalInstancePathElement(parser, reference);
3275 }
3276 else if (strcmp(entry.text, "INSTANCENAME") == 0)
3277 {
3278 parser.putBack(entry);
3279 String className;
|
3280 kumpf 1.73 Array<CIMKeyBinding> keyBindings;
|
3281 mike 1.23 getInstanceNameElement(parser, className, keyBindings);
|
3282 kumpf 1.62 reference.set(String(), CIMNamespaceName(), className, keyBindings);
|
3283 mike 1.23 }
3284
3285 expectEndTag(parser, "VALUE.REFERENCE");
3286 return true;
3287 }
3288
3289 //------------------------------------------------------------------------------
3290 //
|
3291 kumpf 1.28 // getValueReferenceArrayElement()
3292 //
3293 // <!ELEMENT VALUE.REFARRAY (VALUE.REFERENCE*)>
3294 //
3295 //------------------------------------------------------------------------------
3296
3297 Boolean XmlReader::getValueReferenceArrayElement(
3298 XmlParser& parser,
3299 CIMValue& value)
3300 {
3301 XmlEntry entry;
|
3302 kumpf 1.54 Array<CIMObjectPath> referenceArray;
3303 CIMObjectPath reference;
|
3304 kumpf 1.28
3305 value.clear();
3306
3307 // Get VALUE.REFARRAY open tag:
3308
3309 if (!testStartTagOrEmptyTag(parser, entry, "VALUE.REFARRAY"))
3310 return false;
3311
|
3312 kumpf 1.32 if (entry.type != XmlEntry::EMPTY_TAG)
3313 {
3314 // For each VALUE.REFERENCE element:
|
3315 kumpf 1.28
|
3316 kumpf 1.32 while (getValueReferenceElement(parser, reference))
3317 {
3318 referenceArray.append(reference);
3319 }
|
3320 kumpf 1.28
|
3321 kumpf 1.32 expectEndTag(parser, "VALUE.REFARRAY");
|
3322 kumpf 1.28 }
3323
3324 value.set(referenceArray);
3325 return true;
3326 }
3327
3328 //------------------------------------------------------------------------------
3329 //
|
3330 mike 1.23 // getPropertyReferenceElement()
3331 //
3332 // <!ELEMENT PROPERTY.REFERENCE (QUALIFIER*,(VALUE.REFERENCE)?)>
3333 // <!ATTLIST PROPERTY.REFERENCE
3334 // %CIMName;
3335 // %ReferenceClass;
3336 // %ClassOrigin;
3337 // %Propagated;>
3338 //
3339 //------------------------------------------------------------------------------
3340
3341 Boolean XmlReader::getPropertyReferenceElement(
3342 XmlParser& parser,
3343 CIMProperty& property)
3344 {
3345 XmlEntry entry;
3346
3347 if (!testStartTagOrEmptyTag(parser, entry, "PROPERTY.REFERENCE"))
3348 return false;
3349
3350 Boolean empty = entry.type == XmlEntry::EMPTY_TAG;
3351 mike 1.23
3352 // Get PROPERTY.NAME attribute:
3353
|
3354 kumpf 1.74 CIMName name = getCimNameAttribute(
|
3355 mike 1.23 parser.getLine(), entry, "PROPERTY.REFERENCE");
3356
3357 // Get PROPERTY.REFERENCECLASS attribute:
3358
|
3359 kumpf 1.62 CIMName referenceClass = getReferenceClassAttribute(
|
3360 mike 1.23 parser.getLine(), entry, "PROPERTY.REFERENCE");
3361
3362 // Get PROPERTY.CLASSORIGIN attribute:
3363
|
3364 kumpf 1.62 CIMName classOrigin =
|
3365 mike 1.23 getClassOriginAttribute(parser.getLine(), entry, "PROPERTY.REFERENCE");
3366
3367 // Get PROPERTY.PROPAGATED
3368
3369 Boolean propagated = getCimBooleanAttribute(parser.getLine(), entry,
3370 "PROPERTY.REFERENCE", "PROPAGATED", false, false);
3371
3372 // Create property:
3373
|
3374 kumpf 1.61 CIMValue value = CIMValue(CIMTYPE_REFERENCE, false, 0);
|
3375 kumpf 1.54 // value.set(CIMObjectPath());
|
3376 mike 1.23 property = CIMProperty(
3377 name, value, 0, referenceClass, classOrigin, propagated);
3378
3379 if (!empty)
3380 {
3381 getQualifierElements(parser, property);
3382
|
3383 kumpf 1.54 CIMObjectPath reference;
|
3384 mike 1.23
3385 if (getValueReferenceElement(parser, reference))
3386 property.setValue(reference);
3387
3388 expectEndTag(parser, "PROPERTY.REFERENCE");
3389 }
3390
3391 return true;
3392 }
3393
3394 //------------------------------------------------------------------------------
3395 //
3396 // GetPropertyElements()
3397 //
3398 //------------------------------------------------------------------------------
3399
3400 template<class CONTAINER>
3401 void GetPropertyElements(XmlParser& parser, CONTAINER& container)
3402 {
3403 CIMProperty property;
3404
3405 mike 1.23 while (XmlReader::getPropertyElement(parser, property) ||
3406 XmlReader::getPropertyArrayElement(parser, property) ||
3407 XmlReader::getPropertyReferenceElement(parser, property))
3408 {
3409 try
3410 {
3411 container.addProperty(property);
3412 }
|
3413 kumpf 1.66 catch (AlreadyExistsException&)
|
3414 mike 1.23 {
|
3415 humberto 1.85
3416 // l10n
3417
3418 // throw XmlSemanticError(parser.getLine(), "duplicate property");
3419
|
3420 humberto 1.87 MessageLoaderParms mlParms("Common.XmlReader.DUPLICATE_PROPERTY",
3421 "duplicate property");
|
3422 humberto 1.85
3423 throw XmlSemanticError(parser.getLine(), mlParms);
|
3424 mike 1.23 }
3425 }
3426 }
3427
3428 //------------------------------------------------------------------------------
3429 //
3430 // getParameterElement()
3431 //
3432 // <!ELEMENT PARAMETER (QUALIFIER*)>
3433 // <!ATTLIST PARAMETER
3434 // %CIMName;
3435 // %CIMType; #REQUIRED>
3436 //
3437 //------------------------------------------------------------------------------
3438
3439 Boolean XmlReader::getParameterElement(
3440 XmlParser& parser,
3441 CIMParameter& parameter)
3442 {
3443 XmlEntry entry;
3444
3445 mike 1.23 if (!testStartTagOrEmptyTag(parser, entry, "PARAMETER"))
3446 return false;
3447
3448 Boolean empty = entry.type == XmlEntry::EMPTY_TAG;
3449
3450 // Get PARAMETER.NAME attribute:
3451
|
3452 kumpf 1.74 CIMName name = getCimNameAttribute(parser.getLine(), entry, "PARAMETER");
|
3453 mike 1.23
3454 // Get PARAMETER.TYPE attribute:
3455
|
3456 kumpf 1.67 CIMType type;
3457 getCimTypeAttribute(parser.getLine(), entry, type, "PARAMETER");
|
3458 mike 1.23
3459 // Create parameter:
3460
3461 parameter = CIMParameter(name, type);
3462
3463 if (!empty)
3464 {
3465 getQualifierElements(parser, parameter);
3466
3467 expectEndTag(parser, "PARAMETER");
3468 }
3469
3470 return true;
3471 }
3472
3473 //------------------------------------------------------------------------------
3474 //
3475 // getParameterArrayElement()
3476 //
3477 // <!ELEMENT PARAMETER.ARRAY (QUALIFIER*)>
3478 // <!ATTLIST PARAMETER.ARRAY
3479 mike 1.23 // %CIMName;
3480 // %CIMType; #REQUIRED
3481 // %ArraySize;>
3482 //
3483 //------------------------------------------------------------------------------
3484
3485 Boolean XmlReader::getParameterArrayElement(
3486 XmlParser& parser,
3487 CIMParameter& parameter)
3488 {
3489 XmlEntry entry;
3490
3491 if (!testStartTagOrEmptyTag(parser, entry, "PARAMETER.ARRAY"))
3492 return false;
3493
3494 Boolean empty = entry.type == XmlEntry::EMPTY_TAG;
3495
3496 // Get PARAMETER.ARRAY.NAME attribute:
3497
|
3498 kumpf 1.74 CIMName name = getCimNameAttribute(
|
3499 mike 1.23 parser.getLine(), entry, "PARAMETER.ARRAY");
3500
3501 // Get PARAMETER.ARRAY.TYPE attribute:
3502
|
3503 kumpf 1.67 CIMType type;
3504 getCimTypeAttribute(parser.getLine(), entry, type, "PARAMETER.ARRAY");
|
3505 mike 1.23
3506 // Get PARAMETER.ARRAYSIZE attribute:
3507
3508 Uint32 arraySize = 0;
3509 getArraySizeAttribute(parser.getLine(), entry, "PARAMETER.ARRAY",arraySize);
3510
3511 // Create parameter:
3512
3513 parameter = CIMParameter(name, type, true, arraySize);
3514
3515 if (!empty)
3516 {
3517 getQualifierElements(parser, parameter);
3518
3519 expectEndTag(parser, "PARAMETER.ARRAY");
3520 }
3521
3522 return true;
3523 }
3524
3525 //------------------------------------------------------------------------------
3526 mike 1.23 //
3527 // getParameterReferenceElement()
3528 //
3529 // <!ELEMENT PARAMETER.REFERENCE (QUALIFIER*)>
3530 // <!ATTLIST PARAMETER.REFERENCE
3531 // %CIMName;
3532 // %ReferenceClass;>
3533 //
3534 //------------------------------------------------------------------------------
3535
3536 Boolean XmlReader::getParameterReferenceElement(
3537 XmlParser& parser,
3538 CIMParameter& parameter)
3539 {
3540 XmlEntry entry;
3541
3542 if (!testStartTagOrEmptyTag(parser, entry, "PARAMETER.REFERENCE"))
3543 return false;
3544
3545 Boolean empty = entry.type == XmlEntry::EMPTY_TAG;
3546
3547 mike 1.23 // Get PARAMETER.NAME attribute:
3548
|
3549 kumpf 1.74 CIMName name = getCimNameAttribute(
|
3550 mike 1.23 parser.getLine(), entry, "PARAMETER.REFERENCE");
3551
3552 // Get PARAMETER.REFERENCECLASS attribute:
3553
|
3554 kumpf 1.62 CIMName referenceClass = getReferenceClassAttribute(
|
3555 mike 1.23 parser.getLine(), entry, "PARAMETER.REFERENCE");
3556
3557 // Create parameter:
3558
|
3559 kumpf 1.61 parameter = CIMParameter(name, CIMTYPE_REFERENCE, false, 0, referenceClass);
|
3560 mike 1.23
3561 if (!empty)
3562 {
3563 getQualifierElements(parser, parameter);
3564 expectEndTag(parser, "PARAMETER.REFERENCE");
3565 }
3566
3567 return true;
3568 }
3569
3570 //------------------------------------------------------------------------------
3571 //
|
3572 kumpf 1.26 // getParameterReferenceArrayElement()
3573 //
3574 // <!ELEMENT PARAMETER.REFARRAY (QUALIFIER*)>
3575 // <!ATTLIST PARAMETER.REFARRAY
3576 // %CIMName;
3577 // %ReferenceClass;
3578 // %ArraySize;>
3579 //
3580 //------------------------------------------------------------------------------
3581
3582 Boolean XmlReader::getParameterReferenceArrayElement(
3583 XmlParser& parser,
3584 CIMParameter& parameter)
3585 {
3586 XmlEntry entry;
3587
3588 if (!testStartTagOrEmptyTag(parser, entry, "PARAMETER.REFARRAY"))
3589 return false;
3590
3591 Boolean empty = entry.type == XmlEntry::EMPTY_TAG;
3592
3593 kumpf 1.26 // Get PARAMETER.NAME attribute:
3594
|
3595 kumpf 1.74 CIMName name = getCimNameAttribute(
|
3596 kumpf 1.26 parser.getLine(), entry, "PARAMETER.REFARRAY");
3597
3598 // Get PARAMETER.REFERENCECLASS attribute:
3599
|
3600 kumpf 1.62 CIMName referenceClass = getReferenceClassAttribute(
|
3601 kumpf 1.26 parser.getLine(), entry, "PARAMETER.REFARRAY");
3602
3603 // Get PARAMETER.ARRAYSIZE attribute:
3604
3605 Uint32 arraySize = 0;
3606 getArraySizeAttribute(parser.getLine(), entry, "PARAMETER.REFARRAY",
3607 arraySize);
3608
3609 // Create parameter:
3610
|
3611 kumpf 1.61 parameter = CIMParameter(name, CIMTYPE_REFERENCE, true, arraySize,
|
3612 kumpf 1.26 referenceClass);
3613
3614 if (!empty)
3615 {
3616 getQualifierElements(parser, parameter);
3617 expectEndTag(parser, "PARAMETER.REFARRAY");
3618 }
3619
3620 return true;
3621 }
3622
3623 //------------------------------------------------------------------------------
3624 //
|
3625 mike 1.23 // GetParameterElements()
3626 //
3627 //------------------------------------------------------------------------------
3628
3629 template<class CONTAINER>
3630 void GetParameterElements(XmlParser& parser, CONTAINER& container)
3631 {
3632 CIMParameter parameter;
3633
3634 while (XmlReader::getParameterElement(parser, parameter) ||
3635 XmlReader::getParameterArrayElement(parser, parameter) ||
|
3636 kumpf 1.26 XmlReader::getParameterReferenceElement(parser, parameter) ||
3637 XmlReader::getParameterReferenceArrayElement(parser, parameter))
|
3638 mike 1.23 {
3639 try
3640 {
3641 container.addParameter(parameter);
3642 }
|
3643 kumpf 1.66 catch (AlreadyExistsException&)
|
3644 mike 1.23 {
|
3645 humberto 1.85
3646 // l10n
3647
3648 // throw XmlSemanticError(parser.getLine(), "duplicate parameter");
3649
|
3650 humberto 1.87 MessageLoaderParms mlParms("Common.XmlReader.DUPLICATE_PARAMETER",
3651 "duplicate parameter");
|
3652 humberto 1.85
3653 throw XmlSemanticError(parser.getLine(), mlParms);
|
3654 mike 1.23 }
3655 }
3656 }
3657
3658 //------------------------------------------------------------------------------
3659 //
3660 // getQualifierDeclElement()
3661 //
3662 // <!ELEMENT QUALIFIER.DECLARATION (SCOPE?,(VALUE|VALUE.ARRAY)?)>
3663 // <!ATTLIST QUALIFIER.DECLARATION
3664 // %CIMName;
3665 // %CIMType; #REQUIRED
3666 // ISARRAY (true|false) #IMPLIED
3667 // %ArraySize;
3668 // %QualifierFlavor;>
3669 //
3670 //------------------------------------------------------------------------------
3671
3672 Boolean XmlReader::getQualifierDeclElement(
3673 XmlParser& parser,
3674 CIMQualifierDecl& qualifierDecl)
3675 mike 1.23 {
3676 XmlEntry entry;
3677
3678 if (!testStartTagOrEmptyTag(parser, entry, "QUALIFIER.DECLARATION"))
3679 return false;
3680
3681 Boolean empty = entry.type == XmlEntry::EMPTY_TAG;
3682
3683 // Get NAME attribute:
3684
|
3685 kumpf 1.74 CIMName name = getCimNameAttribute(
|
3686 mike 1.23 parser.getLine(), entry, "QUALIFIER.DECLARATION");
3687
3688 // Get TYPE attribute:
3689
|
3690 kumpf 1.67 CIMType type;
3691 getCimTypeAttribute(parser.getLine(), entry, type, "QUALIFIER.DECLARATION");
|
3692 mike 1.23
3693 // Get ISARRAY attribute:
3694
|
3695 mike 1.25 Boolean isArray = getCimBooleanAttribute(
3696 parser.getLine(), entry, "QUALIFIER.DECLARATION", "ISARRAY",
3697 false, false);
|
3698 mike 1.23
3699 // Get ARRAYSIZE attribute:
3700
3701 Uint32 arraySize = 0;
3702 Boolean gotArraySize = getArraySizeAttribute(parser.getLine(),
3703 entry, "QUALIFIER.DECLARATION", arraySize);
3704
3705 // Get flavor oriented attributes:
3706
|
3707 kumpf 1.64 CIMFlavor flavor = getFlavor (entry, parser.getLine (),
3708 "QUALIFIER.DECLARATION");
|
3709 mike 1.23
3710 // No need to look for interior elements if empty tag:
3711
|
3712 kumpf 1.63 CIMScope scope = CIMScope ();
|
3713 mike 1.23 CIMValue value;
|
3714 kumpf 1.67 Boolean gotValue = false;
|
3715 mike 1.23
3716 if (!empty)
3717 {
3718 // Get the option SCOPE element:
3719
3720 scope = getOptionalScope(parser);
3721
3722 // Get VALUE or VALUE.ARRAY element:
3723
3724 if (getValueArrayElement(parser, type, value))
3725 {
3726 if (!isArray)
3727 {
|
3728 humberto 1.85
3729 // l10n
3730
3731 // throw XmlSemanticError(parser.getLine(),
3732 // "VALUE.ARRAY element encountered without "
3733 // "ISARRAY attribute");
3734
3735 MessageLoaderParms mlParms("Common.XmlReader.ARRAY_WITHOUT_ISARRAY",
|
3736 humberto 1.87 "VALUE.ARRAY element encountered without ISARRAY attribute");
|
3737 humberto 1.85
3738 throw XmlSemanticError(parser.getLine(), mlParms);
|
3739 mike 1.23 }
3740
3741 if (arraySize && arraySize != value.getArraySize())
3742 {
|
3743 humberto 1.85
3744 // l10n
3745
3746 // throw XmlSemanticError(parser.getLine(),
3747 // "VALUE.ARRAY size is not the same as "
3748 // "ARRAYSIZE attribute");
3749
3750 MessageLoaderParms mlParms("Common.XmlReader.ARRAY_SIZE_NOT_SAME",
|
3751 humberto 1.87 "VALUE.ARRAY size is not the same as ARRAYSIZE attribute");
|
3752 humberto 1.85
3753 throw XmlSemanticError(parser.getLine(), mlParms);
|
3754 mike 1.23 }
|
3755 kumpf 1.67
3756 gotValue = true;
|
3757 mike 1.23 }
3758 else if (getValueElement(parser, type, value))
3759 {
3760 if (isArray)
3761 {
|
3762 humberto 1.85
3763 // l10n
3764
3765 // throw XmlSemanticError(parser.getLine(),
3766 // "ISARRAY attribute used but VALUE element encountered");
3767
3768 MessageLoaderParms mlParms("Common.XmlReader.ARRAY_ATTRIBUTE_DIFFERENT",
|
3769 humberto 1.87 "ISARRAY attribute used but VALUE element encountered");
|
3770 humberto 1.85
3771 throw XmlSemanticError(parser.getLine(), mlParms);
|
3772 mike 1.23 }
|
3773 kumpf 1.67
3774 gotValue = true;
|
3775 mike 1.23 }
3776
3777 // Now get the closing tag:
3778
3779 expectEndTag(parser, "QUALIFIER.DECLARATION");
3780 }
3781
|
3782 kumpf 1.67 if (!gotValue)
|
3783 mike 1.23 {
3784 if (isArray)
3785 value.setNullValue(type, true, arraySize);
3786 else
3787 value.setNullValue(type, false);
3788 }
3789
3790 CIMQualifierDecl tmp(name, value, scope, flavor, arraySize);
3791 qualifierDecl = CIMQualifierDecl(name, value, scope, flavor, arraySize);
3792 return true;
3793 }
3794
3795 //------------------------------------------------------------------------------
3796 // getMethodElement()
3797 //
3798 // <!ELEMENT METHOD (QUALIFIER*,(PARAMETER|PARAMETER.REFERENCE|
3799 // PARAMETER.ARRAY|PARAMETER.REFARRAY)*)>
3800 // <!ATTLIST METHOD
3801 // %CIMName;
3802 // %CIMType; #IMPLIED
3803 // %ClassOrigin;
3804 mike 1.23 // %Propagated;>
3805 //
3806 //------------------------------------------------------------------------------
3807
3808 Boolean XmlReader::getMethodElement(XmlParser& parser, CIMMethod& method)
3809 {
3810 XmlEntry entry;
3811
3812 if (!testStartTagOrEmptyTag(parser, entry, "METHOD"))
3813 return false;
3814
3815 Boolean empty = entry.type == XmlEntry::EMPTY_TAG;
3816
|
3817 kumpf 1.74 CIMName name = getCimNameAttribute(parser.getLine(), entry, "PROPERTY");
|
3818 mike 1.23
|
3819 kumpf 1.67 CIMType type;
3820 getCimTypeAttribute(parser.getLine(), entry, type, "PROPERTY");
|
3821 mike 1.23
|
3822 kumpf 1.62 CIMName classOrigin =
|
3823 mike 1.23 getClassOriginAttribute(parser.getLine(), entry, "PROPERTY");
3824
3825 Boolean propagated = getCimBooleanAttribute(
3826 parser.getLine(), entry, "PROPERTY", "PROPAGATED", false, false);
3827
3828 method = CIMMethod(name, type, classOrigin, propagated);
3829
3830 if (!empty)
3831 {
|
3832 kumpf 1.26 // ATTN-RK-P2-20020219: Decoding algorithm must not depend on the
3833 // ordering of qualifiers and parameters.
|
3834 mike 1.23 getQualifierElements(parser, method);
3835
3836 GetParameterElements(parser, method);
3837
3838 expectEndTag(parser, "METHOD");
3839 }
3840
3841 return true;
3842 }
3843
3844 //------------------------------------------------------------------------------
3845 // getClassElement()
3846 //
3847 // <!ELEMENT CLASS (QUALIFIER*,
3848 // (PROPERTY|PROPERTY.ARRAY|PROPERTY.REFERENCE)*,METHOD*)>
3849 // <!ATTLIST CLASS %CIMName; %SuperClass;>
3850 //
3851 //------------------------------------------------------------------------------
3852
3853 Boolean XmlReader::getClassElement(XmlParser& parser, CIMClass& cimClass)
3854 {
3855 mike 1.23 XmlEntry entry;
3856
|
3857 a.dunfey 1.96 if (!testStartTagOrEmptyTag(parser, entry, "CLASS"))
|
3858 mike 1.23 return false;
3859
|
3860 kumpf 1.74 CIMName name = getCimNameAttribute(parser.getLine(), entry, "CLASS");
|
3861 mike 1.23
|
3862 kumpf 1.62 CIMName superClass = getSuperClassAttribute(parser.getLine(), entry,"CLASS");
|
3863 mike 1.23
3864 cimClass = CIMClass(name, superClass);
3865
|
3866 a.dunfey 1.97 if(entry.type != XmlEntry::EMPTY_TAG)
3867 {
3868
|
3869 mike 1.23 // Get QUALIFIER elements:
3870
3871 getQualifierElements(parser, cimClass);
3872
3873 // Get PROPERTY elements:
3874
3875 GetPropertyElements(parser, cimClass);
3876
3877 // Get METHOD elements:
3878
3879 CIMMethod method;
3880
3881 while (getMethodElement(parser, method))
3882 cimClass.addMethod(method);
3883
3884 // Get CLASS end tag:
|
3885 a.dunfey 1.97
3886 expectEndTag(parser, "CLASS");
3887 }
|
3888 mike 1.23
3889 return true;
3890 }
3891
3892 //------------------------------------------------------------------------------
3893 // getInstanceElement()
3894 //
3895 // <!ELEMENT INSTANCE (QUALIFIER*,
3896 // (PROPERTY|PROPERTY.ARRAY|PROPERTY.REFERENCE)*) >
3897 // <!ATTLIST INSTANCE
3898 // %ClassName;>
3899 //
3900 //------------------------------------------------------------------------------
3901
3902 Boolean XmlReader::getInstanceElement(
3903 XmlParser& parser,
3904 CIMInstance& cimInstance)
3905 {
3906 XmlEntry entry;
3907
|
3908 kumpf 1.89 if (!testStartTagOrEmptyTag(parser, entry, "INSTANCE"))
|
3909 mike 1.23 return false;
3910
|
3911 kumpf 1.89 Boolean empty = entry.type == XmlEntry::EMPTY_TAG;
3912
|
3913 mike 1.23 String className = getClassNameAttribute(
3914 parser.getLine(), entry, "INSTANCE");
3915
3916 cimInstance = CIMInstance(className);
3917
|
3918 kumpf 1.89 if (!empty)
3919 {
3920 // Get QUALIFIER elements:
3921 getQualifierElements(parser, cimInstance);
3922
3923 // Get PROPERTY elements:
3924 GetPropertyElements(parser, cimInstance);
3925
3926 // Get INSTANCE end tag:
3927 expectEndTag(parser, "INSTANCE");
3928 }
|
3929 mike 1.23
3930 return true;
3931 }
3932
3933 //------------------------------------------------------------------------------
|
3934 mike 1.25 // getNamedInstanceElement()
3935 //
3936 // <!ELEMENT VALUE.NAMEDINSTANCE (INSTANCENAME,INSTANCE)>
3937 //
3938 //------------------------------------------------------------------------------
3939
3940 Boolean XmlReader::getNamedInstanceElement(
3941 XmlParser& parser,
|
3942 kumpf 1.55 CIMInstance& namedInstance)
|
3943 mike 1.25 {
3944 XmlEntry entry;
3945
3946 if (!testStartTag(parser, entry, "VALUE.NAMEDINSTANCE"))
3947 return false;
3948
|
3949 kumpf 1.54 CIMObjectPath instanceName;
|
3950 mike 1.25
3951 // Get INSTANCENAME elements:
3952
3953 if (!getInstanceNameElement(parser, instanceName))
3954 {
|
3955 humberto 1.85
3956 // l10n
3957
3958 // throw XmlValidationError(parser.getLine(),
3959 // "expected INSTANCENAME element");
3960
|
3961 humberto 1.87 MessageLoaderParms mlParms("Common.XmlReader.EXPECTED_INSTANCENAME_ELEMENT",
3962 "expected INSTANCENAME element");
|
3963 humberto 1.85
3964 throw XmlValidationError(parser.getLine(), mlParms);
|
3965 mike 1.25 }
3966
3967 // Get INSTANCE elements:
3968
|
3969 kumpf 1.55 if (!getInstanceElement(parser, namedInstance))
|
3970 mike 1.25 {
|
3971 humberto 1.85
3972 // l10n
3973
3974 // throw XmlValidationError(parser.getLine(),
3975 // "expected INSTANCE element");
3976
3977
|
3978 humberto 1.87 MessageLoaderParms mlParms("Common.XmlReader.EXPECTED_INSTANCE_ELEMENT",
3979 "expected INSTANCE element");
|
3980 humberto 1.85
3981 throw XmlValidationError(parser.getLine(), mlParms);
|
3982 mike 1.25 }
3983
3984 // Get VALUE.NAMEDINSTANCE end tag:
3985
3986 expectEndTag(parser, "VALUE.NAMEDINSTANCE");
3987
|
3988 kumpf 1.55 namedInstance.setPath (instanceName);
|
3989 mike 1.25
3990 return true;
3991 }
3992
3993 //------------------------------------------------------------------------------
|
3994 mike 1.23 //
3995 // getObject()
3996 //
3997 //------------------------------------------------------------------------------
3998
3999 void XmlReader::getObject(XmlParser& parser, CIMClass& x)
4000 {
4001 if (!getClassElement(parser, x))
4002 {
|
4003 humberto 1.85
4004 // l10n
4005
4006 // throw XmlValidationError(parser.getLine(),
4007 // "expected CLASS element");
4008
|
4009 humberto 1.87 MessageLoaderParms mlParms("Common.XmlReader.EXPECTED_CLASS_ELEMENT",
4010 "expected CLASS element");
|
4011 humberto 1.85
4012 throw XmlValidationError(parser.getLine(), mlParms);
|
4013 mike 1.23 }
4014 }
4015
4016 //------------------------------------------------------------------------------
4017 //
4018 // getObject()
4019 //
4020 //------------------------------------------------------------------------------
4021
4022 void XmlReader::getObject(XmlParser& parser, CIMInstance& x)
4023 {
4024 if (!getInstanceElement(parser, x))
4025 {
|
4026 humberto 1.85
4027 // l10n
4028
4029 // throw XmlValidationError(parser.getLine(),
4030 // "expected INSTANCE element");
4031
|
4032 humberto 1.87 MessageLoaderParms mlParms("Common.XmlReader.EXPECTED_INSTANCE_ELEMENT",
4033 "expected INSTANCE element");
|
4034 humberto 1.85
4035 throw XmlValidationError(parser.getLine(), mlParms);
|
4036 mike 1.23 }
4037 }
4038
4039 //------------------------------------------------------------------------------
4040 //
4041 // getObject()
4042 //
4043 //------------------------------------------------------------------------------
4044
4045 void XmlReader::getObject(XmlParser& parser, CIMQualifierDecl& x)
4046 {
4047 if (!getQualifierDeclElement(parser, x))
4048 {
|
4049 humberto 1.85
4050 // l10n
4051
4052 // throw XmlValidationError(parser.getLine(),
4053 // "expected QUALIFIER.DECLARATION element");
4054
|
4055 humberto 1.87 MessageLoaderParms mlParms("Common.XmlReader.EXPECTED_QUALIFIER_DECLARATION_ELEMENT",
4056 "expected QUALIFIER.DECLARATION element");
|
4057 humberto 1.85
4058 throw XmlValidationError(parser.getLine(), mlParms);
|
4059 mike 1.23 }
4060 }
4061
4062 //------------------------------------------------------------------------------
4063 //
4064 // getMessageStartTag()
4065 //
4066 //------------------------------------------------------------------------------
4067
4068 Boolean XmlReader::getMessageStartTag(
4069 XmlParser& parser,
4070 String& id,
|
4071 kumpf 1.34 String& protocolVersion)
|
4072 mike 1.23 {
4073 XmlEntry entry;
4074
4075 if (!testStartTag(parser, entry, "MESSAGE"))
4076 return false;
4077
4078 // Get MESSAGE.ID:
4079
|
4080 humberto 1.85 if (!entry.getAttributeValue("ID", id)) {
4081
4082 // l10n
4083
4084 // throw XmlValidationError(parser.getLine(),
4085 // "Invalid or missing MESSAGE.ID attribute");
4086
|
4087 humberto 1.87 MessageLoaderParms mlParms("Common.XmlReader.INVALID_MISSING_MESSAGE_ID_ATTRIBUTE",
4088 "Invalid or missing MESSAGE.ID attribute");
|
4089 humberto 1.85
4090 throw XmlValidationError(parser.getLine(), mlParms);
4091 }
4092
|
4093 mike 1.23
4094 // Get MESSAGE.PROTOCOLVERSION:
4095
|
4096 humberto 1.85 if (!entry.getAttributeValue("PROTOCOLVERSION", protocolVersion)) {
4097
4098 // l10n
|
4099 mike 1.23
|
4100 humberto 1.85 // throw XmlValidationError(parser.getLine(),
4101 // "Invalid or missing MESSAGE.PROTOCOLVERSION attribute");
4102
|
4103 humberto 1.87 MessageLoaderParms mlParms("Common.XmlReader.INVALID_MISSING_PROTOCOLVERSION_ATTRIBUTE",
4104 "Invalid or missing MESSAGE.PROTOCOLVERSION attribute");
|
4105 humberto 1.85
4106 throw XmlValidationError(parser.getLine(), mlParms);
4107 }
4108
|
4109 mike 1.23 return true;
4110 }
4111
4112 //------------------------------------------------------------------------------
4113 //
4114 // getIMethodCallStartTag()
4115 //
4116 //------------------------------------------------------------------------------
4117
4118 Boolean XmlReader::getIMethodCallStartTag(
4119 XmlParser& parser,
4120 const char*& name)
4121 {
4122 XmlEntry entry;
4123
4124 if (!testStartTag(parser, entry, "IMETHODCALL"))
4125 return false;
4126
4127 // Get IMETHODCALL.NAME attribute:
4128
|
4129 humberto 1.85
4130 if (!entry.getAttributeValue("NAME", name)) {
4131
4132 // l10n
4133
4134 // throw XmlValidationError(parser.getLine(),
4135 // "Missing IMETHODCALL.NAME attribute");
4136
|
4137 humberto 1.87 MessageLoaderParms mlParms("Common.XmlReader.MISSING_IMETHODCALL_ATTRIBUTE",
4138 "Missing IMETHODCALL.NAME attribute");
|
4139 humberto 1.85
4140 throw XmlValidationError(parser.getLine(), mlParms);
4141 }
4142
|
4143 mike 1.23
4144 return true;
4145 }
4146
4147 //------------------------------------------------------------------------------
4148 //
4149 // getIMethodResponseStartTag()
4150 //
4151 //------------------------------------------------------------------------------
4152
4153 Boolean XmlReader::getIMethodResponseStartTag(
4154 XmlParser& parser,
|
4155 kumpf 1.101 const char*& name,
4156 Boolean& isEmptyTag)
|
4157 mike 1.23 {
4158 XmlEntry entry;
4159
|
4160 kumpf 1.101 if (!testStartTagOrEmptyTag(parser, entry, "IMETHODRESPONSE"))
|
4161 mike 1.23 return false;
4162
|
4163 kumpf 1.101 isEmptyTag = (entry.type == XmlEntry::EMPTY_TAG);
4164
|
4165 mike 1.23 // Get IMETHODRESPONSE.NAME attribute:
4166
|
4167 humberto 1.85 if (!entry.getAttributeValue("NAME", name)) {
4168
4169 // l10n
4170
4171 // throw XmlValidationError(parser.getLine(),
4172 // "Missing IMETHODRESPONSE.NAME attribute");
4173
|
4174 humberto 1.87 MessageLoaderParms mlParms("Common.XmlReader.MISSING_IMETHODRESPONSE_ATTRIBUTE",
4175 "Missing IMETHODRESPONSE.NAME attribute");
|
4176 humberto 1.85
4177 throw XmlValidationError(parser.getLine(), mlParms);
4178 }
4179
|
4180 mike 1.23
4181 return true;
4182 }
4183
4184 //------------------------------------------------------------------------------
4185 //
4186 // getIParamValueTag()
4187 //
4188 //------------------------------------------------------------------------------
4189
4190 Boolean XmlReader::getIParamValueTag(
4191 XmlParser& parser,
|
4192 kumpf 1.99 const char*& name,
4193 Boolean& isEmptyTag)
|
4194 mike 1.23 {
4195 XmlEntry entry;
4196
|
4197 kumpf 1.99 if (!testStartTagOrEmptyTag(parser, entry, "IPARAMVALUE"))
|
4198 mike 1.23 return false;
4199
|
4200 kumpf 1.99 isEmptyTag = (entry.type == XmlEntry::EMPTY_TAG);
4201
|
4202 mike 1.23 // Get IPARAMVALUE.NAME attribute:
4203
|
4204 humberto 1.85 if (!entry.getAttributeValue("NAME", name)) {
4205
4206 // l10n
4207
4208 // throw XmlValidationError(parser.getLine(),
4209 // "Missing IPARAMVALUE.NAME attribute");
4210
|
4211 humberto 1.87 MessageLoaderParms mlParms("Common.XmlReader.MISSING_IPARAMVALUE_ATTRIBUTE",
4212 "Missing IPARAMVALUE.NAME attribute");
|
4213 humberto 1.85
4214 throw XmlValidationError(parser.getLine(), mlParms);
4215 }
|
4216 mike 1.23
4217 return true;
4218 }
4219
4220 //------------------------------------------------------------------------------
4221 //
|
4222 kumpf 1.99 // rejectNullIParamValue()
4223 //
4224 //------------------------------------------------------------------------------
4225
4226 void XmlReader::rejectNullIParamValue(
4227 XmlParser& parser,
4228 Boolean isEmptyTag,
4229 const char* paramName)
4230 {
4231 if (isEmptyTag)
4232 {
4233 MessageLoaderParms mlParms("Common.XmlReader.INVALID_NULL_IPARAMVALUE",
4234 "A null value is not valid for IPARAMVALUE \"$0\".",
4235 paramName);
4236 throw XmlValidationError(parser.getLine(), mlParms);
4237 }
4238 }
4239
4240 //------------------------------------------------------------------------------
4241 //
|
4242 mike 1.23 // getBooleanValueElement()
4243 //
4244 // Get an elements like: "<VALUE>FALSE</VALUE>"
4245 //
4246 //------------------------------------------------------------------------------
4247
4248 Boolean XmlReader::getBooleanValueElement(
4249 XmlParser& parser,
4250 Boolean& result,
4251 Boolean required)
4252 {
4253 XmlEntry entry;
4254
4255 if (!testStartTag(parser, entry, "VALUE"))
4256 {
4257 if (required)
4258 {
|
4259 humberto 1.85
4260 // l10n
4261
4262 // throw XmlValidationError(parser.getLine(),
4263 // "Expected VALUE element");
4264
|
4265 humberto 1.87 MessageLoaderParms mlParms("Common.XmlReader.EXPECTED_VALUE_ELEMENT",
4266 "Expected VALUE element");
|
4267 humberto 1.85
4268 throw XmlValidationError(parser.getLine(), mlParms);
|
4269 mike 1.23 }
4270 return false;
4271 }
4272
4273 expectContentOrCData(parser, entry);
4274
|
4275 kumpf 1.72 if (System::strcasecmp(entry.text, "TRUE") == 0)
|
4276 mike 1.23 result = true;
|
4277 kumpf 1.72 else if (System::strcasecmp(entry.text, "FALSE") == 0)
|
4278 mike 1.23 result = false;
|
4279 humberto 1.85 else {
4280
4281 // l10n
4282
4283 // throw XmlSemanticError(parser.getLine(),
4284 // "Invalid value for VALUE element: must be \"TRUE\" or \"FALSE\"");
4285
4286 MessageLoaderParms mlParms("Common.XmlReader.INVALID_VALUE_FOR_VALUE_ELEMENT",
|
4287 humberto 1.87 "Invalid value for VALUE element: must be \"TRUE\" or \"FALSE\"");
|
4288 humberto 1.85
4289 throw XmlSemanticError(parser.getLine(), mlParms);
4290 }
|
4291 mike 1.23
4292 expectEndTag(parser, "VALUE");
4293
4294 return true;
4295 }
4296
4297 //------------------------------------------------------------------------------
4298 //
|
4299 kumpf 1.95 // DMTF CR Pending
|
4300 mike 1.23 //
|
4301 kumpf 1.95 // <!ELEMENT ERROR (INSTANCE*)>
|
4302 mike 1.23 // <!ATTLIST ERROR
4303 // CODE CDATA #REQUIRED
4304 // DESCRIPTION CDATA #IMPLIED>
4305 //
4306 //------------------------------------------------------------------------------
4307
4308 Boolean XmlReader::getErrorElement(
4309 XmlParser& parser,
|
4310 kumpf 1.50 CIMException& cimException,
|
4311 mike 1.23 Boolean required)
4312 {
4313 XmlEntry entry;
4314
4315 if (!testStartTagOrEmptyTag(parser, entry, "ERROR"))
4316 {
|
4317 humberto 1.85 if (required) {
4318
4319 // l10n
4320
4321 // throw XmlValidationError(parser.getLine(),"Expected ERROR element");
4322
|
4323 humberto 1.87 MessageLoaderParms mlParms("Common.XmlReader.EXPECTED_ERROR_ELEMENT",
4324 "Expected ERROR element");
|
4325 humberto 1.85
4326 throw XmlValidationError(parser.getLine(), mlParms);
4327
4328 }
4329 return false;
|
4330 mike 1.23 }
4331
4332 Boolean empty = entry.type == XmlEntry::EMPTY_TAG;
4333
4334 // Get ERROR.CODE
4335
4336 Uint32 tmpCode;
4337
|
4338 humberto 1.85 if (!entry.getAttributeValue("CODE", tmpCode)) {
4339
4340
4341 // l10n
4342
4343 // throw XmlValidationError(
4344 // parser.getLine(), "missing ERROR.CODE attribute");
4345
|
4346 humberto 1.87 MessageLoaderParms mlParms("Common.XmlReader.MISSING_ERROR_CODE_ATTRIBUTE",
4347 "missing ERROR.CODE attribute");
|
4348 humberto 1.85
4349 throw XmlValidationError(parser.getLine(), mlParms);
4350
4351 }
|
4352 mike 1.23
|
4353 kumpf 1.50 // Get ERROR.DESCRIPTION:
|
4354 mike 1.23
|
4355 kumpf 1.50 String tmpDescription;
|
4356 mike 1.23
|
4357 kumpf 1.50 entry.getAttributeValue("DESCRIPTION", tmpDescription);
|
4358 mike 1.23
4359 if (!empty)
|
4360 kumpf 1.95 {
4361 while (testStartTagOrEmptyTag(parser, entry))
4362 {
4363 skipElement(parser, entry);
4364 }
4365
|
4366 mike 1.23 expectEndTag(parser, "ERROR");
|
4367 kumpf 1.95 }
|
4368 mike 1.23
|
4369 kumpf 1.50 cimException = PEGASUS_CIM_EXCEPTION(CIMStatusCode(tmpCode), tmpDescription);
|
4370 mike 1.23 return true;
4371 }
4372
4373
4374 //------------------------------------------------------------------------------
|
4375 kumpf 1.48 // getValueObjectElement()
4376 //
4377 // <!ELEMENT VALUE.OBJECT (CLASS|INSTANCE)>
4378 //
4379 //------------------------------------------------------------------------------
4380
4381 Boolean XmlReader::getValueObjectElement(
4382 XmlParser& parser,
4383 CIMObject& object)
4384 {
4385 XmlEntry entry;
4386
4387 if (!testStartTag(parser, entry, "VALUE.OBJECT"))
4388 return false;
4389
4390 CIMInstance cimInstance;
4391 CIMClass cimClass;
4392
4393 if (XmlReader::getInstanceElement(parser, cimInstance))
4394 {
4395 object = CIMObject(cimInstance);
4396 kumpf 1.48 }
|
4397 dave.sudlik 1.104 else if (XmlReader::getClassElement(parser, cimClass))
|
4398 kumpf 1.48 {
4399 object = CIMObject(cimClass);
4400 }
4401 else
4402 {
|
4403 humberto 1.85
4404 // l10n
4405
4406 // throw XmlValidationError(parser.getLine(),
4407 // "Expected INSTANCE or CLASS element");
4408
|
4409 humberto 1.87 MessageLoaderParms mlParms("Common.XmlReader.EXPECTED_INSTANCE_OR_CLASS_ELEMENT",
4410 "Expected INSTANCE or CLASS element");
|
4411 humberto 1.85
4412 throw XmlValidationError(parser.getLine(), mlParms);
4413
|
4414 kumpf 1.48 }
4415
4416 expectEndTag(parser, "VALUE.OBJECT");
4417
4418 return true;
4419 }
4420
4421 //------------------------------------------------------------------------------
4422 // getValueObjectWithPathElement()
|
4423 mike 1.23 //
4424 // <!ELEMENT VALUE.OBJECTWITHPATH ((CLASSPATH,CLASS)|(INSTANCEPATH,INSTANCE))>
4425 //
4426 //------------------------------------------------------------------------------
4427
|
4428 kumpf 1.48 Boolean XmlReader::getValueObjectWithPathElement(
|
4429 mike 1.23 XmlParser& parser,
|
4430 kumpf 1.57 CIMObject& objectWithPath)
|
4431 mike 1.23 {
4432 XmlEntry entry;
4433
4434 if (!testStartTag(parser, entry, "VALUE.OBJECTWITHPATH"))
4435 return false;
4436
|
4437 kumpf 1.54 CIMObjectPath reference;
|
4438 mike 1.23 Boolean isInstance = false;
4439
4440 if (XmlReader::getInstancePathElement(parser, reference))
4441 isInstance = true;
4442 else if (!XmlReader::getClassPathElement(parser, reference))
4443 {
|
4444 humberto 1.85
|
4445 humberto 1.90 // l10n 485
|
4446 humberto 1.85
4447 // throw XmlValidationError(parser.getLine(),
4448 // "Expected INSTANCEPATH or CLASSPATH element");
4449
|
4450 humberto 1.87 MessageLoaderParms mlParms("Common.XmlReader.EXPECTED_INSTANCEPATH_OR_CLASSPATH_ELEMENT",
|
4451 humberto 1.90 "Expected INSTANCEPATH or CLASSPATH element");
|
4452 humberto 1.85
4453 throw XmlValidationError(parser.getLine(), mlParms);
|
4454 mike 1.23 }
4455
4456 if (isInstance)
4457 {
4458 CIMInstance cimInstance;
4459
4460 if (!XmlReader::getInstanceElement(parser, cimInstance))
4461 {
|
4462 humberto 1.85
4463 // l10n
4464
4465 // throw XmlValidationError(parser.getLine(),
4466 // "Expected INSTANCE element");
4467
|
4468 humberto 1.87 MessageLoaderParms mlParms("Common.XmlReader.EXPECTED_INSTANCE_ELEMENT",
4469 "Expected INSTANCE element");
|
4470 humberto 1.85
4471 throw XmlValidationError(parser.getLine(), mlParms);
|
4472 mike 1.23 }
|
4473 kumpf 1.57 objectWithPath = CIMObject (cimInstance);
4474 objectWithPath.setPath (reference);
|
4475 mike 1.23 }
4476 else
4477 {
4478 CIMClass cimClass;
4479
4480 if (!XmlReader::getClassElement(parser, cimClass))
4481 {
|
4482 humberto 1.85
4483 // l10n
4484
4485 // throw XmlValidationError(parser.getLine(),
4486 // "Expected CLASS element");
4487
|
4488 humberto 1.87 MessageLoaderParms mlParms("Common.XmlReader.EXPECTED_CLASS_ELEMENT",
4489 "Expected CLASS element");
|
4490 humberto 1.85
4491 throw XmlValidationError(parser.getLine(), mlParms);
|
4492 mike 1.23 }
|
4493 kumpf 1.57 objectWithPath = CIMObject (cimClass);
4494 objectWithPath.setPath (reference);
|
4495 mike 1.23 }
4496
4497 expectEndTag(parser, "VALUE.OBJECTWITHPATH");
4498
4499 return true;
|
4500 kumpf 1.48 }
4501
4502 //------------------------------------------------------------------------------
4503 // getValueObjectWithLocalPathElement()
4504 //
4505 // <!ELEMENT VALUE.OBJECTWITHLOCALPATH
4506 // ((LOCALCLASSPATH,CLASS)|(LOCALINSTANCEPATH,INSTANCE))>
4507 //
4508 //------------------------------------------------------------------------------
4509
4510 Boolean XmlReader::getValueObjectWithLocalPathElement(
4511 XmlParser& parser,
|
4512 kumpf 1.57 CIMObject& objectWithPath)
|
4513 kumpf 1.48 {
4514 XmlEntry entry;
4515
4516 if (!testStartTag(parser, entry, "VALUE.OBJECTWITHLOCALPATH"))
4517 return false;
4518
|
4519 kumpf 1.54 CIMObjectPath reference;
|
4520 kumpf 1.48 Boolean isInstance = false;
4521
4522 if (XmlReader::getLocalInstancePathElement(parser, reference))
4523 isInstance = true;
4524 else if (!XmlReader::getLocalClassPathElement(parser, reference))
4525 {
|
4526 humberto 1.85
4527 // l10n
4528
4529 // throw XmlValidationError(parser.getLine(),
4530 // "Expected LOCALINSTANCEPATH or LOCALCLASSPATH element");
4531
|
4532 humberto 1.91 //l10n updated
4533 MessageLoaderParms mlParms("Common.XmlConstants.MISSING_ELEMENT_LOCALPATH",
4534 MISSING_ELEMENT_LOCALPATH);
|
4535 humberto 1.85
4536 throw XmlValidationError(parser.getLine(), mlParms);
4537
|
4538 kumpf 1.48 }
4539
4540 if (isInstance)
4541 {
4542 CIMInstance cimInstance;
4543
4544 if (!XmlReader::getInstanceElement(parser, cimInstance))
4545 {
|
4546 humberto 1.85
4547 // l10n
4548
4549 // throw XmlValidationError(parser.getLine(),
4550 // "Expected INSTANCE element");
4551
|
4552 humberto 1.87 MessageLoaderParms mlParms("Common.XmlReader.EXPECTED_INSTANCE_ELEMENT",
4553 "Expected INSTANCE element");
|
4554 humberto 1.85
4555 throw XmlValidationError(parser.getLine(), mlParms);
4556
|
4557 kumpf 1.48 }
|
4558 kumpf 1.57 objectWithPath = CIMObject (cimInstance);
4559 objectWithPath.setPath (reference);
|
4560 kumpf 1.48 }
4561 else
4562 {
4563 CIMClass cimClass;
4564
4565 if (!XmlReader::getClassElement(parser, cimClass))
4566 {
|
4567 humberto 1.85
4568 // l10n
4569
4570 // throw XmlValidationError(parser.getLine(),
4571 // "Expected CLASS element");
4572
|
4573 humberto 1.87 MessageLoaderParms mlParms("Common.XmlReader.EXPECTED_CLASS_ELEMENT",
4574 "Expected CLASS element");
|
4575 humberto 1.85
4576 throw XmlValidationError(parser.getLine(), mlParms);
4577
4578
|
4579 kumpf 1.48 }
|
4580 kumpf 1.57 objectWithPath = CIMObject (cimClass);
4581 objectWithPath.setPath (reference);
|
4582 kumpf 1.48 }
4583
4584 expectEndTag(parser, "VALUE.OBJECTWITHLOCALPATH");
4585
4586 return true;
4587 }
4588
4589 //------------------------------------------------------------------------------
4590 // getObjectArray()
4591 //
4592 // <object>
4593 // (VALUE.OBJECT|VALUE.OBJECTWITHLOCALPATH|VALUE.OBJECTWITHPATH)
4594 //
4595 //------------------------------------------------------------------------------
4596
4597 void XmlReader::getObjectArray(
4598 XmlParser& parser,
|
4599 kumpf 1.57 Array<CIMObject>& objectArray)
|
4600 kumpf 1.48 {
4601 CIMObject object;
|
4602 kumpf 1.57 CIMObject objectWithPath;
|
4603 kumpf 1.48
4604 objectArray.clear();
4605
4606 if (getValueObjectElement(parser, object))
4607 {
|
4608 kumpf 1.57 objectArray.append(object);
|
4609 kumpf 1.48 while (getValueObjectElement(parser, object))
|
4610 kumpf 1.57 objectArray.append(object);
|
4611 kumpf 1.48 }
4612 else if (getValueObjectWithPathElement(parser, objectWithPath))
4613 {
4614 objectArray.append(objectWithPath);
4615 while (getValueObjectWithPathElement(parser, objectWithPath))
4616 objectArray.append(objectWithPath);
4617 }
4618 else if (getValueObjectWithLocalPathElement(parser, objectWithPath))
4619 {
4620 objectArray.append(objectWithPath);
4621 while (getValueObjectWithLocalPathElement(parser, objectWithPath))
4622 objectArray.append(objectWithPath);
4623 }
|
4624 mike 1.23 }
4625
4626 //------------------------------------------------------------------------------
4627 //
4628 // <objectName>: (CLASSNAME|INSTANCENAME)
4629 //
4630 //------------------------------------------------------------------------------
4631
4632 Boolean XmlReader::getObjectNameElement(
4633 XmlParser& parser,
|
4634 kumpf 1.54 CIMObjectPath& objectName)
|
4635 mike 1.23 {
|
4636 kumpf 1.74 CIMName className;
|
4637 mike 1.23
4638 if (getClassNameElement(parser, className, false))
4639 {
|
4640 kumpf 1.62 objectName.set(String(), CIMNamespaceName(), className);
|
4641 mike 1.23 return true;
4642 }
4643 else if (getInstanceNameElement(parser, objectName))
4644 return true;
4645 else
4646 {
|
4647 humberto 1.85
4648 // l10n
4649
4650 // throw XmlValidationError(parser.getLine(),
4651 // "expected CLASSNAME or INSTANCENAME element");
4652
|
4653 humberto 1.87 MessageLoaderParms mlParms("Common.XmlReader.EXPECTED_CLASSNAME_OR_INSTANCENAME_ELEMENT",
4654 "Expected CLASSNAME or INSTANCENAME element");
|
4655 humberto 1.85
4656 throw XmlValidationError(parser.getLine(), mlParms);
4657
|
4658 mike 1.23 }
4659
|
4660 carson.hovey 1.108 PEGASUS_UNREACHABLE( return false; )
|
4661 mike 1.23 }
4662
4663 //------------------------------------------------------------------------------
4664 //
4665 // <!ELEMENT OBJECTPATH (INSTANCEPATH|CLASSPATH)>
4666 //
4667 //------------------------------------------------------------------------------
4668
4669 Boolean XmlReader::getObjectPathElement(
4670 XmlParser& parser,
|
4671 kumpf 1.54 CIMObjectPath& objectPath)
|
4672 mike 1.23 {
4673 XmlEntry entry;
4674
4675 if (!testStartTag(parser, entry, "OBJECTPATH"))
4676 return false;
4677
4678 if (getClassPathElement(parser, objectPath))
4679 {
4680 expectEndTag(parser, "OBJECTPATH");
4681 return true;
4682 }
4683 else if (getInstancePathElement(parser, objectPath))
4684 {
4685 expectEndTag(parser, "OBJECTPATH");
4686 return true;
4687 }
4688 else
4689 {
|
4690 humberto 1.85
4691 // l10n
4692
4693 // throw XmlValidationError(parser.getLine(),
4694 // "expected INSTANCEPATH or CLASSPATH element");
4695
|
4696 humberto 1.87 MessageLoaderParms mlParms("Common.XmlReader.EXPECTED_INSTANCEPATH_OR_CLASSPATH_ELEMENT",
4697 "expected INSTANCEPATH or CLASSPATH element");
|
4698 humberto 1.85
4699 throw XmlValidationError(parser.getLine(), mlParms);
|
4700 mike 1.23 }
4701
|
4702 mike 1.24 PEGASUS_UNREACHABLE ( return false; )
|
4703 mike 1.25 }
4704
4705 //------------------------------------------------------------------------------
4706 //
4707 // getEMethodCallStartTag()
4708 //
4709 //------------------------------------------------------------------------------
4710
4711 Boolean XmlReader::getEMethodCallStartTag(
4712 XmlParser& parser,
4713 const char*& name)
4714 {
4715 XmlEntry entry;
4716
4717 if (!testStartTag(parser, entry, "EXPMETHODCALL"))
4718 return false;
4719
4720 // Get EXPMETHODCALL.NAME attribute:
4721
|
4722 humberto 1.85
4723 if (!entry.getAttributeValue("NAME", name)) {
4724
4725 // l10n
4726
4727 // throw XmlValidationError(parser.getLine(),
4728 // "Missing EXPMETHODCALL.NAME attribute");
4729
|
4730 humberto 1.87 MessageLoaderParms mlParms("Common.XmlReader.MISSING_EXPMETHODCALL_ATTRIBUTE",
4731 "Missing EXPMETHODCALL.NAME attribute");
|
4732 humberto 1.85
4733 throw XmlValidationError(parser.getLine(), mlParms);
4734 }
|
4735 mike 1.25
4736 return true;
4737 }
4738
4739 //------------------------------------------------------------------------------
4740 //
4741 // getEMethodResponseStartTag()
4742 //
4743 //------------------------------------------------------------------------------
4744
4745 Boolean XmlReader::getEMethodResponseStartTag(
4746 XmlParser& parser,
|
4747 kumpf 1.101 const char*& name,
4748 Boolean& isEmptyTag)
|
4749 mike 1.25 {
4750 XmlEntry entry;
4751
|
4752 kumpf 1.101 if (!testStartTagOrEmptyTag(parser, entry, "EXPMETHODRESPONSE"))
|
4753 mike 1.25 return false;
4754
|
4755 kumpf 1.101 isEmptyTag = (entry.type == XmlEntry::EMPTY_TAG);
4756
|
4757 mike 1.25 // Get EXPMETHODRESPONSE.NAME attribute:
4758
|
4759 humberto 1.85
4760 if (!entry.getAttributeValue("NAME", name)) {
4761 // l10n
4762
4763 // throw XmlValidationError(
4764 // parser.getLine(), "Missing EXPMETHODRESPONSE.NAME attribute");
4765
|
4766 humberto 1.87 MessageLoaderParms mlParms("Common.XmlReader.MISSING_EXPMETHODRESPONSE_ATTRIBUTE",
4767 "Missing EXPMETHODRESPONSE.NAME attribute");
|
4768 humberto 1.85
4769 throw XmlValidationError(parser.getLine(), mlParms);
4770 }
|
4771 mike 1.25
4772 return true;
4773 }
4774
4775 //------------------------------------------------------------------------------
4776 //
|
4777 kumpf 1.83 // getEParamValueTag()
4778 //
4779 //------------------------------------------------------------------------------
4780
4781 Boolean XmlReader::getEParamValueTag(
4782 XmlParser& parser,
4783 const char*& name)
4784 {
4785 XmlEntry entry;
4786
4787 if (!testStartTag(parser, entry, "EXPPARAMVALUE"))
4788 return false;
4789
4790 // Get EXPPARAMVALUE.NAME attribute:
4791
|
4792 humberto 1.85
4793 if (!entry.getAttributeValue("NAME", name)) {
4794
4795 // l10n
4796
4797 // throw XmlValidationError(parser.getLine(),
4798 // "Missing EXPPARAMVALUE.NAME attribute");
4799
|
4800 humberto 1.87 MessageLoaderParms mlParms("Common.XmlReader.MISSING_EXPPARAMVALUE_ATTRIBUTE",
4801 "Missing EXPPARAMVALUE.NAME attribute");
|
4802 humberto 1.85
4803 throw XmlValidationError(parser.getLine(), mlParms);
4804 }
4805
4806
|
4807 kumpf 1.83
4808 return true;
4809 }
4810
4811 //------------------------------------------------------------------------------
4812 //
|
4813 mike 1.25 // getMethodCallStartTag()
4814 //
4815 //------------------------------------------------------------------------------
4816
4817 Boolean XmlReader::getMethodCallStartTag(
4818 XmlParser& parser,
4819 const char*& name)
4820 {
4821 XmlEntry entry;
4822
4823 if (!testStartTag(parser, entry, "METHODCALL"))
4824 return false;
4825
4826 // Get METHODCALL.NAME attribute:
4827
|
4828 humberto 1.85
4829 if (!entry.getAttributeValue("NAME", name)) {
4830
4831 // l10n
4832
4833 // throw XmlValidationError(parser.getLine(),
4834 // "Missing METHODCALL.NAME attribute");
4835
|
4836 humberto 1.87 MessageLoaderParms mlParms("Common.XmlReader.MISSING_METHODCALL_ATTRIBUTE",
4837 "Missing METHODCALL.NAME attribute");
|
4838 humberto 1.85
4839 throw XmlValidationError(parser.getLine(), mlParms);
4840 }
4841
|
4842 mike 1.25
4843 return true;
4844 }
4845
4846 //------------------------------------------------------------------------------
4847 //
4848 // getMethodResponseStartTag()
4849 //
4850 //------------------------------------------------------------------------------
4851
4852 Boolean XmlReader::getMethodResponseStartTag(
4853 XmlParser& parser,
|
4854 kumpf 1.101 const char*& name,
4855 Boolean& isEmptyTag)
|
4856 mike 1.25 {
4857 XmlEntry entry;
4858
|
4859 kumpf 1.101 if (!testStartTagOrEmptyTag(parser, entry, "METHODRESPONSE"))
|
4860 mike 1.25 return false;
4861
|
4862 kumpf 1.101 isEmptyTag = (entry.type == XmlEntry::EMPTY_TAG);
4863
|
4864 mike 1.25 // Get METHODRESPONSE.NAME attribute:
4865
|
4866 humberto 1.85
4867 if (!entry.getAttributeValue("NAME", name)) {
4868
4869 // l10n
4870
4871 // throw XmlValidationError(parser.getLine(),
4872 // "Missing METHODRESPONSE.NAME attribute");
4873
|
4874 humberto 1.87 MessageLoaderParms mlParms("Common.XmlReader.MISSING_METHODRESPONSE_ATTRIBUTE",
4875 "Missing METHODRESPONSE.NAME attribute");
|
4876 humberto 1.85
4877 throw XmlValidationError(parser.getLine(), mlParms);
4878 }
|
4879 mike 1.25
4880 return true;
4881 }
4882
4883 //------------------------------------------------------------------------------
4884 //
|
4885 kumpf 1.26 // getParamValueElement()
4886 //
4887 // <!ELEMENT PARAMVALUE (VALUE|VALUE.REFERENCE|VALUE.ARRAY|VALUE.REFARRAY)?>
4888 // <!ATTLIST PARAMVALUE
4889 // %CIMName;
|
4890 dave.sudlik 1.109 // %EmbeddedObject; #IMPLIED
|
4891 kumpf 1.26 // %ParamType;>
|
4892 mike 1.25 //
4893 //------------------------------------------------------------------------------
4894
|
4895 kumpf 1.26 Boolean XmlReader::getParamValueElement(
|
4896 mike 1.25 XmlParser& parser,
|
4897 kumpf 1.26 CIMParamValue& paramValue)
|
4898 mike 1.25 {
4899 XmlEntry entry;
|
4900 kumpf 1.26 const char* name;
|
4901 marek 1.100 CIMType type=CIMTYPE_BOOLEAN;
|
4902 kumpf 1.26 CIMValue value;
|
4903 mike 1.25
|
4904 kumpf 1.26 if (!testStartTagOrEmptyTag(parser, entry, "PARAMVALUE"))
|
4905 mike 1.25 return false;
4906
|
4907 kumpf 1.26 Boolean empty = entry.type == XmlEntry::EMPTY_TAG;
4908
4909 // Get PARAMVALUE.NAME attribute:
|
4910 mike 1.25
|
4911 humberto 1.85 if (!entry.getAttributeValue("NAME", name)) {
4912
4913 // l10n
4914
4915 // throw XmlValidationError(parser.getLine(),
4916 // "Missing PARAMVALUE.NAME attribute");
4917
|
4918 humberto 1.87 MessageLoaderParms mlParms("Common.XmlReader.MISSING_PARAMVALUE_ATTRIBUTE",
4919 "Missing PARAMVALUE.NAME attribute");
|
4920 humberto 1.85
4921 throw XmlValidationError(parser.getLine(), mlParms);
4922 }
|
4923 dave.sudlik 1.109
4924 // Get PROPERTY.EMBEDDEDOBJECT
|
4925 humberto 1.85
|
4926 dave.sudlik 1.109 String embeddedObject = getEmbeddedObjectAttribute(
4927 parser.getLine(), entry, "PARAMVALUE");
|
4928 kumpf 1.26
4929 // Get PARAMVALUE.PARAMTYPE attribute:
4930
|
4931 kumpf 1.67 Boolean gotType = getCimTypeAttribute(parser.getLine(), entry, type,
4932 "PARAMVALUE", "PARAMTYPE", false);
|
4933 kumpf 1.26
|
4934 kumpf 1.113 if (empty)
4935 {
4936 gotType = false; // Can't distinguish array and non-array types
4937 }
4938 else
|
4939 kumpf 1.26 {
4940 // Parse VALUE.REFERENCE and VALUE.REFARRAY type
|
4941 kumpf 1.67 if ( (type == CIMTYPE_REFERENCE) || !gotType )
|
4942 kumpf 1.26 {
|
4943 dave.sudlik 1.109 CIMObjectPath reference;
4944 if (XmlReader::getValueReferenceElement(parser, reference))
4945 {
4946 value.set(reference);
4947 type = CIMTYPE_REFERENCE;
|
4948 kumpf 1.67 gotType = true;
|
4949 dave.sudlik 1.109 }
|
4950 kumpf 1.28 else if (XmlReader::getValueReferenceArrayElement(parser, value))
|
4951 dave.sudlik 1.109 {
4952 type = CIMTYPE_REFERENCE;
|
4953 kumpf 1.67 gotType = true;
|
4954 dave.sudlik 1.109 }
|
4955 kumpf 1.27 // If type==reference but no VALUE.REFERENCE found, use null value
|
4956 kumpf 1.26 }
4957
4958 // Parse non-reference value
|
4959 kumpf 1.61 if ( type != CIMTYPE_REFERENCE )
|
4960 kumpf 1.26 {
|
4961 kumpf 1.67 CIMType effectiveType;
4962 if (!gotType)
|
4963 dave.sudlik 1.109 {
|
4964 kumpf 1.67 // If we don't know what type the value is, read it as a String
|
4965 dave.sudlik 1.109 effectiveType = CIMTYPE_STRING;
4966 }
|
4967 kumpf 1.67 else
|
4968 dave.sudlik 1.109 {
4969 effectiveType = type;
4970 }
4971
4972 // If the EMBEDDEDOBJECT attribute is present with value "object"
4973 // then
4974 // Convert the EmbeddedObject-encoded string into a CIMObject
4975 if (String::equal(embeddedObject, "object"))
4976 {
4977 // The EMBEDDEDOBJECT attribute is only valid on Parameters of type string
4978 // The type must have been specified.
4979 if (gotType && (type == CIMTYPE_STRING))
4980 {
|
4981 a.dunfey 1.114 // Used below by getValueElement() or getValueArrayElement()
4982 effectiveType = CIMTYPE_OBJECT;
|
4983 dave.sudlik 1.109 }
4984 else
4985 {
4986 // Error -- throw exception
4987 // (the EmbeddedObject attribute may be applied only to entities that have the type String)
4988
4989 // l10n
4990
4991 // throw XmlValidationError(parser.getLine(),
4992 // "expected string type");
4993
4994 MessageLoaderParms mlParms("Common.XmlReader.INVALID_EMBEDDEDOBJECT_TYPE",
4995 "The EMBEDDEDOBJECT attribute is only valid on string types.");
|
4996 kumpf 1.26
|
4997 dave.sudlik 1.109 throw XmlValidationError(parser.getLine(), mlParms);
4998 }
4999 }
5000
|
5001 kumpf 1.26 if ( !XmlReader::getValueArrayElement(parser, effectiveType, value) &&
|
5002 dave.sudlik 1.109 !XmlReader::getValueElement(parser, effectiveType, value) )
5003 {
|
5004 kumpf 1.113 gotType = false; // Can't distinguish array and non-array types
5005 value.clear(); // Isn't necessary; should already be cleared
|
5006 dave.sudlik 1.109 }
5007
|
5008 kumpf 1.26 }
5009
5010 expectEndTag(parser, "PARAMVALUE");
5011 }
5012
|
5013 dave.sudlik 1.109
|
5014 kumpf 1.67 paramValue = CIMParamValue(name, value, gotType);
|
5015 kumpf 1.27
5016 return true;
5017 }
5018
5019 //------------------------------------------------------------------------------
5020 //
5021 // getReturnValueElement()
5022 //
5023 // <!ELEMENT RETURNVALUE (VALUE|VALUE.REFERENCE)>
5024 // <!ATTLIST RETURNVALUE
|
5025 dave.sudlik 1.109 // %EmbeddedObject; #IMPLIED
|
5026 kumpf 1.27 // %ParamType;>
5027 //
5028 //------------------------------------------------------------------------------
5029
5030 Boolean XmlReader::getReturnValueElement(
5031 XmlParser& parser,
5032 CIMValue& returnValue)
5033 {
5034 XmlEntry entry;
5035 CIMType type;
5036 CIMValue value;
5037
5038 if (!testStartTag(parser, entry, "RETURNVALUE"))
5039 return false;
5040
|
5041 dave.sudlik 1.109 // Get PROPERTY.EMBEDDEDOBJECT
5042
5043 String embeddedObject = getEmbeddedObjectAttribute(
5044 parser.getLine(), entry, "RETURNVALUE");
5045
|
5046 kumpf 1.27 // Get RETURNVALUE.PARAMTYPE attribute:
5047 // NOTE: Array type return values are not allowed (2/20/02)
5048
|
5049 kumpf 1.67 Boolean gotType = getCimTypeAttribute(parser.getLine(), entry, type,
5050 "RETURNVALUE", "PARAMTYPE", false);
|
5051 kumpf 1.27
5052 // Parse VALUE.REFERENCE type
|
5053 kumpf 1.67 if ( (type == CIMTYPE_REFERENCE) || !gotType )
|
5054 kumpf 1.27 {
|
5055 kumpf 1.54 CIMObjectPath reference;
|
5056 kumpf 1.27 if (XmlReader::getValueReferenceElement(parser, reference))
5057 {
5058 returnValue.set(reference);
|
5059 kumpf 1.61 type = CIMTYPE_REFERENCE;
|
5060 kumpf 1.67 gotType = true;
|
5061 kumpf 1.27 }
|
5062 kumpf 1.61 else if (type == CIMTYPE_REFERENCE)
|
5063 kumpf 1.27 {
|
5064 humberto 1.85
5065 // l10n
5066
5067 // throw XmlValidationError(parser.getLine(),
5068 // "expected VALUE.REFERENCE element");
5069
|
5070 humberto 1.87 MessageLoaderParms mlParms("Common.XmlReader.EXPECTED_VALUE_REFERENCE_ELEMENT",
5071 "expected VALUE.REFERENCE element");
|
5072 humberto 1.85
5073 throw XmlValidationError(parser.getLine(), mlParms);
|
5074 kumpf 1.27 }
5075 }
5076
5077 // Parse non-reference return value
|
5078 kumpf 1.61 if ( type != CIMTYPE_REFERENCE )
|
5079 kumpf 1.27 {
|
5080 kumpf 1.67 if (!gotType)
|
5081 kumpf 1.27 {
|
5082 kumpf 1.67 // If we don't know what type the value is, read it as a String
|
5083 kumpf 1.61 type = CIMTYPE_STRING;
|
5084 kumpf 1.27 }
5085
|
5086 dave.sudlik 1.109 if (String::equal(embeddedObject, "object"))
5087 {
5088 if (gotType && (type == CIMTYPE_STRING))
5089 {
5090 type = CIMTYPE_OBJECT; // Used below by getValueElement()
5091 }
5092 else
5093 {
5094 // Error -- throw exception
5095 // (the EmbeddedObject attribute may be applied only to entities that have the type String)
5096
5097 // l10n
5098
5099 // throw XmlValidationError(parser.getLine(),
5100 // "expected string type");
5101
5102 MessageLoaderParms mlParms("Common.XmlReader.INVALID_EMBEDDEDOBJECT_TYPE",
5103 "The EMBEDDEDOBJECT attribute is only valid on string types.");
5104
5105 throw XmlValidationError(parser.getLine(), mlParms);
5106 }
5107 dave.sudlik 1.109 }
5108
|
5109 kumpf 1.27 if ( !XmlReader::getValueElement(parser, type, returnValue) )
5110 {
|
5111 humberto 1.85
|
5112 dave.sudlik 1.109 // l10n
|
5113 humberto 1.85
|
5114 dave.sudlik 1.109 // throw XmlValidationError(parser.getLine(),
5115 // "expected VALUE element");
|
5116 humberto 1.85
|
5117 dave.sudlik 1.109 MessageLoaderParms mlParms("Common.XmlReader.EXPECTED_VALUE_ELEMENT",
|
5118 humberto 1.87 "expected VALUE element");
|
5119 humberto 1.85
|
5120 dave.sudlik 1.109 throw XmlValidationError(parser.getLine(), mlParms);
|
5121 kumpf 1.27 }
5122 }
5123
5124 expectEndTag(parser, "RETURNVALUE");
|
5125 mike 1.25
5126 return true;
|
5127 mike 1.23 }
5128
5129 PEGASUS_NAMESPACE_END
|
5130 s.hills 1.93
|