// Copyright 2017 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

#include "core/fxcrt/xml/cfx_saxreaderhandler.h"

#include "core/fxcrt/cfx_checksumcontext.h"

CFX_SAXReaderHandler::CFX_SAXReaderHandler(CFX_ChecksumContext* pContext)
    : m_pContext(pContext) {
  ASSERT(m_pContext);
}

CFX_SAXReaderHandler::~CFX_SAXReaderHandler() {}

CFX_SAXContext* CFX_SAXReaderHandler::OnTagEnter(
    const CFX_ByteStringC& bsTagName,
    CFX_SAXItem::Type eType,
    uint32_t dwStartPos) {
  UpdateChecksum(true);
  if (eType != CFX_SAXItem::Type::Tag &&
      eType != CFX_SAXItem::Type::Instruction) {
    return nullptr;
  }

  m_SAXContext.m_eNode = eType;
  m_SAXContext.m_TextBuf << "<";
  if (eType == CFX_SAXItem::Type::Instruction)
    m_SAXContext.m_TextBuf << "?";

  m_SAXContext.m_TextBuf << bsTagName.c_str();
  m_SAXContext.m_bsTagName = bsTagName;
  return &m_SAXContext;
}

void CFX_SAXReaderHandler::OnTagAttribute(CFX_SAXContext* pTag,
                                          const CFX_ByteStringC& bsAttri,
                                          const CFX_ByteStringC& bsValue) {
  if (!pTag)
    return;
  pTag->m_TextBuf << " " << bsAttri.c_str() << "=\"" << bsValue.c_str() << "\"";
}

void CFX_SAXReaderHandler::OnTagBreak(CFX_SAXContext* pTag) {
  if (!pTag)
    return;

  pTag->m_TextBuf << ">";
  UpdateChecksum(false);
}

void CFX_SAXReaderHandler::OnTagData(CFX_SAXContext* pTag,
                                     CFX_SAXItem::Type eType,
                                     const CFX_ByteStringC& bsData,
                                     uint32_t dwStartPos) {
  if (!pTag)
    return;

  if (eType == CFX_SAXItem::Type::CharData)
    pTag->m_TextBuf << "<![CDATA[";

  pTag->m_TextBuf << bsData.c_str();
  if (eType == CFX_SAXItem::Type::CharData)
    pTag->m_TextBuf << "]]>";
}

void CFX_SAXReaderHandler::OnTagClose(CFX_SAXContext* pTag, uint32_t dwEndPos) {
  if (!pTag)
    return;

  if (pTag->m_eNode == CFX_SAXItem::Type::Instruction)
    pTag->m_TextBuf << "?>";
  else if (pTag->m_eNode == CFX_SAXItem::Type::Tag)
    pTag->m_TextBuf << "></" << pTag->m_bsTagName.AsStringC().c_str() << ">";

  UpdateChecksum(false);
}

void CFX_SAXReaderHandler::OnTagEnd(CFX_SAXContext* pTag,
                                    const CFX_ByteStringC& bsTagName,
                                    uint32_t dwEndPos) {
  if (!pTag)
    return;

  pTag->m_TextBuf << "</" << bsTagName.c_str() << ">";
  UpdateChecksum(false);
}

void CFX_SAXReaderHandler::OnTargetData(CFX_SAXContext* pTag,
                                        CFX_SAXItem::Type eType,
                                        const CFX_ByteStringC& bsData,
                                        uint32_t dwStartPos) {
  if (!pTag && eType != CFX_SAXItem::Type::Comment)
    return;

  if (eType == CFX_SAXItem::Type::Comment) {
    m_SAXContext.m_TextBuf << "<!--" << bsData.c_str() << "-->";
    UpdateChecksum(false);
  } else {
    pTag->m_TextBuf << " " << bsData.c_str();
  }
}

void CFX_SAXReaderHandler::UpdateChecksum(bool bCheckSpace) {
  int32_t iLength = m_SAXContext.m_TextBuf.tellp();
  if (iLength < 1)
    return;

  const uint8_t* pBuffer =
      reinterpret_cast<const uint8_t*>(m_SAXContext.m_TextBuf.str().c_str());
  bool bUpdata = true;
  if (bCheckSpace) {
    bUpdata = false;
    for (int32_t i = 0; i < iLength; i++) {
      bUpdata = (pBuffer[i] > 0x20);
      if (bUpdata)
        break;
    }
  }
  if (bUpdata)
    m_pContext->Update(CFX_ByteStringC(pBuffer, iLength));

  m_SAXContext.m_TextBuf.str("");
}
