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