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