summaryrefslogtreecommitdiff
path: root/core/fxcrt/xml_int.h
blob: 9a2c28c11f4b58db0295a86ab2f515386162a8b1 (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
// 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_FXCRT_XML_INT_H_
#define CORE_FXCRT_XML_INT_H_

#include <algorithm>

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

class CFX_UTF8Decoder;
class CXML_Element;

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) {}
  ~CXML_DataBufAcc() override {}

  // IFX_BufferRead
  void Release() override { delete this; }
  FX_BOOL IsEOF() override { return m_dwCurPos >= m_dwSize; }
  FX_FILESIZE GetPosition() override { return (FX_FILESIZE)m_dwCurPos; }
  size_t ReadBlock(void* buffer, size_t size) override { return 0; }
  FX_BOOL ReadNextBlock(FX_BOOL bRestart = FALSE) override {
    if (bRestart) {
      m_dwCurPos = 0;
    }
    if (m_dwCurPos < m_dwSize) {
      m_dwCurPos = m_dwSize;
      return TRUE;
    }
    return FALSE;
  }
  const uint8_t* GetBlockBuffer() override { return m_pBuffer; }
  size_t GetBlockSize() override { return m_dwSize; }
  FX_FILESIZE GetBlockOffset() override { return 0; }

 protected:
  const uint8_t* m_pBuffer;
  size_t m_dwSize;
  size_t m_dwCurPos;
};

class CXML_DataStmAcc : public IFX_BufferRead {
 public:
  explicit CXML_DataStmAcc(IFX_FileRead* pFileRead)
      : m_pFileRead(pFileRead), m_pBuffer(NULL), m_nStart(0), m_dwSize(0) {
    FXSYS_assert(m_pFileRead);
  }
  ~CXML_DataStmAcc() override { FX_Free(m_pBuffer); }

  void Release() override { delete this; }
  FX_BOOL IsEOF() override {
    return m_nStart + (FX_FILESIZE)m_dwSize >= m_pFileRead->GetSize();
  }
  FX_FILESIZE GetPosition() override {
    return m_nStart + (FX_FILESIZE)m_dwSize;
  }
  size_t ReadBlock(void* buffer, size_t size) override { return 0; }
  FX_BOOL ReadNextBlock(FX_BOOL bRestart = FALSE) override {
    if (bRestart) {
      m_nStart = 0;
    }
    FX_FILESIZE nLength = m_pFileRead->GetSize();
    m_nStart += (FX_FILESIZE)m_dwSize;
    if (m_nStart >= nLength) {
      return FALSE;
    }
    static const FX_FILESIZE FX_XMLDATASTREAM_BufferSize = 32 * 1024;
    m_dwSize = static_cast<size_t>(
        std::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);
  }
  const uint8_t* GetBlockBuffer() override { return (const uint8_t*)m_pBuffer; }
  size_t GetBlockSize() override { return m_dwSize; }
  FX_FILESIZE GetBlockOffset() override { 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;
  FX_BOOL m_bOwnedStream;
  FX_FILESIZE m_nOffset;
  FX_BOOL m_bSaveSpaceChars;
  const uint8_t* m_pBuffer;
  size_t m_dwBufferSize;
  FX_FILESIZE m_nBufferOffset;
  size_t m_dwIndex;
  FX_BOOL Init(uint8_t* pBuffer, size_t size);
  FX_BOOL Init(IFX_FileRead* pFileRead);
  FX_BOOL Init(IFX_BufferRead* pBuffer);
  FX_BOOL Init(FX_BOOL bOwndedStream);
  FX_BOOL ReadNextBlock();
  FX_BOOL IsEOF();
  FX_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,
                  FX_BOOL& bEndTag,
                  FX_BOOL bStartTag = FALSE);
  void SkipLiterals(const CFX_ByteStringC& str);
  CXML_Element* ParseElement(CXML_Element* pParent, FX_BOOL bStartTag = FALSE);
  void InsertContentSegment(FX_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_FXCRT_XML_INT_H_