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