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