From 0d86ecb08e1b2c204333b1f1f6b0b014e5b2971c Mon Sep 17 00:00:00 2001 From: Dan Sinclair Date: Wed, 19 Apr 2017 09:19:57 -0400 Subject: Move fde XML parser to core MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This CL moves the XML parser from FDE into FXCRT and renames to CFX_ from CFDE_. Change-Id: I21a9590bf74daf5517df630d7e7a5de89da99ea4 Reviewed-on: https://pdfium-review.googlesource.com/4312 Commit-Queue: dsinclair Reviewed-by: Tom Sepez Reviewed-by: Nicolás Peña --- core/fxcrt/xml/cfx_xmlelement.cpp | 102 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 core/fxcrt/xml/cfx_xmlelement.cpp (limited to 'core/fxcrt/xml/cfx_xmlelement.cpp') diff --git a/core/fxcrt/xml/cfx_xmlelement.cpp b/core/fxcrt/xml/cfx_xmlelement.cpp new file mode 100644 index 0000000000..c6b70e1cc4 --- /dev/null +++ b/core/fxcrt/xml/cfx_xmlelement.cpp @@ -0,0 +1,102 @@ +// 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_xmlelement.h" + +#include "core/fxcrt/fx_ext.h" +#include "core/fxcrt/xml/cfx_xmlchardata.h" +#include "core/fxcrt/xml/cfx_xmltext.h" +#include "third_party/base/ptr_util.h" +#include "third_party/base/stl_util.h" + +CFX_XMLElement::CFX_XMLElement(const CFX_WideString& wsTag) + : CFX_XMLAttributeNode(wsTag) {} + +CFX_XMLElement::~CFX_XMLElement() {} + +FX_XMLNODETYPE CFX_XMLElement::GetType() const { + return FX_XMLNODE_Element; +} + +std::unique_ptr CFX_XMLElement::Clone() { + auto pClone = pdfium::MakeUnique(GetName()); + pClone->SetAttributes(GetAttributes()); + + CFX_WideString wsText; + CFX_XMLNode* pChild = m_pChild; + while (pChild) { + switch (pChild->GetType()) { + case FX_XMLNODE_Text: + wsText += static_cast(pChild)->GetText(); + break; + default: + break; + } + pChild = pChild->m_pNext; + } + pClone->SetTextData(wsText); + return pClone; +} + +CFX_WideString CFX_XMLElement::GetLocalTagName() const { + FX_STRSIZE iFind = GetName().Find(L':', 0); + if (iFind < 0) + return GetName(); + return GetName().Right(GetName().GetLength() - iFind - 1); +} + +CFX_WideString CFX_XMLElement::GetNamespacePrefix() const { + FX_STRSIZE iFind = GetName().Find(L':', 0); + if (iFind < 0) + return CFX_WideString(); + return GetName().Left(iFind); +} + +CFX_WideString CFX_XMLElement::GetNamespaceURI() const { + CFX_WideString wsAttri(L"xmlns"); + CFX_WideString wsPrefix = GetNamespacePrefix(); + if (wsPrefix.GetLength() > 0) { + wsAttri += L":"; + wsAttri += wsPrefix; + } + + auto* pNode = static_cast(this); + while (pNode) { + if (pNode->GetType() != FX_XMLNODE_Element) + break; + + auto* pElement = static_cast(pNode); + if (!pElement->HasAttribute(wsAttri)) { + pNode = pNode->GetNodeItem(CFX_XMLNode::Parent); + continue; + } + return pElement->GetString(wsAttri); + } + return CFX_WideString(); +} + +CFX_WideString CFX_XMLElement::GetTextData() const { + CFX_WideTextBuf buffer; + CFX_XMLNode* pChild = m_pChild; + while (pChild) { + switch (pChild->GetType()) { + case FX_XMLNODE_Text: + case FX_XMLNODE_CharData: + buffer << static_cast(pChild)->GetText(); + break; + default: + break; + } + pChild = pChild->m_pNext; + } + return buffer.MakeString(); +} + +void CFX_XMLElement::SetTextData(const CFX_WideString& wsText) { + if (wsText.GetLength() < 1) + return; + InsertChildNode(new CFX_XMLText(wsText)); +} -- cgit v1.2.3