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