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