| Index: core/src/fxcrt/fx_xml_parser.cpp
|
| diff --git a/core/src/fxcrt/fx_xml_parser.cpp b/core/src/fxcrt/fx_xml_parser.cpp
|
| index dcf91d1a97218fc469239a08104baf27f629b494..dc59ded2b74ae87bd0a6e9b3ba1dce0133e32ee8 100644
|
| --- a/core/src/fxcrt/fx_xml_parser.cpp
|
| +++ b/core/src/fxcrt/fx_xml_parser.cpp
|
| @@ -6,840 +6,825 @@
|
|
|
| #include "../../include/fxcrt/fx_xml.h"
|
| #include "xml_int.h"
|
| -CXML_Parser::~CXML_Parser()
|
| -{
|
| - if (m_bOwnedStream) {
|
| - m_pDataAcc->Release();
|
| - }
|
| +CXML_Parser::~CXML_Parser() {
|
| + if (m_bOwnedStream) {
|
| + m_pDataAcc->Release();
|
| + }
|
| }
|
| -FX_BOOL CXML_Parser::Init(uint8_t* pBuffer, size_t size)
|
| -{
|
| - m_pDataAcc = new CXML_DataBufAcc(pBuffer, size);
|
| - return Init(TRUE);
|
| +FX_BOOL CXML_Parser::Init(uint8_t* pBuffer, size_t size) {
|
| + m_pDataAcc = new CXML_DataBufAcc(pBuffer, size);
|
| + return Init(TRUE);
|
| }
|
| -FX_BOOL CXML_Parser::Init(IFX_FileRead *pFileRead)
|
| -{
|
| - m_pDataAcc = new CXML_DataStmAcc(pFileRead);
|
| - return Init(TRUE);
|
| +FX_BOOL CXML_Parser::Init(IFX_FileRead* pFileRead) {
|
| + m_pDataAcc = new CXML_DataStmAcc(pFileRead);
|
| + return Init(TRUE);
|
| }
|
| -FX_BOOL CXML_Parser::Init(IFX_BufferRead *pBuffer)
|
| -{
|
| - if (!pBuffer) {
|
| - return FALSE;
|
| - }
|
| - m_pDataAcc = pBuffer;
|
| - return Init(FALSE);
|
| -}
|
| -FX_BOOL CXML_Parser::Init(FX_BOOL bOwndedStream)
|
| -{
|
| - m_bOwnedStream = bOwndedStream;
|
| - m_nOffset = 0;
|
| - return ReadNextBlock();
|
| -}
|
| -FX_BOOL CXML_Parser::ReadNextBlock()
|
| -{
|
| - if (!m_pDataAcc->ReadNextBlock()) {
|
| - return FALSE;
|
| - }
|
| - m_pBuffer = m_pDataAcc->GetBlockBuffer();
|
| - m_dwBufferSize = m_pDataAcc->GetBlockSize();
|
| - m_nBufferOffset = m_pDataAcc->GetBlockOffset();
|
| - m_dwIndex = 0;
|
| - return m_dwBufferSize > 0;
|
| -}
|
| -FX_BOOL CXML_Parser::IsEOF()
|
| -{
|
| - if (!m_pDataAcc->IsEOF()) {
|
| - return FALSE;
|
| - }
|
| - return m_dwIndex >= m_dwBufferSize;
|
| -}
|
| -#define FXCRTM_XML_CHARTYPE_Normal 0x00
|
| -#define FXCRTM_XML_CHARTYPE_SpaceChar 0x01
|
| -#define FXCRTM_XML_CHARTYPE_Letter 0x02
|
| -#define FXCRTM_XML_CHARTYPE_Digital 0x04
|
| -#define FXCRTM_XML_CHARTYPE_NameIntro 0x08
|
| -#define FXCRTM_XML_CHARTYPE_NameChar 0x10
|
| -#define FXCRTM_XML_CHARTYPE_HexDigital 0x20
|
| -#define FXCRTM_XML_CHARTYPE_HexLowerLetter 0x40
|
| -#define FXCRTM_XML_CHARTYPE_HexUpperLetter 0x60
|
| -#define FXCRTM_XML_CHARTYPE_HexChar 0x60
|
| +FX_BOOL CXML_Parser::Init(IFX_BufferRead* pBuffer) {
|
| + if (!pBuffer) {
|
| + return FALSE;
|
| + }
|
| + m_pDataAcc = pBuffer;
|
| + return Init(FALSE);
|
| +}
|
| +FX_BOOL CXML_Parser::Init(FX_BOOL bOwndedStream) {
|
| + m_bOwnedStream = bOwndedStream;
|
| + m_nOffset = 0;
|
| + return ReadNextBlock();
|
| +}
|
| +FX_BOOL CXML_Parser::ReadNextBlock() {
|
| + if (!m_pDataAcc->ReadNextBlock()) {
|
| + return FALSE;
|
| + }
|
| + m_pBuffer = m_pDataAcc->GetBlockBuffer();
|
| + m_dwBufferSize = m_pDataAcc->GetBlockSize();
|
| + m_nBufferOffset = m_pDataAcc->GetBlockOffset();
|
| + m_dwIndex = 0;
|
| + return m_dwBufferSize > 0;
|
| +}
|
| +FX_BOOL CXML_Parser::IsEOF() {
|
| + if (!m_pDataAcc->IsEOF()) {
|
| + return FALSE;
|
| + }
|
| + return m_dwIndex >= m_dwBufferSize;
|
| +}
|
| +#define FXCRTM_XML_CHARTYPE_Normal 0x00
|
| +#define FXCRTM_XML_CHARTYPE_SpaceChar 0x01
|
| +#define FXCRTM_XML_CHARTYPE_Letter 0x02
|
| +#define FXCRTM_XML_CHARTYPE_Digital 0x04
|
| +#define FXCRTM_XML_CHARTYPE_NameIntro 0x08
|
| +#define FXCRTM_XML_CHARTYPE_NameChar 0x10
|
| +#define FXCRTM_XML_CHARTYPE_HexDigital 0x20
|
| +#define FXCRTM_XML_CHARTYPE_HexLowerLetter 0x40
|
| +#define FXCRTM_XML_CHARTYPE_HexUpperLetter 0x60
|
| +#define FXCRTM_XML_CHARTYPE_HexChar 0x60
|
| uint8_t g_FXCRT_XML_ByteTypes[256] = {
|
| - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
|
| - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
|
| - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x00,
|
| - 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00,
|
| - 0x00, 0x7A, 0x7A, 0x7A, 0x7A, 0x7A, 0x7A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A,
|
| - 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x18,
|
| - 0x00, 0x5A, 0x5A, 0x5A, 0x5A, 0x5A, 0x5A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A,
|
| - 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00,
|
| - 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A,
|
| - 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A,
|
| - 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A,
|
| - 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A,
|
| - 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A,
|
| - 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A,
|
| - 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A,
|
| - 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x01, 0x01,
|
| + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
|
| + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
|
| + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00,
|
| + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x00,
|
| + 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x08, 0x00,
|
| + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7A, 0x7A, 0x7A, 0x7A, 0x7A, 0x7A, 0x1A,
|
| + 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A,
|
| + 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x18,
|
| + 0x00, 0x5A, 0x5A, 0x5A, 0x5A, 0x5A, 0x5A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A,
|
| + 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A,
|
| + 0x1A, 0x1A, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1A, 0x1A, 0x1A, 0x1A,
|
| + 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A,
|
| + 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A,
|
| + 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A,
|
| + 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A,
|
| + 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A,
|
| + 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A,
|
| + 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A,
|
| + 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A,
|
| + 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A,
|
| + 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A,
|
| + 0x1A, 0x1A, 0x01, 0x01,
|
| };
|
| -FX_BOOL g_FXCRT_XML_IsWhiteSpace(uint8_t ch)
|
| -{
|
| - return (g_FXCRT_XML_ByteTypes[ch] & FXCRTM_XML_CHARTYPE_SpaceChar) != 0;
|
| +FX_BOOL g_FXCRT_XML_IsWhiteSpace(uint8_t ch) {
|
| + return (g_FXCRT_XML_ByteTypes[ch] & FXCRTM_XML_CHARTYPE_SpaceChar) != 0;
|
| }
|
| -FX_BOOL g_FXCRT_XML_IsLetter(uint8_t ch)
|
| -{
|
| - return (g_FXCRT_XML_ByteTypes[ch] & FXCRTM_XML_CHARTYPE_Letter) != 0;
|
| +FX_BOOL g_FXCRT_XML_IsLetter(uint8_t ch) {
|
| + return (g_FXCRT_XML_ByteTypes[ch] & FXCRTM_XML_CHARTYPE_Letter) != 0;
|
| }
|
| -FX_BOOL g_FXCRT_XML_IsDigital(uint8_t ch)
|
| -{
|
| - return (g_FXCRT_XML_ByteTypes[ch] & FXCRTM_XML_CHARTYPE_Digital) != 0;
|
| +FX_BOOL g_FXCRT_XML_IsDigital(uint8_t ch) {
|
| + return (g_FXCRT_XML_ByteTypes[ch] & FXCRTM_XML_CHARTYPE_Digital) != 0;
|
| }
|
| -FX_BOOL g_FXCRT_XML_IsNameIntro(uint8_t ch)
|
| -{
|
| - return (g_FXCRT_XML_ByteTypes[ch] & FXCRTM_XML_CHARTYPE_NameIntro) != 0;
|
| +FX_BOOL g_FXCRT_XML_IsNameIntro(uint8_t ch) {
|
| + return (g_FXCRT_XML_ByteTypes[ch] & FXCRTM_XML_CHARTYPE_NameIntro) != 0;
|
| }
|
| -FX_BOOL g_FXCRT_XML_IsNameChar(uint8_t ch)
|
| -{
|
| - return (g_FXCRT_XML_ByteTypes[ch] & FXCRTM_XML_CHARTYPE_NameChar) != 0;
|
| +FX_BOOL g_FXCRT_XML_IsNameChar(uint8_t ch) {
|
| + return (g_FXCRT_XML_ByteTypes[ch] & FXCRTM_XML_CHARTYPE_NameChar) != 0;
|
| }
|
| -FX_BOOL g_FXCRT_XML_IsHexChar(uint8_t ch)
|
| -{
|
| - return (g_FXCRT_XML_ByteTypes[ch] & FXCRTM_XML_CHARTYPE_HexChar) != 0;
|
| +FX_BOOL g_FXCRT_XML_IsHexChar(uint8_t ch) {
|
| + return (g_FXCRT_XML_ByteTypes[ch] & FXCRTM_XML_CHARTYPE_HexChar) != 0;
|
| }
|
| -void CXML_Parser::SkipWhiteSpaces()
|
| -{
|
| - m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;
|
| - if (IsEOF()) {
|
| - return;
|
| +void CXML_Parser::SkipWhiteSpaces() {
|
| + m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;
|
| + if (IsEOF()) {
|
| + return;
|
| + }
|
| + do {
|
| + while (m_dwIndex < m_dwBufferSize &&
|
| + g_FXCRT_XML_IsWhiteSpace(m_pBuffer[m_dwIndex])) {
|
| + m_dwIndex++;
|
| }
|
| - do {
|
| - while (m_dwIndex < m_dwBufferSize && g_FXCRT_XML_IsWhiteSpace(m_pBuffer[m_dwIndex])) {
|
| - m_dwIndex ++;
|
| - }
|
| - m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;
|
| - if (m_dwIndex < m_dwBufferSize || IsEOF()) {
|
| - break;
|
| - }
|
| - } while (ReadNextBlock());
|
| -}
|
| -void CXML_Parser::GetName(CFX_ByteString &space, CFX_ByteString &name)
|
| -{
|
| m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;
|
| - if (IsEOF()) {
|
| - return;
|
| + if (m_dwIndex < m_dwBufferSize || IsEOF()) {
|
| + break;
|
| + }
|
| + } while (ReadNextBlock());
|
| +}
|
| +void CXML_Parser::GetName(CFX_ByteString& space, CFX_ByteString& name) {
|
| + m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;
|
| + if (IsEOF()) {
|
| + return;
|
| + }
|
| + CFX_ByteTextBuf buf;
|
| + uint8_t ch;
|
| + do {
|
| + while (m_dwIndex < m_dwBufferSize) {
|
| + ch = m_pBuffer[m_dwIndex];
|
| + if (ch == ':') {
|
| + space = buf.GetByteString();
|
| + buf.Clear();
|
| + } else if (g_FXCRT_XML_IsNameChar(ch)) {
|
| + buf.AppendChar(ch);
|
| + } else {
|
| + break;
|
| + }
|
| + m_dwIndex++;
|
| }
|
| - CFX_ByteTextBuf buf;
|
| - uint8_t ch;
|
| - do {
|
| - while (m_dwIndex < m_dwBufferSize) {
|
| - ch = m_pBuffer[m_dwIndex];
|
| - if (ch == ':') {
|
| - space = buf.GetByteString();
|
| - buf.Clear();
|
| - } else if (g_FXCRT_XML_IsNameChar(ch)) {
|
| - buf.AppendChar(ch);
|
| - } else {
|
| - break;
|
| - }
|
| - m_dwIndex ++;
|
| - }
|
| - m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;
|
| - if (m_dwIndex < m_dwBufferSize || IsEOF()) {
|
| - break;
|
| - }
|
| - } while (ReadNextBlock());
|
| - name = buf.GetByteString();
|
| -}
|
| -void CXML_Parser::SkipLiterals(const CFX_ByteStringC& str)
|
| -{
|
| m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;
|
| - if (IsEOF()) {
|
| - return;
|
| - }
|
| - int32_t i = 0, iLen = str.GetLength();
|
| - do {
|
| - while (m_dwIndex < m_dwBufferSize) {
|
| - if (str.GetAt(i) != m_pBuffer[m_dwIndex ++]) {
|
| - i = 0;
|
| - } else {
|
| - i ++;
|
| - if (i == iLen) {
|
| - break;
|
| - }
|
| - }
|
| - }
|
| - m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;
|
| + if (m_dwIndex < m_dwBufferSize || IsEOF()) {
|
| + break;
|
| + }
|
| + } while (ReadNextBlock());
|
| + name = buf.GetByteString();
|
| +}
|
| +void CXML_Parser::SkipLiterals(const CFX_ByteStringC& str) {
|
| + m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;
|
| + if (IsEOF()) {
|
| + return;
|
| + }
|
| + int32_t i = 0, iLen = str.GetLength();
|
| + do {
|
| + while (m_dwIndex < m_dwBufferSize) {
|
| + if (str.GetAt(i) != m_pBuffer[m_dwIndex++]) {
|
| + i = 0;
|
| + } else {
|
| + i++;
|
| if (i == iLen) {
|
| - return;
|
| + break;
|
| }
|
| - if (m_dwIndex < m_dwBufferSize || IsEOF()) {
|
| - break;
|
| - }
|
| - } while (ReadNextBlock());
|
| - while (!m_pDataAcc->IsEOF()) {
|
| - ReadNextBlock();
|
| - m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwBufferSize;
|
| + }
|
| }
|
| - m_dwIndex = m_dwBufferSize;
|
| -}
|
| -FX_DWORD CXML_Parser::GetCharRef()
|
| -{
|
| m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;
|
| - if (IsEOF()) {
|
| - return 0;
|
| - }
|
| - uint8_t ch;
|
| - int32_t iState = 0;
|
| - CFX_ByteTextBuf buf;
|
| - FX_DWORD code = 0;
|
| - do {
|
| - while (m_dwIndex < m_dwBufferSize) {
|
| - ch = m_pBuffer[m_dwIndex];
|
| - switch (iState) {
|
| - case 0:
|
| - if (ch == '#') {
|
| - m_dwIndex ++;
|
| - iState = 2;
|
| - break;
|
| - }
|
| - iState = 1;
|
| - case 1:
|
| - m_dwIndex ++;
|
| - if (ch == ';') {
|
| - CFX_ByteStringC ref = buf.GetByteString();
|
| - if (ref == FX_BSTRC("gt")) {
|
| - code = '>';
|
| - } else if (ref == FX_BSTRC("lt")) {
|
| - code = '<';
|
| - } else if (ref == FX_BSTRC("amp")) {
|
| - code = '&';
|
| - } else if (ref == FX_BSTRC("apos")) {
|
| - code = '\'';
|
| - } else if (ref == FX_BSTRC("quot")) {
|
| - code = '"';
|
| - }
|
| - iState = 10;
|
| - break;
|
| - }
|
| - buf.AppendByte(ch);
|
| - break;
|
| - case 2:
|
| - if (ch == 'x') {
|
| - m_dwIndex ++;
|
| - iState = 4;
|
| - break;
|
| - }
|
| - iState = 3;
|
| - case 3:
|
| - m_dwIndex ++;
|
| - if (ch == ';') {
|
| - iState = 10;
|
| - break;
|
| - }
|
| - if (g_FXCRT_XML_IsDigital(ch)) {
|
| - code = code * 10 + ch - '0';
|
| - }
|
| - break;
|
| - case 4:
|
| - m_dwIndex ++;
|
| - if (ch == ';') {
|
| - iState = 10;
|
| - break;
|
| - }
|
| - uint8_t nHex = g_FXCRT_XML_ByteTypes[ch] & FXCRTM_XML_CHARTYPE_HexChar;
|
| - if (nHex) {
|
| - if (nHex == FXCRTM_XML_CHARTYPE_HexDigital) {
|
| - code = (code << 4) + ch - '0';
|
| - } else if (nHex == FXCRTM_XML_CHARTYPE_HexLowerLetter) {
|
| - code = (code << 4) + ch - 87;
|
| - } else {
|
| - code = (code << 4) + ch - 55;
|
| - }
|
| - }
|
| - break;
|
| - }
|
| - if (iState == 10) {
|
| - break;
|
| - }
|
| - }
|
| - m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;
|
| - if (iState == 10 || m_dwIndex < m_dwBufferSize || IsEOF()) {
|
| + if (i == iLen) {
|
| + return;
|
| + }
|
| + if (m_dwIndex < m_dwBufferSize || IsEOF()) {
|
| + break;
|
| + }
|
| + } while (ReadNextBlock());
|
| + while (!m_pDataAcc->IsEOF()) {
|
| + ReadNextBlock();
|
| + m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwBufferSize;
|
| + }
|
| + m_dwIndex = m_dwBufferSize;
|
| +}
|
| +FX_DWORD CXML_Parser::GetCharRef() {
|
| + m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;
|
| + if (IsEOF()) {
|
| + return 0;
|
| + }
|
| + uint8_t ch;
|
| + int32_t iState = 0;
|
| + CFX_ByteTextBuf buf;
|
| + FX_DWORD code = 0;
|
| + do {
|
| + while (m_dwIndex < m_dwBufferSize) {
|
| + ch = m_pBuffer[m_dwIndex];
|
| + switch (iState) {
|
| + case 0:
|
| + if (ch == '#') {
|
| + m_dwIndex++;
|
| + iState = 2;
|
| break;
|
| - }
|
| - } while (ReadNextBlock());
|
| - return code;
|
| -}
|
| -void CXML_Parser::GetAttrValue(CFX_WideString &value)
|
| -{
|
| - m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;
|
| - if (IsEOF()) {
|
| - return;
|
| - }
|
| - CFX_UTF8Decoder decoder;
|
| - uint8_t mark = 0, ch = 0;
|
| - do {
|
| - while (m_dwIndex < m_dwBufferSize) {
|
| - ch = m_pBuffer[m_dwIndex];
|
| - if (mark == 0) {
|
| - if (ch != '\'' && ch != '"') {
|
| - return;
|
| - }
|
| - mark = ch;
|
| - m_dwIndex ++;
|
| - ch = 0;
|
| - continue;
|
| - }
|
| - m_dwIndex ++;
|
| - if (ch == mark) {
|
| - break;
|
| + }
|
| + iState = 1;
|
| + case 1:
|
| + m_dwIndex++;
|
| + if (ch == ';') {
|
| + CFX_ByteStringC ref = buf.GetByteString();
|
| + if (ref == FX_BSTRC("gt")) {
|
| + code = '>';
|
| + } else if (ref == FX_BSTRC("lt")) {
|
| + code = '<';
|
| + } else if (ref == FX_BSTRC("amp")) {
|
| + code = '&';
|
| + } else if (ref == FX_BSTRC("apos")) {
|
| + code = '\'';
|
| + } else if (ref == FX_BSTRC("quot")) {
|
| + code = '"';
|
| }
|
| - if (ch == '&') {
|
| - decoder.AppendChar(GetCharRef());
|
| - if (IsEOF()) {
|
| - value = decoder.GetResult();
|
| - return;
|
| - }
|
| + iState = 10;
|
| + break;
|
| + }
|
| + buf.AppendByte(ch);
|
| + break;
|
| + case 2:
|
| + if (ch == 'x') {
|
| + m_dwIndex++;
|
| + iState = 4;
|
| + break;
|
| + }
|
| + iState = 3;
|
| + case 3:
|
| + m_dwIndex++;
|
| + if (ch == ';') {
|
| + iState = 10;
|
| + break;
|
| + }
|
| + if (g_FXCRT_XML_IsDigital(ch)) {
|
| + code = code * 10 + ch - '0';
|
| + }
|
| + break;
|
| + case 4:
|
| + m_dwIndex++;
|
| + if (ch == ';') {
|
| + iState = 10;
|
| + break;
|
| + }
|
| + uint8_t nHex =
|
| + g_FXCRT_XML_ByteTypes[ch] & FXCRTM_XML_CHARTYPE_HexChar;
|
| + if (nHex) {
|
| + if (nHex == FXCRTM_XML_CHARTYPE_HexDigital) {
|
| + code = (code << 4) + ch - '0';
|
| + } else if (nHex == FXCRTM_XML_CHARTYPE_HexLowerLetter) {
|
| + code = (code << 4) + ch - 87;
|
| } else {
|
| - decoder.Input(ch);
|
| + code = (code << 4) + ch - 55;
|
| }
|
| + }
|
| + break;
|
| + }
|
| + if (iState == 10) {
|
| + break;
|
| + }
|
| + }
|
| + m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;
|
| + if (iState == 10 || m_dwIndex < m_dwBufferSize || IsEOF()) {
|
| + break;
|
| + }
|
| + } while (ReadNextBlock());
|
| + return code;
|
| +}
|
| +void CXML_Parser::GetAttrValue(CFX_WideString& value) {
|
| + m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;
|
| + if (IsEOF()) {
|
| + return;
|
| + }
|
| + CFX_UTF8Decoder decoder;
|
| + uint8_t mark = 0, ch = 0;
|
| + do {
|
| + while (m_dwIndex < m_dwBufferSize) {
|
| + ch = m_pBuffer[m_dwIndex];
|
| + if (mark == 0) {
|
| + if (ch != '\'' && ch != '"') {
|
| + return;
|
| }
|
| - m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;
|
| - if (ch == mark || m_dwIndex < m_dwBufferSize || IsEOF()) {
|
| - break;
|
| + mark = ch;
|
| + m_dwIndex++;
|
| + ch = 0;
|
| + continue;
|
| + }
|
| + m_dwIndex++;
|
| + if (ch == mark) {
|
| + break;
|
| + }
|
| + if (ch == '&') {
|
| + decoder.AppendChar(GetCharRef());
|
| + if (IsEOF()) {
|
| + value = decoder.GetResult();
|
| + return;
|
| }
|
| - } while (ReadNextBlock());
|
| - value = decoder.GetResult();
|
| -}
|
| -void CXML_Parser::GetTagName(CFX_ByteString &space, CFX_ByteString &name, FX_BOOL &bEndTag, FX_BOOL bStartTag)
|
| -{
|
| - m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;
|
| - if (IsEOF()) {
|
| - return;
|
| + } else {
|
| + decoder.Input(ch);
|
| + }
|
| }
|
| - bEndTag = FALSE;
|
| - uint8_t ch;
|
| - int32_t iState = bStartTag ? 1 : 0;
|
| - do {
|
| - while (m_dwIndex < m_dwBufferSize) {
|
| - ch = m_pBuffer[m_dwIndex];
|
| - switch (iState) {
|
| - case 0:
|
| - m_dwIndex ++;
|
| - if (ch != '<') {
|
| - break;
|
| - }
|
| - iState = 1;
|
| - break;
|
| - case 1:
|
| - if (ch == '?') {
|
| - m_dwIndex ++;
|
| - SkipLiterals(FX_BSTRC("?>"));
|
| - iState = 0;
|
| - break;
|
| - } else if (ch == '!') {
|
| - m_dwIndex ++;
|
| - SkipLiterals(FX_BSTRC("-->"));
|
| - iState = 0;
|
| - break;
|
| - }
|
| - if (ch == '/') {
|
| - m_dwIndex ++;
|
| - GetName(space, name);
|
| - bEndTag = TRUE;
|
| - } else {
|
| - GetName(space, name);
|
| - bEndTag = FALSE;
|
| - }
|
| - return;
|
| - }
|
| - }
|
| - m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;
|
| - if (m_dwIndex < m_dwBufferSize || IsEOF()) {
|
| + m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;
|
| + if (ch == mark || m_dwIndex < m_dwBufferSize || IsEOF()) {
|
| + break;
|
| + }
|
| + } while (ReadNextBlock());
|
| + value = decoder.GetResult();
|
| +}
|
| +void CXML_Parser::GetTagName(CFX_ByteString& space,
|
| + CFX_ByteString& name,
|
| + FX_BOOL& bEndTag,
|
| + FX_BOOL bStartTag) {
|
| + m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;
|
| + if (IsEOF()) {
|
| + return;
|
| + }
|
| + bEndTag = FALSE;
|
| + uint8_t ch;
|
| + int32_t iState = bStartTag ? 1 : 0;
|
| + do {
|
| + while (m_dwIndex < m_dwBufferSize) {
|
| + ch = m_pBuffer[m_dwIndex];
|
| + switch (iState) {
|
| + case 0:
|
| + m_dwIndex++;
|
| + if (ch != '<') {
|
| break;
|
| - }
|
| - } while (ReadNextBlock());
|
| -}
|
| -CXML_Element* CXML_Parser::ParseElement(CXML_Element* pParent, FX_BOOL bStartTag)
|
| -{
|
| + }
|
| + iState = 1;
|
| + break;
|
| + case 1:
|
| + if (ch == '?') {
|
| + m_dwIndex++;
|
| + SkipLiterals(FX_BSTRC("?>"));
|
| + iState = 0;
|
| + break;
|
| + } else if (ch == '!') {
|
| + m_dwIndex++;
|
| + SkipLiterals(FX_BSTRC("-->"));
|
| + iState = 0;
|
| + break;
|
| + }
|
| + if (ch == '/') {
|
| + m_dwIndex++;
|
| + GetName(space, name);
|
| + bEndTag = TRUE;
|
| + } else {
|
| + GetName(space, name);
|
| + bEndTag = FALSE;
|
| + }
|
| + return;
|
| + }
|
| + }
|
| m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;
|
| - if (IsEOF()) {
|
| - return NULL;
|
| + if (m_dwIndex < m_dwBufferSize || IsEOF()) {
|
| + break;
|
| }
|
| - CFX_ByteString tag_name, tag_space;
|
| - FX_BOOL bEndTag;
|
| - GetTagName(tag_space, tag_name, bEndTag, bStartTag);
|
| - if (tag_name.IsEmpty() || bEndTag) {
|
| - return NULL;
|
| + } while (ReadNextBlock());
|
| +}
|
| +CXML_Element* CXML_Parser::ParseElement(CXML_Element* pParent,
|
| + FX_BOOL bStartTag) {
|
| + m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;
|
| + if (IsEOF()) {
|
| + return NULL;
|
| + }
|
| + CFX_ByteString tag_name, tag_space;
|
| + FX_BOOL bEndTag;
|
| + GetTagName(tag_space, tag_name, bEndTag, bStartTag);
|
| + if (tag_name.IsEmpty() || bEndTag) {
|
| + return NULL;
|
| + }
|
| + CXML_Element* pElement = new CXML_Element;
|
| + pElement->m_pParent = pParent;
|
| + pElement->SetTag(tag_space, tag_name);
|
| + do {
|
| + CFX_ByteString attr_space, attr_name;
|
| + while (m_dwIndex < m_dwBufferSize) {
|
| + SkipWhiteSpaces();
|
| + if (IsEOF()) {
|
| + break;
|
| + }
|
| + if (!g_FXCRT_XML_IsNameIntro(m_pBuffer[m_dwIndex])) {
|
| + break;
|
| + }
|
| + GetName(attr_space, attr_name);
|
| + SkipWhiteSpaces();
|
| + if (IsEOF()) {
|
| + break;
|
| + }
|
| + if (m_pBuffer[m_dwIndex] != '=') {
|
| + break;
|
| + }
|
| + m_dwIndex++;
|
| + SkipWhiteSpaces();
|
| + if (IsEOF()) {
|
| + break;
|
| + }
|
| + CFX_WideString attr_value;
|
| + GetAttrValue(attr_value);
|
| + pElement->m_AttrMap.SetAt(attr_space, attr_name, attr_value);
|
| }
|
| - CXML_Element* pElement = new CXML_Element;
|
| - pElement->m_pParent = pParent;
|
| - pElement->SetTag(tag_space, tag_name);
|
| - do {
|
| - CFX_ByteString attr_space, attr_name;
|
| - while (m_dwIndex < m_dwBufferSize) {
|
| + m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;
|
| + if (m_dwIndex < m_dwBufferSize || IsEOF()) {
|
| + break;
|
| + }
|
| + } while (ReadNextBlock());
|
| + SkipWhiteSpaces();
|
| + if (IsEOF()) {
|
| + return pElement;
|
| + }
|
| + uint8_t ch = m_pBuffer[m_dwIndex++];
|
| + if (ch == '/') {
|
| + m_dwIndex++;
|
| + m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;
|
| + return pElement;
|
| + }
|
| + if (ch != '>') {
|
| + m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;
|
| + delete pElement;
|
| + return NULL;
|
| + }
|
| + SkipWhiteSpaces();
|
| + if (IsEOF()) {
|
| + return pElement;
|
| + }
|
| + CFX_UTF8Decoder decoder;
|
| + CFX_WideTextBuf content;
|
| + FX_BOOL bCDATA = FALSE;
|
| + int32_t iState = 0;
|
| + do {
|
| + while (m_dwIndex < m_dwBufferSize) {
|
| + ch = m_pBuffer[m_dwIndex++];
|
| + switch (iState) {
|
| + case 0:
|
| + if (ch == '<') {
|
| + iState = 1;
|
| + } else if (ch == '&') {
|
| + decoder.ClearStatus();
|
| + decoder.AppendChar(GetCharRef());
|
| + } else {
|
| + decoder.Input(ch);
|
| + }
|
| + break;
|
| + case 1:
|
| + if (ch == '!') {
|
| + iState = 2;
|
| + } else if (ch == '?') {
|
| + SkipLiterals(FX_BSTRC("?>"));
|
| SkipWhiteSpaces();
|
| - if (IsEOF()) {
|
| - break;
|
| - }
|
| - if (!g_FXCRT_XML_IsNameIntro(m_pBuffer[m_dwIndex])) {
|
| - break;
|
| - }
|
| - GetName(attr_space, attr_name);
|
| + iState = 0;
|
| + } else if (ch == '/') {
|
| + CFX_ByteString space, name;
|
| + GetName(space, name);
|
| SkipWhiteSpaces();
|
| - if (IsEOF()) {
|
| - break;
|
| + m_dwIndex++;
|
| + iState = 10;
|
| + } else {
|
| + content << decoder.GetResult();
|
| + CFX_WideString dataStr = content.GetWideString();
|
| + if (!bCDATA && !m_bSaveSpaceChars) {
|
| + dataStr.TrimRight(L" \t\r\n");
|
| }
|
| - if (m_pBuffer[m_dwIndex] != '=') {
|
| - break;
|
| + InsertContentSegment(bCDATA, dataStr, pElement);
|
| + content.Clear();
|
| + decoder.Clear();
|
| + bCDATA = FALSE;
|
| + iState = 0;
|
| + m_dwIndex--;
|
| + CXML_Element* pSubElement = ParseElement(pElement, TRUE);
|
| + if (pSubElement == NULL) {
|
| + break;
|
| }
|
| - m_dwIndex ++;
|
| + pSubElement->m_pParent = pElement;
|
| + pElement->m_Children.Add((void*)CXML_Element::Element);
|
| + pElement->m_Children.Add(pSubElement);
|
| SkipWhiteSpaces();
|
| - if (IsEOF()) {
|
| - break;
|
| - }
|
| - CFX_WideString attr_value;
|
| - GetAttrValue(attr_value);
|
| - pElement->m_AttrMap.SetAt(attr_space, attr_name, attr_value);
|
| - }
|
| - m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;
|
| - if (m_dwIndex < m_dwBufferSize || IsEOF()) {
|
| - break;
|
| - }
|
| - } while (ReadNextBlock());
|
| - SkipWhiteSpaces();
|
| - if (IsEOF()) {
|
| - return pElement;
|
| - }
|
| - uint8_t ch = m_pBuffer[m_dwIndex ++];
|
| - if (ch == '/') {
|
| - m_dwIndex ++;
|
| - m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;
|
| - return pElement;
|
| + }
|
| + break;
|
| + case 2:
|
| + if (ch == '[') {
|
| + SkipLiterals(FX_BSTRC("]]>"));
|
| + } else if (ch == '-') {
|
| + m_dwIndex++;
|
| + SkipLiterals(FX_BSTRC("-->"));
|
| + } else {
|
| + SkipLiterals(FX_BSTRC(">"));
|
| + }
|
| + decoder.Clear();
|
| + SkipWhiteSpaces();
|
| + iState = 0;
|
| + break;
|
| + }
|
| + if (iState == 10) {
|
| + break;
|
| + }
|
| }
|
| - if (ch != '>') {
|
| - m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;
|
| - delete pElement;
|
| - return NULL;
|
| - }
|
| - SkipWhiteSpaces();
|
| - if (IsEOF()) {
|
| - return pElement;
|
| - }
|
| - CFX_UTF8Decoder decoder;
|
| - CFX_WideTextBuf content;
|
| - FX_BOOL bCDATA = FALSE;
|
| - int32_t iState = 0;
|
| - do {
|
| - while (m_dwIndex < m_dwBufferSize) {
|
| - ch = m_pBuffer[m_dwIndex ++];
|
| - switch (iState) {
|
| - case 0:
|
| - if (ch == '<') {
|
| - iState = 1;
|
| - } else if (ch == '&') {
|
| - decoder.ClearStatus();
|
| - decoder.AppendChar(GetCharRef());
|
| - } else {
|
| - decoder.Input(ch);
|
| - }
|
| - break;
|
| - case 1:
|
| - if (ch == '!') {
|
| - iState = 2;
|
| - } else if (ch == '?') {
|
| - SkipLiterals(FX_BSTRC("?>"));
|
| - SkipWhiteSpaces();
|
| - iState = 0;
|
| - } else if (ch == '/') {
|
| - CFX_ByteString space, name;
|
| - GetName(space, name);
|
| - SkipWhiteSpaces();
|
| - m_dwIndex ++;
|
| - iState = 10;
|
| - } else {
|
| - content << decoder.GetResult();
|
| - CFX_WideString dataStr = content.GetWideString();
|
| - if (!bCDATA && !m_bSaveSpaceChars) {
|
| - dataStr.TrimRight(L" \t\r\n");
|
| - }
|
| - InsertContentSegment(bCDATA, dataStr, pElement);
|
| - content.Clear();
|
| - decoder.Clear();
|
| - bCDATA = FALSE;
|
| - iState = 0;
|
| - m_dwIndex --;
|
| - CXML_Element* pSubElement = ParseElement(pElement, TRUE);
|
| - if (pSubElement == NULL) {
|
| - break;
|
| - }
|
| - pSubElement->m_pParent = pElement;
|
| - pElement->m_Children.Add((void*)CXML_Element::Element);
|
| - pElement->m_Children.Add(pSubElement);
|
| - SkipWhiteSpaces();
|
| - }
|
| - break;
|
| - case 2:
|
| - if (ch == '[') {
|
| - SkipLiterals(FX_BSTRC("]]>"));
|
| - } else if (ch == '-') {
|
| - m_dwIndex ++;
|
| - SkipLiterals(FX_BSTRC("-->"));
|
| - } else {
|
| - SkipLiterals(FX_BSTRC(">"));
|
| - }
|
| - decoder.Clear();
|
| - SkipWhiteSpaces();
|
| - iState = 0;
|
| - break;
|
| - }
|
| - if (iState == 10) {
|
| - break;
|
| - }
|
| - }
|
| - m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;
|
| - if (iState == 10 || m_dwIndex < m_dwBufferSize || IsEOF()) {
|
| - break;
|
| - }
|
| - } while (ReadNextBlock());
|
| - content << decoder.GetResult();
|
| - CFX_WideString dataStr = content.GetWideString();
|
| - if (!m_bSaveSpaceChars) {
|
| - dataStr.TrimRight(L" \t\r\n");
|
| - }
|
| - InsertContentSegment(bCDATA, dataStr, pElement);
|
| - content.Clear();
|
| - decoder.Clear();
|
| - bCDATA = FALSE;
|
| - return pElement;
|
| -}
|
| -void CXML_Parser::InsertContentSegment(FX_BOOL bCDATA, const CFX_WideStringC& content, CXML_Element* pElement)
|
| -{
|
| - if (content.IsEmpty()) {
|
| - return;
|
| - }
|
| - CXML_Content* pContent = new CXML_Content;
|
| - pContent->Set(bCDATA, content);
|
| - pElement->m_Children.Add((void*)CXML_Element::Content);
|
| - pElement->m_Children.Add(pContent);
|
| -}
|
| -static CXML_Element* XML_ContinueParse(CXML_Parser &parser, FX_BOOL bSaveSpaceChars, FX_FILESIZE* pParsedSize)
|
| -{
|
| - parser.m_bSaveSpaceChars = bSaveSpaceChars;
|
| - CXML_Element* pElement = parser.ParseElement(NULL, FALSE);
|
| - if (pParsedSize) {
|
| - *pParsedSize = parser.m_nOffset;
|
| - }
|
| - return pElement;
|
| -}
|
| -CXML_Element* CXML_Element::Parse(const void* pBuffer, size_t size, FX_BOOL bSaveSpaceChars, FX_FILESIZE* pParsedSize)
|
| -{
|
| - CXML_Parser parser;
|
| - if (!parser.Init((uint8_t*)pBuffer, size)) {
|
| - return NULL;
|
| - }
|
| - return XML_ContinueParse(parser, bSaveSpaceChars, pParsedSize);
|
| -}
|
| -CXML_Element* CXML_Element::Parse(IFX_FileRead *pFile, FX_BOOL bSaveSpaceChars, FX_FILESIZE* pParsedSize)
|
| -{
|
| - CXML_Parser parser;
|
| - if (!parser.Init(pFile)) {
|
| - return NULL;
|
| - }
|
| - return XML_ContinueParse(parser, bSaveSpaceChars, pParsedSize);
|
| + m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;
|
| + if (iState == 10 || m_dwIndex < m_dwBufferSize || IsEOF()) {
|
| + break;
|
| + }
|
| + } while (ReadNextBlock());
|
| + content << decoder.GetResult();
|
| + CFX_WideString dataStr = content.GetWideString();
|
| + if (!m_bSaveSpaceChars) {
|
| + dataStr.TrimRight(L" \t\r\n");
|
| + }
|
| + InsertContentSegment(bCDATA, dataStr, pElement);
|
| + content.Clear();
|
| + decoder.Clear();
|
| + bCDATA = FALSE;
|
| + return pElement;
|
| +}
|
| +void CXML_Parser::InsertContentSegment(FX_BOOL bCDATA,
|
| + const CFX_WideStringC& content,
|
| + CXML_Element* pElement) {
|
| + if (content.IsEmpty()) {
|
| + return;
|
| + }
|
| + CXML_Content* pContent = new CXML_Content;
|
| + pContent->Set(bCDATA, content);
|
| + pElement->m_Children.Add((void*)CXML_Element::Content);
|
| + pElement->m_Children.Add(pContent);
|
| +}
|
| +static CXML_Element* XML_ContinueParse(CXML_Parser& parser,
|
| + FX_BOOL bSaveSpaceChars,
|
| + FX_FILESIZE* pParsedSize) {
|
| + parser.m_bSaveSpaceChars = bSaveSpaceChars;
|
| + CXML_Element* pElement = parser.ParseElement(NULL, FALSE);
|
| + if (pParsedSize) {
|
| + *pParsedSize = parser.m_nOffset;
|
| + }
|
| + return pElement;
|
| +}
|
| +CXML_Element* CXML_Element::Parse(const void* pBuffer,
|
| + size_t size,
|
| + FX_BOOL bSaveSpaceChars,
|
| + FX_FILESIZE* pParsedSize) {
|
| + CXML_Parser parser;
|
| + if (!parser.Init((uint8_t*)pBuffer, size)) {
|
| + return NULL;
|
| + }
|
| + return XML_ContinueParse(parser, bSaveSpaceChars, pParsedSize);
|
| +}
|
| +CXML_Element* CXML_Element::Parse(IFX_FileRead* pFile,
|
| + FX_BOOL bSaveSpaceChars,
|
| + FX_FILESIZE* pParsedSize) {
|
| + CXML_Parser parser;
|
| + if (!parser.Init(pFile)) {
|
| + return NULL;
|
| + }
|
| + return XML_ContinueParse(parser, bSaveSpaceChars, pParsedSize);
|
| +}
|
| +CXML_Element* CXML_Element::Parse(IFX_BufferRead* pBuffer,
|
| + FX_BOOL bSaveSpaceChars,
|
| + FX_FILESIZE* pParsedSize) {
|
| + CXML_Parser parser;
|
| + if (!parser.Init(pBuffer)) {
|
| + return NULL;
|
| + }
|
| + return XML_ContinueParse(parser, bSaveSpaceChars, pParsedSize);
|
| }
|
| -CXML_Element* CXML_Element::Parse(IFX_BufferRead *pBuffer, FX_BOOL bSaveSpaceChars, FX_FILESIZE* pParsedSize)
|
| -{
|
| - CXML_Parser parser;
|
| - if (!parser.Init(pBuffer)) {
|
| - return NULL;
|
| - }
|
| - return XML_ContinueParse(parser, bSaveSpaceChars, pParsedSize);
|
| -}
|
| -CXML_Element::CXML_Element()
|
| - : m_QSpaceName()
|
| - , m_TagName()
|
| - , m_AttrMap()
|
| -{
|
| -}
|
| -CXML_Element::CXML_Element(const CFX_ByteStringC& qSpace, const CFX_ByteStringC& tagName)
|
| - : m_QSpaceName()
|
| - , m_TagName()
|
| - , m_AttrMap()
|
| -{
|
| - m_QSpaceName = qSpace;
|
| - m_TagName = tagName;
|
| +CXML_Element::CXML_Element() : m_QSpaceName(), m_TagName(), m_AttrMap() {}
|
| +CXML_Element::CXML_Element(const CFX_ByteStringC& qSpace,
|
| + const CFX_ByteStringC& tagName)
|
| + : m_QSpaceName(), m_TagName(), m_AttrMap() {
|
| + m_QSpaceName = qSpace;
|
| + m_TagName = tagName;
|
| }
|
| CXML_Element::CXML_Element(const CFX_ByteStringC& qTagName)
|
| - : m_pParent(NULL)
|
| - , m_QSpaceName()
|
| - , m_TagName()
|
| - , m_AttrMap()
|
| -{
|
| - SetTag(qTagName);
|
| -}
|
| -CXML_Element::~CXML_Element()
|
| -{
|
| - Empty();
|
| -}
|
| -void CXML_Element::Empty()
|
| -{
|
| - RemoveChildren();
|
| -}
|
| -void CXML_Element::RemoveChildren()
|
| -{
|
| - for (int i = 0; i < m_Children.GetSize(); i += 2) {
|
| - ChildType type = (ChildType)(uintptr_t)m_Children.GetAt(i);
|
| - if (type == Content) {
|
| - CXML_Content* content = (CXML_Content*)m_Children.GetAt(i + 1);
|
| - delete content;
|
| - } else if (type == Element) {
|
| - CXML_Element* child = (CXML_Element*)m_Children.GetAt(i + 1);
|
| - child->RemoveChildren();
|
| - delete child;
|
| - }
|
| - }
|
| - m_Children.RemoveAll();
|
| -}
|
| -CFX_ByteString CXML_Element::GetTagName(FX_BOOL bQualified) const
|
| -{
|
| - if (!bQualified || m_QSpaceName.IsEmpty()) {
|
| - return m_TagName;
|
| - }
|
| - CFX_ByteString bsTag = m_QSpaceName;
|
| - bsTag += ":";
|
| - bsTag += m_TagName;
|
| - return bsTag;
|
| -}
|
| -CFX_ByteString CXML_Element::GetNamespace(FX_BOOL bQualified) const
|
| -{
|
| - if (bQualified) {
|
| - return m_QSpaceName;
|
| - }
|
| - return GetNamespaceURI(m_QSpaceName);
|
| -}
|
| -CFX_ByteString CXML_Element::GetNamespaceURI(const CFX_ByteStringC& qName) const
|
| -{
|
| - const CFX_WideString* pwsSpace;
|
| - const CXML_Element *pElement = this;
|
| - do {
|
| - if (qName.IsEmpty()) {
|
| - pwsSpace = pElement->m_AttrMap.Lookup(FX_BSTRC(""), FX_BSTRC("xmlns"));
|
| - } else {
|
| - pwsSpace = pElement->m_AttrMap.Lookup(FX_BSTRC("xmlns"), qName);
|
| - }
|
| - if (pwsSpace) {
|
| - break;
|
| - }
|
| - pElement = pElement->GetParent();
|
| - } while(pElement);
|
| - return pwsSpace ? FX_UTF8Encode(*pwsSpace) : CFX_ByteString();
|
| -}
|
| -void CXML_Element::GetAttrByIndex(int index, CFX_ByteString& space, CFX_ByteString& name, CFX_WideString& value) const
|
| -{
|
| - if (index < 0 || index >= m_AttrMap.GetSize()) {
|
| - return;
|
| - }
|
| - CXML_AttrItem& item = m_AttrMap.GetAt(index);
|
| - space = item.m_QSpaceName;
|
| - name = item.m_AttrName;
|
| - value = item.m_Value;
|
| -}
|
| -FX_BOOL CXML_Element::HasAttr(const CFX_ByteStringC& name) const
|
| -{
|
| - CFX_ByteStringC bsSpace, bsName;
|
| - FX_XML_SplitQualifiedName(name, bsSpace, bsName);
|
| - return m_AttrMap.Lookup(bsSpace, bsName) != NULL;
|
| -}
|
| -FX_BOOL CXML_Element::GetAttrValue(const CFX_ByteStringC& name, CFX_WideString& attribute) const
|
| -{
|
| - CFX_ByteStringC bsSpace, bsName;
|
| - FX_XML_SplitQualifiedName(name, bsSpace, bsName);
|
| - return GetAttrValue(bsSpace, bsName, attribute);
|
| -}
|
| -FX_BOOL CXML_Element::GetAttrValue(const CFX_ByteStringC& space, const CFX_ByteStringC& name, CFX_WideString& attribute) const
|
| -{
|
| - const CFX_WideString* pValue = m_AttrMap.Lookup(space, name);
|
| - if (pValue) {
|
| - attribute = *pValue;
|
| - return TRUE;
|
| - }
|
| - return FALSE;
|
| -}
|
| -FX_BOOL CXML_Element::GetAttrInteger(const CFX_ByteStringC& name, int& attribute) const
|
| -{
|
| - CFX_ByteStringC bsSpace, bsName;
|
| - FX_XML_SplitQualifiedName(name, bsSpace, bsName);
|
| - const CFX_WideString* pwsValue = m_AttrMap.Lookup(bsSpace, bsName);
|
| - if (pwsValue) {
|
| - attribute = pwsValue->GetInteger();
|
| - return TRUE;
|
| - }
|
| - return FALSE;
|
| -}
|
| -FX_BOOL CXML_Element::GetAttrInteger(const CFX_ByteStringC& space, const CFX_ByteStringC& name, int& attribute) const
|
| -{
|
| - const CFX_WideString* pwsValue = m_AttrMap.Lookup(space, name);
|
| - if (pwsValue) {
|
| - attribute = pwsValue->GetInteger();
|
| - return TRUE;
|
| - }
|
| - return FALSE;
|
| -}
|
| -FX_BOOL CXML_Element::GetAttrFloat(const CFX_ByteStringC& name, FX_FLOAT& attribute) const
|
| -{
|
| - CFX_ByteStringC bsSpace, bsName;
|
| - FX_XML_SplitQualifiedName(name, bsSpace, bsName);
|
| - return GetAttrFloat(bsSpace, bsName, attribute);
|
| -}
|
| -FX_BOOL CXML_Element::GetAttrFloat(const CFX_ByteStringC& space, const CFX_ByteStringC& name, FX_FLOAT& attribute) const
|
| -{
|
| - const CFX_WideString* pValue = m_AttrMap.Lookup(space, name);
|
| - if (pValue) {
|
| - attribute = pValue->GetFloat();
|
| - return TRUE;
|
| - }
|
| - return FALSE;
|
| -}
|
| -FX_DWORD CXML_Element::CountChildren() const
|
| -{
|
| - return m_Children.GetSize() / 2;
|
| -}
|
| -CXML_Element::ChildType CXML_Element::GetChildType(FX_DWORD index) const
|
| -{
|
| - index <<= 1;
|
| - if (index >= (FX_DWORD)m_Children.GetSize()) {
|
| - return Invalid;
|
| - }
|
| - return (ChildType)(uintptr_t)m_Children.GetAt(index);
|
| -}
|
| -CFX_WideString CXML_Element::GetContent(FX_DWORD index) const
|
| -{
|
| - index <<= 1;
|
| - if (index >= (FX_DWORD)m_Children.GetSize() ||
|
| - (ChildType)(uintptr_t)m_Children.GetAt(index) != Content) {
|
| - return CFX_WideString();
|
| - }
|
| - CXML_Content* pContent = (CXML_Content*)m_Children.GetAt(index + 1);
|
| - if (pContent) {
|
| - return pContent->m_Content;
|
| - }
|
| + : m_pParent(NULL), m_QSpaceName(), m_TagName(), m_AttrMap() {
|
| + SetTag(qTagName);
|
| +}
|
| +CXML_Element::~CXML_Element() {
|
| + Empty();
|
| +}
|
| +void CXML_Element::Empty() {
|
| + RemoveChildren();
|
| +}
|
| +void CXML_Element::RemoveChildren() {
|
| + for (int i = 0; i < m_Children.GetSize(); i += 2) {
|
| + ChildType type = (ChildType)(uintptr_t)m_Children.GetAt(i);
|
| + if (type == Content) {
|
| + CXML_Content* content = (CXML_Content*)m_Children.GetAt(i + 1);
|
| + delete content;
|
| + } else if (type == Element) {
|
| + CXML_Element* child = (CXML_Element*)m_Children.GetAt(i + 1);
|
| + child->RemoveChildren();
|
| + delete child;
|
| + }
|
| + }
|
| + m_Children.RemoveAll();
|
| +}
|
| +CFX_ByteString CXML_Element::GetTagName(FX_BOOL bQualified) const {
|
| + if (!bQualified || m_QSpaceName.IsEmpty()) {
|
| + return m_TagName;
|
| + }
|
| + CFX_ByteString bsTag = m_QSpaceName;
|
| + bsTag += ":";
|
| + bsTag += m_TagName;
|
| + return bsTag;
|
| +}
|
| +CFX_ByteString CXML_Element::GetNamespace(FX_BOOL bQualified) const {
|
| + if (bQualified) {
|
| + return m_QSpaceName;
|
| + }
|
| + return GetNamespaceURI(m_QSpaceName);
|
| +}
|
| +CFX_ByteString CXML_Element::GetNamespaceURI(
|
| + const CFX_ByteStringC& qName) const {
|
| + const CFX_WideString* pwsSpace;
|
| + const CXML_Element* pElement = this;
|
| + do {
|
| + if (qName.IsEmpty()) {
|
| + pwsSpace = pElement->m_AttrMap.Lookup(FX_BSTRC(""), FX_BSTRC("xmlns"));
|
| + } else {
|
| + pwsSpace = pElement->m_AttrMap.Lookup(FX_BSTRC("xmlns"), qName);
|
| + }
|
| + if (pwsSpace) {
|
| + break;
|
| + }
|
| + pElement = pElement->GetParent();
|
| + } while (pElement);
|
| + return pwsSpace ? FX_UTF8Encode(*pwsSpace) : CFX_ByteString();
|
| +}
|
| +void CXML_Element::GetAttrByIndex(int index,
|
| + CFX_ByteString& space,
|
| + CFX_ByteString& name,
|
| + CFX_WideString& value) const {
|
| + if (index < 0 || index >= m_AttrMap.GetSize()) {
|
| + return;
|
| + }
|
| + CXML_AttrItem& item = m_AttrMap.GetAt(index);
|
| + space = item.m_QSpaceName;
|
| + name = item.m_AttrName;
|
| + value = item.m_Value;
|
| +}
|
| +FX_BOOL CXML_Element::HasAttr(const CFX_ByteStringC& name) const {
|
| + CFX_ByteStringC bsSpace, bsName;
|
| + FX_XML_SplitQualifiedName(name, bsSpace, bsName);
|
| + return m_AttrMap.Lookup(bsSpace, bsName) != NULL;
|
| +}
|
| +FX_BOOL CXML_Element::GetAttrValue(const CFX_ByteStringC& name,
|
| + CFX_WideString& attribute) const {
|
| + CFX_ByteStringC bsSpace, bsName;
|
| + FX_XML_SplitQualifiedName(name, bsSpace, bsName);
|
| + return GetAttrValue(bsSpace, bsName, attribute);
|
| +}
|
| +FX_BOOL CXML_Element::GetAttrValue(const CFX_ByteStringC& space,
|
| + const CFX_ByteStringC& name,
|
| + CFX_WideString& attribute) const {
|
| + const CFX_WideString* pValue = m_AttrMap.Lookup(space, name);
|
| + if (pValue) {
|
| + attribute = *pValue;
|
| + return TRUE;
|
| + }
|
| + return FALSE;
|
| +}
|
| +FX_BOOL CXML_Element::GetAttrInteger(const CFX_ByteStringC& name,
|
| + int& attribute) const {
|
| + CFX_ByteStringC bsSpace, bsName;
|
| + FX_XML_SplitQualifiedName(name, bsSpace, bsName);
|
| + const CFX_WideString* pwsValue = m_AttrMap.Lookup(bsSpace, bsName);
|
| + if (pwsValue) {
|
| + attribute = pwsValue->GetInteger();
|
| + return TRUE;
|
| + }
|
| + return FALSE;
|
| +}
|
| +FX_BOOL CXML_Element::GetAttrInteger(const CFX_ByteStringC& space,
|
| + const CFX_ByteStringC& name,
|
| + int& attribute) const {
|
| + const CFX_WideString* pwsValue = m_AttrMap.Lookup(space, name);
|
| + if (pwsValue) {
|
| + attribute = pwsValue->GetInteger();
|
| + return TRUE;
|
| + }
|
| + return FALSE;
|
| +}
|
| +FX_BOOL CXML_Element::GetAttrFloat(const CFX_ByteStringC& name,
|
| + FX_FLOAT& attribute) const {
|
| + CFX_ByteStringC bsSpace, bsName;
|
| + FX_XML_SplitQualifiedName(name, bsSpace, bsName);
|
| + return GetAttrFloat(bsSpace, bsName, attribute);
|
| +}
|
| +FX_BOOL CXML_Element::GetAttrFloat(const CFX_ByteStringC& space,
|
| + const CFX_ByteStringC& name,
|
| + FX_FLOAT& attribute) const {
|
| + const CFX_WideString* pValue = m_AttrMap.Lookup(space, name);
|
| + if (pValue) {
|
| + attribute = pValue->GetFloat();
|
| + return TRUE;
|
| + }
|
| + return FALSE;
|
| +}
|
| +FX_DWORD CXML_Element::CountChildren() const {
|
| + return m_Children.GetSize() / 2;
|
| +}
|
| +CXML_Element::ChildType CXML_Element::GetChildType(FX_DWORD index) const {
|
| + index <<= 1;
|
| + if (index >= (FX_DWORD)m_Children.GetSize()) {
|
| + return Invalid;
|
| + }
|
| + return (ChildType)(uintptr_t)m_Children.GetAt(index);
|
| +}
|
| +CFX_WideString CXML_Element::GetContent(FX_DWORD index) const {
|
| + index <<= 1;
|
| + if (index >= (FX_DWORD)m_Children.GetSize() ||
|
| + (ChildType)(uintptr_t)m_Children.GetAt(index) != Content) {
|
| return CFX_WideString();
|
| -}
|
| -CXML_Element* CXML_Element::GetElement(FX_DWORD index) const
|
| -{
|
| - index <<= 1;
|
| - if (index >= (FX_DWORD)m_Children.GetSize() ||
|
| - (ChildType)(uintptr_t)m_Children.GetAt(index) != Element) {
|
| - return NULL;
|
| - }
|
| - return (CXML_Element*)m_Children.GetAt(index + 1);
|
| -}
|
| -FX_DWORD CXML_Element::CountElements(const CFX_ByteStringC& space, const CFX_ByteStringC& tag) const
|
| -{
|
| - int count = 0;
|
| - for (int i = 0; i < m_Children.GetSize(); i += 2) {
|
| - ChildType type = (ChildType)(uintptr_t)m_Children.GetAt(i);
|
| - if (type != Element) {
|
| - continue;
|
| - }
|
| - CXML_Element* pKid = (CXML_Element*)m_Children.GetAt(i + 1);
|
| - if ((space.IsEmpty() || pKid->m_QSpaceName == space) && pKid->m_TagName == tag) {
|
| - count ++;
|
| - }
|
| - }
|
| - return count;
|
| -}
|
| -CXML_Element* CXML_Element::GetElement(const CFX_ByteStringC& space, const CFX_ByteStringC& tag, int index) const
|
| -{
|
| - if (index < 0) {
|
| - return NULL;
|
| - }
|
| - for (int i = 0; i < m_Children.GetSize(); i += 2) {
|
| - ChildType type = (ChildType)(uintptr_t)m_Children.GetAt(i);
|
| - if (type != Element) {
|
| - continue;
|
| - }
|
| - CXML_Element* pKid = (CXML_Element*)m_Children.GetAt(i + 1);
|
| - if ((!space.IsEmpty() && pKid->m_QSpaceName != space) || pKid->m_TagName != tag) {
|
| - continue;
|
| - }
|
| - if (index -- == 0) {
|
| - return pKid;
|
| - }
|
| - }
|
| + }
|
| + CXML_Content* pContent = (CXML_Content*)m_Children.GetAt(index + 1);
|
| + if (pContent) {
|
| + return pContent->m_Content;
|
| + }
|
| + return CFX_WideString();
|
| +}
|
| +CXML_Element* CXML_Element::GetElement(FX_DWORD index) const {
|
| + index <<= 1;
|
| + if (index >= (FX_DWORD)m_Children.GetSize() ||
|
| + (ChildType)(uintptr_t)m_Children.GetAt(index) != Element) {
|
| return NULL;
|
| -}
|
| -FX_DWORD CXML_Element::FindElement(CXML_Element *pChild) const
|
| -{
|
| - for (int i = 0; i < m_Children.GetSize(); i += 2) {
|
| - if ((ChildType)(uintptr_t)m_Children.GetAt(i) == Element &&
|
| - (CXML_Element*)m_Children.GetAt(i + 1) == pChild) {
|
| - return (FX_DWORD)(i >> 1);
|
| - }
|
| - }
|
| - return (FX_DWORD) - 1;
|
| -}
|
| -const CFX_WideString* CXML_AttrMap::Lookup(const CFX_ByteStringC& space, const CFX_ByteStringC& name) const
|
| -{
|
| - if (m_pMap == NULL) {
|
| - return NULL;
|
| - }
|
| - for (int i = 0; i < m_pMap->GetSize(); i ++) {
|
| - CXML_AttrItem& item = GetAt(i);
|
| - if ((space.IsEmpty() || item.m_QSpaceName == space) && item.m_AttrName == name) {
|
| - return &item.m_Value;
|
| - }
|
| - }
|
| + }
|
| + return (CXML_Element*)m_Children.GetAt(index + 1);
|
| +}
|
| +FX_DWORD CXML_Element::CountElements(const CFX_ByteStringC& space,
|
| + const CFX_ByteStringC& tag) const {
|
| + int count = 0;
|
| + for (int i = 0; i < m_Children.GetSize(); i += 2) {
|
| + ChildType type = (ChildType)(uintptr_t)m_Children.GetAt(i);
|
| + if (type != Element) {
|
| + continue;
|
| + }
|
| + CXML_Element* pKid = (CXML_Element*)m_Children.GetAt(i + 1);
|
| + if ((space.IsEmpty() || pKid->m_QSpaceName == space) &&
|
| + pKid->m_TagName == tag) {
|
| + count++;
|
| + }
|
| + }
|
| + return count;
|
| +}
|
| +CXML_Element* CXML_Element::GetElement(const CFX_ByteStringC& space,
|
| + const CFX_ByteStringC& tag,
|
| + int index) const {
|
| + if (index < 0) {
|
| return NULL;
|
| -}
|
| -void CXML_AttrMap::SetAt(const CFX_ByteStringC& space, const CFX_ByteStringC& name, const CFX_WideStringC& value)
|
| -{
|
| - for (int i = 0; i < GetSize(); i++) {
|
| - CXML_AttrItem& item = GetAt(i);
|
| - if ((space.IsEmpty() || item.m_QSpaceName == space) && item.m_AttrName == name) {
|
| - item.m_Value = value;
|
| - return;
|
| - }
|
| - }
|
| - if (!m_pMap) {
|
| - m_pMap = new CFX_ObjectArray<CXML_AttrItem>;
|
| - }
|
| - CXML_AttrItem* pItem = (CXML_AttrItem*)m_pMap->AddSpace();
|
| - if (!pItem) {
|
| - return;
|
| - }
|
| - pItem->m_QSpaceName = space;
|
| - pItem->m_AttrName = name;
|
| - pItem->m_Value = value;
|
| -}
|
| -void CXML_AttrMap::RemoveAt(const CFX_ByteStringC& space, const CFX_ByteStringC& name)
|
| -{
|
| - if (m_pMap == NULL) {
|
| - return;
|
| - }
|
| - for (int i = 0; i < m_pMap->GetSize(); i ++) {
|
| - CXML_AttrItem& item = GetAt(i);
|
| - if ((space.IsEmpty() || item.m_QSpaceName == space) && item.m_AttrName == name) {
|
| - m_pMap->RemoveAt(i);
|
| - return;
|
| - }
|
| - }
|
| -}
|
| -int CXML_AttrMap::GetSize() const
|
| -{
|
| - return m_pMap == NULL ? 0 : m_pMap->GetSize();
|
| -}
|
| -CXML_AttrItem& CXML_AttrMap::GetAt(int index) const
|
| -{
|
| - ASSERT(m_pMap != NULL);
|
| - return (*m_pMap)[index];
|
| -}
|
| -void CXML_AttrMap::RemoveAll()
|
| -{
|
| - if (!m_pMap) {
|
| - return;
|
| - }
|
| - m_pMap->RemoveAll();
|
| - delete m_pMap;
|
| - m_pMap = NULL;
|
| + }
|
| + for (int i = 0; i < m_Children.GetSize(); i += 2) {
|
| + ChildType type = (ChildType)(uintptr_t)m_Children.GetAt(i);
|
| + if (type != Element) {
|
| + continue;
|
| + }
|
| + CXML_Element* pKid = (CXML_Element*)m_Children.GetAt(i + 1);
|
| + if ((!space.IsEmpty() && pKid->m_QSpaceName != space) ||
|
| + pKid->m_TagName != tag) {
|
| + continue;
|
| + }
|
| + if (index-- == 0) {
|
| + return pKid;
|
| + }
|
| + }
|
| + return NULL;
|
| +}
|
| +FX_DWORD CXML_Element::FindElement(CXML_Element* pChild) const {
|
| + for (int i = 0; i < m_Children.GetSize(); i += 2) {
|
| + if ((ChildType)(uintptr_t)m_Children.GetAt(i) == Element &&
|
| + (CXML_Element*)m_Children.GetAt(i + 1) == pChild) {
|
| + return (FX_DWORD)(i >> 1);
|
| + }
|
| + }
|
| + return (FX_DWORD)-1;
|
| +}
|
| +const CFX_WideString* CXML_AttrMap::Lookup(const CFX_ByteStringC& space,
|
| + const CFX_ByteStringC& name) const {
|
| + if (m_pMap == NULL) {
|
| + return NULL;
|
| + }
|
| + for (int i = 0; i < m_pMap->GetSize(); i++) {
|
| + CXML_AttrItem& item = GetAt(i);
|
| + if ((space.IsEmpty() || item.m_QSpaceName == space) &&
|
| + item.m_AttrName == name) {
|
| + return &item.m_Value;
|
| + }
|
| + }
|
| + return NULL;
|
| +}
|
| +void CXML_AttrMap::SetAt(const CFX_ByteStringC& space,
|
| + const CFX_ByteStringC& name,
|
| + const CFX_WideStringC& value) {
|
| + for (int i = 0; i < GetSize(); i++) {
|
| + CXML_AttrItem& item = GetAt(i);
|
| + if ((space.IsEmpty() || item.m_QSpaceName == space) &&
|
| + item.m_AttrName == name) {
|
| + item.m_Value = value;
|
| + return;
|
| + }
|
| + }
|
| + if (!m_pMap) {
|
| + m_pMap = new CFX_ObjectArray<CXML_AttrItem>;
|
| + }
|
| + CXML_AttrItem* pItem = (CXML_AttrItem*)m_pMap->AddSpace();
|
| + if (!pItem) {
|
| + return;
|
| + }
|
| + pItem->m_QSpaceName = space;
|
| + pItem->m_AttrName = name;
|
| + pItem->m_Value = value;
|
| +}
|
| +void CXML_AttrMap::RemoveAt(const CFX_ByteStringC& space,
|
| + const CFX_ByteStringC& name) {
|
| + if (m_pMap == NULL) {
|
| + return;
|
| + }
|
| + for (int i = 0; i < m_pMap->GetSize(); i++) {
|
| + CXML_AttrItem& item = GetAt(i);
|
| + if ((space.IsEmpty() || item.m_QSpaceName == space) &&
|
| + item.m_AttrName == name) {
|
| + m_pMap->RemoveAt(i);
|
| + return;
|
| + }
|
| + }
|
| +}
|
| +int CXML_AttrMap::GetSize() const {
|
| + return m_pMap == NULL ? 0 : m_pMap->GetSize();
|
| +}
|
| +CXML_AttrItem& CXML_AttrMap::GetAt(int index) const {
|
| + ASSERT(m_pMap != NULL);
|
| + return (*m_pMap)[index];
|
| +}
|
| +void CXML_AttrMap::RemoveAll() {
|
| + if (!m_pMap) {
|
| + return;
|
| + }
|
| + m_pMap->RemoveAll();
|
| + delete m_pMap;
|
| + m_pMap = NULL;
|
| }
|
|
|