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