Index: xfa/src/fxfa/src/parser/xfa_parser_imp.cpp |
diff --git a/xfa/src/fxfa/src/parser/xfa_parser_imp.cpp b/xfa/src/fxfa/src/parser/xfa_parser_imp.cpp |
index 6064c0158f3eb3ef20c99b2765af3bed10dc1c32..b774c46517ba06fd49a79dd9642d7e6233b9c78d 100644 |
--- a/xfa/src/fxfa/src/parser/xfa_parser_imp.cpp |
+++ b/xfa/src/fxfa/src/parser/xfa_parser_imp.cpp |
@@ -1,1618 +1,1618 @@ |
-// 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 |
- |
-#include "xfa/src/foxitlib.h" |
-#include "xfa/src/fxfa/src/common/xfa_utils.h" |
-#include "xfa/src/fxfa/src/common/xfa_object.h" |
-#include "xfa/src/fxfa/src/common/xfa_document.h" |
-#include "xfa/src/fxfa/src/common/xfa_parser.h" |
-#include "xfa/src/fxfa/src/common/xfa_script.h" |
-#include "xfa/src/fxfa/src/common/xfa_docdata.h" |
-#include "xfa/src/fxfa/src/common/xfa_doclayout.h" |
-#include "xfa/src/fxfa/src/common/xfa_localemgr.h" |
-#include "xfa/src/fxfa/src/common/xfa_fm2jsapi.h" |
-#include "xfa_basic_imp.h" |
-#include "xfa_parser_imp.h" |
-IXFA_Parser* IXFA_Parser::Create(IXFA_ObjFactory* pFactory, |
- FX_BOOL bDocumentParser) { |
- return new CXFA_SimpleParser(pFactory, bDocumentParser); |
-} |
-CXFA_SimpleParser::CXFA_SimpleParser(IXFA_ObjFactory* pFactory, |
- FX_BOOL bDocumentParser) |
- : m_pXMLParser(nullptr), |
- m_pXMLDoc(nullptr), |
- m_pStream(nullptr), |
- m_pFileRead(nullptr), |
- m_pFactory(pFactory), |
- m_pRootNode(nullptr), |
- m_ePacketID(XFA_XDPPACKET_UNKNOWN), |
- m_bDocumentParser(bDocumentParser) { |
-} |
-CXFA_SimpleParser::~CXFA_SimpleParser() { |
- CloseParser(); |
-} |
-void CXFA_SimpleParser::SetFactory(IXFA_ObjFactory* pFactory) { |
- m_pFactory = pFactory; |
-} |
-static IFDE_XMLNode* XFA_FDEExtension_GetDocumentNode( |
- IFDE_XMLDoc* pXMLDoc, |
- FX_BOOL bVerifyWellFormness = FALSE) { |
- if (!pXMLDoc) { |
- return NULL; |
- } |
- IFDE_XMLNode* pXMLFakeRoot = pXMLDoc->GetRoot(); |
- for (IFDE_XMLNode* pXMLNode = |
- pXMLFakeRoot->GetNodeItem(IFDE_XMLNode::FirstChild); |
- pXMLNode; pXMLNode = pXMLNode->GetNodeItem(IFDE_XMLNode::NextSibling)) { |
- if (pXMLNode->GetType() == FDE_XMLNODE_Element) { |
- if (bVerifyWellFormness) { |
- for (IFDE_XMLNode* pNextNode = |
- pXMLNode->GetNodeItem(IFDE_XMLNode::NextSibling); |
- pNextNode; |
- pNextNode = pNextNode->GetNodeItem(IFDE_XMLNode::NextSibling)) { |
- if (pNextNode->GetType() == FDE_XMLNODE_Element) { |
- return FALSE; |
- } |
- } |
- } |
- return pXMLNode; |
- } |
- } |
- return NULL; |
-} |
-int32_t CXFA_SimpleParser::StartParse(IFX_FileRead* pStream, |
- XFA_XDPPACKET ePacketID) { |
- CloseParser(); |
- m_pFileRead = pStream; |
- m_pStream = IFX_Stream::CreateStream( |
- pStream, FX_STREAMACCESS_Read | FX_STREAMACCESS_Text); |
- if (m_pStream == NULL) { |
- return XFA_PARSESTATUS_StreamErr; |
- } |
- FX_WORD wCodePage = m_pStream->GetCodePage(); |
- if (wCodePage != FX_CODEPAGE_UTF16LE && wCodePage != FX_CODEPAGE_UTF16BE && |
- wCodePage != FX_CODEPAGE_UTF8) { |
- m_pStream->SetCodePage(FX_CODEPAGE_UTF8); |
- } |
- m_pXMLDoc = IFDE_XMLDoc::Create(); |
- if (m_pXMLDoc == NULL) { |
- return XFA_PARSESTATUS_StatusErr; |
- } |
- m_pXMLParser = new CXFA_XMLParser(m_pXMLDoc->GetRoot(), m_pStream); |
- if (m_pXMLParser == NULL) { |
- return XFA_PARSESTATUS_StatusErr; |
- } |
- if (!m_pXMLDoc->LoadXML(m_pXMLParser)) { |
- return XFA_PARSESTATUS_StatusErr; |
- } |
- m_ePacketID = ePacketID; |
- return XFA_PARSESTATUS_Ready; |
-} |
-int32_t CXFA_SimpleParser::DoParse(IFX_Pause* pPause) { |
- if (m_pXMLDoc == NULL || m_ePacketID == XFA_XDPPACKET_UNKNOWN) { |
- return XFA_PARSESTATUS_StatusErr; |
- } |
- int32_t iRet = m_pXMLDoc->DoLoad(pPause); |
- if (iRet < 0) { |
- return XFA_PARSESTATUS_SyntaxErr; |
- } |
- if (iRet < 100) { |
- return iRet / 2; |
- } |
- m_pRootNode = ParseAsXDPPacket(XFA_FDEExtension_GetDocumentNode(m_pXMLDoc), |
- m_ePacketID); |
- m_pXMLDoc->CloseXML(); |
- if (m_pStream) { |
- m_pStream->Release(); |
- m_pStream = NULL; |
- } |
- if (!m_pRootNode) { |
- return XFA_PARSESTATUS_StatusErr; |
- } |
- return XFA_PARSESTATUS_Done; |
-} |
-int32_t CXFA_SimpleParser::ParseXMLData(const CFX_WideString& wsXML, |
- IFDE_XMLNode*& pXMLNode, |
- IFX_Pause* pPause) { |
- CloseParser(); |
- pXMLNode = NULL; |
- IFX_Stream* pStream = XFA_CreateWideTextRead(wsXML); |
- if (!pStream) { |
- return XFA_PARSESTATUS_StreamErr; |
- } |
- m_pStream = pStream; |
- m_pXMLDoc = IFDE_XMLDoc::Create(); |
- if (m_pXMLDoc == NULL) { |
- return XFA_PARSESTATUS_StatusErr; |
- } |
- CXFA_XMLParser* pParser = new CXFA_XMLParser(m_pXMLDoc->GetRoot(), m_pStream); |
- if (pParser == NULL) { |
- return XFA_PARSESTATUS_StatusErr; |
- } |
-#ifdef _XFA_VERIFY_Checksum_ |
- pParser->m_dwCheckStatus = 0x03; |
-#endif |
- if (!m_pXMLDoc->LoadXML(pParser)) { |
- return XFA_PARSESTATUS_StatusErr; |
- } |
- int32_t iRet = m_pXMLDoc->DoLoad(pPause); |
- if (iRet < 0 || iRet >= 100) { |
- m_pXMLDoc->CloseXML(); |
- } |
- if (iRet < 0) { |
- return XFA_PARSESTATUS_SyntaxErr; |
- } |
- if (iRet < 100) { |
- return iRet / 2; |
- } |
- if (m_pStream) { |
- m_pStream->Release(); |
- m_pStream = NULL; |
- } |
- pXMLNode = XFA_FDEExtension_GetDocumentNode(m_pXMLDoc); |
- return XFA_PARSESTATUS_Done; |
-} |
-void CXFA_SimpleParser::ConstructXFANode(CXFA_Node* pXFANode, |
- IFDE_XMLNode* pXMLNode) { |
- XFA_XDPPACKET ePacketID = (XFA_XDPPACKET)pXFANode->GetPacketID(); |
- if (ePacketID == XFA_XDPPACKET_Datasets) { |
- if (pXFANode->GetClassID() == XFA_ELEMENT_DataValue) { |
- for (IFDE_XMLNode* pXMLChild = |
- pXMLNode->GetNodeItem(IFDE_XMLNode::FirstChild); |
- pXMLChild; |
- pXMLChild = pXMLChild->GetNodeItem(IFDE_XMLNode::NextSibling)) { |
- FDE_XMLNODETYPE eNodeType = pXMLChild->GetType(); |
- if (eNodeType == FDE_XMLNODE_Instruction) { |
- continue; |
- } |
- if (eNodeType == FDE_XMLNODE_Element) { |
- CXFA_Node* pXFAChild = m_pFactory->CreateNode(XFA_XDPPACKET_Datasets, |
- XFA_ELEMENT_DataValue); |
- if (pXFAChild == NULL) { |
- return; |
- } |
- CFX_WideString wsNodeStr; |
- ((IFDE_XMLElement*)pXMLChild)->GetLocalTagName(wsNodeStr); |
- pXFAChild->SetCData(XFA_ATTRIBUTE_Name, wsNodeStr); |
- CFX_WideString wsChildValue; |
-#ifdef XFA_PARSE_HAS_LINEIDENTIFIER |
- XFA_GetPlainTextFromRichText((IFDE_XMLElement*)pXMLChild, |
- wsChildValue); |
-#else |
- XFA_ConvertRichTextToPlainText((IFDE_XMLElement*)pXMLChild, |
- wsChildValue); |
-#endif |
- if (!wsChildValue.IsEmpty()) { |
- pXFAChild->SetCData(XFA_ATTRIBUTE_Value, wsChildValue); |
- } |
- pXFANode->InsertChild(pXFAChild); |
- pXFAChild->SetXMLMappingNode(pXMLChild); |
- pXFAChild->SetFlag(XFA_NODEFLAG_Initialized, TRUE, FALSE); |
- break; |
- } |
- } |
- m_pRootNode = pXFANode; |
- } else { |
- m_pRootNode = DataLoader(pXFANode, pXMLNode, TRUE); |
- } |
- } else { |
- if (pXFANode->GetObjectType() == XFA_OBJECTTYPE_ContentNode) { |
- ParseContentNode(pXFANode, pXMLNode, ePacketID); |
- m_pRootNode = pXFANode; |
- } else { |
- m_pRootNode = NormalLoader(pXFANode, pXMLNode, ePacketID); |
- } |
- } |
-} |
-FX_BOOL XFA_FDEExtension_ResolveNamespaceQualifier( |
- IFDE_XMLElement* pNode, |
- const CFX_WideStringC& wsQualifier, |
- CFX_WideString& wsNamespaceURI) { |
- if (!pNode) { |
- return FALSE; |
- } |
- IFDE_XMLNode* pFakeRoot = pNode->GetNodeItem(IFDE_XMLNode::Root); |
- CFX_WideString wsNSAttribute; |
- FX_BOOL bRet = FALSE; |
- if (wsQualifier.IsEmpty()) { |
- wsNSAttribute = FX_WSTRC(L"xmlns"); |
- bRet = TRUE; |
- } else { |
- wsNSAttribute = FX_WSTRC(L"xmlns:") + wsQualifier; |
- } |
- for (; pNode != pFakeRoot; |
- pNode = (IFDE_XMLElement*)pNode->GetNodeItem(IFDE_XMLNode::Parent)) { |
- if (pNode->GetType() != FDE_XMLNODE_Element) { |
- continue; |
- } |
- if (pNode->HasAttribute(wsNSAttribute)) { |
- pNode->GetString(wsNSAttribute, wsNamespaceURI); |
- return TRUE; |
- } |
- } |
- wsNamespaceURI.Empty(); |
- return bRet; |
-} |
-static inline void XFA_FDEExtension_GetElementTagNamespaceURI( |
- IFDE_XMLElement* pElement, |
- CFX_WideString& wsNamespaceURI) { |
- CFX_WideString wsNodeStr; |
- pElement->GetNamespacePrefix(wsNodeStr); |
- if (!XFA_FDEExtension_ResolveNamespaceQualifier(pElement, wsNodeStr, |
- wsNamespaceURI)) { |
- wsNamespaceURI.Empty(); |
- } |
-} |
-static FX_BOOL XFA_FDEExtension_MatchNodeName( |
- IFDE_XMLNode* pNode, |
- const CFX_WideStringC& wsLocalTagName, |
- const CFX_WideStringC& wsNamespaceURIPrefix, |
- FX_DWORD eMatchFlags = XFA_XDPPACKET_FLAGS_NOMATCH) { |
- if (!pNode || pNode->GetType() != FDE_XMLNODE_Element) { |
- return FALSE; |
- } |
- IFDE_XMLElement* pElement = reinterpret_cast<IFDE_XMLElement*>(pNode); |
- CFX_WideString wsNodeStr; |
- pElement->GetLocalTagName(wsNodeStr); |
- if (wsNodeStr != wsLocalTagName) { |
- return FALSE; |
- } |
- XFA_FDEExtension_GetElementTagNamespaceURI(pElement, wsNodeStr); |
- if (eMatchFlags & XFA_XDPPACKET_FLAGS_NOMATCH) { |
- return TRUE; |
- } |
- if (eMatchFlags & XFA_XDPPACKET_FLAGS_PREFIXMATCH) { |
- return wsNodeStr.Left(wsNamespaceURIPrefix.GetLength()) == |
- wsNamespaceURIPrefix; |
- } |
- return wsNodeStr == wsNamespaceURIPrefix; |
-} |
-static FX_BOOL XFA_FDEExtension_GetAttributeLocalName( |
- const CFX_WideStringC& wsAttributeName, |
- CFX_WideString& wsLocalAttrName) { |
- CFX_WideString wsAttrName(wsAttributeName); |
- FX_STRSIZE iFind = wsAttrName.Find(L':', 0); |
- if (iFind < 0) { |
- wsLocalAttrName = wsAttrName; |
- return FALSE; |
- } else { |
- wsLocalAttrName = wsAttrName.Right(wsAttrName.GetLength() - iFind - 1); |
- return TRUE; |
- } |
-} |
-static FX_BOOL XFA_FDEExtension_ResolveAttribute( |
- IFDE_XMLElement* pElement, |
- const CFX_WideStringC& wsAttributeName, |
- CFX_WideString& wsLocalAttrName, |
- CFX_WideString& wsNamespaceURI) { |
- CFX_WideString wsAttrName(wsAttributeName); |
- CFX_WideString wsNSPrefix; |
- if (XFA_FDEExtension_GetAttributeLocalName(wsAttributeName, |
- wsLocalAttrName)) { |
- wsNSPrefix = wsAttrName.Left(wsAttributeName.GetLength() - |
- wsLocalAttrName.GetLength() - 1); |
- } |
- if (wsLocalAttrName == FX_WSTRC(L"xmlns") || |
- wsNSPrefix == FX_WSTRC(L"xmlns") || wsNSPrefix == FX_WSTRC(L"xml")) { |
- return FALSE; |
- } |
- if (!XFA_FDEExtension_ResolveNamespaceQualifier(pElement, wsNSPrefix, |
- wsNamespaceURI)) { |
- wsNamespaceURI.Empty(); |
- return FALSE; |
- } |
- return TRUE; |
-} |
-static FX_BOOL XFA_FDEExtension_FindAttributeWithNS( |
- IFDE_XMLElement* pElement, |
- const CFX_WideStringC& wsLocalAttributeName, |
- const CFX_WideStringC& wsNamespaceURIPrefix, |
- CFX_WideString& wsValue, |
- FX_BOOL bMatchNSAsPrefix = FALSE) { |
- if (!pElement) { |
- return FALSE; |
- } |
- CFX_WideString wsAttrName; |
- CFX_WideString wsAttrValue; |
- CFX_WideString wsAttrNS; |
- for (int32_t iAttrCount = pElement->CountAttributes(), i = 0; i < iAttrCount; |
- i++) { |
- pElement->GetAttribute(i, wsAttrName, wsAttrValue); |
- FX_STRSIZE iFind = wsAttrName.Find(L':', 0); |
- CFX_WideString wsNSPrefix; |
- if (iFind < 0) { |
- if (wsLocalAttributeName != wsAttrName) { |
- continue; |
- } |
- } else { |
- if (wsLocalAttributeName != |
- wsAttrName.Right(wsAttrName.GetLength() - iFind - 1)) { |
- continue; |
- } |
- wsNSPrefix = wsAttrName.Left(iFind); |
- } |
- if (!XFA_FDEExtension_ResolveNamespaceQualifier(pElement, wsNSPrefix, |
- wsAttrNS)) { |
- continue; |
- } |
- if (bMatchNSAsPrefix) { |
- if (wsAttrNS.Left(wsNamespaceURIPrefix.GetLength()) != |
- wsNamespaceURIPrefix) { |
- continue; |
- } |
- } else { |
- if (wsAttrNS != wsNamespaceURIPrefix) { |
- continue; |
- } |
- } |
- wsValue = wsAttrValue; |
- return TRUE; |
- } |
- return FALSE; |
-} |
-CXFA_Node* CXFA_SimpleParser::ParseAsXDPPacket(IFDE_XMLNode* pXMLDocumentNode, |
- XFA_XDPPACKET ePacketID) { |
- switch (ePacketID) { |
- case XFA_XDPPACKET_UNKNOWN: |
- return NULL; |
- case XFA_XDPPACKET_XDP: |
- return ParseAsXDPPacket_XDP(pXMLDocumentNode, ePacketID); |
- case XFA_XDPPACKET_Config: |
- return ParseAsXDPPacket_Config(pXMLDocumentNode, ePacketID); |
- case XFA_XDPPACKET_Template: |
- case XFA_XDPPACKET_Form: |
- return ParseAsXDPPacket_TemplateForm(pXMLDocumentNode, ePacketID); |
- case XFA_XDPPACKET_Datasets: |
- return ParseAsXDPPacket_Data(pXMLDocumentNode, ePacketID); |
- case XFA_XDPPACKET_Xdc: |
- return ParseAsXDPPacket_Xdc(pXMLDocumentNode, ePacketID); |
- case XFA_XDPPACKET_LocaleSet: |
- case XFA_XDPPACKET_ConnectionSet: |
- case XFA_XDPPACKET_SourceSet: |
- return ParseAsXDPPacket_LocaleConnectionSourceSet(pXMLDocumentNode, |
- ePacketID); |
- default: |
- return ParseAsXDPPacket_User(pXMLDocumentNode, ePacketID); |
- } |
- return NULL; |
-} |
-CXFA_Node* CXFA_SimpleParser::ParseAsXDPPacket_XDP( |
- IFDE_XMLNode* pXMLDocumentNode, |
- XFA_XDPPACKET ePacketID) { |
- if (!XFA_FDEExtension_MatchNodeName( |
- pXMLDocumentNode, XFA_GetPacketByIndex(XFA_PACKET_XDP)->pName, |
- XFA_GetPacketByIndex(XFA_PACKET_XDP)->pURI, |
- XFA_GetPacketByIndex(XFA_PACKET_XDP)->eFlags)) { |
- return nullptr; |
- } |
- CXFA_Node* pXFARootNode = |
- m_pFactory->CreateNode(XFA_XDPPACKET_XDP, XFA_ELEMENT_Xfa); |
- if (!pXFARootNode) { |
- return nullptr; |
- } |
- m_pRootNode = pXFARootNode; |
- pXFARootNode->SetCData(XFA_ATTRIBUTE_Name, FX_WSTRC(L"xfa")); |
- { |
- IFDE_XMLElement* pElement = (IFDE_XMLElement*)pXMLDocumentNode; |
- int32_t iAttributeCount = pElement->CountAttributes(); |
- for (int32_t i = 0; i < iAttributeCount; i++) { |
- CFX_WideString wsAttriName, wsAttriValue; |
- pElement->GetAttribute(i, wsAttriName, wsAttriValue); |
- if (wsAttriName == FX_WSTRC(L"uuid")) { |
- pXFARootNode->SetCData(XFA_ATTRIBUTE_Uuid, wsAttriValue); |
- } else if (wsAttriName == FX_WSTRC(L"timeStamp")) { |
- pXFARootNode->SetCData(XFA_ATTRIBUTE_TimeStamp, wsAttriValue); |
- } |
- } |
- } |
- IFDE_XMLNode* pXMLConfigDOMRoot = nullptr; |
- CXFA_Node* pXFAConfigDOMRoot = nullptr; |
- { |
- for (IFDE_XMLNode* pChildItem = |
- pXMLDocumentNode->GetNodeItem(IFDE_XMLNode::FirstChild); |
- pChildItem; |
- pChildItem = pChildItem->GetNodeItem(IFDE_XMLNode::NextSibling)) { |
- XFA_LPCPACKETINFO pPacketInfo = XFA_GetPacketByIndex(XFA_PACKET_Config); |
- if (!XFA_FDEExtension_MatchNodeName(pChildItem, pPacketInfo->pName, |
- pPacketInfo->pURI, |
- pPacketInfo->eFlags)) { |
- continue; |
- } |
- if (pXFARootNode->GetFirstChildByName(pPacketInfo->uHash)) { |
- return nullptr; |
- } |
- pXMLConfigDOMRoot = pChildItem; |
- pXFAConfigDOMRoot = |
- ParseAsXDPPacket_Config(pXMLConfigDOMRoot, XFA_XDPPACKET_Config); |
- pXFARootNode->InsertChild(pXFAConfigDOMRoot, NULL); |
- } |
- } |
- IFDE_XMLNode* pXMLDatasetsDOMRoot = nullptr; |
- IFDE_XMLNode* pXMLFormDOMRoot = nullptr; |
- IFDE_XMLNode* pXMLTemplateDOMRoot = nullptr; |
- { |
- for (IFDE_XMLNode* pChildItem = |
- pXMLDocumentNode->GetNodeItem(IFDE_XMLNode::FirstChild); |
- pChildItem; |
- pChildItem = pChildItem->GetNodeItem(IFDE_XMLNode::NextSibling)) { |
- if (!pChildItem || pChildItem->GetType() != FDE_XMLNODE_Element) { |
- continue; |
- } |
- if (pChildItem == pXMLConfigDOMRoot) { |
- continue; |
- } |
- IFDE_XMLElement* pElement = |
- reinterpret_cast<IFDE_XMLElement*>(pChildItem); |
- CFX_WideString wsPacketName; |
- pElement->GetLocalTagName(wsPacketName); |
- XFA_LPCPACKETINFO pPacketInfo = XFA_GetPacketByName(wsPacketName); |
- if (pPacketInfo && pPacketInfo->pURI) { |
- if (!XFA_FDEExtension_MatchNodeName(pElement, pPacketInfo->pName, |
- pPacketInfo->pURI, |
- pPacketInfo->eFlags)) { |
- pPacketInfo = nullptr; |
- } |
- } |
- XFA_XDPPACKET ePacket = |
- pPacketInfo ? pPacketInfo->eName : XFA_XDPPACKET_USER; |
- if (ePacket == XFA_XDPPACKET_XDP) { |
- continue; |
- } |
- if (ePacket == XFA_XDPPACKET_Datasets) { |
- if (pXMLDatasetsDOMRoot) { |
- return nullptr; |
- } |
- pXMLDatasetsDOMRoot = pElement; |
- } else if (ePacket == XFA_XDPPACKET_Form) { |
- if (pXMLFormDOMRoot) { |
- return nullptr; |
- } |
- pXMLFormDOMRoot = pElement; |
- } else if (ePacket == XFA_XDPPACKET_Template) { |
- if (pXMLTemplateDOMRoot) { |
- // Found a duplicate template packet. |
- return nullptr; |
- } |
- CXFA_Node* pPacketNode = ParseAsXDPPacket(pElement, ePacket); |
- if (pPacketNode) { |
- pXMLTemplateDOMRoot = pElement; |
- pXFARootNode->InsertChild(pPacketNode); |
- } |
- } else { |
- CXFA_Node* pPacketNode = ParseAsXDPPacket(pElement, ePacket); |
- if (pPacketNode) { |
- if (pPacketInfo && |
- (pPacketInfo->eFlags & XFA_XDPPACKET_FLAGS_SUPPORTONE) && |
- pXFARootNode->GetFirstChildByName(pPacketInfo->uHash)) { |
- return nullptr; |
- } |
- pXFARootNode->InsertChild(pPacketNode); |
- } |
- } |
- } |
- } |
- if (!pXMLTemplateDOMRoot) { |
- // No template is found. |
- return nullptr; |
- } |
- if (pXMLDatasetsDOMRoot) { |
- CXFA_Node* pPacketNode = |
- ParseAsXDPPacket(pXMLDatasetsDOMRoot, XFA_XDPPACKET_Datasets); |
- if (pPacketNode) { |
- pXFARootNode->InsertChild(pPacketNode); |
- } |
- } |
- if (pXMLFormDOMRoot) { |
- CXFA_Node* pPacketNode = |
- ParseAsXDPPacket(pXMLFormDOMRoot, XFA_XDPPACKET_Form); |
- if (pPacketNode) { |
- pXFARootNode->InsertChild(pPacketNode); |
- } |
- } |
- pXFARootNode->SetXMLMappingNode(pXMLDocumentNode); |
- return pXFARootNode; |
-} |
-CXFA_Node* CXFA_SimpleParser::ParseAsXDPPacket_Config( |
- IFDE_XMLNode* pXMLDocumentNode, |
- XFA_XDPPACKET ePacketID) { |
- if (!XFA_FDEExtension_MatchNodeName( |
- pXMLDocumentNode, XFA_GetPacketByIndex(XFA_PACKET_Config)->pName, |
- XFA_GetPacketByIndex(XFA_PACKET_Config)->pURI, |
- XFA_GetPacketByIndex(XFA_PACKET_Config)->eFlags)) { |
- return NULL; |
- } |
- CXFA_Node* pNode = |
- m_pFactory->CreateNode(XFA_XDPPACKET_Config, XFA_ELEMENT_Config); |
- if (!pNode) { |
- return NULL; |
- } |
- pNode->SetCData(XFA_ATTRIBUTE_Name, |
- XFA_GetPacketByIndex(XFA_PACKET_Config)->pName); |
- if (!NormalLoader(pNode, pXMLDocumentNode, ePacketID)) { |
- return NULL; |
- } |
- pNode->SetXMLMappingNode(pXMLDocumentNode); |
- return pNode; |
-} |
-CXFA_Node* CXFA_SimpleParser::ParseAsXDPPacket_TemplateForm( |
- IFDE_XMLNode* pXMLDocumentNode, |
- XFA_XDPPACKET ePacketID) { |
- CXFA_Node* pNode = NULL; |
- if (ePacketID == XFA_XDPPACKET_Template) { |
- if (XFA_FDEExtension_MatchNodeName( |
- pXMLDocumentNode, XFA_GetPacketByIndex(XFA_PACKET_Template)->pName, |
- XFA_GetPacketByIndex(XFA_PACKET_Template)->pURI, |
- XFA_GetPacketByIndex(XFA_PACKET_Template)->eFlags)) { |
- pNode = |
- m_pFactory->CreateNode(XFA_XDPPACKET_Template, XFA_ELEMENT_Template); |
- if (!pNode) { |
- return NULL; |
- } |
- pNode->SetCData(XFA_ATTRIBUTE_Name, |
- XFA_GetPacketByIndex(XFA_PACKET_Template)->pName); |
- if (m_bDocumentParser) { |
- CFX_WideString wsNamespaceURI; |
- IFDE_XMLElement* pXMLDocumentElement = |
- (IFDE_XMLElement*)pXMLDocumentNode; |
- pXMLDocumentElement->GetNamespaceURI(wsNamespaceURI); |
- if (wsNamespaceURI.IsEmpty()) { |
- pXMLDocumentElement->GetString(L"xmlns:xfa", wsNamespaceURI); |
- } |
- pNode->GetDocument()->RecognizeXFAVersionNumber(wsNamespaceURI); |
- } |
- if (!NormalLoader(pNode, pXMLDocumentNode, ePacketID)) { |
- return NULL; |
- } |
- } |
- } else if (ePacketID == XFA_XDPPACKET_Form) { |
- if (XFA_FDEExtension_MatchNodeName( |
- pXMLDocumentNode, XFA_GetPacketByIndex(XFA_PACKET_Form)->pName, |
- XFA_GetPacketByIndex(XFA_PACKET_Form)->pURI, |
- XFA_GetPacketByIndex(XFA_PACKET_Form)->eFlags)) { |
- IFDE_XMLElement* pXMLDocumentElement = (IFDE_XMLElement*)pXMLDocumentNode; |
- CFX_WideString wsChecksum; |
- pXMLDocumentElement->GetString(L"checksum", wsChecksum); |
-#ifdef _XFA_VERIFY_Checksum_ |
- if (wsChecksum.GetLength() != 28 || |
- m_pXMLParser->m_dwCheckStatus != 0x03) { |
- return NULL; |
- } |
- IXFA_ChecksumContext* pChecksum = XFA_Checksum_Create(); |
- pChecksum->StartChecksum(); |
- pChecksum->UpdateChecksum(m_pFileRead, m_pXMLParser->m_nStart[0], |
- m_pXMLParser->m_nSize[0]); |
- pChecksum->UpdateChecksum(m_pFileRead, m_pXMLParser->m_nStart[1], |
- m_pXMLParser->m_nSize[1]); |
- pChecksum->FinishChecksum(); |
- CFX_ByteString bsCheck; |
- pChecksum->GetChecksum(bsCheck); |
- pChecksum->Release(); |
- if (bsCheck != wsChecksum.UTF8Encode()) { |
- return NULL; |
- } |
-#endif |
- pNode = m_pFactory->CreateNode(XFA_XDPPACKET_Form, XFA_ELEMENT_Form); |
- if (!pNode) { |
- return NULL; |
- } |
- pNode->SetCData(XFA_ATTRIBUTE_Name, |
- XFA_GetPacketByIndex(XFA_PACKET_Form)->pName); |
- pNode->SetAttribute(XFA_ATTRIBUTE_Checksum, wsChecksum); |
- CXFA_Node* pTemplateRoot = |
- m_pRootNode->GetFirstChildByClass(XFA_ELEMENT_Template); |
- CXFA_Node* pTemplateChosen = |
- pTemplateRoot |
- ? pTemplateRoot->GetFirstChildByClass(XFA_ELEMENT_Subform) |
- : NULL; |
- FX_BOOL bUseAttribute = TRUE; |
- if (pTemplateChosen && |
- pTemplateChosen->GetEnum(XFA_ATTRIBUTE_RestoreState) != |
- XFA_ATTRIBUTEENUM_Auto) { |
- bUseAttribute = FALSE; |
- } |
- if (!NormalLoader(pNode, pXMLDocumentNode, ePacketID, bUseAttribute)) { |
- return NULL; |
- } |
- } |
- } |
- if (pNode) { |
- pNode->SetXMLMappingNode(pXMLDocumentNode); |
- } |
- return pNode; |
-} |
-static IFDE_XMLNode* XFA_GetDataSetsFromXDP(IFDE_XMLNode* pXMLDocumentNode) { |
- if (XFA_FDEExtension_MatchNodeName( |
- pXMLDocumentNode, XFA_GetPacketByIndex(XFA_PACKET_Datasets)->pName, |
- XFA_GetPacketByIndex(XFA_PACKET_Datasets)->pURI, |
- XFA_GetPacketByIndex(XFA_PACKET_Datasets)->eFlags)) { |
- return pXMLDocumentNode; |
- } |
- if (!XFA_FDEExtension_MatchNodeName( |
- pXMLDocumentNode, XFA_GetPacketByIndex(XFA_PACKET_XDP)->pName, |
- XFA_GetPacketByIndex(XFA_PACKET_XDP)->pURI, |
- XFA_GetPacketByIndex(XFA_PACKET_XDP)->eFlags)) { |
- return NULL; |
- } |
- for (IFDE_XMLNode* pDatasetsNode = |
- pXMLDocumentNode->GetNodeItem(IFDE_XMLNode::FirstChild); |
- pDatasetsNode; |
- pDatasetsNode = pDatasetsNode->GetNodeItem(IFDE_XMLNode::NextSibling)) { |
- if (!XFA_FDEExtension_MatchNodeName( |
- pDatasetsNode, XFA_GetPacketByIndex(XFA_PACKET_Datasets)->pName, |
- XFA_GetPacketByIndex(XFA_PACKET_Datasets)->pURI, |
- XFA_GetPacketByIndex(XFA_PACKET_Datasets)->eFlags)) { |
- continue; |
- } |
- return pDatasetsNode; |
- } |
- return NULL; |
-} |
-CXFA_Node* CXFA_SimpleParser::ParseAsXDPPacket_Data( |
- IFDE_XMLNode* pXMLDocumentNode, |
- XFA_XDPPACKET ePacketID) { |
- IFDE_XMLNode* pDatasetsXMLNode = XFA_GetDataSetsFromXDP(pXMLDocumentNode); |
- if (pDatasetsXMLNode) { |
- CXFA_Node* pNode = |
- m_pFactory->CreateNode(XFA_XDPPACKET_Datasets, XFA_ELEMENT_DataModel); |
- if (!pNode) { |
- return NULL; |
- } |
- pNode->SetCData(XFA_ATTRIBUTE_Name, |
- XFA_GetPacketByIndex(XFA_PACKET_Datasets)->pName); |
- if (!DataLoader(pNode, pDatasetsXMLNode, FALSE)) { |
- return NULL; |
- } |
- pNode->SetXMLMappingNode(pDatasetsXMLNode); |
- return pNode; |
- } |
- IFDE_XMLNode* pDataXMLNode = NULL; |
- if (XFA_FDEExtension_MatchNodeName( |
- pXMLDocumentNode, FX_WSTRC(L"data"), |
- XFA_GetPacketByIndex(XFA_PACKET_Datasets)->pURI, |
- XFA_GetPacketByIndex(XFA_PACKET_Datasets)->eFlags)) { |
- ((IFDE_XMLElement*)pXMLDocumentNode)->RemoveAttribute(L"xmlns:xfa"); |
- pDataXMLNode = pXMLDocumentNode; |
- } else { |
- IFDE_XMLElement* pDataElement = |
- IFDE_XMLElement::Create(FX_WSTRC(L"xfa:data")); |
- IFDE_XMLNode* pParentXMLNode = |
- pXMLDocumentNode->GetNodeItem(IFDE_XMLNode::Parent); |
- if (pParentXMLNode) { |
- pParentXMLNode->RemoveChildNode(pXMLDocumentNode); |
- } |
- FXSYS_assert(pXMLDocumentNode->GetType() == FDE_XMLNODE_Element); |
- if (pXMLDocumentNode->GetType() == FDE_XMLNODE_Element) { |
- ((IFDE_XMLElement*)pXMLDocumentNode)->RemoveAttribute(L"xmlns:xfa"); |
- } |
- pDataElement->InsertChildNode(pXMLDocumentNode); |
- pDataXMLNode = pDataElement; |
- } |
- if (pDataXMLNode) { |
- CXFA_Node* pNode = |
- m_pFactory->CreateNode(XFA_XDPPACKET_Datasets, XFA_ELEMENT_DataGroup); |
- if (!pNode) { |
- if (pDataXMLNode != pXMLDocumentNode) { |
- pDataXMLNode->Release(); |
- } |
- return NULL; |
- } |
- CFX_WideString wsLocalName; |
- ((IFDE_XMLElement*)pDataXMLNode)->GetLocalTagName(wsLocalName); |
- pNode->SetCData(XFA_ATTRIBUTE_Name, wsLocalName); |
- if (!DataLoader(pNode, pDataXMLNode, TRUE)) { |
- return NULL; |
- } |
- pNode->SetXMLMappingNode(pDataXMLNode); |
- if (pDataXMLNode != pXMLDocumentNode) { |
- pNode->SetFlag(XFA_NODEFLAG_OwnXMLNode, TRUE, FALSE); |
- } |
- return pNode; |
- } |
- return NULL; |
-} |
-CXFA_Node* CXFA_SimpleParser::ParseAsXDPPacket_LocaleConnectionSourceSet( |
- IFDE_XMLNode* pXMLDocumentNode, |
- XFA_XDPPACKET ePacketID) { |
- CXFA_Node* pNode = NULL; |
- if (ePacketID == XFA_XDPPACKET_LocaleSet) { |
- if (XFA_FDEExtension_MatchNodeName( |
- pXMLDocumentNode, XFA_GetPacketByIndex(XFA_PACKET_LocaleSet)->pName, |
- XFA_GetPacketByIndex(XFA_PACKET_LocaleSet)->pURI, |
- XFA_GetPacketByIndex(XFA_PACKET_LocaleSet)->eFlags)) { |
- pNode = m_pFactory->CreateNode(XFA_XDPPACKET_LocaleSet, |
- XFA_ELEMENT_LocaleSet); |
- if (!pNode) { |
- return NULL; |
- } |
- pNode->SetCData(XFA_ATTRIBUTE_Name, |
- XFA_GetPacketByIndex(XFA_PACKET_LocaleSet)->pName); |
- if (!NormalLoader(pNode, pXMLDocumentNode, ePacketID)) { |
- return NULL; |
- } |
- } |
- } else if (ePacketID == XFA_XDPPACKET_ConnectionSet) { |
- if (XFA_FDEExtension_MatchNodeName( |
- pXMLDocumentNode, |
- XFA_GetPacketByIndex(XFA_PACKET_ConnectionSet)->pName, |
- XFA_GetPacketByIndex(XFA_PACKET_ConnectionSet)->pURI, |
- XFA_GetPacketByIndex(XFA_PACKET_ConnectionSet)->eFlags)) { |
- pNode = m_pFactory->CreateNode(XFA_XDPPACKET_ConnectionSet, |
- XFA_ELEMENT_ConnectionSet); |
- if (!pNode) { |
- return NULL; |
- } |
- pNode->SetCData(XFA_ATTRIBUTE_Name, |
- XFA_GetPacketByIndex(XFA_PACKET_ConnectionSet)->pName); |
- if (!NormalLoader(pNode, pXMLDocumentNode, ePacketID)) { |
- return NULL; |
- } |
- } |
- } else if (ePacketID == XFA_XDPPACKET_SourceSet) { |
- if (XFA_FDEExtension_MatchNodeName( |
- pXMLDocumentNode, XFA_GetPacketByIndex(XFA_PACKET_SourceSet)->pName, |
- XFA_GetPacketByIndex(XFA_PACKET_SourceSet)->pURI, |
- XFA_GetPacketByIndex(XFA_PACKET_SourceSet)->eFlags)) { |
- pNode = m_pFactory->CreateNode(XFA_XDPPACKET_SourceSet, |
- XFA_ELEMENT_SourceSet); |
- if (!pNode) { |
- return NULL; |
- } |
- pNode->SetCData(XFA_ATTRIBUTE_Name, |
- XFA_GetPacketByIndex(XFA_PACKET_SourceSet)->pName); |
- if (!NormalLoader(pNode, pXMLDocumentNode, ePacketID)) { |
- return NULL; |
- } |
- } |
- } |
- if (pNode) { |
- pNode->SetXMLMappingNode(pXMLDocumentNode); |
- } |
- return pNode; |
-} |
-CXFA_Node* CXFA_SimpleParser::ParseAsXDPPacket_Xdc( |
- IFDE_XMLNode* pXMLDocumentNode, |
- XFA_XDPPACKET ePacketID) { |
- if (XFA_FDEExtension_MatchNodeName( |
- pXMLDocumentNode, XFA_GetPacketByIndex(XFA_PACKET_Xdc)->pName, |
- XFA_GetPacketByIndex(XFA_PACKET_Xdc)->pURI, |
- XFA_GetPacketByIndex(XFA_PACKET_Xdc)->eFlags)) { |
- CXFA_Node* pNode = |
- m_pFactory->CreateNode(XFA_XDPPACKET_Xdc, XFA_ELEMENT_Xdc); |
- if (!pNode) { |
- return NULL; |
- } |
- pNode->SetCData(XFA_ATTRIBUTE_Name, |
- XFA_GetPacketByIndex(XFA_PACKET_Xdc)->pName); |
- pNode->SetXMLMappingNode(pXMLDocumentNode); |
- return pNode; |
- } |
- return NULL; |
-} |
-CXFA_Node* CXFA_SimpleParser::ParseAsXDPPacket_User( |
- IFDE_XMLNode* pXMLDocumentNode, |
- XFA_XDPPACKET ePacketID) { |
- CXFA_Node* pNode = |
- m_pFactory->CreateNode(XFA_XDPPACKET_XDP, XFA_ELEMENT_Packet); |
- if (!pNode) { |
- return NULL; |
- } |
- CFX_WideString wsName; |
- ((IFDE_XMLElement*)pXMLDocumentNode)->GetLocalTagName(wsName); |
- pNode->SetCData(XFA_ATTRIBUTE_Name, wsName); |
- if (!UserPacketLoader(pNode, pXMLDocumentNode)) { |
- return NULL; |
- } |
- pNode->SetXMLMappingNode(pXMLDocumentNode); |
- return pNode; |
-} |
-CXFA_Node* CXFA_SimpleParser::UserPacketLoader(CXFA_Node* pXFANode, |
- IFDE_XMLNode* pXMLDoc) { |
- return pXFANode; |
-} |
-static FX_BOOL XFA_FDEExtension_IsStringAllWhitespace(CFX_WideString wsText) { |
- wsText.TrimRight(L"\x20\x9\xD\xA"); |
- return wsText.IsEmpty(); |
-} |
-CXFA_Node* CXFA_SimpleParser::DataLoader(CXFA_Node* pXFANode, |
- IFDE_XMLNode* pXMLDoc, |
- FX_BOOL bDoTransform) { |
- ParseDataGroup(pXFANode, pXMLDoc, XFA_XDPPACKET_Datasets); |
- return pXFANode; |
-} |
-CXFA_Node* CXFA_SimpleParser::NormalLoader(CXFA_Node* pXFANode, |
- IFDE_XMLNode* pXMLDoc, |
- XFA_XDPPACKET ePacketID, |
- FX_BOOL bUseAttribute) { |
- FX_BOOL bOneOfPropertyFound = FALSE; |
- for (IFDE_XMLNode* pXMLChild = pXMLDoc->GetNodeItem(IFDE_XMLNode::FirstChild); |
- pXMLChild; |
- pXMLChild = pXMLChild->GetNodeItem(IFDE_XMLNode::NextSibling)) { |
- switch (pXMLChild->GetType()) { |
- case FDE_XMLNODE_Element: { |
- IFDE_XMLElement* pXMLElement = (IFDE_XMLElement*)pXMLChild; |
- CFX_WideString wsTagName; |
- pXMLElement->GetLocalTagName(wsTagName); |
- XFA_LPCELEMENTINFO pElemInfo = XFA_GetElementByName(wsTagName); |
- if (!pElemInfo) { |
- continue; |
- } |
- XFA_LPCPROPERTY pPropertyInfo = XFA_GetPropertyOfElement( |
- pXFANode->GetClassID(), pElemInfo->eName, ePacketID); |
- if (pPropertyInfo && |
- ((pPropertyInfo->uFlags & |
- (XFA_PROPERTYFLAG_OneOf | XFA_PROPERTYFLAG_DefaultOneOf)) != 0)) { |
- if (bOneOfPropertyFound) { |
- break; |
- } |
- bOneOfPropertyFound = TRUE; |
- } |
- CXFA_Node* pXFAChild = |
- m_pFactory->CreateNode(ePacketID, pElemInfo->eName); |
- if (pXFAChild == NULL) { |
- return NULL; |
- } |
- if (ePacketID == XFA_XDPPACKET_Config) { |
- pXFAChild->SetAttribute(XFA_ATTRIBUTE_Name, wsTagName); |
- } |
- FX_BOOL IsNeedValue = TRUE; |
- for (int32_t i = 0, count = pXMLElement->CountAttributes(); i < count; |
- i++) { |
- CFX_WideString wsAttrQualifiedName; |
- CFX_WideString wsAttrName; |
- CFX_WideString wsAttrValue; |
- pXMLElement->GetAttribute(i, wsAttrQualifiedName, wsAttrValue); |
- XFA_FDEExtension_GetAttributeLocalName(wsAttrQualifiedName, |
- wsAttrName); |
- if (wsAttrName == FX_WSTRC(L"nil") && |
- wsAttrValue == FX_WSTRC(L"true")) { |
- IsNeedValue = FALSE; |
- } |
- XFA_LPCATTRIBUTEINFO lpAttrInfo = XFA_GetAttributeByName(wsAttrName); |
- if (!lpAttrInfo) { |
- continue; |
- } |
- if (!bUseAttribute && lpAttrInfo->eName != XFA_ATTRIBUTE_Name && |
- lpAttrInfo->eName != XFA_ATTRIBUTE_Save) { |
- continue; |
- } |
- pXFAChild->SetAttribute(lpAttrInfo->eName, wsAttrValue); |
- } |
- pXFANode->InsertChild(pXFAChild); |
- if (pElemInfo->eName == XFA_ELEMENT_Validate || |
- pElemInfo->eName == XFA_ELEMENT_Locale) { |
- if (ePacketID == XFA_XDPPACKET_Config) { |
- ParseContentNode(pXFAChild, pXMLElement, ePacketID); |
- } else { |
- NormalLoader(pXFAChild, pXMLElement, ePacketID, bUseAttribute); |
- } |
- break; |
- } |
- switch (pXFAChild->GetObjectType()) { |
- case XFA_OBJECTTYPE_ContentNode: |
- case XFA_OBJECTTYPE_TextNode: |
- case XFA_OBJECTTYPE_NodeC: |
- case XFA_OBJECTTYPE_NodeV: |
- if (IsNeedValue) { |
- ParseContentNode(pXFAChild, pXMLElement, ePacketID); |
- } |
- break; |
- default: |
- NormalLoader(pXFAChild, pXMLElement, ePacketID, bUseAttribute); |
- break; |
- } |
- } break; |
- case FDE_XMLNODE_Instruction: |
- ParseInstruction(pXFANode, (IFDE_XMLInstruction*)pXMLChild, ePacketID); |
- break; |
- default: |
- break; |
- } |
- } |
- return pXFANode; |
-} |
-FX_BOOL XFA_RecognizeRichText(IFDE_XMLElement* pRichTextXMLNode) { |
- if (pRichTextXMLNode) { |
- CFX_WideString wsNamespaceURI; |
- XFA_FDEExtension_GetElementTagNamespaceURI(pRichTextXMLNode, |
- wsNamespaceURI); |
- if (wsNamespaceURI == FX_WSTRC(L"http://www.w3.org/1999/xhtml")) { |
- return TRUE; |
- } |
- } |
- return FALSE; |
-} |
-class RichTextNodeVisitor { |
- public: |
- static inline IFDE_XMLNode* GetFirstChild(IFDE_XMLNode* pNode) { |
- return pNode->GetNodeItem(IFDE_XMLNode::FirstChild); |
- } |
- static inline IFDE_XMLNode* GetNextSibling(IFDE_XMLNode* pNode) { |
- return pNode->GetNodeItem(IFDE_XMLNode::NextSibling); |
- } |
- static inline IFDE_XMLNode* GetParent(IFDE_XMLNode* pNode) { |
- return pNode->GetNodeItem(IFDE_XMLNode::Parent); |
- } |
-}; |
-#ifndef XFA_PARSE_HAS_LINEIDENTIFIER |
-void XFA_ConvertRichTextToPlainText(IFDE_XMLElement* pRichTextXMLNode, |
- CFX_WideString& wsOutput) { |
- CXFA_NodeIteratorTemplate<IFDE_XMLNode, RichTextNodeVisitor> sIterator( |
- pRichTextXMLNode); |
- CFX_WideTextBuf wsPlainTextBuf; |
- for (IFDE_XMLNode* pNode = sIterator.GetCurrent(); pNode; |
- pNode = sIterator.MoveToNext()) { |
- switch (pNode->GetType()) { |
- case FDE_XMLNODE_Text: { |
- CFX_WideString wsText; |
- ((IFDE_XMLText*)pNode)->GetText(wsText); |
- wsPlainTextBuf << wsText; |
- } break; |
- case FDE_XMLNODE_CharData: { |
- CFX_WideString wsText; |
- ((IFDE_XMLCharData*)pNode)->GetCharData(wsText); |
- wsPlainTextBuf << wsText; |
- } break; |
- default: |
- break; |
- } |
- } |
- wsOutput = wsPlainTextBuf.GetWideString(); |
-} |
-#endif |
-void XFA_ConvertXMLToPlainText(IFDE_XMLElement* pRootXMLNode, |
- CFX_WideString& wsOutput) { |
- for (IFDE_XMLNode* pXMLChild = |
- pRootXMLNode->GetNodeItem(IFDE_XMLNode::FirstChild); |
- pXMLChild; |
- pXMLChild = pXMLChild->GetNodeItem(IFDE_XMLNode::NextSibling)) { |
-#ifdef _DEBUG |
- FDE_XMLNODETYPE nodeType = pXMLChild->GetType(); |
-#endif |
- switch (pXMLChild->GetType()) { |
- case FDE_XMLNODE_Element: { |
- CFX_WideString wsTextData; |
- ((IFDE_XMLElement*)pXMLChild)->GetTextData(wsTextData); |
- wsTextData += FX_WSTRC(L"\n"); |
- wsOutput += wsTextData; |
- } break; |
- case FDE_XMLNODE_Text: { |
- CFX_WideString wsText; |
- ((IFDE_XMLText*)pXMLChild)->GetText(wsText); |
- if (XFA_FDEExtension_IsStringAllWhitespace(wsText)) { |
- continue; |
- } else { |
- wsOutput = wsText; |
- } |
- } break; |
- case FDE_XMLNODE_CharData: { |
- CFX_WideString wsCharData; |
- ((IFDE_XMLCharData*)pXMLChild)->GetCharData(wsCharData); |
- if (XFA_FDEExtension_IsStringAllWhitespace(wsCharData)) { |
- continue; |
- } else { |
- wsOutput = wsCharData; |
- } |
- } break; |
- default: |
- FXSYS_assert(FALSE); |
- break; |
- } |
- } |
-} |
-void CXFA_SimpleParser::ParseContentNode(CXFA_Node* pXFANode, |
- IFDE_XMLNode* pXMLNode, |
- XFA_XDPPACKET ePacketID) { |
- XFA_ELEMENT element = XFA_ELEMENT_Sharptext; |
- if (pXFANode->GetClassID() == XFA_ELEMENT_ExData) { |
- CFX_WideStringC wsContentType = |
- pXFANode->GetCData(XFA_ATTRIBUTE_ContentType); |
- if (wsContentType == FX_WSTRC(L"text/html")) { |
- element = XFA_ELEMENT_SharpxHTML; |
- } else if (wsContentType == FX_WSTRC(L"text/xml")) { |
- element = XFA_ELEMENT_Sharpxml; |
- } |
- } |
- if (element == XFA_ELEMENT_SharpxHTML) { |
- pXFANode->SetXMLMappingNode(pXMLNode); |
- } |
- CFX_WideString wsValue; |
- for (IFDE_XMLNode* pXMLChild = |
- pXMLNode->GetNodeItem(IFDE_XMLNode::FirstChild); |
- pXMLChild; |
- pXMLChild = pXMLChild->GetNodeItem(IFDE_XMLNode::NextSibling)) { |
- FDE_XMLNODETYPE eNodeType = pXMLChild->GetType(); |
- if (eNodeType == FDE_XMLNODE_Instruction) { |
- continue; |
- } |
- if (element == XFA_ELEMENT_SharpxHTML) { |
- if (eNodeType != FDE_XMLNODE_Element) { |
- break; |
- } |
- if (XFA_RecognizeRichText((IFDE_XMLElement*)pXMLChild)) { |
-#ifdef XFA_PARSE_HAS_LINEIDENTIFIER |
- XFA_GetPlainTextFromRichText((IFDE_XMLElement*)pXMLChild, wsValue); |
-#else |
- XFA_ConvertRichTextToPlainText((IFDE_XMLElement*)pXMLChild, wsValue); |
-#endif |
- } |
- } else if (element == XFA_ELEMENT_Sharpxml) { |
- if (eNodeType != FDE_XMLNODE_Element) { |
- break; |
- } |
- XFA_ConvertXMLToPlainText((IFDE_XMLElement*)pXMLChild, wsValue); |
- } else { |
- if (eNodeType == FDE_XMLNODE_Element) { |
- break; |
- } |
- if (eNodeType == FDE_XMLNODE_Text) { |
- ((IFDE_XMLText*)pXMLChild)->GetText(wsValue); |
- } else if (eNodeType == FDE_XMLNODE_CharData) { |
- ((IFDE_XMLCharData*)pXMLChild)->GetCharData(wsValue); |
- } |
- } |
- break; |
- } |
- if (!wsValue.IsEmpty()) { |
- if (pXFANode->GetObjectType() == XFA_OBJECTTYPE_ContentNode) { |
- CXFA_Node* pContentRawDataNode = |
- m_pFactory->CreateNode(ePacketID, element); |
- FXSYS_assert(pContentRawDataNode); |
- pContentRawDataNode->SetCData(XFA_ATTRIBUTE_Value, wsValue); |
- pXFANode->InsertChild(pContentRawDataNode); |
- } else { |
- pXFANode->SetCData(XFA_ATTRIBUTE_Value, wsValue); |
- } |
- } |
-} |
-void CXFA_SimpleParser::ParseDataGroup(CXFA_Node* pXFANode, |
- IFDE_XMLNode* pXMLNode, |
- XFA_XDPPACKET ePacketID) { |
- for (IFDE_XMLNode* pXMLChild = |
- pXMLNode->GetNodeItem(IFDE_XMLNode::FirstChild); |
- pXMLChild; |
- pXMLChild = pXMLChild->GetNodeItem(IFDE_XMLNode::NextSibling)) { |
- switch (pXMLChild->GetType()) { |
- case FDE_XMLNODE_Element: { |
- IFDE_XMLElement* pXMLElement = (IFDE_XMLElement*)pXMLChild; |
- { |
- CFX_WideString wsNamespaceURI; |
- XFA_FDEExtension_GetElementTagNamespaceURI(pXMLElement, |
- wsNamespaceURI); |
- if (wsNamespaceURI == |
- FX_WSTRC(L"http://www.xfa.com/schema/xfa-package/") || |
- wsNamespaceURI == |
- FX_WSTRC(L"http://www.xfa.org/schema/xfa-package/") || |
- wsNamespaceURI == |
- FX_WSTRC(L"http://www.w3.org/2001/XMLSchema-instance")) { |
- continue; |
- } |
- if (0) { |
- continue; |
- } |
- } |
- XFA_ELEMENT eNodeType = XFA_ELEMENT_DataModel; |
- if (eNodeType == XFA_ELEMENT_DataModel) { |
- CFX_WideString wsDataNodeAttr; |
- if (XFA_FDEExtension_FindAttributeWithNS( |
- pXMLElement, FX_WSTRC(L"dataNode"), |
- FX_WSTRC(L"http://www.xfa.org/schema/xfa-data/1.0/"), |
- wsDataNodeAttr)) { |
- if (wsDataNodeAttr == FX_WSTRC(L"dataGroup")) { |
- eNodeType = XFA_ELEMENT_DataGroup; |
- } else if (wsDataNodeAttr == FX_WSTRC(L"dataValue")) { |
- eNodeType = XFA_ELEMENT_DataValue; |
- } |
- } |
- } |
- CFX_WideString wsContentType; |
- if (eNodeType == XFA_ELEMENT_DataModel) { |
- if (XFA_FDEExtension_FindAttributeWithNS( |
- pXMLElement, FX_WSTRC(L"contentType"), |
- FX_WSTRC(L"http://www.xfa.org/schema/xfa-data/1.0/"), |
- wsContentType)) { |
- if (!wsContentType.IsEmpty()) { |
- eNodeType = XFA_ELEMENT_DataValue; |
- } |
- } |
- } |
- if (eNodeType == XFA_ELEMENT_DataModel) { |
- for (IFDE_XMLNode* pXMLDataChild = |
- pXMLElement->GetNodeItem(IFDE_XMLNode::FirstChild); |
- pXMLDataChild; pXMLDataChild = pXMLDataChild->GetNodeItem( |
- IFDE_XMLNode::NextSibling)) { |
- if (pXMLDataChild->GetType() == FDE_XMLNODE_Element) { |
- if (!XFA_RecognizeRichText((IFDE_XMLElement*)pXMLDataChild)) { |
- eNodeType = XFA_ELEMENT_DataGroup; |
- break; |
- } |
- } |
- } |
- } |
- if (eNodeType == XFA_ELEMENT_DataModel) { |
- eNodeType = XFA_ELEMENT_DataValue; |
- } |
- CXFA_Node* pXFAChild = |
- m_pFactory->CreateNode(XFA_XDPPACKET_Datasets, eNodeType); |
- if (pXFAChild == NULL) { |
- return; |
- } |
- CFX_WideString wsNodeName; |
- pXMLElement->GetLocalTagName(wsNodeName); |
- pXFAChild->SetCData(XFA_ATTRIBUTE_Name, wsNodeName); |
- FX_BOOL bNeedValue = TRUE; |
- if (1) { |
- for (int32_t i = 0, count = pXMLElement->CountAttributes(); i < count; |
- i++) { |
- CFX_WideString wsAttrQualifiedName; |
- CFX_WideString wsAttrValue; |
- CFX_WideString wsAttrName; |
- CFX_WideString wsAttrNamespaceURI; |
- pXMLElement->GetAttribute(i, wsAttrQualifiedName, wsAttrValue); |
- if (!XFA_FDEExtension_ResolveAttribute( |
- pXMLElement, wsAttrQualifiedName, wsAttrName, |
- wsAttrNamespaceURI)) { |
- continue; |
- } |
- if (wsAttrName == FX_WSTRC(L"nil") && |
- wsAttrValue == FX_WSTRC(L"true")) { |
- bNeedValue = FALSE; |
- continue; |
- } |
- if (wsAttrNamespaceURI == |
- FX_WSTRC(L"http://www.xfa.com/schema/xfa-package/") || |
- wsAttrNamespaceURI == |
- FX_WSTRC(L"http://www.xfa.org/schema/xfa-package/") || |
- wsAttrNamespaceURI == |
- FX_WSTRC(L"http://www.w3.org/2001/XMLSchema-instance") || |
- wsAttrNamespaceURI == |
- FX_WSTRC(L"http://www.xfa.org/schema/xfa-data/1.0/")) { |
- continue; |
- } |
- if (0) { |
- continue; |
- } |
- CXFA_Node* pXFAMetaData = m_pFactory->CreateNode( |
- XFA_XDPPACKET_Datasets, XFA_ELEMENT_DataValue); |
- if (pXFAMetaData == NULL) { |
- return; |
- } |
- pXFAMetaData->SetCData(XFA_ATTRIBUTE_Name, wsAttrName); |
- pXFAMetaData->SetCData(XFA_ATTRIBUTE_QualifiedName, |
- wsAttrQualifiedName); |
- pXFAMetaData->SetCData(XFA_ATTRIBUTE_Value, wsAttrValue); |
- pXFAMetaData->SetEnum(XFA_ATTRIBUTE_Contains, |
- XFA_ATTRIBUTEENUM_MetaData); |
- pXFAChild->InsertChild(pXFAMetaData); |
- pXFAMetaData->SetXMLMappingNode(pXMLElement); |
- pXFAMetaData->SetFlag(XFA_NODEFLAG_Initialized, TRUE, FALSE); |
- } |
- if (!bNeedValue) { |
- CFX_WideString wsNilName = FX_WSTRC(L"xsi:nil"); |
- pXMLElement->RemoveAttribute(wsNilName); |
- } |
- } |
- pXFANode->InsertChild(pXFAChild); |
- if (eNodeType == XFA_ELEMENT_DataGroup) { |
- ParseDataGroup(pXFAChild, pXMLElement, ePacketID); |
- } else { |
- if (bNeedValue) { |
- ParseDataValue(pXFAChild, pXMLChild, XFA_XDPPACKET_Datasets); |
- } |
- } |
- pXFAChild->SetXMLMappingNode(pXMLElement); |
- pXFAChild->SetFlag(XFA_NODEFLAG_Initialized, TRUE, FALSE); |
- } |
- continue; |
- case FDE_XMLNODE_CharData: { |
- IFDE_XMLCharData* pXMLCharData = (IFDE_XMLCharData*)pXMLChild; |
- CFX_WideString wsCharData; |
- pXMLCharData->GetCharData(wsCharData); |
- if (XFA_FDEExtension_IsStringAllWhitespace(wsCharData)) { |
- continue; |
- } |
- CXFA_Node* pXFAChild = m_pFactory->CreateNode(XFA_XDPPACKET_Datasets, |
- XFA_ELEMENT_DataValue); |
- if (pXFAChild == NULL) { |
- return; |
- } |
- pXFAChild->SetCData(XFA_ATTRIBUTE_Value, wsCharData); |
- pXFANode->InsertChild(pXFAChild); |
- pXFAChild->SetXMLMappingNode(pXMLCharData); |
- pXFAChild->SetFlag(XFA_NODEFLAG_Initialized, TRUE, FALSE); |
- } |
- continue; |
- case FDE_XMLNODE_Text: { |
- IFDE_XMLText* pXMLText = (IFDE_XMLText*)pXMLChild; |
- CFX_WideString wsText; |
- pXMLText->GetText(wsText); |
- if (XFA_FDEExtension_IsStringAllWhitespace(wsText)) { |
- continue; |
- } |
- CXFA_Node* pXFAChild = m_pFactory->CreateNode(XFA_XDPPACKET_Datasets, |
- XFA_ELEMENT_DataValue); |
- if (pXFAChild == NULL) { |
- return; |
- } |
- pXFAChild->SetCData(XFA_ATTRIBUTE_Value, wsText); |
- pXFANode->InsertChild(pXFAChild); |
- pXFAChild->SetXMLMappingNode(pXMLText); |
- pXFAChild->SetFlag(XFA_NODEFLAG_Initialized, TRUE, FALSE); |
- } |
- continue; |
- case FDE_XMLNODE_Instruction: |
- continue; |
- default: |
- continue; |
- } |
- } |
-} |
-void CXFA_SimpleParser::ParseDataValue(CXFA_Node* pXFANode, |
- IFDE_XMLNode* pXMLNode, |
- XFA_XDPPACKET ePacketID) { |
- CFX_WideTextBuf wsValueTextBuf; |
- CFX_WideTextBuf wsCurValueTextBuf; |
- FX_BOOL bMarkAsCompound = FALSE; |
- IFDE_XMLNode* pXMLCurValueNode = NULL; |
- for (IFDE_XMLNode* pXMLChild = |
- pXMLNode->GetNodeItem(IFDE_XMLNode::FirstChild); |
- pXMLChild; |
- pXMLChild = pXMLChild->GetNodeItem(IFDE_XMLNode::NextSibling)) { |
- FDE_XMLNODETYPE eNodeType = pXMLChild->GetType(); |
- if (eNodeType == FDE_XMLNODE_Instruction) { |
- continue; |
- } |
- CFX_WideString wsText; |
- if (eNodeType == FDE_XMLNODE_Text) { |
- ((IFDE_XMLText*)pXMLChild)->GetText(wsText); |
- if (!pXMLCurValueNode) { |
- pXMLCurValueNode = pXMLChild; |
- } |
- wsCurValueTextBuf << wsText; |
- } else if (eNodeType == FDE_XMLNODE_CharData) { |
- ((IFDE_XMLCharData*)pXMLChild)->GetCharData(wsText); |
- if (!pXMLCurValueNode) { |
- pXMLCurValueNode = pXMLChild; |
- } |
- wsCurValueTextBuf << wsText; |
- } else if (XFA_RecognizeRichText((IFDE_XMLElement*)pXMLChild)) { |
-#ifdef XFA_PARSE_HAS_LINEIDENTIFIER |
- XFA_GetPlainTextFromRichText((IFDE_XMLElement*)pXMLChild, wsText); |
-#else |
- XFA_ConvertRichTextToPlainText((IFDE_XMLElement*)pXMLChild, wsText); |
-#endif |
- if (!pXMLCurValueNode) { |
- pXMLCurValueNode = pXMLChild; |
- } |
- wsCurValueTextBuf << wsText; |
- } else { |
- bMarkAsCompound = TRUE; |
- if (pXMLCurValueNode) { |
- CFX_WideStringC wsCurValue = wsCurValueTextBuf.GetWideString(); |
- if (!wsCurValue.IsEmpty()) { |
- CXFA_Node* pXFAChild = |
- m_pFactory->CreateNode(ePacketID, XFA_ELEMENT_DataValue); |
- if (pXFAChild == NULL) { |
- return; |
- } |
- pXFAChild->SetCData(XFA_ATTRIBUTE_Name, FX_WSTRC(L"")); |
- pXFAChild->SetCData(XFA_ATTRIBUTE_Value, wsCurValue); |
- pXFANode->InsertChild(pXFAChild); |
- pXFAChild->SetXMLMappingNode(pXMLCurValueNode); |
- pXFAChild->SetFlag(XFA_NODEFLAG_Initialized, TRUE, FALSE); |
- wsValueTextBuf << wsCurValue; |
- wsCurValueTextBuf.Clear(); |
- } |
- pXMLCurValueNode = NULL; |
- } |
- CXFA_Node* pXFAChild = |
- m_pFactory->CreateNode(ePacketID, XFA_ELEMENT_DataValue); |
- if (pXFAChild == NULL) { |
- return; |
- } |
- CFX_WideString wsNodeStr; |
- ((IFDE_XMLElement*)pXMLChild)->GetLocalTagName(wsNodeStr); |
- pXFAChild->SetCData(XFA_ATTRIBUTE_Name, wsNodeStr); |
- ParseDataValue(pXFAChild, pXMLChild, ePacketID); |
- pXFANode->InsertChild(pXFAChild); |
- pXFAChild->SetXMLMappingNode(pXMLChild); |
- pXFAChild->SetFlag(XFA_NODEFLAG_Initialized, TRUE, FALSE); |
- CFX_WideStringC wsCurValue = pXFAChild->GetCData(XFA_ATTRIBUTE_Value); |
- wsValueTextBuf << wsCurValue; |
- } |
- } |
- if (pXMLCurValueNode) { |
- CFX_WideStringC wsCurValue = wsCurValueTextBuf.GetWideString(); |
- if (!wsCurValue.IsEmpty()) { |
- if (bMarkAsCompound) { |
- CXFA_Node* pXFAChild = |
- m_pFactory->CreateNode(ePacketID, XFA_ELEMENT_DataValue); |
- if (pXFAChild == NULL) { |
- return; |
- } |
- pXFAChild->SetCData(XFA_ATTRIBUTE_Name, FX_WSTRC(L"")); |
- pXFAChild->SetCData(XFA_ATTRIBUTE_Value, wsCurValue); |
- pXFANode->InsertChild(pXFAChild); |
- pXFAChild->SetXMLMappingNode(pXMLCurValueNode); |
- pXFAChild->SetFlag(XFA_NODEFLAG_Initialized, TRUE, FALSE); |
- } |
- wsValueTextBuf << wsCurValue; |
- wsCurValueTextBuf.Clear(); |
- } |
- pXMLCurValueNode = NULL; |
- } |
- CFX_WideStringC wsNodeValue = wsValueTextBuf.GetWideString(); |
- pXFANode->SetCData(XFA_ATTRIBUTE_Value, wsNodeValue); |
-} |
-void CXFA_SimpleParser::ParseInstruction(CXFA_Node* pXFANode, |
- IFDE_XMLInstruction* pXMLInstruction, |
- XFA_XDPPACKET ePacketID) { |
- if (!m_bDocumentParser) { |
- return; |
- } |
- CFX_WideString wsTargetName; |
- pXMLInstruction->GetTargetName(wsTargetName); |
- if (wsTargetName == FX_WSTRC(L"originalXFAVersion")) { |
- CFX_WideString wsData; |
- if (pXMLInstruction->GetData(0, wsData) && |
- (pXFANode->GetDocument()->RecognizeXFAVersionNumber(wsData) != |
- XFA_VERSION_UNKNOWN)) { |
- wsData.Empty(); |
- if (pXMLInstruction->GetData(1, wsData) && |
- wsData == FX_WSTRC(L"v2.7-scripting:1")) { |
- pXFANode->GetDocument()->SetFlag(XFA_DOCFLAG_Scripting, TRUE); |
- } |
- } |
- } else if (wsTargetName == FX_WSTRC(L"acrobat")) { |
- CFX_WideString wsData; |
- if (pXMLInstruction->GetData(0, wsData) && |
- wsData == FX_WSTRC(L"JavaScript")) { |
- if (pXMLInstruction->GetData(1, wsData) && |
- wsData == FX_WSTRC(L"strictScoping")) { |
- pXFANode->GetDocument()->SetFlag(XFA_DOCFLAG_StrictScoping, TRUE); |
- } |
- } |
- } |
-} |
-void CXFA_SimpleParser::CloseParser() { |
- if (m_pXMLDoc) { |
- m_pXMLDoc->Release(); |
- m_pXMLDoc = NULL; |
- } |
- if (m_pStream) { |
- m_pStream->Release(); |
- m_pStream = NULL; |
- } |
-} |
-IXFA_DocParser* IXFA_DocParser::Create(IXFA_Notify* pNotify) { |
- return new CXFA_DocumentParser(pNotify); |
-} |
-CXFA_DocumentParser::CXFA_DocumentParser(IXFA_Notify* pNotify) |
- : m_nodeParser(NULL, TRUE), m_pNotify(pNotify), m_pDocument(NULL) { |
-} |
-CXFA_DocumentParser::~CXFA_DocumentParser() { |
- CloseParser(); |
-} |
-int32_t CXFA_DocumentParser::StartParse(IFX_FileRead* pStream, |
- XFA_XDPPACKET ePacketID) { |
- CloseParser(); |
- int32_t nRetStatus = m_nodeParser.StartParse(pStream, ePacketID); |
- if (nRetStatus == XFA_PARSESTATUS_Ready) { |
- m_pDocument = new CXFA_Document(this); |
- m_nodeParser.SetFactory(m_pDocument); |
- } |
- return nRetStatus; |
-} |
-int32_t CXFA_DocumentParser::DoParse(IFX_Pause* pPause) { |
- int32_t nRetStatus = m_nodeParser.DoParse(pPause); |
- if (nRetStatus >= XFA_PARSESTATUS_Done) { |
- FXSYS_assert(m_pDocument); |
- m_pDocument->SetRoot(m_nodeParser.GetRootNode()); |
- } |
- return nRetStatus; |
-} |
-int32_t CXFA_DocumentParser::ParseXMLData(const CFX_WideString& wsXML, |
- IFDE_XMLNode*& pXMLNode, |
- IFX_Pause* pPause) { |
- CloseParser(); |
- int32_t nRetStatus = m_nodeParser.ParseXMLData(wsXML, pXMLNode, NULL); |
- if (nRetStatus == XFA_PARSESTATUS_Done && pXMLNode) { |
- m_pDocument = new CXFA_Document(this); |
- m_nodeParser.SetFactory(m_pDocument); |
- } |
- return nRetStatus; |
-} |
-void CXFA_DocumentParser::ConstructXFANode(CXFA_Node* pXFANode, |
- IFDE_XMLNode* pXMLNode) { |
- if (!pXFANode || !pXMLNode) { |
- return; |
- } |
- m_nodeParser.ConstructXFANode(pXFANode, pXMLNode); |
- CXFA_Node* pRootNode = m_nodeParser.GetRootNode(); |
- if (m_pDocument && pRootNode) { |
- m_pDocument->SetRoot(pRootNode); |
- } |
-} |
-void CXFA_DocumentParser::CloseParser() { |
- if (m_pDocument) { |
- delete m_pDocument; |
- m_pDocument = NULL; |
- } |
- m_nodeParser.CloseParser(); |
-} |
-CXFA_XMLParser::CXFA_XMLParser(IFDE_XMLNode* pRoot, IFX_Stream* pStream) |
- : |
-#ifdef _XFA_VERIFY_Checksum_ |
- m_nElementStart(0), |
- m_dwCheckStatus(0), |
- m_dwCurrentCheckStatus(0), |
-#endif |
- m_pRoot(pRoot), |
- m_pStream(pStream), |
- m_pParser(nullptr), |
- m_pParent(pRoot), |
- m_pChild(nullptr), |
- m_NodeStack(16), |
- m_dwStatus(FDE_XMLSYNTAXSTATUS_None) { |
- ASSERT(m_pParent && m_pStream); |
- m_NodeStack.Push(m_pParent); |
- m_pParser = IFDE_XMLSyntaxParser::Create(); |
- m_pParser->Init(m_pStream, 32 * 1024, 1024 * 1024); |
-} |
-CXFA_XMLParser::~CXFA_XMLParser() { |
- if (m_pParser) { |
- m_pParser->Release(); |
- } |
- m_NodeStack.RemoveAll(); |
- m_ws1.Empty(); |
- m_ws2.Empty(); |
-} |
-int32_t CXFA_XMLParser::DoParser(IFX_Pause* pPause) { |
- if (m_dwStatus == FDE_XMLSYNTAXSTATUS_Error) { |
- return -1; |
- } |
- if (m_dwStatus == FDE_XMLSYNTAXSTATUS_EOS) { |
- return 100; |
- } |
- int32_t iCount = 0; |
- while (TRUE) { |
- m_dwStatus = m_pParser->DoSyntaxParse(); |
- switch (m_dwStatus) { |
- case FDE_XMLSYNTAXSTATUS_InstructionOpen: |
- break; |
- case FDE_XMLSYNTAXSTATUS_InstructionClose: |
- if (m_pChild) { |
- if (m_pChild->GetType() != FDE_XMLNODE_Instruction) { |
- m_dwStatus = FDE_XMLSYNTAXSTATUS_Error; |
- break; |
- } |
- } |
- m_pChild = m_pParent; |
- break; |
- case FDE_XMLSYNTAXSTATUS_ElementOpen: |
-#ifdef _XFA_VERIFY_Checksum_ |
- if (m_dwCheckStatus != 0x03 && m_NodeStack.GetSize() == 2) { |
- m_nElementStart = m_pParser->GetCurrentPos() - 1; |
- } |
-#endif |
- break; |
- case FDE_XMLSYNTAXSTATUS_ElementBreak: |
- break; |
- case FDE_XMLSYNTAXSTATUS_ElementClose: |
- if (m_pChild->GetType() != FDE_XMLNODE_Element) { |
- m_dwStatus = FDE_XMLSYNTAXSTATUS_Error; |
- break; |
- } |
- m_pParser->GetTagName(m_ws1); |
- ((IFDE_XMLElement*)m_pChild)->GetTagName(m_ws2); |
- if (m_ws1.GetLength() > 0 && !m_ws1.Equal(m_ws2)) { |
- m_dwStatus = FDE_XMLSYNTAXSTATUS_Error; |
- break; |
- } |
- m_NodeStack.Pop(); |
- if (m_NodeStack.GetSize() < 1) { |
- m_dwStatus = FDE_XMLSYNTAXSTATUS_Error; |
- break; |
- } |
-#ifdef _XFA_VERIFY_Checksum_ |
- else if (m_dwCurrentCheckStatus != 0 && m_NodeStack.GetSize() == 2) { |
- m_nSize[m_dwCurrentCheckStatus - 1] = |
- m_pParser->GetCurrentBinaryPos() - |
- m_nStart[m_dwCurrentCheckStatus - 1]; |
- m_dwCurrentCheckStatus = 0; |
- } |
-#endif |
- m_pParent = (IFDE_XMLNode*)*m_NodeStack.GetTopElement(); |
- m_pChild = m_pParent; |
- iCount++; |
- break; |
- case FDE_XMLSYNTAXSTATUS_TargetName: |
- m_pParser->GetTargetName(m_ws1); |
- if (m_ws1 == FX_WSTRC(L"originalXFAVersion") || |
- m_ws1 == FX_WSTRC(L"acrobat")) { |
- m_pChild = IFDE_XMLInstruction::Create(m_ws1); |
- m_pParent->InsertChildNode(m_pChild); |
- } else { |
- m_pChild = NULL; |
- } |
- m_ws1.Empty(); |
- break; |
- case FDE_XMLSYNTAXSTATUS_TagName: |
- m_pParser->GetTagName(m_ws1); |
- m_pChild = IFDE_XMLElement::Create(m_ws1); |
- m_pParent->InsertChildNode(m_pChild); |
- m_NodeStack.Push(m_pChild); |
- m_pParent = m_pChild; |
-#ifdef _XFA_VERIFY_Checksum_ |
- if (m_dwCheckStatus != 0x03 && m_NodeStack.GetSize() == 3) { |
- CFX_WideString wsTag; |
- ((IFDE_XMLElement*)m_pChild)->GetLocalTagName(wsTag); |
- if (wsTag == FX_WSTRC(L"template")) { |
- m_dwCheckStatus |= 0x01; |
- m_dwCurrentCheckStatus = 0x01; |
- m_nStart[0] = m_pParser->GetCurrentBinaryPos() - |
- (m_pParser->GetCurrentPos() - m_nElementStart); |
- } else if (wsTag == FX_WSTRC(L"datasets")) { |
- m_dwCheckStatus |= 0x02; |
- m_dwCurrentCheckStatus = 0x02; |
- m_nStart[1] = m_pParser->GetCurrentBinaryPos() - |
- (m_pParser->GetCurrentPos() - m_nElementStart); |
- } |
- } |
-#endif |
- break; |
- case FDE_XMLSYNTAXSTATUS_AttriName: |
- m_pParser->GetAttributeName(m_ws1); |
- break; |
- case FDE_XMLSYNTAXSTATUS_AttriValue: |
- if (m_pChild) { |
- m_pParser->GetAttributeName(m_ws2); |
- if (m_pChild->GetType() == FDE_XMLNODE_Element) { |
- ((IFDE_XMLElement*)m_pChild)->SetString(m_ws1, m_ws2); |
- } |
- } |
- m_ws1.Empty(); |
- break; |
- case FDE_XMLSYNTAXSTATUS_Text: |
- m_pParser->GetTextData(m_ws1); |
- m_pChild = IFDE_XMLText::Create(m_ws1); |
- m_pParent->InsertChildNode(m_pChild); |
- m_pChild = m_pParent; |
- break; |
- case FDE_XMLSYNTAXSTATUS_CData: |
- m_pParser->GetTextData(m_ws1); |
- m_pChild = IFDE_XMLCharData::Create(m_ws1); |
- m_pParent->InsertChildNode(m_pChild); |
- m_pChild = m_pParent; |
- break; |
- case FDE_XMLSYNTAXSTATUS_TargetData: |
- if (m_pChild) { |
- if (m_pChild->GetType() != FDE_XMLNODE_Instruction) { |
- m_dwStatus = FDE_XMLSYNTAXSTATUS_Error; |
- break; |
- } |
- if (!m_ws1.IsEmpty()) { |
- ((IFDE_XMLInstruction*)m_pChild)->AppendData(m_ws1); |
- } |
- m_pParser->GetTargetData(m_ws1); |
- ((IFDE_XMLInstruction*)m_pChild)->AppendData(m_ws1); |
- } |
- m_ws1.Empty(); |
- break; |
- default: |
- break; |
- } |
- if (m_dwStatus == FDE_XMLSYNTAXSTATUS_Error || |
- m_dwStatus == FDE_XMLSYNTAXSTATUS_EOS) { |
- break; |
- } |
- if (pPause != NULL && iCount > 500 && pPause->NeedToPauseNow()) { |
- break; |
- } |
- } |
- return (m_dwStatus == FDE_XMLSYNTAXSTATUS_Error || m_NodeStack.GetSize() != 1) |
- ? -1 |
- : m_pParser->GetStatus(); |
-} |
+// 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 |
+ |
+#include "xfa/src/foxitlib.h" |
+#include "xfa/src/fxfa/src/common/xfa_utils.h" |
+#include "xfa/src/fxfa/src/common/xfa_object.h" |
+#include "xfa/src/fxfa/src/common/xfa_document.h" |
+#include "xfa/src/fxfa/src/common/xfa_parser.h" |
+#include "xfa/src/fxfa/src/common/xfa_script.h" |
+#include "xfa/src/fxfa/src/common/xfa_docdata.h" |
+#include "xfa/src/fxfa/src/common/xfa_doclayout.h" |
+#include "xfa/src/fxfa/src/common/xfa_localemgr.h" |
+#include "xfa/src/fxfa/src/common/xfa_fm2jsapi.h" |
+#include "xfa_basic_imp.h" |
+#include "xfa_parser_imp.h" |
+IXFA_Parser* IXFA_Parser::Create(IXFA_ObjFactory* pFactory, |
+ FX_BOOL bDocumentParser) { |
+ return new CXFA_SimpleParser(pFactory, bDocumentParser); |
+} |
+CXFA_SimpleParser::CXFA_SimpleParser(IXFA_ObjFactory* pFactory, |
+ FX_BOOL bDocumentParser) |
+ : m_pXMLParser(nullptr), |
+ m_pXMLDoc(nullptr), |
+ m_pStream(nullptr), |
+ m_pFileRead(nullptr), |
+ m_pFactory(pFactory), |
+ m_pRootNode(nullptr), |
+ m_ePacketID(XFA_XDPPACKET_UNKNOWN), |
+ m_bDocumentParser(bDocumentParser) { |
+} |
+CXFA_SimpleParser::~CXFA_SimpleParser() { |
+ CloseParser(); |
+} |
+void CXFA_SimpleParser::SetFactory(IXFA_ObjFactory* pFactory) { |
+ m_pFactory = pFactory; |
+} |
+static IFDE_XMLNode* XFA_FDEExtension_GetDocumentNode( |
+ IFDE_XMLDoc* pXMLDoc, |
+ FX_BOOL bVerifyWellFormness = FALSE) { |
+ if (!pXMLDoc) { |
+ return NULL; |
+ } |
+ IFDE_XMLNode* pXMLFakeRoot = pXMLDoc->GetRoot(); |
+ for (IFDE_XMLNode* pXMLNode = |
+ pXMLFakeRoot->GetNodeItem(IFDE_XMLNode::FirstChild); |
+ pXMLNode; pXMLNode = pXMLNode->GetNodeItem(IFDE_XMLNode::NextSibling)) { |
+ if (pXMLNode->GetType() == FDE_XMLNODE_Element) { |
+ if (bVerifyWellFormness) { |
+ for (IFDE_XMLNode* pNextNode = |
+ pXMLNode->GetNodeItem(IFDE_XMLNode::NextSibling); |
+ pNextNode; |
+ pNextNode = pNextNode->GetNodeItem(IFDE_XMLNode::NextSibling)) { |
+ if (pNextNode->GetType() == FDE_XMLNODE_Element) { |
+ return FALSE; |
+ } |
+ } |
+ } |
+ return pXMLNode; |
+ } |
+ } |
+ return NULL; |
+} |
+int32_t CXFA_SimpleParser::StartParse(IFX_FileRead* pStream, |
+ XFA_XDPPACKET ePacketID) { |
+ CloseParser(); |
+ m_pFileRead = pStream; |
+ m_pStream = IFX_Stream::CreateStream( |
+ pStream, FX_STREAMACCESS_Read | FX_STREAMACCESS_Text); |
+ if (m_pStream == NULL) { |
+ return XFA_PARSESTATUS_StreamErr; |
+ } |
+ FX_WORD wCodePage = m_pStream->GetCodePage(); |
+ if (wCodePage != FX_CODEPAGE_UTF16LE && wCodePage != FX_CODEPAGE_UTF16BE && |
+ wCodePage != FX_CODEPAGE_UTF8) { |
+ m_pStream->SetCodePage(FX_CODEPAGE_UTF8); |
+ } |
+ m_pXMLDoc = IFDE_XMLDoc::Create(); |
+ if (m_pXMLDoc == NULL) { |
+ return XFA_PARSESTATUS_StatusErr; |
+ } |
+ m_pXMLParser = new CXFA_XMLParser(m_pXMLDoc->GetRoot(), m_pStream); |
+ if (m_pXMLParser == NULL) { |
+ return XFA_PARSESTATUS_StatusErr; |
+ } |
+ if (!m_pXMLDoc->LoadXML(m_pXMLParser)) { |
+ return XFA_PARSESTATUS_StatusErr; |
+ } |
+ m_ePacketID = ePacketID; |
+ return XFA_PARSESTATUS_Ready; |
+} |
+int32_t CXFA_SimpleParser::DoParse(IFX_Pause* pPause) { |
+ if (m_pXMLDoc == NULL || m_ePacketID == XFA_XDPPACKET_UNKNOWN) { |
+ return XFA_PARSESTATUS_StatusErr; |
+ } |
+ int32_t iRet = m_pXMLDoc->DoLoad(pPause); |
+ if (iRet < 0) { |
+ return XFA_PARSESTATUS_SyntaxErr; |
+ } |
+ if (iRet < 100) { |
+ return iRet / 2; |
+ } |
+ m_pRootNode = ParseAsXDPPacket(XFA_FDEExtension_GetDocumentNode(m_pXMLDoc), |
+ m_ePacketID); |
+ m_pXMLDoc->CloseXML(); |
+ if (m_pStream) { |
+ m_pStream->Release(); |
+ m_pStream = NULL; |
+ } |
+ if (!m_pRootNode) { |
+ return XFA_PARSESTATUS_StatusErr; |
+ } |
+ return XFA_PARSESTATUS_Done; |
+} |
+int32_t CXFA_SimpleParser::ParseXMLData(const CFX_WideString& wsXML, |
+ IFDE_XMLNode*& pXMLNode, |
+ IFX_Pause* pPause) { |
+ CloseParser(); |
+ pXMLNode = NULL; |
+ IFX_Stream* pStream = XFA_CreateWideTextRead(wsXML); |
+ if (!pStream) { |
+ return XFA_PARSESTATUS_StreamErr; |
+ } |
+ m_pStream = pStream; |
+ m_pXMLDoc = IFDE_XMLDoc::Create(); |
+ if (m_pXMLDoc == NULL) { |
+ return XFA_PARSESTATUS_StatusErr; |
+ } |
+ CXFA_XMLParser* pParser = new CXFA_XMLParser(m_pXMLDoc->GetRoot(), m_pStream); |
+ if (pParser == NULL) { |
+ return XFA_PARSESTATUS_StatusErr; |
+ } |
+#ifdef _XFA_VERIFY_Checksum_ |
+ pParser->m_dwCheckStatus = 0x03; |
+#endif |
+ if (!m_pXMLDoc->LoadXML(pParser)) { |
+ return XFA_PARSESTATUS_StatusErr; |
+ } |
+ int32_t iRet = m_pXMLDoc->DoLoad(pPause); |
+ if (iRet < 0 || iRet >= 100) { |
+ m_pXMLDoc->CloseXML(); |
+ } |
+ if (iRet < 0) { |
+ return XFA_PARSESTATUS_SyntaxErr; |
+ } |
+ if (iRet < 100) { |
+ return iRet / 2; |
+ } |
+ if (m_pStream) { |
+ m_pStream->Release(); |
+ m_pStream = NULL; |
+ } |
+ pXMLNode = XFA_FDEExtension_GetDocumentNode(m_pXMLDoc); |
+ return XFA_PARSESTATUS_Done; |
+} |
+void CXFA_SimpleParser::ConstructXFANode(CXFA_Node* pXFANode, |
+ IFDE_XMLNode* pXMLNode) { |
+ XFA_XDPPACKET ePacketID = (XFA_XDPPACKET)pXFANode->GetPacketID(); |
+ if (ePacketID == XFA_XDPPACKET_Datasets) { |
+ if (pXFANode->GetClassID() == XFA_ELEMENT_DataValue) { |
+ for (IFDE_XMLNode* pXMLChild = |
+ pXMLNode->GetNodeItem(IFDE_XMLNode::FirstChild); |
+ pXMLChild; |
+ pXMLChild = pXMLChild->GetNodeItem(IFDE_XMLNode::NextSibling)) { |
+ FDE_XMLNODETYPE eNodeType = pXMLChild->GetType(); |
+ if (eNodeType == FDE_XMLNODE_Instruction) { |
+ continue; |
+ } |
+ if (eNodeType == FDE_XMLNODE_Element) { |
+ CXFA_Node* pXFAChild = m_pFactory->CreateNode(XFA_XDPPACKET_Datasets, |
+ XFA_ELEMENT_DataValue); |
+ if (pXFAChild == NULL) { |
+ return; |
+ } |
+ CFX_WideString wsNodeStr; |
+ ((IFDE_XMLElement*)pXMLChild)->GetLocalTagName(wsNodeStr); |
+ pXFAChild->SetCData(XFA_ATTRIBUTE_Name, wsNodeStr); |
+ CFX_WideString wsChildValue; |
+#ifdef XFA_PARSE_HAS_LINEIDENTIFIER |
+ XFA_GetPlainTextFromRichText((IFDE_XMLElement*)pXMLChild, |
+ wsChildValue); |
+#else |
+ XFA_ConvertRichTextToPlainText((IFDE_XMLElement*)pXMLChild, |
+ wsChildValue); |
+#endif |
+ if (!wsChildValue.IsEmpty()) { |
+ pXFAChild->SetCData(XFA_ATTRIBUTE_Value, wsChildValue); |
+ } |
+ pXFANode->InsertChild(pXFAChild); |
+ pXFAChild->SetXMLMappingNode(pXMLChild); |
+ pXFAChild->SetFlag(XFA_NODEFLAG_Initialized, TRUE, FALSE); |
+ break; |
+ } |
+ } |
+ m_pRootNode = pXFANode; |
+ } else { |
+ m_pRootNode = DataLoader(pXFANode, pXMLNode, TRUE); |
+ } |
+ } else { |
+ if (pXFANode->GetObjectType() == XFA_OBJECTTYPE_ContentNode) { |
+ ParseContentNode(pXFANode, pXMLNode, ePacketID); |
+ m_pRootNode = pXFANode; |
+ } else { |
+ m_pRootNode = NormalLoader(pXFANode, pXMLNode, ePacketID); |
+ } |
+ } |
+} |
+FX_BOOL XFA_FDEExtension_ResolveNamespaceQualifier( |
+ IFDE_XMLElement* pNode, |
+ const CFX_WideStringC& wsQualifier, |
+ CFX_WideString& wsNamespaceURI) { |
+ if (!pNode) { |
+ return FALSE; |
+ } |
+ IFDE_XMLNode* pFakeRoot = pNode->GetNodeItem(IFDE_XMLNode::Root); |
+ CFX_WideString wsNSAttribute; |
+ FX_BOOL bRet = FALSE; |
+ if (wsQualifier.IsEmpty()) { |
+ wsNSAttribute = FX_WSTRC(L"xmlns"); |
+ bRet = TRUE; |
+ } else { |
+ wsNSAttribute = FX_WSTRC(L"xmlns:") + wsQualifier; |
+ } |
+ for (; pNode != pFakeRoot; |
+ pNode = (IFDE_XMLElement*)pNode->GetNodeItem(IFDE_XMLNode::Parent)) { |
+ if (pNode->GetType() != FDE_XMLNODE_Element) { |
+ continue; |
+ } |
+ if (pNode->HasAttribute(wsNSAttribute)) { |
+ pNode->GetString(wsNSAttribute, wsNamespaceURI); |
+ return TRUE; |
+ } |
+ } |
+ wsNamespaceURI.Empty(); |
+ return bRet; |
+} |
+static inline void XFA_FDEExtension_GetElementTagNamespaceURI( |
+ IFDE_XMLElement* pElement, |
+ CFX_WideString& wsNamespaceURI) { |
+ CFX_WideString wsNodeStr; |
+ pElement->GetNamespacePrefix(wsNodeStr); |
+ if (!XFA_FDEExtension_ResolveNamespaceQualifier(pElement, wsNodeStr, |
+ wsNamespaceURI)) { |
+ wsNamespaceURI.Empty(); |
+ } |
+} |
+static FX_BOOL XFA_FDEExtension_MatchNodeName( |
+ IFDE_XMLNode* pNode, |
+ const CFX_WideStringC& wsLocalTagName, |
+ const CFX_WideStringC& wsNamespaceURIPrefix, |
+ FX_DWORD eMatchFlags = XFA_XDPPACKET_FLAGS_NOMATCH) { |
+ if (!pNode || pNode->GetType() != FDE_XMLNODE_Element) { |
+ return FALSE; |
+ } |
+ IFDE_XMLElement* pElement = reinterpret_cast<IFDE_XMLElement*>(pNode); |
+ CFX_WideString wsNodeStr; |
+ pElement->GetLocalTagName(wsNodeStr); |
+ if (wsNodeStr != wsLocalTagName) { |
+ return FALSE; |
+ } |
+ XFA_FDEExtension_GetElementTagNamespaceURI(pElement, wsNodeStr); |
+ if (eMatchFlags & XFA_XDPPACKET_FLAGS_NOMATCH) { |
+ return TRUE; |
+ } |
+ if (eMatchFlags & XFA_XDPPACKET_FLAGS_PREFIXMATCH) { |
+ return wsNodeStr.Left(wsNamespaceURIPrefix.GetLength()) == |
+ wsNamespaceURIPrefix; |
+ } |
+ return wsNodeStr == wsNamespaceURIPrefix; |
+} |
+static FX_BOOL XFA_FDEExtension_GetAttributeLocalName( |
+ const CFX_WideStringC& wsAttributeName, |
+ CFX_WideString& wsLocalAttrName) { |
+ CFX_WideString wsAttrName(wsAttributeName); |
+ FX_STRSIZE iFind = wsAttrName.Find(L':', 0); |
+ if (iFind < 0) { |
+ wsLocalAttrName = wsAttrName; |
+ return FALSE; |
+ } else { |
+ wsLocalAttrName = wsAttrName.Right(wsAttrName.GetLength() - iFind - 1); |
+ return TRUE; |
+ } |
+} |
+static FX_BOOL XFA_FDEExtension_ResolveAttribute( |
+ IFDE_XMLElement* pElement, |
+ const CFX_WideStringC& wsAttributeName, |
+ CFX_WideString& wsLocalAttrName, |
+ CFX_WideString& wsNamespaceURI) { |
+ CFX_WideString wsAttrName(wsAttributeName); |
+ CFX_WideString wsNSPrefix; |
+ if (XFA_FDEExtension_GetAttributeLocalName(wsAttributeName, |
+ wsLocalAttrName)) { |
+ wsNSPrefix = wsAttrName.Left(wsAttributeName.GetLength() - |
+ wsLocalAttrName.GetLength() - 1); |
+ } |
+ if (wsLocalAttrName == FX_WSTRC(L"xmlns") || |
+ wsNSPrefix == FX_WSTRC(L"xmlns") || wsNSPrefix == FX_WSTRC(L"xml")) { |
+ return FALSE; |
+ } |
+ if (!XFA_FDEExtension_ResolveNamespaceQualifier(pElement, wsNSPrefix, |
+ wsNamespaceURI)) { |
+ wsNamespaceURI.Empty(); |
+ return FALSE; |
+ } |
+ return TRUE; |
+} |
+static FX_BOOL XFA_FDEExtension_FindAttributeWithNS( |
+ IFDE_XMLElement* pElement, |
+ const CFX_WideStringC& wsLocalAttributeName, |
+ const CFX_WideStringC& wsNamespaceURIPrefix, |
+ CFX_WideString& wsValue, |
+ FX_BOOL bMatchNSAsPrefix = FALSE) { |
+ if (!pElement) { |
+ return FALSE; |
+ } |
+ CFX_WideString wsAttrName; |
+ CFX_WideString wsAttrValue; |
+ CFX_WideString wsAttrNS; |
+ for (int32_t iAttrCount = pElement->CountAttributes(), i = 0; i < iAttrCount; |
+ i++) { |
+ pElement->GetAttribute(i, wsAttrName, wsAttrValue); |
+ FX_STRSIZE iFind = wsAttrName.Find(L':', 0); |
+ CFX_WideString wsNSPrefix; |
+ if (iFind < 0) { |
+ if (wsLocalAttributeName != wsAttrName) { |
+ continue; |
+ } |
+ } else { |
+ if (wsLocalAttributeName != |
+ wsAttrName.Right(wsAttrName.GetLength() - iFind - 1)) { |
+ continue; |
+ } |
+ wsNSPrefix = wsAttrName.Left(iFind); |
+ } |
+ if (!XFA_FDEExtension_ResolveNamespaceQualifier(pElement, wsNSPrefix, |
+ wsAttrNS)) { |
+ continue; |
+ } |
+ if (bMatchNSAsPrefix) { |
+ if (wsAttrNS.Left(wsNamespaceURIPrefix.GetLength()) != |
+ wsNamespaceURIPrefix) { |
+ continue; |
+ } |
+ } else { |
+ if (wsAttrNS != wsNamespaceURIPrefix) { |
+ continue; |
+ } |
+ } |
+ wsValue = wsAttrValue; |
+ return TRUE; |
+ } |
+ return FALSE; |
+} |
+CXFA_Node* CXFA_SimpleParser::ParseAsXDPPacket(IFDE_XMLNode* pXMLDocumentNode, |
+ XFA_XDPPACKET ePacketID) { |
+ switch (ePacketID) { |
+ case XFA_XDPPACKET_UNKNOWN: |
+ return NULL; |
+ case XFA_XDPPACKET_XDP: |
+ return ParseAsXDPPacket_XDP(pXMLDocumentNode, ePacketID); |
+ case XFA_XDPPACKET_Config: |
+ return ParseAsXDPPacket_Config(pXMLDocumentNode, ePacketID); |
+ case XFA_XDPPACKET_Template: |
+ case XFA_XDPPACKET_Form: |
+ return ParseAsXDPPacket_TemplateForm(pXMLDocumentNode, ePacketID); |
+ case XFA_XDPPACKET_Datasets: |
+ return ParseAsXDPPacket_Data(pXMLDocumentNode, ePacketID); |
+ case XFA_XDPPACKET_Xdc: |
+ return ParseAsXDPPacket_Xdc(pXMLDocumentNode, ePacketID); |
+ case XFA_XDPPACKET_LocaleSet: |
+ case XFA_XDPPACKET_ConnectionSet: |
+ case XFA_XDPPACKET_SourceSet: |
+ return ParseAsXDPPacket_LocaleConnectionSourceSet(pXMLDocumentNode, |
+ ePacketID); |
+ default: |
+ return ParseAsXDPPacket_User(pXMLDocumentNode, ePacketID); |
+ } |
+ return NULL; |
+} |
+CXFA_Node* CXFA_SimpleParser::ParseAsXDPPacket_XDP( |
+ IFDE_XMLNode* pXMLDocumentNode, |
+ XFA_XDPPACKET ePacketID) { |
+ if (!XFA_FDEExtension_MatchNodeName( |
+ pXMLDocumentNode, XFA_GetPacketByIndex(XFA_PACKET_XDP)->pName, |
+ XFA_GetPacketByIndex(XFA_PACKET_XDP)->pURI, |
+ XFA_GetPacketByIndex(XFA_PACKET_XDP)->eFlags)) { |
+ return nullptr; |
+ } |
+ CXFA_Node* pXFARootNode = |
+ m_pFactory->CreateNode(XFA_XDPPACKET_XDP, XFA_ELEMENT_Xfa); |
+ if (!pXFARootNode) { |
+ return nullptr; |
+ } |
+ m_pRootNode = pXFARootNode; |
+ pXFARootNode->SetCData(XFA_ATTRIBUTE_Name, FX_WSTRC(L"xfa")); |
+ { |
+ IFDE_XMLElement* pElement = (IFDE_XMLElement*)pXMLDocumentNode; |
+ int32_t iAttributeCount = pElement->CountAttributes(); |
+ for (int32_t i = 0; i < iAttributeCount; i++) { |
+ CFX_WideString wsAttriName, wsAttriValue; |
+ pElement->GetAttribute(i, wsAttriName, wsAttriValue); |
+ if (wsAttriName == FX_WSTRC(L"uuid")) { |
+ pXFARootNode->SetCData(XFA_ATTRIBUTE_Uuid, wsAttriValue); |
+ } else if (wsAttriName == FX_WSTRC(L"timeStamp")) { |
+ pXFARootNode->SetCData(XFA_ATTRIBUTE_TimeStamp, wsAttriValue); |
+ } |
+ } |
+ } |
+ IFDE_XMLNode* pXMLConfigDOMRoot = nullptr; |
+ CXFA_Node* pXFAConfigDOMRoot = nullptr; |
+ { |
+ for (IFDE_XMLNode* pChildItem = |
+ pXMLDocumentNode->GetNodeItem(IFDE_XMLNode::FirstChild); |
+ pChildItem; |
+ pChildItem = pChildItem->GetNodeItem(IFDE_XMLNode::NextSibling)) { |
+ XFA_LPCPACKETINFO pPacketInfo = XFA_GetPacketByIndex(XFA_PACKET_Config); |
+ if (!XFA_FDEExtension_MatchNodeName(pChildItem, pPacketInfo->pName, |
+ pPacketInfo->pURI, |
+ pPacketInfo->eFlags)) { |
+ continue; |
+ } |
+ if (pXFARootNode->GetFirstChildByName(pPacketInfo->uHash)) { |
+ return nullptr; |
+ } |
+ pXMLConfigDOMRoot = pChildItem; |
+ pXFAConfigDOMRoot = |
+ ParseAsXDPPacket_Config(pXMLConfigDOMRoot, XFA_XDPPACKET_Config); |
+ pXFARootNode->InsertChild(pXFAConfigDOMRoot, NULL); |
+ } |
+ } |
+ IFDE_XMLNode* pXMLDatasetsDOMRoot = nullptr; |
+ IFDE_XMLNode* pXMLFormDOMRoot = nullptr; |
+ IFDE_XMLNode* pXMLTemplateDOMRoot = nullptr; |
+ { |
+ for (IFDE_XMLNode* pChildItem = |
+ pXMLDocumentNode->GetNodeItem(IFDE_XMLNode::FirstChild); |
+ pChildItem; |
+ pChildItem = pChildItem->GetNodeItem(IFDE_XMLNode::NextSibling)) { |
+ if (!pChildItem || pChildItem->GetType() != FDE_XMLNODE_Element) { |
+ continue; |
+ } |
+ if (pChildItem == pXMLConfigDOMRoot) { |
+ continue; |
+ } |
+ IFDE_XMLElement* pElement = |
+ reinterpret_cast<IFDE_XMLElement*>(pChildItem); |
+ CFX_WideString wsPacketName; |
+ pElement->GetLocalTagName(wsPacketName); |
+ XFA_LPCPACKETINFO pPacketInfo = XFA_GetPacketByName(wsPacketName); |
+ if (pPacketInfo && pPacketInfo->pURI) { |
+ if (!XFA_FDEExtension_MatchNodeName(pElement, pPacketInfo->pName, |
+ pPacketInfo->pURI, |
+ pPacketInfo->eFlags)) { |
+ pPacketInfo = nullptr; |
+ } |
+ } |
+ XFA_XDPPACKET ePacket = |
+ pPacketInfo ? pPacketInfo->eName : XFA_XDPPACKET_USER; |
+ if (ePacket == XFA_XDPPACKET_XDP) { |
+ continue; |
+ } |
+ if (ePacket == XFA_XDPPACKET_Datasets) { |
+ if (pXMLDatasetsDOMRoot) { |
+ return nullptr; |
+ } |
+ pXMLDatasetsDOMRoot = pElement; |
+ } else if (ePacket == XFA_XDPPACKET_Form) { |
+ if (pXMLFormDOMRoot) { |
+ return nullptr; |
+ } |
+ pXMLFormDOMRoot = pElement; |
+ } else if (ePacket == XFA_XDPPACKET_Template) { |
+ if (pXMLTemplateDOMRoot) { |
+ // Found a duplicate template packet. |
+ return nullptr; |
+ } |
+ CXFA_Node* pPacketNode = ParseAsXDPPacket(pElement, ePacket); |
+ if (pPacketNode) { |
+ pXMLTemplateDOMRoot = pElement; |
+ pXFARootNode->InsertChild(pPacketNode); |
+ } |
+ } else { |
+ CXFA_Node* pPacketNode = ParseAsXDPPacket(pElement, ePacket); |
+ if (pPacketNode) { |
+ if (pPacketInfo && |
+ (pPacketInfo->eFlags & XFA_XDPPACKET_FLAGS_SUPPORTONE) && |
+ pXFARootNode->GetFirstChildByName(pPacketInfo->uHash)) { |
+ return nullptr; |
+ } |
+ pXFARootNode->InsertChild(pPacketNode); |
+ } |
+ } |
+ } |
+ } |
+ if (!pXMLTemplateDOMRoot) { |
+ // No template is found. |
+ return nullptr; |
+ } |
+ if (pXMLDatasetsDOMRoot) { |
+ CXFA_Node* pPacketNode = |
+ ParseAsXDPPacket(pXMLDatasetsDOMRoot, XFA_XDPPACKET_Datasets); |
+ if (pPacketNode) { |
+ pXFARootNode->InsertChild(pPacketNode); |
+ } |
+ } |
+ if (pXMLFormDOMRoot) { |
+ CXFA_Node* pPacketNode = |
+ ParseAsXDPPacket(pXMLFormDOMRoot, XFA_XDPPACKET_Form); |
+ if (pPacketNode) { |
+ pXFARootNode->InsertChild(pPacketNode); |
+ } |
+ } |
+ pXFARootNode->SetXMLMappingNode(pXMLDocumentNode); |
+ return pXFARootNode; |
+} |
+CXFA_Node* CXFA_SimpleParser::ParseAsXDPPacket_Config( |
+ IFDE_XMLNode* pXMLDocumentNode, |
+ XFA_XDPPACKET ePacketID) { |
+ if (!XFA_FDEExtension_MatchNodeName( |
+ pXMLDocumentNode, XFA_GetPacketByIndex(XFA_PACKET_Config)->pName, |
+ XFA_GetPacketByIndex(XFA_PACKET_Config)->pURI, |
+ XFA_GetPacketByIndex(XFA_PACKET_Config)->eFlags)) { |
+ return NULL; |
+ } |
+ CXFA_Node* pNode = |
+ m_pFactory->CreateNode(XFA_XDPPACKET_Config, XFA_ELEMENT_Config); |
+ if (!pNode) { |
+ return NULL; |
+ } |
+ pNode->SetCData(XFA_ATTRIBUTE_Name, |
+ XFA_GetPacketByIndex(XFA_PACKET_Config)->pName); |
+ if (!NormalLoader(pNode, pXMLDocumentNode, ePacketID)) { |
+ return NULL; |
+ } |
+ pNode->SetXMLMappingNode(pXMLDocumentNode); |
+ return pNode; |
+} |
+CXFA_Node* CXFA_SimpleParser::ParseAsXDPPacket_TemplateForm( |
+ IFDE_XMLNode* pXMLDocumentNode, |
+ XFA_XDPPACKET ePacketID) { |
+ CXFA_Node* pNode = NULL; |
+ if (ePacketID == XFA_XDPPACKET_Template) { |
+ if (XFA_FDEExtension_MatchNodeName( |
+ pXMLDocumentNode, XFA_GetPacketByIndex(XFA_PACKET_Template)->pName, |
+ XFA_GetPacketByIndex(XFA_PACKET_Template)->pURI, |
+ XFA_GetPacketByIndex(XFA_PACKET_Template)->eFlags)) { |
+ pNode = |
+ m_pFactory->CreateNode(XFA_XDPPACKET_Template, XFA_ELEMENT_Template); |
+ if (!pNode) { |
+ return NULL; |
+ } |
+ pNode->SetCData(XFA_ATTRIBUTE_Name, |
+ XFA_GetPacketByIndex(XFA_PACKET_Template)->pName); |
+ if (m_bDocumentParser) { |
+ CFX_WideString wsNamespaceURI; |
+ IFDE_XMLElement* pXMLDocumentElement = |
+ (IFDE_XMLElement*)pXMLDocumentNode; |
+ pXMLDocumentElement->GetNamespaceURI(wsNamespaceURI); |
+ if (wsNamespaceURI.IsEmpty()) { |
+ pXMLDocumentElement->GetString(L"xmlns:xfa", wsNamespaceURI); |
+ } |
+ pNode->GetDocument()->RecognizeXFAVersionNumber(wsNamespaceURI); |
+ } |
+ if (!NormalLoader(pNode, pXMLDocumentNode, ePacketID)) { |
+ return NULL; |
+ } |
+ } |
+ } else if (ePacketID == XFA_XDPPACKET_Form) { |
+ if (XFA_FDEExtension_MatchNodeName( |
+ pXMLDocumentNode, XFA_GetPacketByIndex(XFA_PACKET_Form)->pName, |
+ XFA_GetPacketByIndex(XFA_PACKET_Form)->pURI, |
+ XFA_GetPacketByIndex(XFA_PACKET_Form)->eFlags)) { |
+ IFDE_XMLElement* pXMLDocumentElement = (IFDE_XMLElement*)pXMLDocumentNode; |
+ CFX_WideString wsChecksum; |
+ pXMLDocumentElement->GetString(L"checksum", wsChecksum); |
+#ifdef _XFA_VERIFY_Checksum_ |
+ if (wsChecksum.GetLength() != 28 || |
+ m_pXMLParser->m_dwCheckStatus != 0x03) { |
+ return NULL; |
+ } |
+ IXFA_ChecksumContext* pChecksum = XFA_Checksum_Create(); |
+ pChecksum->StartChecksum(); |
+ pChecksum->UpdateChecksum(m_pFileRead, m_pXMLParser->m_nStart[0], |
+ m_pXMLParser->m_nSize[0]); |
+ pChecksum->UpdateChecksum(m_pFileRead, m_pXMLParser->m_nStart[1], |
+ m_pXMLParser->m_nSize[1]); |
+ pChecksum->FinishChecksum(); |
+ CFX_ByteString bsCheck; |
+ pChecksum->GetChecksum(bsCheck); |
+ pChecksum->Release(); |
+ if (bsCheck != wsChecksum.UTF8Encode()) { |
+ return NULL; |
+ } |
+#endif |
+ pNode = m_pFactory->CreateNode(XFA_XDPPACKET_Form, XFA_ELEMENT_Form); |
+ if (!pNode) { |
+ return NULL; |
+ } |
+ pNode->SetCData(XFA_ATTRIBUTE_Name, |
+ XFA_GetPacketByIndex(XFA_PACKET_Form)->pName); |
+ pNode->SetAttribute(XFA_ATTRIBUTE_Checksum, wsChecksum); |
+ CXFA_Node* pTemplateRoot = |
+ m_pRootNode->GetFirstChildByClass(XFA_ELEMENT_Template); |
+ CXFA_Node* pTemplateChosen = |
+ pTemplateRoot |
+ ? pTemplateRoot->GetFirstChildByClass(XFA_ELEMENT_Subform) |
+ : NULL; |
+ FX_BOOL bUseAttribute = TRUE; |
+ if (pTemplateChosen && |
+ pTemplateChosen->GetEnum(XFA_ATTRIBUTE_RestoreState) != |
+ XFA_ATTRIBUTEENUM_Auto) { |
+ bUseAttribute = FALSE; |
+ } |
+ if (!NormalLoader(pNode, pXMLDocumentNode, ePacketID, bUseAttribute)) { |
+ return NULL; |
+ } |
+ } |
+ } |
+ if (pNode) { |
+ pNode->SetXMLMappingNode(pXMLDocumentNode); |
+ } |
+ return pNode; |
+} |
+static IFDE_XMLNode* XFA_GetDataSetsFromXDP(IFDE_XMLNode* pXMLDocumentNode) { |
+ if (XFA_FDEExtension_MatchNodeName( |
+ pXMLDocumentNode, XFA_GetPacketByIndex(XFA_PACKET_Datasets)->pName, |
+ XFA_GetPacketByIndex(XFA_PACKET_Datasets)->pURI, |
+ XFA_GetPacketByIndex(XFA_PACKET_Datasets)->eFlags)) { |
+ return pXMLDocumentNode; |
+ } |
+ if (!XFA_FDEExtension_MatchNodeName( |
+ pXMLDocumentNode, XFA_GetPacketByIndex(XFA_PACKET_XDP)->pName, |
+ XFA_GetPacketByIndex(XFA_PACKET_XDP)->pURI, |
+ XFA_GetPacketByIndex(XFA_PACKET_XDP)->eFlags)) { |
+ return NULL; |
+ } |
+ for (IFDE_XMLNode* pDatasetsNode = |
+ pXMLDocumentNode->GetNodeItem(IFDE_XMLNode::FirstChild); |
+ pDatasetsNode; |
+ pDatasetsNode = pDatasetsNode->GetNodeItem(IFDE_XMLNode::NextSibling)) { |
+ if (!XFA_FDEExtension_MatchNodeName( |
+ pDatasetsNode, XFA_GetPacketByIndex(XFA_PACKET_Datasets)->pName, |
+ XFA_GetPacketByIndex(XFA_PACKET_Datasets)->pURI, |
+ XFA_GetPacketByIndex(XFA_PACKET_Datasets)->eFlags)) { |
+ continue; |
+ } |
+ return pDatasetsNode; |
+ } |
+ return NULL; |
+} |
+CXFA_Node* CXFA_SimpleParser::ParseAsXDPPacket_Data( |
+ IFDE_XMLNode* pXMLDocumentNode, |
+ XFA_XDPPACKET ePacketID) { |
+ IFDE_XMLNode* pDatasetsXMLNode = XFA_GetDataSetsFromXDP(pXMLDocumentNode); |
+ if (pDatasetsXMLNode) { |
+ CXFA_Node* pNode = |
+ m_pFactory->CreateNode(XFA_XDPPACKET_Datasets, XFA_ELEMENT_DataModel); |
+ if (!pNode) { |
+ return NULL; |
+ } |
+ pNode->SetCData(XFA_ATTRIBUTE_Name, |
+ XFA_GetPacketByIndex(XFA_PACKET_Datasets)->pName); |
+ if (!DataLoader(pNode, pDatasetsXMLNode, FALSE)) { |
+ return NULL; |
+ } |
+ pNode->SetXMLMappingNode(pDatasetsXMLNode); |
+ return pNode; |
+ } |
+ IFDE_XMLNode* pDataXMLNode = NULL; |
+ if (XFA_FDEExtension_MatchNodeName( |
+ pXMLDocumentNode, FX_WSTRC(L"data"), |
+ XFA_GetPacketByIndex(XFA_PACKET_Datasets)->pURI, |
+ XFA_GetPacketByIndex(XFA_PACKET_Datasets)->eFlags)) { |
+ ((IFDE_XMLElement*)pXMLDocumentNode)->RemoveAttribute(L"xmlns:xfa"); |
+ pDataXMLNode = pXMLDocumentNode; |
+ } else { |
+ IFDE_XMLElement* pDataElement = |
+ IFDE_XMLElement::Create(FX_WSTRC(L"xfa:data")); |
+ IFDE_XMLNode* pParentXMLNode = |
+ pXMLDocumentNode->GetNodeItem(IFDE_XMLNode::Parent); |
+ if (pParentXMLNode) { |
+ pParentXMLNode->RemoveChildNode(pXMLDocumentNode); |
+ } |
+ FXSYS_assert(pXMLDocumentNode->GetType() == FDE_XMLNODE_Element); |
+ if (pXMLDocumentNode->GetType() == FDE_XMLNODE_Element) { |
+ ((IFDE_XMLElement*)pXMLDocumentNode)->RemoveAttribute(L"xmlns:xfa"); |
+ } |
+ pDataElement->InsertChildNode(pXMLDocumentNode); |
+ pDataXMLNode = pDataElement; |
+ } |
+ if (pDataXMLNode) { |
+ CXFA_Node* pNode = |
+ m_pFactory->CreateNode(XFA_XDPPACKET_Datasets, XFA_ELEMENT_DataGroup); |
+ if (!pNode) { |
+ if (pDataXMLNode != pXMLDocumentNode) { |
+ pDataXMLNode->Release(); |
+ } |
+ return NULL; |
+ } |
+ CFX_WideString wsLocalName; |
+ ((IFDE_XMLElement*)pDataXMLNode)->GetLocalTagName(wsLocalName); |
+ pNode->SetCData(XFA_ATTRIBUTE_Name, wsLocalName); |
+ if (!DataLoader(pNode, pDataXMLNode, TRUE)) { |
+ return NULL; |
+ } |
+ pNode->SetXMLMappingNode(pDataXMLNode); |
+ if (pDataXMLNode != pXMLDocumentNode) { |
+ pNode->SetFlag(XFA_NODEFLAG_OwnXMLNode, TRUE, FALSE); |
+ } |
+ return pNode; |
+ } |
+ return NULL; |
+} |
+CXFA_Node* CXFA_SimpleParser::ParseAsXDPPacket_LocaleConnectionSourceSet( |
+ IFDE_XMLNode* pXMLDocumentNode, |
+ XFA_XDPPACKET ePacketID) { |
+ CXFA_Node* pNode = NULL; |
+ if (ePacketID == XFA_XDPPACKET_LocaleSet) { |
+ if (XFA_FDEExtension_MatchNodeName( |
+ pXMLDocumentNode, XFA_GetPacketByIndex(XFA_PACKET_LocaleSet)->pName, |
+ XFA_GetPacketByIndex(XFA_PACKET_LocaleSet)->pURI, |
+ XFA_GetPacketByIndex(XFA_PACKET_LocaleSet)->eFlags)) { |
+ pNode = m_pFactory->CreateNode(XFA_XDPPACKET_LocaleSet, |
+ XFA_ELEMENT_LocaleSet); |
+ if (!pNode) { |
+ return NULL; |
+ } |
+ pNode->SetCData(XFA_ATTRIBUTE_Name, |
+ XFA_GetPacketByIndex(XFA_PACKET_LocaleSet)->pName); |
+ if (!NormalLoader(pNode, pXMLDocumentNode, ePacketID)) { |
+ return NULL; |
+ } |
+ } |
+ } else if (ePacketID == XFA_XDPPACKET_ConnectionSet) { |
+ if (XFA_FDEExtension_MatchNodeName( |
+ pXMLDocumentNode, |
+ XFA_GetPacketByIndex(XFA_PACKET_ConnectionSet)->pName, |
+ XFA_GetPacketByIndex(XFA_PACKET_ConnectionSet)->pURI, |
+ XFA_GetPacketByIndex(XFA_PACKET_ConnectionSet)->eFlags)) { |
+ pNode = m_pFactory->CreateNode(XFA_XDPPACKET_ConnectionSet, |
+ XFA_ELEMENT_ConnectionSet); |
+ if (!pNode) { |
+ return NULL; |
+ } |
+ pNode->SetCData(XFA_ATTRIBUTE_Name, |
+ XFA_GetPacketByIndex(XFA_PACKET_ConnectionSet)->pName); |
+ if (!NormalLoader(pNode, pXMLDocumentNode, ePacketID)) { |
+ return NULL; |
+ } |
+ } |
+ } else if (ePacketID == XFA_XDPPACKET_SourceSet) { |
+ if (XFA_FDEExtension_MatchNodeName( |
+ pXMLDocumentNode, XFA_GetPacketByIndex(XFA_PACKET_SourceSet)->pName, |
+ XFA_GetPacketByIndex(XFA_PACKET_SourceSet)->pURI, |
+ XFA_GetPacketByIndex(XFA_PACKET_SourceSet)->eFlags)) { |
+ pNode = m_pFactory->CreateNode(XFA_XDPPACKET_SourceSet, |
+ XFA_ELEMENT_SourceSet); |
+ if (!pNode) { |
+ return NULL; |
+ } |
+ pNode->SetCData(XFA_ATTRIBUTE_Name, |
+ XFA_GetPacketByIndex(XFA_PACKET_SourceSet)->pName); |
+ if (!NormalLoader(pNode, pXMLDocumentNode, ePacketID)) { |
+ return NULL; |
+ } |
+ } |
+ } |
+ if (pNode) { |
+ pNode->SetXMLMappingNode(pXMLDocumentNode); |
+ } |
+ return pNode; |
+} |
+CXFA_Node* CXFA_SimpleParser::ParseAsXDPPacket_Xdc( |
+ IFDE_XMLNode* pXMLDocumentNode, |
+ XFA_XDPPACKET ePacketID) { |
+ if (XFA_FDEExtension_MatchNodeName( |
+ pXMLDocumentNode, XFA_GetPacketByIndex(XFA_PACKET_Xdc)->pName, |
+ XFA_GetPacketByIndex(XFA_PACKET_Xdc)->pURI, |
+ XFA_GetPacketByIndex(XFA_PACKET_Xdc)->eFlags)) { |
+ CXFA_Node* pNode = |
+ m_pFactory->CreateNode(XFA_XDPPACKET_Xdc, XFA_ELEMENT_Xdc); |
+ if (!pNode) { |
+ return NULL; |
+ } |
+ pNode->SetCData(XFA_ATTRIBUTE_Name, |
+ XFA_GetPacketByIndex(XFA_PACKET_Xdc)->pName); |
+ pNode->SetXMLMappingNode(pXMLDocumentNode); |
+ return pNode; |
+ } |
+ return NULL; |
+} |
+CXFA_Node* CXFA_SimpleParser::ParseAsXDPPacket_User( |
+ IFDE_XMLNode* pXMLDocumentNode, |
+ XFA_XDPPACKET ePacketID) { |
+ CXFA_Node* pNode = |
+ m_pFactory->CreateNode(XFA_XDPPACKET_XDP, XFA_ELEMENT_Packet); |
+ if (!pNode) { |
+ return NULL; |
+ } |
+ CFX_WideString wsName; |
+ ((IFDE_XMLElement*)pXMLDocumentNode)->GetLocalTagName(wsName); |
+ pNode->SetCData(XFA_ATTRIBUTE_Name, wsName); |
+ if (!UserPacketLoader(pNode, pXMLDocumentNode)) { |
+ return NULL; |
+ } |
+ pNode->SetXMLMappingNode(pXMLDocumentNode); |
+ return pNode; |
+} |
+CXFA_Node* CXFA_SimpleParser::UserPacketLoader(CXFA_Node* pXFANode, |
+ IFDE_XMLNode* pXMLDoc) { |
+ return pXFANode; |
+} |
+static FX_BOOL XFA_FDEExtension_IsStringAllWhitespace(CFX_WideString wsText) { |
+ wsText.TrimRight(L"\x20\x9\xD\xA"); |
+ return wsText.IsEmpty(); |
+} |
+CXFA_Node* CXFA_SimpleParser::DataLoader(CXFA_Node* pXFANode, |
+ IFDE_XMLNode* pXMLDoc, |
+ FX_BOOL bDoTransform) { |
+ ParseDataGroup(pXFANode, pXMLDoc, XFA_XDPPACKET_Datasets); |
+ return pXFANode; |
+} |
+CXFA_Node* CXFA_SimpleParser::NormalLoader(CXFA_Node* pXFANode, |
+ IFDE_XMLNode* pXMLDoc, |
+ XFA_XDPPACKET ePacketID, |
+ FX_BOOL bUseAttribute) { |
+ FX_BOOL bOneOfPropertyFound = FALSE; |
+ for (IFDE_XMLNode* pXMLChild = pXMLDoc->GetNodeItem(IFDE_XMLNode::FirstChild); |
+ pXMLChild; |
+ pXMLChild = pXMLChild->GetNodeItem(IFDE_XMLNode::NextSibling)) { |
+ switch (pXMLChild->GetType()) { |
+ case FDE_XMLNODE_Element: { |
+ IFDE_XMLElement* pXMLElement = (IFDE_XMLElement*)pXMLChild; |
+ CFX_WideString wsTagName; |
+ pXMLElement->GetLocalTagName(wsTagName); |
+ XFA_LPCELEMENTINFO pElemInfo = XFA_GetElementByName(wsTagName); |
+ if (!pElemInfo) { |
+ continue; |
+ } |
+ XFA_LPCPROPERTY pPropertyInfo = XFA_GetPropertyOfElement( |
+ pXFANode->GetClassID(), pElemInfo->eName, ePacketID); |
+ if (pPropertyInfo && |
+ ((pPropertyInfo->uFlags & |
+ (XFA_PROPERTYFLAG_OneOf | XFA_PROPERTYFLAG_DefaultOneOf)) != 0)) { |
+ if (bOneOfPropertyFound) { |
+ break; |
+ } |
+ bOneOfPropertyFound = TRUE; |
+ } |
+ CXFA_Node* pXFAChild = |
+ m_pFactory->CreateNode(ePacketID, pElemInfo->eName); |
+ if (pXFAChild == NULL) { |
+ return NULL; |
+ } |
+ if (ePacketID == XFA_XDPPACKET_Config) { |
+ pXFAChild->SetAttribute(XFA_ATTRIBUTE_Name, wsTagName); |
+ } |
+ FX_BOOL IsNeedValue = TRUE; |
+ for (int32_t i = 0, count = pXMLElement->CountAttributes(); i < count; |
+ i++) { |
+ CFX_WideString wsAttrQualifiedName; |
+ CFX_WideString wsAttrName; |
+ CFX_WideString wsAttrValue; |
+ pXMLElement->GetAttribute(i, wsAttrQualifiedName, wsAttrValue); |
+ XFA_FDEExtension_GetAttributeLocalName(wsAttrQualifiedName, |
+ wsAttrName); |
+ if (wsAttrName == FX_WSTRC(L"nil") && |
+ wsAttrValue == FX_WSTRC(L"true")) { |
+ IsNeedValue = FALSE; |
+ } |
+ XFA_LPCATTRIBUTEINFO lpAttrInfo = XFA_GetAttributeByName(wsAttrName); |
+ if (!lpAttrInfo) { |
+ continue; |
+ } |
+ if (!bUseAttribute && lpAttrInfo->eName != XFA_ATTRIBUTE_Name && |
+ lpAttrInfo->eName != XFA_ATTRIBUTE_Save) { |
+ continue; |
+ } |
+ pXFAChild->SetAttribute(lpAttrInfo->eName, wsAttrValue); |
+ } |
+ pXFANode->InsertChild(pXFAChild); |
+ if (pElemInfo->eName == XFA_ELEMENT_Validate || |
+ pElemInfo->eName == XFA_ELEMENT_Locale) { |
+ if (ePacketID == XFA_XDPPACKET_Config) { |
+ ParseContentNode(pXFAChild, pXMLElement, ePacketID); |
+ } else { |
+ NormalLoader(pXFAChild, pXMLElement, ePacketID, bUseAttribute); |
+ } |
+ break; |
+ } |
+ switch (pXFAChild->GetObjectType()) { |
+ case XFA_OBJECTTYPE_ContentNode: |
+ case XFA_OBJECTTYPE_TextNode: |
+ case XFA_OBJECTTYPE_NodeC: |
+ case XFA_OBJECTTYPE_NodeV: |
+ if (IsNeedValue) { |
+ ParseContentNode(pXFAChild, pXMLElement, ePacketID); |
+ } |
+ break; |
+ default: |
+ NormalLoader(pXFAChild, pXMLElement, ePacketID, bUseAttribute); |
+ break; |
+ } |
+ } break; |
+ case FDE_XMLNODE_Instruction: |
+ ParseInstruction(pXFANode, (IFDE_XMLInstruction*)pXMLChild, ePacketID); |
+ break; |
+ default: |
+ break; |
+ } |
+ } |
+ return pXFANode; |
+} |
+FX_BOOL XFA_RecognizeRichText(IFDE_XMLElement* pRichTextXMLNode) { |
+ if (pRichTextXMLNode) { |
+ CFX_WideString wsNamespaceURI; |
+ XFA_FDEExtension_GetElementTagNamespaceURI(pRichTextXMLNode, |
+ wsNamespaceURI); |
+ if (wsNamespaceURI == FX_WSTRC(L"http://www.w3.org/1999/xhtml")) { |
+ return TRUE; |
+ } |
+ } |
+ return FALSE; |
+} |
+class RichTextNodeVisitor { |
+ public: |
+ static inline IFDE_XMLNode* GetFirstChild(IFDE_XMLNode* pNode) { |
+ return pNode->GetNodeItem(IFDE_XMLNode::FirstChild); |
+ } |
+ static inline IFDE_XMLNode* GetNextSibling(IFDE_XMLNode* pNode) { |
+ return pNode->GetNodeItem(IFDE_XMLNode::NextSibling); |
+ } |
+ static inline IFDE_XMLNode* GetParent(IFDE_XMLNode* pNode) { |
+ return pNode->GetNodeItem(IFDE_XMLNode::Parent); |
+ } |
+}; |
+#ifndef XFA_PARSE_HAS_LINEIDENTIFIER |
+void XFA_ConvertRichTextToPlainText(IFDE_XMLElement* pRichTextXMLNode, |
+ CFX_WideString& wsOutput) { |
+ CXFA_NodeIteratorTemplate<IFDE_XMLNode, RichTextNodeVisitor> sIterator( |
+ pRichTextXMLNode); |
+ CFX_WideTextBuf wsPlainTextBuf; |
+ for (IFDE_XMLNode* pNode = sIterator.GetCurrent(); pNode; |
+ pNode = sIterator.MoveToNext()) { |
+ switch (pNode->GetType()) { |
+ case FDE_XMLNODE_Text: { |
+ CFX_WideString wsText; |
+ ((IFDE_XMLText*)pNode)->GetText(wsText); |
+ wsPlainTextBuf << wsText; |
+ } break; |
+ case FDE_XMLNODE_CharData: { |
+ CFX_WideString wsText; |
+ ((IFDE_XMLCharData*)pNode)->GetCharData(wsText); |
+ wsPlainTextBuf << wsText; |
+ } break; |
+ default: |
+ break; |
+ } |
+ } |
+ wsOutput = wsPlainTextBuf.GetWideString(); |
+} |
+#endif |
+void XFA_ConvertXMLToPlainText(IFDE_XMLElement* pRootXMLNode, |
+ CFX_WideString& wsOutput) { |
+ for (IFDE_XMLNode* pXMLChild = |
+ pRootXMLNode->GetNodeItem(IFDE_XMLNode::FirstChild); |
+ pXMLChild; |
+ pXMLChild = pXMLChild->GetNodeItem(IFDE_XMLNode::NextSibling)) { |
+#ifdef _DEBUG |
+ FDE_XMLNODETYPE nodeType = pXMLChild->GetType(); |
+#endif |
+ switch (pXMLChild->GetType()) { |
+ case FDE_XMLNODE_Element: { |
+ CFX_WideString wsTextData; |
+ ((IFDE_XMLElement*)pXMLChild)->GetTextData(wsTextData); |
+ wsTextData += FX_WSTRC(L"\n"); |
+ wsOutput += wsTextData; |
+ } break; |
+ case FDE_XMLNODE_Text: { |
+ CFX_WideString wsText; |
+ ((IFDE_XMLText*)pXMLChild)->GetText(wsText); |
+ if (XFA_FDEExtension_IsStringAllWhitespace(wsText)) { |
+ continue; |
+ } else { |
+ wsOutput = wsText; |
+ } |
+ } break; |
+ case FDE_XMLNODE_CharData: { |
+ CFX_WideString wsCharData; |
+ ((IFDE_XMLCharData*)pXMLChild)->GetCharData(wsCharData); |
+ if (XFA_FDEExtension_IsStringAllWhitespace(wsCharData)) { |
+ continue; |
+ } else { |
+ wsOutput = wsCharData; |
+ } |
+ } break; |
+ default: |
+ FXSYS_assert(FALSE); |
+ break; |
+ } |
+ } |
+} |
+void CXFA_SimpleParser::ParseContentNode(CXFA_Node* pXFANode, |
+ IFDE_XMLNode* pXMLNode, |
+ XFA_XDPPACKET ePacketID) { |
+ XFA_ELEMENT element = XFA_ELEMENT_Sharptext; |
+ if (pXFANode->GetClassID() == XFA_ELEMENT_ExData) { |
+ CFX_WideStringC wsContentType = |
+ pXFANode->GetCData(XFA_ATTRIBUTE_ContentType); |
+ if (wsContentType == FX_WSTRC(L"text/html")) { |
+ element = XFA_ELEMENT_SharpxHTML; |
+ } else if (wsContentType == FX_WSTRC(L"text/xml")) { |
+ element = XFA_ELEMENT_Sharpxml; |
+ } |
+ } |
+ if (element == XFA_ELEMENT_SharpxHTML) { |
+ pXFANode->SetXMLMappingNode(pXMLNode); |
+ } |
+ CFX_WideString wsValue; |
+ for (IFDE_XMLNode* pXMLChild = |
+ pXMLNode->GetNodeItem(IFDE_XMLNode::FirstChild); |
+ pXMLChild; |
+ pXMLChild = pXMLChild->GetNodeItem(IFDE_XMLNode::NextSibling)) { |
+ FDE_XMLNODETYPE eNodeType = pXMLChild->GetType(); |
+ if (eNodeType == FDE_XMLNODE_Instruction) { |
+ continue; |
+ } |
+ if (element == XFA_ELEMENT_SharpxHTML) { |
+ if (eNodeType != FDE_XMLNODE_Element) { |
+ break; |
+ } |
+ if (XFA_RecognizeRichText((IFDE_XMLElement*)pXMLChild)) { |
+#ifdef XFA_PARSE_HAS_LINEIDENTIFIER |
+ XFA_GetPlainTextFromRichText((IFDE_XMLElement*)pXMLChild, wsValue); |
+#else |
+ XFA_ConvertRichTextToPlainText((IFDE_XMLElement*)pXMLChild, wsValue); |
+#endif |
+ } |
+ } else if (element == XFA_ELEMENT_Sharpxml) { |
+ if (eNodeType != FDE_XMLNODE_Element) { |
+ break; |
+ } |
+ XFA_ConvertXMLToPlainText((IFDE_XMLElement*)pXMLChild, wsValue); |
+ } else { |
+ if (eNodeType == FDE_XMLNODE_Element) { |
+ break; |
+ } |
+ if (eNodeType == FDE_XMLNODE_Text) { |
+ ((IFDE_XMLText*)pXMLChild)->GetText(wsValue); |
+ } else if (eNodeType == FDE_XMLNODE_CharData) { |
+ ((IFDE_XMLCharData*)pXMLChild)->GetCharData(wsValue); |
+ } |
+ } |
+ break; |
+ } |
+ if (!wsValue.IsEmpty()) { |
+ if (pXFANode->GetObjectType() == XFA_OBJECTTYPE_ContentNode) { |
+ CXFA_Node* pContentRawDataNode = |
+ m_pFactory->CreateNode(ePacketID, element); |
+ FXSYS_assert(pContentRawDataNode); |
+ pContentRawDataNode->SetCData(XFA_ATTRIBUTE_Value, wsValue); |
+ pXFANode->InsertChild(pContentRawDataNode); |
+ } else { |
+ pXFANode->SetCData(XFA_ATTRIBUTE_Value, wsValue); |
+ } |
+ } |
+} |
+void CXFA_SimpleParser::ParseDataGroup(CXFA_Node* pXFANode, |
+ IFDE_XMLNode* pXMLNode, |
+ XFA_XDPPACKET ePacketID) { |
+ for (IFDE_XMLNode* pXMLChild = |
+ pXMLNode->GetNodeItem(IFDE_XMLNode::FirstChild); |
+ pXMLChild; |
+ pXMLChild = pXMLChild->GetNodeItem(IFDE_XMLNode::NextSibling)) { |
+ switch (pXMLChild->GetType()) { |
+ case FDE_XMLNODE_Element: { |
+ IFDE_XMLElement* pXMLElement = (IFDE_XMLElement*)pXMLChild; |
+ { |
+ CFX_WideString wsNamespaceURI; |
+ XFA_FDEExtension_GetElementTagNamespaceURI(pXMLElement, |
+ wsNamespaceURI); |
+ if (wsNamespaceURI == |
+ FX_WSTRC(L"http://www.xfa.com/schema/xfa-package/") || |
+ wsNamespaceURI == |
+ FX_WSTRC(L"http://www.xfa.org/schema/xfa-package/") || |
+ wsNamespaceURI == |
+ FX_WSTRC(L"http://www.w3.org/2001/XMLSchema-instance")) { |
+ continue; |
+ } |
+ if (0) { |
+ continue; |
+ } |
+ } |
+ XFA_ELEMENT eNodeType = XFA_ELEMENT_DataModel; |
+ if (eNodeType == XFA_ELEMENT_DataModel) { |
+ CFX_WideString wsDataNodeAttr; |
+ if (XFA_FDEExtension_FindAttributeWithNS( |
+ pXMLElement, FX_WSTRC(L"dataNode"), |
+ FX_WSTRC(L"http://www.xfa.org/schema/xfa-data/1.0/"), |
+ wsDataNodeAttr)) { |
+ if (wsDataNodeAttr == FX_WSTRC(L"dataGroup")) { |
+ eNodeType = XFA_ELEMENT_DataGroup; |
+ } else if (wsDataNodeAttr == FX_WSTRC(L"dataValue")) { |
+ eNodeType = XFA_ELEMENT_DataValue; |
+ } |
+ } |
+ } |
+ CFX_WideString wsContentType; |
+ if (eNodeType == XFA_ELEMENT_DataModel) { |
+ if (XFA_FDEExtension_FindAttributeWithNS( |
+ pXMLElement, FX_WSTRC(L"contentType"), |
+ FX_WSTRC(L"http://www.xfa.org/schema/xfa-data/1.0/"), |
+ wsContentType)) { |
+ if (!wsContentType.IsEmpty()) { |
+ eNodeType = XFA_ELEMENT_DataValue; |
+ } |
+ } |
+ } |
+ if (eNodeType == XFA_ELEMENT_DataModel) { |
+ for (IFDE_XMLNode* pXMLDataChild = |
+ pXMLElement->GetNodeItem(IFDE_XMLNode::FirstChild); |
+ pXMLDataChild; pXMLDataChild = pXMLDataChild->GetNodeItem( |
+ IFDE_XMLNode::NextSibling)) { |
+ if (pXMLDataChild->GetType() == FDE_XMLNODE_Element) { |
+ if (!XFA_RecognizeRichText((IFDE_XMLElement*)pXMLDataChild)) { |
+ eNodeType = XFA_ELEMENT_DataGroup; |
+ break; |
+ } |
+ } |
+ } |
+ } |
+ if (eNodeType == XFA_ELEMENT_DataModel) { |
+ eNodeType = XFA_ELEMENT_DataValue; |
+ } |
+ CXFA_Node* pXFAChild = |
+ m_pFactory->CreateNode(XFA_XDPPACKET_Datasets, eNodeType); |
+ if (pXFAChild == NULL) { |
+ return; |
+ } |
+ CFX_WideString wsNodeName; |
+ pXMLElement->GetLocalTagName(wsNodeName); |
+ pXFAChild->SetCData(XFA_ATTRIBUTE_Name, wsNodeName); |
+ FX_BOOL bNeedValue = TRUE; |
+ if (1) { |
+ for (int32_t i = 0, count = pXMLElement->CountAttributes(); i < count; |
+ i++) { |
+ CFX_WideString wsAttrQualifiedName; |
+ CFX_WideString wsAttrValue; |
+ CFX_WideString wsAttrName; |
+ CFX_WideString wsAttrNamespaceURI; |
+ pXMLElement->GetAttribute(i, wsAttrQualifiedName, wsAttrValue); |
+ if (!XFA_FDEExtension_ResolveAttribute( |
+ pXMLElement, wsAttrQualifiedName, wsAttrName, |
+ wsAttrNamespaceURI)) { |
+ continue; |
+ } |
+ if (wsAttrName == FX_WSTRC(L"nil") && |
+ wsAttrValue == FX_WSTRC(L"true")) { |
+ bNeedValue = FALSE; |
+ continue; |
+ } |
+ if (wsAttrNamespaceURI == |
+ FX_WSTRC(L"http://www.xfa.com/schema/xfa-package/") || |
+ wsAttrNamespaceURI == |
+ FX_WSTRC(L"http://www.xfa.org/schema/xfa-package/") || |
+ wsAttrNamespaceURI == |
+ FX_WSTRC(L"http://www.w3.org/2001/XMLSchema-instance") || |
+ wsAttrNamespaceURI == |
+ FX_WSTRC(L"http://www.xfa.org/schema/xfa-data/1.0/")) { |
+ continue; |
+ } |
+ if (0) { |
+ continue; |
+ } |
+ CXFA_Node* pXFAMetaData = m_pFactory->CreateNode( |
+ XFA_XDPPACKET_Datasets, XFA_ELEMENT_DataValue); |
+ if (pXFAMetaData == NULL) { |
+ return; |
+ } |
+ pXFAMetaData->SetCData(XFA_ATTRIBUTE_Name, wsAttrName); |
+ pXFAMetaData->SetCData(XFA_ATTRIBUTE_QualifiedName, |
+ wsAttrQualifiedName); |
+ pXFAMetaData->SetCData(XFA_ATTRIBUTE_Value, wsAttrValue); |
+ pXFAMetaData->SetEnum(XFA_ATTRIBUTE_Contains, |
+ XFA_ATTRIBUTEENUM_MetaData); |
+ pXFAChild->InsertChild(pXFAMetaData); |
+ pXFAMetaData->SetXMLMappingNode(pXMLElement); |
+ pXFAMetaData->SetFlag(XFA_NODEFLAG_Initialized, TRUE, FALSE); |
+ } |
+ if (!bNeedValue) { |
+ CFX_WideString wsNilName = FX_WSTRC(L"xsi:nil"); |
+ pXMLElement->RemoveAttribute(wsNilName); |
+ } |
+ } |
+ pXFANode->InsertChild(pXFAChild); |
+ if (eNodeType == XFA_ELEMENT_DataGroup) { |
+ ParseDataGroup(pXFAChild, pXMLElement, ePacketID); |
+ } else { |
+ if (bNeedValue) { |
+ ParseDataValue(pXFAChild, pXMLChild, XFA_XDPPACKET_Datasets); |
+ } |
+ } |
+ pXFAChild->SetXMLMappingNode(pXMLElement); |
+ pXFAChild->SetFlag(XFA_NODEFLAG_Initialized, TRUE, FALSE); |
+ } |
+ continue; |
+ case FDE_XMLNODE_CharData: { |
+ IFDE_XMLCharData* pXMLCharData = (IFDE_XMLCharData*)pXMLChild; |
+ CFX_WideString wsCharData; |
+ pXMLCharData->GetCharData(wsCharData); |
+ if (XFA_FDEExtension_IsStringAllWhitespace(wsCharData)) { |
+ continue; |
+ } |
+ CXFA_Node* pXFAChild = m_pFactory->CreateNode(XFA_XDPPACKET_Datasets, |
+ XFA_ELEMENT_DataValue); |
+ if (pXFAChild == NULL) { |
+ return; |
+ } |
+ pXFAChild->SetCData(XFA_ATTRIBUTE_Value, wsCharData); |
+ pXFANode->InsertChild(pXFAChild); |
+ pXFAChild->SetXMLMappingNode(pXMLCharData); |
+ pXFAChild->SetFlag(XFA_NODEFLAG_Initialized, TRUE, FALSE); |
+ } |
+ continue; |
+ case FDE_XMLNODE_Text: { |
+ IFDE_XMLText* pXMLText = (IFDE_XMLText*)pXMLChild; |
+ CFX_WideString wsText; |
+ pXMLText->GetText(wsText); |
+ if (XFA_FDEExtension_IsStringAllWhitespace(wsText)) { |
+ continue; |
+ } |
+ CXFA_Node* pXFAChild = m_pFactory->CreateNode(XFA_XDPPACKET_Datasets, |
+ XFA_ELEMENT_DataValue); |
+ if (pXFAChild == NULL) { |
+ return; |
+ } |
+ pXFAChild->SetCData(XFA_ATTRIBUTE_Value, wsText); |
+ pXFANode->InsertChild(pXFAChild); |
+ pXFAChild->SetXMLMappingNode(pXMLText); |
+ pXFAChild->SetFlag(XFA_NODEFLAG_Initialized, TRUE, FALSE); |
+ } |
+ continue; |
+ case FDE_XMLNODE_Instruction: |
+ continue; |
+ default: |
+ continue; |
+ } |
+ } |
+} |
+void CXFA_SimpleParser::ParseDataValue(CXFA_Node* pXFANode, |
+ IFDE_XMLNode* pXMLNode, |
+ XFA_XDPPACKET ePacketID) { |
+ CFX_WideTextBuf wsValueTextBuf; |
+ CFX_WideTextBuf wsCurValueTextBuf; |
+ FX_BOOL bMarkAsCompound = FALSE; |
+ IFDE_XMLNode* pXMLCurValueNode = NULL; |
+ for (IFDE_XMLNode* pXMLChild = |
+ pXMLNode->GetNodeItem(IFDE_XMLNode::FirstChild); |
+ pXMLChild; |
+ pXMLChild = pXMLChild->GetNodeItem(IFDE_XMLNode::NextSibling)) { |
+ FDE_XMLNODETYPE eNodeType = pXMLChild->GetType(); |
+ if (eNodeType == FDE_XMLNODE_Instruction) { |
+ continue; |
+ } |
+ CFX_WideString wsText; |
+ if (eNodeType == FDE_XMLNODE_Text) { |
+ ((IFDE_XMLText*)pXMLChild)->GetText(wsText); |
+ if (!pXMLCurValueNode) { |
+ pXMLCurValueNode = pXMLChild; |
+ } |
+ wsCurValueTextBuf << wsText; |
+ } else if (eNodeType == FDE_XMLNODE_CharData) { |
+ ((IFDE_XMLCharData*)pXMLChild)->GetCharData(wsText); |
+ if (!pXMLCurValueNode) { |
+ pXMLCurValueNode = pXMLChild; |
+ } |
+ wsCurValueTextBuf << wsText; |
+ } else if (XFA_RecognizeRichText((IFDE_XMLElement*)pXMLChild)) { |
+#ifdef XFA_PARSE_HAS_LINEIDENTIFIER |
+ XFA_GetPlainTextFromRichText((IFDE_XMLElement*)pXMLChild, wsText); |
+#else |
+ XFA_ConvertRichTextToPlainText((IFDE_XMLElement*)pXMLChild, wsText); |
+#endif |
+ if (!pXMLCurValueNode) { |
+ pXMLCurValueNode = pXMLChild; |
+ } |
+ wsCurValueTextBuf << wsText; |
+ } else { |
+ bMarkAsCompound = TRUE; |
+ if (pXMLCurValueNode) { |
+ CFX_WideStringC wsCurValue = wsCurValueTextBuf.GetWideString(); |
+ if (!wsCurValue.IsEmpty()) { |
+ CXFA_Node* pXFAChild = |
+ m_pFactory->CreateNode(ePacketID, XFA_ELEMENT_DataValue); |
+ if (pXFAChild == NULL) { |
+ return; |
+ } |
+ pXFAChild->SetCData(XFA_ATTRIBUTE_Name, FX_WSTRC(L"")); |
+ pXFAChild->SetCData(XFA_ATTRIBUTE_Value, wsCurValue); |
+ pXFANode->InsertChild(pXFAChild); |
+ pXFAChild->SetXMLMappingNode(pXMLCurValueNode); |
+ pXFAChild->SetFlag(XFA_NODEFLAG_Initialized, TRUE, FALSE); |
+ wsValueTextBuf << wsCurValue; |
+ wsCurValueTextBuf.Clear(); |
+ } |
+ pXMLCurValueNode = NULL; |
+ } |
+ CXFA_Node* pXFAChild = |
+ m_pFactory->CreateNode(ePacketID, XFA_ELEMENT_DataValue); |
+ if (pXFAChild == NULL) { |
+ return; |
+ } |
+ CFX_WideString wsNodeStr; |
+ ((IFDE_XMLElement*)pXMLChild)->GetLocalTagName(wsNodeStr); |
+ pXFAChild->SetCData(XFA_ATTRIBUTE_Name, wsNodeStr); |
+ ParseDataValue(pXFAChild, pXMLChild, ePacketID); |
+ pXFANode->InsertChild(pXFAChild); |
+ pXFAChild->SetXMLMappingNode(pXMLChild); |
+ pXFAChild->SetFlag(XFA_NODEFLAG_Initialized, TRUE, FALSE); |
+ CFX_WideStringC wsCurValue = pXFAChild->GetCData(XFA_ATTRIBUTE_Value); |
+ wsValueTextBuf << wsCurValue; |
+ } |
+ } |
+ if (pXMLCurValueNode) { |
+ CFX_WideStringC wsCurValue = wsCurValueTextBuf.GetWideString(); |
+ if (!wsCurValue.IsEmpty()) { |
+ if (bMarkAsCompound) { |
+ CXFA_Node* pXFAChild = |
+ m_pFactory->CreateNode(ePacketID, XFA_ELEMENT_DataValue); |
+ if (pXFAChild == NULL) { |
+ return; |
+ } |
+ pXFAChild->SetCData(XFA_ATTRIBUTE_Name, FX_WSTRC(L"")); |
+ pXFAChild->SetCData(XFA_ATTRIBUTE_Value, wsCurValue); |
+ pXFANode->InsertChild(pXFAChild); |
+ pXFAChild->SetXMLMappingNode(pXMLCurValueNode); |
+ pXFAChild->SetFlag(XFA_NODEFLAG_Initialized, TRUE, FALSE); |
+ } |
+ wsValueTextBuf << wsCurValue; |
+ wsCurValueTextBuf.Clear(); |
+ } |
+ pXMLCurValueNode = NULL; |
+ } |
+ CFX_WideStringC wsNodeValue = wsValueTextBuf.GetWideString(); |
+ pXFANode->SetCData(XFA_ATTRIBUTE_Value, wsNodeValue); |
+} |
+void CXFA_SimpleParser::ParseInstruction(CXFA_Node* pXFANode, |
+ IFDE_XMLInstruction* pXMLInstruction, |
+ XFA_XDPPACKET ePacketID) { |
+ if (!m_bDocumentParser) { |
+ return; |
+ } |
+ CFX_WideString wsTargetName; |
+ pXMLInstruction->GetTargetName(wsTargetName); |
+ if (wsTargetName == FX_WSTRC(L"originalXFAVersion")) { |
+ CFX_WideString wsData; |
+ if (pXMLInstruction->GetData(0, wsData) && |
+ (pXFANode->GetDocument()->RecognizeXFAVersionNumber(wsData) != |
+ XFA_VERSION_UNKNOWN)) { |
+ wsData.Empty(); |
+ if (pXMLInstruction->GetData(1, wsData) && |
+ wsData == FX_WSTRC(L"v2.7-scripting:1")) { |
+ pXFANode->GetDocument()->SetFlag(XFA_DOCFLAG_Scripting, TRUE); |
+ } |
+ } |
+ } else if (wsTargetName == FX_WSTRC(L"acrobat")) { |
+ CFX_WideString wsData; |
+ if (pXMLInstruction->GetData(0, wsData) && |
+ wsData == FX_WSTRC(L"JavaScript")) { |
+ if (pXMLInstruction->GetData(1, wsData) && |
+ wsData == FX_WSTRC(L"strictScoping")) { |
+ pXFANode->GetDocument()->SetFlag(XFA_DOCFLAG_StrictScoping, TRUE); |
+ } |
+ } |
+ } |
+} |
+void CXFA_SimpleParser::CloseParser() { |
+ if (m_pXMLDoc) { |
+ m_pXMLDoc->Release(); |
+ m_pXMLDoc = NULL; |
+ } |
+ if (m_pStream) { |
+ m_pStream->Release(); |
+ m_pStream = NULL; |
+ } |
+} |
+IXFA_DocParser* IXFA_DocParser::Create(IXFA_Notify* pNotify) { |
+ return new CXFA_DocumentParser(pNotify); |
+} |
+CXFA_DocumentParser::CXFA_DocumentParser(IXFA_Notify* pNotify) |
+ : m_nodeParser(NULL, TRUE), m_pNotify(pNotify), m_pDocument(NULL) { |
+} |
+CXFA_DocumentParser::~CXFA_DocumentParser() { |
+ CloseParser(); |
+} |
+int32_t CXFA_DocumentParser::StartParse(IFX_FileRead* pStream, |
+ XFA_XDPPACKET ePacketID) { |
+ CloseParser(); |
+ int32_t nRetStatus = m_nodeParser.StartParse(pStream, ePacketID); |
+ if (nRetStatus == XFA_PARSESTATUS_Ready) { |
+ m_pDocument = new CXFA_Document(this); |
+ m_nodeParser.SetFactory(m_pDocument); |
+ } |
+ return nRetStatus; |
+} |
+int32_t CXFA_DocumentParser::DoParse(IFX_Pause* pPause) { |
+ int32_t nRetStatus = m_nodeParser.DoParse(pPause); |
+ if (nRetStatus >= XFA_PARSESTATUS_Done) { |
+ FXSYS_assert(m_pDocument); |
+ m_pDocument->SetRoot(m_nodeParser.GetRootNode()); |
+ } |
+ return nRetStatus; |
+} |
+int32_t CXFA_DocumentParser::ParseXMLData(const CFX_WideString& wsXML, |
+ IFDE_XMLNode*& pXMLNode, |
+ IFX_Pause* pPause) { |
+ CloseParser(); |
+ int32_t nRetStatus = m_nodeParser.ParseXMLData(wsXML, pXMLNode, NULL); |
+ if (nRetStatus == XFA_PARSESTATUS_Done && pXMLNode) { |
+ m_pDocument = new CXFA_Document(this); |
+ m_nodeParser.SetFactory(m_pDocument); |
+ } |
+ return nRetStatus; |
+} |
+void CXFA_DocumentParser::ConstructXFANode(CXFA_Node* pXFANode, |
+ IFDE_XMLNode* pXMLNode) { |
+ if (!pXFANode || !pXMLNode) { |
+ return; |
+ } |
+ m_nodeParser.ConstructXFANode(pXFANode, pXMLNode); |
+ CXFA_Node* pRootNode = m_nodeParser.GetRootNode(); |
+ if (m_pDocument && pRootNode) { |
+ m_pDocument->SetRoot(pRootNode); |
+ } |
+} |
+void CXFA_DocumentParser::CloseParser() { |
+ if (m_pDocument) { |
+ delete m_pDocument; |
+ m_pDocument = NULL; |
+ } |
+ m_nodeParser.CloseParser(); |
+} |
+CXFA_XMLParser::CXFA_XMLParser(IFDE_XMLNode* pRoot, IFX_Stream* pStream) |
+ : |
+#ifdef _XFA_VERIFY_Checksum_ |
+ m_nElementStart(0), |
+ m_dwCheckStatus(0), |
+ m_dwCurrentCheckStatus(0), |
+#endif |
+ m_pRoot(pRoot), |
+ m_pStream(pStream), |
+ m_pParser(nullptr), |
+ m_pParent(pRoot), |
+ m_pChild(nullptr), |
+ m_NodeStack(16), |
+ m_dwStatus(FDE_XMLSYNTAXSTATUS_None) { |
+ ASSERT(m_pParent && m_pStream); |
+ m_NodeStack.Push(m_pParent); |
+ m_pParser = IFDE_XMLSyntaxParser::Create(); |
+ m_pParser->Init(m_pStream, 32 * 1024, 1024 * 1024); |
+} |
+CXFA_XMLParser::~CXFA_XMLParser() { |
+ if (m_pParser) { |
+ m_pParser->Release(); |
+ } |
+ m_NodeStack.RemoveAll(); |
+ m_ws1.Empty(); |
+ m_ws2.Empty(); |
+} |
+int32_t CXFA_XMLParser::DoParser(IFX_Pause* pPause) { |
+ if (m_dwStatus == FDE_XMLSYNTAXSTATUS_Error) { |
+ return -1; |
+ } |
+ if (m_dwStatus == FDE_XMLSYNTAXSTATUS_EOS) { |
+ return 100; |
+ } |
+ int32_t iCount = 0; |
+ while (TRUE) { |
+ m_dwStatus = m_pParser->DoSyntaxParse(); |
+ switch (m_dwStatus) { |
+ case FDE_XMLSYNTAXSTATUS_InstructionOpen: |
+ break; |
+ case FDE_XMLSYNTAXSTATUS_InstructionClose: |
+ if (m_pChild) { |
+ if (m_pChild->GetType() != FDE_XMLNODE_Instruction) { |
+ m_dwStatus = FDE_XMLSYNTAXSTATUS_Error; |
+ break; |
+ } |
+ } |
+ m_pChild = m_pParent; |
+ break; |
+ case FDE_XMLSYNTAXSTATUS_ElementOpen: |
+#ifdef _XFA_VERIFY_Checksum_ |
+ if (m_dwCheckStatus != 0x03 && m_NodeStack.GetSize() == 2) { |
+ m_nElementStart = m_pParser->GetCurrentPos() - 1; |
+ } |
+#endif |
+ break; |
+ case FDE_XMLSYNTAXSTATUS_ElementBreak: |
+ break; |
+ case FDE_XMLSYNTAXSTATUS_ElementClose: |
+ if (m_pChild->GetType() != FDE_XMLNODE_Element) { |
+ m_dwStatus = FDE_XMLSYNTAXSTATUS_Error; |
+ break; |
+ } |
+ m_pParser->GetTagName(m_ws1); |
+ ((IFDE_XMLElement*)m_pChild)->GetTagName(m_ws2); |
+ if (m_ws1.GetLength() > 0 && !m_ws1.Equal(m_ws2)) { |
+ m_dwStatus = FDE_XMLSYNTAXSTATUS_Error; |
+ break; |
+ } |
+ m_NodeStack.Pop(); |
+ if (m_NodeStack.GetSize() < 1) { |
+ m_dwStatus = FDE_XMLSYNTAXSTATUS_Error; |
+ break; |
+ } |
+#ifdef _XFA_VERIFY_Checksum_ |
+ else if (m_dwCurrentCheckStatus != 0 && m_NodeStack.GetSize() == 2) { |
+ m_nSize[m_dwCurrentCheckStatus - 1] = |
+ m_pParser->GetCurrentBinaryPos() - |
+ m_nStart[m_dwCurrentCheckStatus - 1]; |
+ m_dwCurrentCheckStatus = 0; |
+ } |
+#endif |
+ m_pParent = (IFDE_XMLNode*)*m_NodeStack.GetTopElement(); |
+ m_pChild = m_pParent; |
+ iCount++; |
+ break; |
+ case FDE_XMLSYNTAXSTATUS_TargetName: |
+ m_pParser->GetTargetName(m_ws1); |
+ if (m_ws1 == FX_WSTRC(L"originalXFAVersion") || |
+ m_ws1 == FX_WSTRC(L"acrobat")) { |
+ m_pChild = IFDE_XMLInstruction::Create(m_ws1); |
+ m_pParent->InsertChildNode(m_pChild); |
+ } else { |
+ m_pChild = NULL; |
+ } |
+ m_ws1.Empty(); |
+ break; |
+ case FDE_XMLSYNTAXSTATUS_TagName: |
+ m_pParser->GetTagName(m_ws1); |
+ m_pChild = IFDE_XMLElement::Create(m_ws1); |
+ m_pParent->InsertChildNode(m_pChild); |
+ m_NodeStack.Push(m_pChild); |
+ m_pParent = m_pChild; |
+#ifdef _XFA_VERIFY_Checksum_ |
+ if (m_dwCheckStatus != 0x03 && m_NodeStack.GetSize() == 3) { |
+ CFX_WideString wsTag; |
+ ((IFDE_XMLElement*)m_pChild)->GetLocalTagName(wsTag); |
+ if (wsTag == FX_WSTRC(L"template")) { |
+ m_dwCheckStatus |= 0x01; |
+ m_dwCurrentCheckStatus = 0x01; |
+ m_nStart[0] = m_pParser->GetCurrentBinaryPos() - |
+ (m_pParser->GetCurrentPos() - m_nElementStart); |
+ } else if (wsTag == FX_WSTRC(L"datasets")) { |
+ m_dwCheckStatus |= 0x02; |
+ m_dwCurrentCheckStatus = 0x02; |
+ m_nStart[1] = m_pParser->GetCurrentBinaryPos() - |
+ (m_pParser->GetCurrentPos() - m_nElementStart); |
+ } |
+ } |
+#endif |
+ break; |
+ case FDE_XMLSYNTAXSTATUS_AttriName: |
+ m_pParser->GetAttributeName(m_ws1); |
+ break; |
+ case FDE_XMLSYNTAXSTATUS_AttriValue: |
+ if (m_pChild) { |
+ m_pParser->GetAttributeName(m_ws2); |
+ if (m_pChild->GetType() == FDE_XMLNODE_Element) { |
+ ((IFDE_XMLElement*)m_pChild)->SetString(m_ws1, m_ws2); |
+ } |
+ } |
+ m_ws1.Empty(); |
+ break; |
+ case FDE_XMLSYNTAXSTATUS_Text: |
+ m_pParser->GetTextData(m_ws1); |
+ m_pChild = IFDE_XMLText::Create(m_ws1); |
+ m_pParent->InsertChildNode(m_pChild); |
+ m_pChild = m_pParent; |
+ break; |
+ case FDE_XMLSYNTAXSTATUS_CData: |
+ m_pParser->GetTextData(m_ws1); |
+ m_pChild = IFDE_XMLCharData::Create(m_ws1); |
+ m_pParent->InsertChildNode(m_pChild); |
+ m_pChild = m_pParent; |
+ break; |
+ case FDE_XMLSYNTAXSTATUS_TargetData: |
+ if (m_pChild) { |
+ if (m_pChild->GetType() != FDE_XMLNODE_Instruction) { |
+ m_dwStatus = FDE_XMLSYNTAXSTATUS_Error; |
+ break; |
+ } |
+ if (!m_ws1.IsEmpty()) { |
+ ((IFDE_XMLInstruction*)m_pChild)->AppendData(m_ws1); |
+ } |
+ m_pParser->GetTargetData(m_ws1); |
+ ((IFDE_XMLInstruction*)m_pChild)->AppendData(m_ws1); |
+ } |
+ m_ws1.Empty(); |
+ break; |
+ default: |
+ break; |
+ } |
+ if (m_dwStatus == FDE_XMLSYNTAXSTATUS_Error || |
+ m_dwStatus == FDE_XMLSYNTAXSTATUS_EOS) { |
+ break; |
+ } |
+ if (pPause != NULL && iCount > 500 && pPause->NeedToPauseNow()) { |
+ break; |
+ } |
+ } |
+ return (m_dwStatus == FDE_XMLSYNTAXSTATUS_Error || m_NodeStack.GetSize() != 1) |
+ ? -1 |
+ : m_pParser->GetStatus(); |
+} |