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