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