📄 xmlreader.cpp
字号:
//%2006//////////////////////////////////////////////////////////////////////////// Copyright (c) 2000, 2001, 2002 BMC Software; Hewlett-Packard Development// Company, L.P.; IBM Corp.; The Open Group; Tivoli Systems.// Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L.P.;// IBM Corp.; EMC Corporation, The Open Group.// Copyright (c) 2004 BMC Software; Hewlett-Packard Development Company, L.P.;// IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group.// Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.;// EMC Corporation; VERITAS Software Corporation; The Open Group.// Copyright (c) 2006 Hewlett-Packard Development Company, L.P.; IBM Corp.;// EMC Corporation; Symantec Corporation; The Open Group.//// Permission is hereby granted, free of charge, to any person obtaining a copy// of this software and associated documentation files (the "Software"), to// deal in the Software without restriction, including without limitation the// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or// sell copies of the Software, and to permit persons to whom the Software is// furnished to do so, subject to the following conditions:// // THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN// ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED// "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT// LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN// ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.////==============================================================================////%/////////////////////////////////////////////////////////////////////////////#include <Pegasus/Common/Config.h>#include <errno.h>#include <cctype>#include <cstdio>#include <cstdlib>#if defined(PEGASUS_OS_TYPE_UNIX) || defined(PEGASUS_OS_VMS)# include <errno.h>#endif#include "CIMName.h"#include "XmlReader.h"#include "XmlWriter.h"#include "CIMQualifier.h"#include "CIMQualifierDecl.h"#include "CIMClass.h"#include "CIMInstance.h"#include "CIMObject.h"#include "CIMParamValue.h"#include "System.h"#include "XmlConstants.h"#ifdef PEGASUS_PLATFORM_OS400_ISERIES_IBM# include "EBCDIC_OS400.h"#endif#include <Pegasus/Common/MessageLoader.h>#include <Pegasus/Common/AutoPtr.h>#include "CIMNameUnchecked.h"#define PEGASUS_SINT64_MIN (PEGASUS_SINT64_LITERAL(0x8000000000000000))#define PEGASUS_UINT64_MAX PEGASUS_UINT64_LITERAL(0xFFFFFFFFFFFFFFFF)PEGASUS_USING_STD;PEGASUS_NAMESPACE_BEGINstatic const Uint32 MESSAGE_SIZE = 128;//------------------------------------------------------------------------------//// getXmlDeclaration()//// <?xml version="1.0" encoding="utf-8"?>////------------------------------------------------------------------------------void XmlReader::getXmlDeclaration( XmlParser& parser, const char*& xmlVersion, const char*& xmlEncoding){ XmlEntry entry; if (!parser.next(entry) || entry.type != XmlEntry::XML_DECLARATION || strcmp(entry.text, "xml") != 0) { MessageLoaderParms mlParms( "Common.XmlReader.EXPECTED_XML_STYLE", "Expected <?xml ... ?> style declaration"); throw XmlValidationError(parser.getLine(), mlParms); } if (!entry.getAttributeValue("version", xmlVersion)) { MessageLoaderParms mlParms( "Common.XmlReader.MISSING_XML_ATTRIBUTE", "missing xml.version attribute"); throw XmlValidationError(parser.getLine(), mlParms); } if (!entry.getAttributeValue("encoding", xmlEncoding)) { // ATTN-RK-P3-20020403: Is there a default encoding? }}//------------------------------------------------------------------------------//// testXmlDeclaration ()////------------------------------------------------------------------------------Boolean XmlReader::testXmlDeclaration ( XmlParser& parser, XmlEntry& entry){ if (!parser.next (entry) || entry.type != XmlEntry::XML_DECLARATION || strcmp (entry.text, "xml") != 0) { parser.putBack (entry); return false; } return true;}//------------------------------------------------------------------------------//// expectStartTag()////------------------------------------------------------------------------------void XmlReader::expectStartTag( XmlParser& parser, XmlEntry& entry, const char* tagName){ if (!parser.next(entry) || entry.type != XmlEntry::START_TAG || strcmp(entry.text, tagName) != 0) { MessageLoaderParms mlParms( "Common.XmlReader.EXPECTED_OPEN", "Expected open of $0 element", tagName); throw XmlValidationError(parser.getLine(), mlParms); }}//------------------------------------------------------------------------------//// expectEndTag()////------------------------------------------------------------------------------void XmlReader::expectEndTag(XmlParser& parser, const char* tagName){ XmlEntry entry; if (!parser.next(entry) || entry.type != XmlEntry::END_TAG || strcmp(entry.text, tagName) != 0) { MessageLoaderParms mlParms( "Common.XmlReader.EXPECTED_CLOSE", "Expected close of $0 element, got $1 instead", tagName,entry.text); throw XmlValidationError(parser.getLine(), mlParms); }}//------------------------------------------------------------------------------//// expectStartTagOrEmptyTag()////------------------------------------------------------------------------------void XmlReader::expectStartTagOrEmptyTag( XmlParser& parser, XmlEntry& entry, const char* tagName){ if (!parser.next(entry) || (entry.type != XmlEntry::START_TAG && entry.type != XmlEntry::EMPTY_TAG) || strcmp(entry.text, tagName) != 0) { MessageLoaderParms mlParms( "Common.XmlReader.EXPECTED_OPENCLOSE", "Expected either open or open/close $0 element", tagName); throw XmlValidationError(parser.getLine(), mlParms); }}//------------------------------------------------------------------------------//// expectContentOrCData()////------------------------------------------------------------------------------Boolean XmlReader::expectContentOrCData( XmlParser& parser, XmlEntry& entry){ if (!parser.next(entry) || (entry.type != XmlEntry::CONTENT && entry.type != XmlEntry::CDATA)) { MessageLoaderParms mlParms( "Common.XmlReader.EXPECTED_CDATA", "Expected content of CDATA"); throw XmlValidationError(parser.getLine(), mlParms); } return true;}//------------------------------------------------------------------------------//// testStartTag()////------------------------------------------------------------------------------Boolean XmlReader::testStartTag( XmlParser& parser, XmlEntry& entry, const char* tagName){ if (!parser.next(entry) || entry.type != XmlEntry::START_TAG || strcmp(entry.text, tagName) != 0) { parser.putBack(entry); return false; } return true;}//------------------------------------------------------------------------------//// testEndTag()////------------------------------------------------------------------------------Boolean XmlReader::testEndTag(XmlParser& parser, const char* tagName){ XmlEntry entry; if (!parser.next(entry) || entry.type != XmlEntry::END_TAG || strcmp(entry.text, tagName) != 0) { parser.putBack(entry); return false; } return true;}//------------------------------------------------------------------------------//// testStartTagOrEmptyTag()////------------------------------------------------------------------------------Boolean XmlReader::testStartTagOrEmptyTag( XmlParser& parser, XmlEntry& entry, const char* tagName){ if (!parser.next(entry) || (entry.type != XmlEntry::START_TAG && entry.type != XmlEntry::EMPTY_TAG) || strcmp(entry.text, tagName) != 0) { parser.putBack(entry); return false; } return true;}//------------------------------------------------------------------------------//// testStartTagOrEmptyTag()////------------------------------------------------------------------------------Boolean XmlReader::testStartTagOrEmptyTag( XmlParser& parser, XmlEntry& entry){ if (!parser.next(entry) || (entry.type != XmlEntry::START_TAG && entry.type != XmlEntry::EMPTY_TAG)) { parser.putBack(entry); return false; } return true;}//------------------------------------------------------------------------------//// testContentOrCData()////------------------------------------------------------------------------------Boolean XmlReader::testContentOrCData( XmlParser& parser, XmlEntry& entry){ if (!parser.next(entry) || (entry.type != XmlEntry::CONTENT && entry.type != XmlEntry::CDATA)) { parser.putBack(entry); return false; } return true;}//------------------------------------------------------------------------------//// getCimStartTag()//// <!ELEMENT CIM (MESSAGE|DECLARATION)>// <!ATTRLIST CIM// CIMVERSION CDATA #REQUIRED// DTDVERSION CDATA #REQUIRED>////------------------------------------------------------------------------------void XmlReader::getCimStartTag( XmlParser& parser, const char*& cimVersion, const char*& dtdVersion){ XmlEntry entry; XmlReader::expectStartTag(parser, entry, "CIM"); if (!entry.getAttributeValue("CIMVERSION", cimVersion)) { MessageLoaderParms mlParms( "Common.XmlReader.MISSING_CIMVERSION_ATTRIBUTE", "missing CIM.CIMVERSION attribute"); throw XmlValidationError(parser.getLine(), mlParms); } if (!entry.getAttributeValue("DTDVERSION", dtdVersion)) { MessageLoaderParms mlParms( "Common.XmlReader.MISSING_DTDVERSION_ATTRIBUTE", "missing CIM.DTDVERSION attribute"); throw XmlValidationError(parser.getLine(), mlParms); }}//------------------------------------------------------------------------------//// getCimNameAttribute()//// <!ENTITY % CIMName "NAME CDATA #REQUIRED">////------------------------------------------------------------------------------CIMName XmlReader::getCimNameAttribute( Uint32 lineNumber, const XmlEntry& entry, const char* elementName, Boolean acceptNull){ String name; if (!entry.getAttributeValue("NAME", name)) { char buffer[MESSAGE_SIZE]; sprintf(buffer, "%s.NAME", elementName); MessageLoaderParms mlParms( "Common.XmlReader.MISSING_ATTRIBUTE", "missing $0 attribute", buffer); throw XmlValidationError(lineNumber, mlParms); } if (acceptNull && name.size() == 0) return CIMName (); if (!CIMName::legal(name)) {#ifdef PEGASUS_SNIA_INTEROP_TEST // In testing, replace illegal CIMName with this value to avoid the // exception and let xml parsing continue. THIS IS TEMP. name = "BADNAMESUBSTITUTEDBYPEGASUSCLIENT";#else char buffer[MESSAGE_SIZE]; sprintf(buffer, "%s.NAME", elementName); MessageLoaderParms mlParms( "Common.XmlReader.ILLEGAL_VALUE_FOR_ATTRIBUTE", "Illegal value for $0 attribute", buffer); throw XmlSemanticError(lineNumber, mlParms);#endif } return CIMNameUnchecked(name);}//------------------------------------------------------------------------------//// getClassNameAttribute()//// <!ENTITY % CIMName "CLASSNAME CDATA #REQUIRED">////------------------------------------------------------------------------------String XmlReader::getClassNameAttribute( Uint32 lineNumber, const XmlEntry& entry, const char* elementName){ String name; if (!entry.getAttributeValue("CLASSNAME", name)) { char buffer[MESSAGE_SIZE]; sprintf(buffer, "%s.CLASSNAME", elementName); MessageLoaderParms mlParms( "Common.XmlReader.MISSING_ATTRIBUTE", "missing $0 attribute", buffer); throw XmlValidationError(lineNumber, mlParms); } if (!CIMName::legal(name)) { char buffer[MESSAGE_SIZE]; sprintf(buffer, "%s.CLASSNAME", elementName); MessageLoaderParms mlParms( "Common.XmlReader.ILLEGAL_VALUE_FOR_ATTRIBUTE", "Illegal value for $0 attribute", buffer);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -