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