summaryrefslogtreecommitdiff
path: root/core/src/fxcrt/xml_int.h
blob: ec8bdc28500f87562225ffc9afb17dbb11d7e1ee (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
// Copyright 2014 PDFium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

#ifndef CORE_SRC_FXCRT_XML_INT_H_
#define CORE_SRC_FXCRT_XML_INT_H_

#include "../../include/fxcrt/fx_stream.h"

class CXML_DataBufAcc : public IFX_BufferRead
{
public:
    CXML_DataBufAcc(const uint8_t* pBuffer, size_t size)
        : m_pBuffer(pBuffer)
        , m_dwSize(size)
        , m_dwCurPos(0)
    {
    }
    virtual ~CXML_DataBufAcc() {}
    virtual void			Release()
    {
        delete this;
    }
    virtual bool			IsEOF()
    {
        return m_dwCurPos >= m_dwSize;
    }
    virtual FX_FILESIZE		GetPosition()
    {
        return (FX_FILESIZE)m_dwCurPos;
    }
    virtual size_t			ReadBlock(void* buffer, size_t size)
    {
        return 0;
    }
    virtual bool			ReadNextBlock(bool bRestart = false)
    {
        if (bRestart) {
            m_dwCurPos = 0;
        }
        if (m_dwCurPos < m_dwSize) {
            m_dwCurPos = m_dwSize;
            return true;
        }
        return false;
    }
    virtual const uint8_t*		GetBlockBuffer()
    {
        return m_pBuffer;
    }
    virtual size_t			GetBlockSize()
    {
        return m_dwSize;
    }
    virtual FX_FILESIZE		GetBlockOffset()
    {
        return 0;
    }
protected:
    const uint8_t*		m_pBuffer;
    size_t			m_dwSize;
    size_t			m_dwCurPos;
};
#define FX_XMLDATASTREAM_BufferSize		(32 * 1024)
class CXML_DataStmAcc : public IFX_BufferRead
{
public:
    CXML_DataStmAcc(IFX_FileRead *pFileRead)
        : m_pFileRead(pFileRead)
        , m_pBuffer(NULL)
        , m_nStart(0)
        , m_dwSize(0)
    {
        FXSYS_assert(m_pFileRead != NULL);
    }
    virtual ~CXML_DataStmAcc()
    {
        if (m_pBuffer) {
            FX_Free(m_pBuffer);
        }
    }
    virtual void			Release()
    {
        delete this;
    }
    virtual bool			IsEOF()
    {
        return m_nStart + (FX_FILESIZE)m_dwSize >= m_pFileRead->GetSize();
    }
    virtual FX_FILESIZE		GetPosition()
    {
        return m_nStart + (FX_FILESIZE)m_dwSize;
    }
    virtual size_t			ReadBlock(void* buffer, size_t size)
    {
        return 0;
    }
    virtual bool			ReadNextBlock(bool bRestart = false)
    {
        if (bRestart) {
            m_nStart = 0;
        }
        FX_FILESIZE nLength = m_pFileRead->GetSize();
        m_nStart += (FX_FILESIZE)m_dwSize;
        if (m_nStart >= nLength) {
            return false;
        }
        m_dwSize = (size_t)FX_MIN(FX_XMLDATASTREAM_BufferSize, nLength - m_nStart);
        if (!m_pBuffer) {
            m_pBuffer = FX_Alloc(uint8_t, m_dwSize);
        }
        return m_pFileRead->ReadBlock(m_pBuffer, m_nStart, m_dwSize);
    }
    virtual const uint8_t*		GetBlockBuffer()
    {
        return (const uint8_t*)m_pBuffer;
    }
    virtual size_t			GetBlockSize()
    {
        return m_dwSize;
    }
    virtual FX_FILESIZE		GetBlockOffset()
    {
        return m_nStart;
    }
protected:
    IFX_FileRead	*m_pFileRead;
    uint8_t*		m_pBuffer;
    FX_FILESIZE		m_nStart;
    size_t			m_dwSize;
};
class CXML_Parser
{
public:
    ~CXML_Parser();
    IFX_BufferRead*	m_pDataAcc;
    bool			m_bOwnedStream;
    FX_FILESIZE		m_nOffset;
    bool			m_bSaveSpaceChars;
    const uint8_t*		m_pBuffer;
    size_t			m_dwBufferSize;
    FX_FILESIZE		m_nBufferOffset;
    size_t			m_dwIndex;
    bool			Init(uint8_t* pBuffer, size_t size);
    bool			Init(IFX_FileRead *pFileRead);
    bool			Init(IFX_BufferRead *pBuffer);
    bool			Init(bool bOwndedStream);
    bool			ReadNextBlock();
    bool			IsEOF();
    bool			HaveAvailData();
    void			SkipWhiteSpaces();
    void			GetName(CFX_ByteString& space, CFX_ByteString& name);
    void			GetAttrValue(CFX_WideString &value);
    FX_DWORD		GetCharRef();
    void			GetTagName(CFX_ByteString &space, CFX_ByteString &name, bool &bEndTag, bool bStartTag = false);
    void			SkipLiterals(const CFX_ByteStringC& str);
    CXML_Element*	ParseElement(CXML_Element* pParent, bool bStartTag = false);
    void			InsertContentSegment(bool bCDATA, const CFX_WideStringC& content, CXML_Element* pElement);
    void			InsertCDATASegment(CFX_UTF8Decoder& decoder, CXML_Element* pElement);
};
void FX_XML_SplitQualifiedName(const CFX_ByteStringC& bsFullName, CFX_ByteStringC &bsSpace, CFX_ByteStringC &bsName);

#endif  // CORE_SRC_FXCRT_XML_INT_H_