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