blob: 865d0c9fae31f3d5edb9e6e6fcb770897642b25e [file] [log] [blame]
// 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 XFA_FXFA_PARSER_XFA_UTILS_H_
#define XFA_FXFA_PARSER_XFA_UTILS_H_
#include "xfa/fde/xml/fde_xml.h"
#include "xfa/fgas/crt/fgas_stream.h"
#include "xfa/fgas/crt/fgas_utils.h"
#include "xfa/fxfa/fxfa_basic.h"
class CFDE_XMLElement;
class CFDE_XMLNode;
class CXFA_LocaleValue;
class CXFA_Node;
class CXFA_WidgetData;
bool XFA_FDEExtension_ResolveNamespaceQualifier(
CFDE_XMLElement* pNode,
const CFX_WideStringC& wsQualifier,
CFX_WideString& wsNamespaceURI);
template <class NodeType, class TraverseStrategy>
class CXFA_NodeIteratorTemplate {
public:
explicit CXFA_NodeIteratorTemplate(NodeType* pRoot)
: m_pRoot(pRoot), m_pCurrent(pRoot) {}
NodeType* GetRoot() const { return m_pRoot; }
NodeType* GetCurrent() const { return m_pCurrent; }
void Reset() { m_pCurrent = m_pRoot; }
bool SetCurrent(NodeType* pNode) {
if (!RootReachableFromNode(pNode)) {
m_pCurrent = nullptr;
return false;
}
m_pCurrent = pNode;
return true;
}
NodeType* MoveToPrev() {
if (!m_pRoot)
return nullptr;
if (!m_pCurrent) {
m_pCurrent = LastDescendant(m_pRoot);
return m_pCurrent;
}
NodeType* pSibling = PreviousSiblingWithinSubtree(m_pCurrent);
if (pSibling) {
m_pCurrent = LastDescendant(pSibling);
return m_pCurrent;
}
NodeType* pParent = ParentWithinSubtree(m_pCurrent);
if (pParent) {
m_pCurrent = pParent;
return m_pCurrent;
}
return nullptr;
}
NodeType* MoveToNext() {
if (!m_pRoot || !m_pCurrent)
return nullptr;
NodeType* pChild = TraverseStrategy::GetFirstChild(m_pCurrent);
if (pChild) {
m_pCurrent = pChild;
return m_pCurrent;
}
return SkipChildrenAndMoveToNext();
}
NodeType* SkipChildrenAndMoveToNext() {
if (!m_pRoot)
return nullptr;
NodeType* pNode = m_pCurrent;
while (pNode) {
NodeType* pSibling = NextSiblingWithinSubtree(pNode);
if (pSibling) {
m_pCurrent = pSibling;
return m_pCurrent;
}
pNode = ParentWithinSubtree(pNode);
}
m_pCurrent = nullptr;
return m_pCurrent;
}
protected:
bool RootReachableFromNode(NodeType* pNode) {
if (!pNode)
return false;
if (pNode == m_pRoot)
return true;
return RootReachableFromNode(TraverseStrategy::GetParent(pNode));
}
NodeType* ParentWithinSubtree(NodeType* pNode) {
if (!pNode || pNode == m_pRoot)
return nullptr;
return TraverseStrategy::GetParent(pNode);
}
NodeType* NextSiblingWithinSubtree(NodeType* pNode) {
if (pNode == m_pRoot)
return nullptr;
return TraverseStrategy::GetNextSibling(pNode);
}
NodeType* PreviousSiblingWithinSubtree(NodeType* pNode) {
NodeType* pParent = ParentWithinSubtree(pNode);
if (!pParent)
return nullptr;
NodeType* pCurrent = TraverseStrategy::GetFirstChild(pParent);
NodeType* pPrevious = nullptr;
while (pCurrent != pNode) {
pPrevious = pCurrent;
pCurrent = TraverseStrategy::GetNextSibling(pCurrent);
}
return pPrevious;
}
NodeType* LastChild(NodeType* pNode) {
NodeType* pPrevious = nullptr;
NodeType* pChild = TraverseStrategy::GetFirstChild(pNode);
while (pChild) {
pPrevious = pChild;
pChild = NextSiblingWithinSubtree(pChild);
}
return pPrevious;
}
NodeType* LastDescendant(NodeType* pNode) {
NodeType* pChild = LastChild(pNode);
return pChild ? LastDescendant(pChild) : pNode;
}
NodeType* m_pRoot;
NodeType* m_pCurrent;
};
CXFA_LocaleValue XFA_GetLocaleValue(CXFA_WidgetData* pWidgetData);
FX_DOUBLE XFA_ByteStringToDouble(const CFX_ByteStringC& szStringVal);
int32_t XFA_MapRotation(int32_t nRotation);
bool XFA_RecognizeRichText(CFDE_XMLElement* pRichTextXMLNode);
void XFA_GetPlainTextFromRichText(CFDE_XMLNode* pXMLNode,
CFX_WideString& wsPlainText);
bool XFA_FieldIsMultiListBox(CXFA_Node* pFieldNode);
void XFA_DataExporter_DealWithDataGroupNode(CXFA_Node* pDataNode);
void XFA_DataExporter_RegenerateFormFile(
CXFA_Node* pNode,
const CFX_RetainPtr<IFGAS_Stream>& pStream,
const FX_CHAR* pChecksum = nullptr,
bool bSaveXML = false);
const XFA_NOTSUREATTRIBUTE* XFA_GetNotsureAttribute(
XFA_Element eElement,
XFA_ATTRIBUTE eAttribute,
XFA_ATTRIBUTETYPE eType = XFA_ATTRIBUTETYPE_NOTSURE);
const XFA_SCRIPTATTRIBUTEINFO* XFA_GetScriptAttributeByName(
XFA_Element eElement,
const CFX_WideStringC& wsAttributeName);
const XFA_PROPERTY* XFA_GetPropertyOfElement(XFA_Element eElement,
XFA_Element eProperty,
uint32_t dwPacket);
const XFA_PROPERTY* XFA_GetElementProperties(XFA_Element eElement,
int32_t& iCount);
const uint8_t* XFA_GetElementAttributes(XFA_Element eElement, int32_t& iCount);
const XFA_ELEMENTINFO* XFA_GetElementByID(XFA_Element eName);
XFA_Element XFA_GetElementTypeForName(const CFX_WideStringC& wsName);
CXFA_Measurement XFA_GetAttributeDefaultValue_Measure(XFA_Element eElement,
XFA_ATTRIBUTE eAttribute,
uint32_t dwPacket);
bool XFA_GetAttributeDefaultValue(void*& pValue,
XFA_Element eElement,
XFA_ATTRIBUTE eAttribute,
XFA_ATTRIBUTETYPE eType,
uint32_t dwPacket);
const XFA_ATTRIBUTEINFO* XFA_GetAttributeByName(const CFX_WideStringC& wsName);
const XFA_ATTRIBUTEINFO* XFA_GetAttributeByID(XFA_ATTRIBUTE eName);
const XFA_ATTRIBUTEENUMINFO* XFA_GetAttributeEnumByName(
const CFX_WideStringC& wsName);
const XFA_PACKETINFO* XFA_GetPacketByIndex(XFA_PACKET ePacket);
const XFA_PACKETINFO* XFA_GetPacketByID(uint32_t dwPacket);
#endif // XFA_FXFA_PARSER_XFA_UTILS_H_