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