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