Files
MinecraftConsoles/Minecraft.Client/Xbox/XML/ATGXmlParser.h
2026-03-01 12:16:08 +08:00

157 lines
5.6 KiB
C++

// 4J-PB -
// The ATG Framework is a common set of C++ class libraries that is used by the samples in the XDK, and was developed by the Advanced Technology Group (ATG).
// The ATG Framework offers a clean and consistent format for the samples. These classes define functions used by all the samples.
// The ATG Framework together with the samples demonstrates best practices and innovative techniques for Xbox 360. There are many useful sections of code in the samples.
// You are encouraged to incorporate this code into your titles.
//-------------------------------------------------------------------------------------
// AtgXmlParser.h
//
// XMLParser and SAX interface declaration
//
// Xbox Advanced Technology Group
// Copyright (C) Microsoft Corporation. All rights reserved.
//-------------------------------------------------------------------------------------
#pragma once
#ifndef ATGXMLPARSER_H
#define ATGXMLPARSER_H
namespace ATG
{
//-----------------------------------------------------------------------------
// error returns from XMLParse
//-----------------------------------------------------------------------------
#define _ATGFAC 0x61B
#define E_COULD_NOT_OPEN_FILE MAKE_HRESULT(1, _ATGFAC, 0x0001 )
#define E_INVALID_XML_SYNTAX MAKE_HRESULT(1, _ATGFAC, 0x0002 )
CONST UINT XML_MAX_ATTRIBUTES_PER_ELEMENT = 32;
CONST UINT XML_MAX_NAME_LENGTH = 128;
CONST UINT XML_READ_BUFFER_SIZE = 2048;
CONST UINT XML_WRITE_BUFFER_SIZE = 2048;
// No tag can be longer than XML_WRITE_BUFFER_SIZE - an error will be returned if
// it is
//-------------------------------------------------------------------------------------
struct XMLAttribute
{
WCHAR* strName;
UINT NameLen;
WCHAR* strValue;
UINT ValueLen;
};
//-------------------------------------------------------------------------------------
class ISAXCallback
{
friend class XMLParser;
public:
ISAXCallback() {};
virtual ~ISAXCallback() {};
virtual HRESULT StartDocument() = 0;
virtual HRESULT EndDocument() = 0;
virtual HRESULT ElementBegin( CONST WCHAR* strName, UINT NameLen,
CONST XMLAttribute *pAttributes, UINT NumAttributes ) = 0;
virtual HRESULT ElementContent( CONST WCHAR *strData, UINT DataLen, BOOL More ) = 0;
virtual HRESULT ElementEnd( CONST WCHAR *strName, UINT NameLen ) = 0;
virtual HRESULT CDATABegin( ) = 0;
virtual HRESULT CDATAData( CONST WCHAR *strCDATA, UINT CDATALen, BOOL bMore ) = 0;
virtual HRESULT CDATAEnd( ) = 0;
virtual VOID Error( HRESULT hError, CONST CHAR *strMessage ) = 0;
virtual VOID SetParseProgress( DWORD dwProgress ) { }
const CHAR* GetFilename() { return m_strFilename; }
UINT GetLineNumber() { return m_LineNum; }
UINT GetLinePosition() { return m_LinePos; }
private:
CONST CHAR *m_strFilename;
UINT m_LineNum;
UINT m_LinePos;
};
//-------------------------------------------------------------------------------------
class XMLParser
{
public:
XMLParser();
~XMLParser();
// Register an interface inheiriting from ISAXCallback
VOID RegisterSAXCallbackInterface( ISAXCallback *pISAXCallback );
// Get the registered interface
ISAXCallback* GetSAXCallbackInterface();
// ParseXMLFile returns one of the following:
// E_COULD_NOT_OPEN_FILE - couldn't open the file
// E_INVALID_XML_SYNTAX - bad XML syntax according to this parser
// E_NOINTERFACE - RegisterSAXCallbackInterface not called
// E_ABORT - callback returned a fail code
// S_OK - file parsed and completed
HRESULT ParseXMLFile( CONST CHAR *strFilename );
// Parses from a buffer- if you pass a WCHAR buffer (and cast it), it will
// correctly detect it and use unicode instead. Return codes are the
// same as for ParseXMLFile
HRESULT ParseXMLBuffer( CONST CHAR* strBuffer, UINT uBufferSize );
private:
HRESULT MainParseLoop();
HRESULT AdvanceCharacter( BOOL bOkToFail = FALSE );
VOID SkipNextAdvance();
HRESULT ConsumeSpace();
HRESULT ConvertEscape();
HRESULT AdvanceElement();
HRESULT AdvanceName();
HRESULT AdvanceAttrVal();
HRESULT AdvanceCDATA();
HRESULT AdvanceComment();
VOID FillBuffer();
#ifdef _Printf_format_string_ // VC++ 2008 and later support this annotation
VOID Error( HRESULT hRet, _In_z_ _Printf_format_string_ CONST CHAR* strFormat, ... );
#else
VOID Error( HRESULT hRet, CONST CHAR* strFormat, ... );
#endif
ISAXCallback* m_pISAXCallback;
HANDLE m_hFile;
CONST CHAR* m_pInXMLBuffer;
UINT m_uInXMLBufferCharsLeft;
DWORD m_dwCharsTotal;
DWORD m_dwCharsConsumed;
BYTE m_pReadBuf[ XML_READ_BUFFER_SIZE + 2 ]; // room for a trailing NULL
WCHAR m_pWriteBuf[ XML_WRITE_BUFFER_SIZE ];
BYTE* m_pReadPtr;
WCHAR* m_pWritePtr; // write pointer within m_pBuf
BOOL m_bUnicode; // TRUE = 16-bits, FALSE = 8-bits
BOOL m_bReverseBytes; // TRUE = reverse bytes, FALSE = don't reverse
BOOL m_bSkipNextAdvance;
WCHAR m_Ch; // Current character being parsed
};
} // namespace ATG
#endif