1d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann// Copyright 2017 PDFium Authors. All rights reserved.
2d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann// Use of this source code is governed by a BSD-style license that can be
3d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann// found in the LICENSE file.
4d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
5d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
7d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "core/fxcrt/xml/cfx_saxreaderhandler.h"
8d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
9d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include <string>
10d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
11d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "core/fxcrt/cfx_checksumcontext.h"
12d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
13d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCFX_SAXReaderHandler::CFX_SAXReaderHandler(CFX_ChecksumContext* pContext)
14d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    : m_pContext(pContext) {
15d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  ASSERT(m_pContext);
16d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
17d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
18d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCFX_SAXReaderHandler::~CFX_SAXReaderHandler() {}
19d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
20d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCFX_SAXContext* CFX_SAXReaderHandler::OnTagEnter(
21d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    const ByteStringView& bsTagName,
22d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    CFX_SAXItem::Type eType,
23d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    uint32_t dwStartPos) {
24d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  UpdateChecksum(true);
25d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (eType != CFX_SAXItem::Type::Tag &&
26d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      eType != CFX_SAXItem::Type::Instruction) {
27d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return nullptr;
28d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
29d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
30d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  m_SAXContext.m_eNode = eType;
31d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  m_SAXContext.m_TextBuf << "<";
32d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (eType == CFX_SAXItem::Type::Instruction)
33d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    m_SAXContext.m_TextBuf << "?";
34d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
35d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  m_SAXContext.m_TextBuf << bsTagName;
36d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  m_SAXContext.m_bsTagName = bsTagName;
37d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return &m_SAXContext;
38d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
39d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
40d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFX_SAXReaderHandler::OnTagAttribute(CFX_SAXContext* pTag,
41d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                          const ByteStringView& bsAttri,
42d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                          const ByteStringView& bsValue) {
43d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!pTag)
44d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return;
45d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  pTag->m_TextBuf << " " << bsAttri << "=\"" << bsValue << "\"";
46d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
47d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
48d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFX_SAXReaderHandler::OnTagBreak(CFX_SAXContext* pTag) {
49d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!pTag)
50d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return;
51d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
52d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  pTag->m_TextBuf << ">";
53d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  UpdateChecksum(false);
54d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
55d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
56d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFX_SAXReaderHandler::OnTagData(CFX_SAXContext* pTag,
57d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                     CFX_SAXItem::Type eType,
58d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                     const ByteStringView& bsData,
59d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                     uint32_t dwStartPos) {
60d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!pTag)
61d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return;
62d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
63d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (eType == CFX_SAXItem::Type::CharData)
64d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    pTag->m_TextBuf << "<![CDATA[";
65d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
66d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  pTag->m_TextBuf << bsData;
67d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (eType == CFX_SAXItem::Type::CharData)
68d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    pTag->m_TextBuf << "]]>";
69d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
70d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
71d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFX_SAXReaderHandler::OnTagClose(CFX_SAXContext* pTag, uint32_t dwEndPos) {
72d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!pTag)
73d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return;
74d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
75d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (pTag->m_eNode == CFX_SAXItem::Type::Instruction)
76d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    pTag->m_TextBuf << "?>";
77d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  else if (pTag->m_eNode == CFX_SAXItem::Type::Tag)
78d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    pTag->m_TextBuf << "></" << pTag->m_bsTagName.AsStringView() << ">";
79d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
80d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  UpdateChecksum(false);
81d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
82d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
83d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFX_SAXReaderHandler::OnTagEnd(CFX_SAXContext* pTag,
84d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                    const ByteStringView& bsTagName,
85d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                    uint32_t dwEndPos) {
86d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!pTag)
87d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return;
88d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
89d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  pTag->m_TextBuf << "</" << bsTagName << ">";
90d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  UpdateChecksum(false);
91d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
92d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
93d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFX_SAXReaderHandler::OnTargetData(CFX_SAXContext* pTag,
94d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                        CFX_SAXItem::Type eType,
95d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                        const ByteStringView& bsData,
96d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                        uint32_t dwStartPos) {
97d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!pTag && eType != CFX_SAXItem::Type::Comment)
98d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return;
99d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
100d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (eType == CFX_SAXItem::Type::Comment) {
101d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    m_SAXContext.m_TextBuf << "<!--" << bsData << "-->";
102d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    UpdateChecksum(false);
103d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  } else {
104d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    pTag->m_TextBuf << " " << bsData;
105d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
106d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
107d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
108d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFX_SAXReaderHandler::UpdateChecksum(bool bCheckSpace) {
109d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  int32_t iLength = m_SAXContext.m_TextBuf.tellp();
110d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (iLength < 1)
111d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return;
112d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
113d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  std::string sBuffer = m_SAXContext.m_TextBuf.str();
114d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  const uint8_t* pBuffer = reinterpret_cast<const uint8_t*>(sBuffer.c_str());
115d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  bool bUpdata = true;
116d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (bCheckSpace) {
117d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    bUpdata = false;
118d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    for (int32_t i = 0; i < iLength; i++) {
119d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      bUpdata = (pBuffer[i] > 0x20);
120d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      if (bUpdata)
121d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        break;
122d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    }
123d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
124d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (bUpdata)
125d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    m_pContext->Update(ByteStringView(pBuffer, iLength));
126d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
127d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  m_SAXContext.m_TextBuf.str("");
128d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
129