Index: xfa/fxfa/parser/cxfa_document.cpp |
diff --git a/xfa/fxfa/parser/xfa_document_imp.cpp b/xfa/fxfa/parser/cxfa_document.cpp |
similarity index 89% |
rename from xfa/fxfa/parser/xfa_document_imp.cpp |
rename to xfa/fxfa/parser/cxfa_document.cpp |
index 633e2e220984a41083ce99564da9fda7b9c7eea0..346690b484d84b0dedf23b30d7260977805ca470 100644 |
--- a/xfa/fxfa/parser/xfa_document_imp.cpp |
+++ b/xfa/fxfa/parser/cxfa_document.cpp |
@@ -12,15 +12,77 @@ |
#include "xfa/fxfa/parser/cscript_layoutpseudomodel.h" |
#include "xfa/fxfa/parser/cscript_logpseudomodel.h" |
#include "xfa/fxfa/parser/cscript_signaturepseudomodel.h" |
+#include "xfa/fxfa/parser/cxfa_document.h" |
#include "xfa/fxfa/parser/cxfa_document_parser.h" |
#include "xfa/fxfa/parser/cxfa_layoutprocessor.h" |
#include "xfa/fxfa/parser/cxfa_scriptcontext.h" |
-#include "xfa/fxfa/parser/xfa_document.h" |
#include "xfa/fxfa/parser/xfa_localemgr.h" |
#include "xfa/fxfa/parser/xfa_object.h" |
#include "xfa/fxfa/parser/xfa_resolvenode_rs.h" |
#include "xfa/fxfa/parser/xfa_utils.h" |
+namespace { |
+ |
+void MergeNodeRecurse(CXFA_Document* pDocument, |
+ CXFA_Node* pDestNodeParent, |
+ CXFA_Node* pProtoNode) { |
+ CXFA_Node* pExistingNode = nullptr; |
+ for (CXFA_Node* pFormChild = |
+ pDestNodeParent->GetNodeItem(XFA_NODEITEM_FirstChild); |
+ pFormChild; |
+ pFormChild = pFormChild->GetNodeItem(XFA_NODEITEM_NextSibling)) { |
+ if (pFormChild->GetElementType() == pProtoNode->GetElementType() && |
+ pFormChild->GetNameHash() == pProtoNode->GetNameHash() && |
+ pFormChild->IsUnusedNode()) { |
+ pFormChild->ClearFlag(XFA_NodeFlag_UnusedNode); |
+ pExistingNode = pFormChild; |
+ break; |
+ } |
+ } |
+ |
+ if (pExistingNode) { |
+ pExistingNode->SetTemplateNode(pProtoNode); |
+ for (CXFA_Node* pTemplateChild = |
+ pProtoNode->GetNodeItem(XFA_NODEITEM_FirstChild); |
+ pTemplateChild; pTemplateChild = pTemplateChild->GetNodeItem( |
+ XFA_NODEITEM_NextSibling)) { |
+ MergeNodeRecurse(pDocument, pExistingNode, pTemplateChild); |
+ } |
+ return; |
+ } |
+ CXFA_Node* pNewNode = pProtoNode->Clone(TRUE); |
+ pNewNode->SetTemplateNode(pProtoNode); |
+ pDestNodeParent->InsertChild(pNewNode, nullptr); |
+} |
+ |
+void MergeNode(CXFA_Document* pDocument, |
+ CXFA_Node* pDestNode, |
+ CXFA_Node* pProtoNode) { |
+ { |
+ CXFA_NodeIterator sIterator(pDestNode); |
+ for (CXFA_Node* pNode = sIterator.GetCurrent(); pNode; |
+ pNode = sIterator.MoveToNext()) { |
+ pNode->SetFlag(XFA_NodeFlag_UnusedNode, true); |
+ } |
+ } |
+ pDestNode->SetTemplateNode(pProtoNode); |
+ for (CXFA_Node* pTemplateChild = |
+ pProtoNode->GetNodeItem(XFA_NODEITEM_FirstChild); |
+ pTemplateChild; |
+ pTemplateChild = pTemplateChild->GetNodeItem(XFA_NODEITEM_NextSibling)) { |
+ MergeNodeRecurse(pDocument, pDestNode, pTemplateChild); |
+ } |
+ { |
+ CXFA_NodeIterator sIterator(pDestNode); |
+ for (CXFA_Node* pNode = sIterator.GetCurrent(); pNode; |
+ pNode = sIterator.MoveToNext()) { |
+ pNode->ClearFlag(XFA_NodeFlag_UnusedNode); |
+ } |
+ } |
+} |
+ |
+} // namespace |
+ |
CXFA_Document::CXFA_Document(CXFA_DocumentParser* pParser) |
: m_pParser(pParser), |
m_pScriptContext(nullptr), |
@@ -37,6 +99,7 @@ CXFA_Document::CXFA_Document(CXFA_DocumentParser* pParser) |
m_dwDocFlags(0) { |
ASSERT(m_pParser); |
} |
+ |
CXFA_Document::~CXFA_Document() { |
delete m_pRootNode; |
PurgeNodes(); |
@@ -64,9 +127,9 @@ void CXFA_Document::ClearLayoutData() { |
} |
void CXFA_Document::SetRoot(CXFA_Node* pNewRoot) { |
- if (m_pRootNode) { |
+ if (m_pRootNode) |
AddPurgeNode(m_pRootNode); |
- } |
+ |
m_pRootNode = pNewRoot; |
RemovePurgeNode(pNewRoot); |
} |
@@ -83,28 +146,26 @@ CXFA_Object* CXFA_Document::GetXFAObject(XFA_HashCode dwNodeNameHash) { |
switch (dwNodeNameHash) { |
case XFA_HASHCODE_Data: { |
CXFA_Node* pDatasetsNode = ToNode(GetXFAObject(XFA_HASHCODE_Datasets)); |
- if (!pDatasetsNode) { |
+ if (!pDatasetsNode) |
return nullptr; |
- } |
+ |
for (CXFA_Node* pDatasetsChild = |
pDatasetsNode->GetFirstChildByClass(XFA_Element::DataGroup); |
pDatasetsChild; |
pDatasetsChild = pDatasetsChild->GetNextSameClassSibling( |
XFA_Element::DataGroup)) { |
- if (pDatasetsChild->GetNameHash() != XFA_HASHCODE_Data) { |
+ if (pDatasetsChild->GetNameHash() != XFA_HASHCODE_Data) |
continue; |
- } |
+ |
CFX_WideString wsNamespaceURI; |
- if (!pDatasetsChild->TryNamespace(wsNamespaceURI)) { |
+ if (!pDatasetsChild->TryNamespace(wsNamespaceURI)) |
continue; |
- } |
+ |
CFX_WideString wsDatasetsURI; |
- if (!pDatasetsNode->TryNamespace(wsDatasetsURI)) { |
+ if (!pDatasetsNode->TryNamespace(wsDatasetsURI)) |
continue; |
- } |
- if (wsNamespaceURI == wsDatasetsURI) { |
+ if (wsNamespaceURI == wsDatasetsURI) |
return pDatasetsChild; |
- } |
} |
return nullptr; |
} |
@@ -147,6 +208,7 @@ CXFA_Object* CXFA_Document::GetXFAObject(XFA_HashCode dwNodeNameHash) { |
return m_pRootNode->GetFirstChildByName(dwNodeNameHash); |
} |
} |
+ |
CXFA_Node* CXFA_Document::CreateNode(uint32_t dwPacket, XFA_Element eElement) { |
return CreateNode(XFA_GetPacketByID(dwPacket), eElement); |
} |
@@ -184,29 +246,29 @@ void CXFA_Document::PurgeNodes() { |
} |
void CXFA_Document::SetFlag(uint32_t dwFlag, FX_BOOL bOn) { |
- if (bOn) { |
+ if (bOn) |
m_dwDocFlags |= dwFlag; |
- } else { |
+ else |
m_dwDocFlags &= ~dwFlag; |
- } |
} |
+ |
FX_BOOL CXFA_Document::IsInteractive() { |
- if (m_dwDocFlags & XFA_DOCFLAG_HasInteractive) { |
+ if (m_dwDocFlags & XFA_DOCFLAG_HasInteractive) |
return !!(m_dwDocFlags & XFA_DOCFLAG_Interactive); |
- } |
+ |
CXFA_Node* pConfig = ToNode(GetXFAObject(XFA_HASHCODE_Config)); |
- if (!pConfig) { |
+ if (!pConfig) |
return FALSE; |
- } |
+ |
CFX_WideString wsInteractive; |
CXFA_Node* pPresent = pConfig->GetFirstChildByClass(XFA_Element::Present); |
- if (!pPresent) { |
+ if (!pPresent) |
return FALSE; |
- } |
+ |
CXFA_Node* pPDF = pPresent->GetFirstChildByClass(XFA_Element::Pdf); |
- if (!pPDF) { |
+ if (!pPDF) |
return FALSE; |
- } |
+ |
CXFA_Node* pInteractive = pPDF->GetChild(0, XFA_Element::Interactive); |
if (pInteractive) { |
m_dwDocFlags |= XFA_DOCFLAG_HasInteractive; |
@@ -218,6 +280,7 @@ FX_BOOL CXFA_Document::IsInteractive() { |
} |
return FALSE; |
} |
+ |
CXFA_LocaleMgr* CXFA_Document::GetLocalMgr() { |
if (!m_pLocalMgr) { |
CFX_WideString wsLanguage; |
@@ -227,17 +290,20 @@ CXFA_LocaleMgr* CXFA_Document::GetLocalMgr() { |
} |
return m_pLocalMgr; |
} |
+ |
CXFA_ScriptContext* CXFA_Document::InitScriptContext(v8::Isolate* pIsolate) { |
if (!m_pScriptContext) |
m_pScriptContext = new CXFA_ScriptContext(this); |
m_pScriptContext->Initialize(pIsolate); |
return m_pScriptContext; |
} |
+ |
CXFA_ScriptContext* CXFA_Document::GetScriptContext() { |
if (!m_pScriptContext) |
m_pScriptContext = new CXFA_ScriptContext(this); |
return m_pScriptContext; |
} |
+ |
XFA_VERSION CXFA_Document::RecognizeXFAVersionNumber( |
CFX_WideString& wsTemplateNS) { |
CFX_WideStringC wsTemplateURIPrefix = |
@@ -248,98 +314,44 @@ XFA_VERSION CXFA_Document::RecognizeXFAVersionNumber( |
return XFA_VERSION_UNKNOWN; |
} |
FX_STRSIZE nDotPos = wsTemplateNS.Find('.', nPrefixLength); |
- if (nDotPos == (FX_STRSIZE)-1) { |
+ if (nDotPos == (FX_STRSIZE)-1) |
return XFA_VERSION_UNKNOWN; |
- } |
+ |
int8_t iMajor = FXSYS_wtoi( |
wsTemplateNS.Mid(nPrefixLength, nDotPos - nPrefixLength).c_str()); |
int8_t iMinor = FXSYS_wtoi( |
wsTemplateNS.Mid(nDotPos + 1, wsTemplateNS.GetLength() - nDotPos - 2) |
.c_str()); |
XFA_VERSION eVersion = (XFA_VERSION)((int32_t)iMajor * 100 + iMinor); |
- if (eVersion < XFA_VERSION_MIN || eVersion > XFA_VERSION_MAX) { |
+ if (eVersion < XFA_VERSION_MIN || eVersion > XFA_VERSION_MAX) |
return XFA_VERSION_UNKNOWN; |
- } |
+ |
m_eCurVersionMode = eVersion; |
return eVersion; |
} |
+ |
CXFA_Node* CXFA_Document::GetNodeByID(CXFA_Node* pRoot, |
const CFX_WideStringC& wsID) { |
- if (!pRoot || wsID.IsEmpty()) { |
+ if (!pRoot || wsID.IsEmpty()) |
return nullptr; |
- } |
+ |
CXFA_NodeIterator sIterator(pRoot); |
for (CXFA_Node* pNode = sIterator.GetCurrent(); pNode; |
pNode = sIterator.MoveToNext()) { |
CFX_WideStringC wsIDVal; |
if (pNode->TryCData(XFA_ATTRIBUTE_Id, wsIDVal) && !wsIDVal.IsEmpty()) { |
- if (wsIDVal == wsID) { |
+ if (wsIDVal == wsID) |
return pNode; |
- } |
} |
} |
return nullptr; |
} |
-static void XFA_ProtoMerge_MergeNodeRecurse(CXFA_Document* pDocument, |
- CXFA_Node* pDestNodeParent, |
- CXFA_Node* pProtoNode) { |
- CXFA_Node* pExistingNode = nullptr; |
- for (CXFA_Node* pFormChild = |
- pDestNodeParent->GetNodeItem(XFA_NODEITEM_FirstChild); |
- pFormChild; |
- pFormChild = pFormChild->GetNodeItem(XFA_NODEITEM_NextSibling)) { |
- if (pFormChild->GetElementType() == pProtoNode->GetElementType() && |
- pFormChild->GetNameHash() == pProtoNode->GetNameHash() && |
- pFormChild->IsUnusedNode()) { |
- pFormChild->ClearFlag(XFA_NodeFlag_UnusedNode); |
- pExistingNode = pFormChild; |
- break; |
- } |
- } |
- if (pExistingNode) { |
- pExistingNode->SetTemplateNode(pProtoNode); |
- for (CXFA_Node* pTemplateChild = |
- pProtoNode->GetNodeItem(XFA_NODEITEM_FirstChild); |
- pTemplateChild; pTemplateChild = pTemplateChild->GetNodeItem( |
- XFA_NODEITEM_NextSibling)) { |
- XFA_ProtoMerge_MergeNodeRecurse(pDocument, pExistingNode, pTemplateChild); |
- } |
- return; |
- } |
- CXFA_Node* pNewNode = pProtoNode->Clone(TRUE); |
- pNewNode->SetTemplateNode(pProtoNode); |
- pDestNodeParent->InsertChild(pNewNode, nullptr); |
-} |
-static void XFA_ProtoMerge_MergeNode(CXFA_Document* pDocument, |
- CXFA_Node* pDestNode, |
- CXFA_Node* pProtoNode) { |
- { |
- CXFA_NodeIterator sIterator(pDestNode); |
- for (CXFA_Node* pNode = sIterator.GetCurrent(); pNode; |
- pNode = sIterator.MoveToNext()) { |
- pNode->SetFlag(XFA_NodeFlag_UnusedNode, true); |
- } |
- } |
- pDestNode->SetTemplateNode(pProtoNode); |
- for (CXFA_Node* pTemplateChild = |
- pProtoNode->GetNodeItem(XFA_NODEITEM_FirstChild); |
- pTemplateChild; |
- pTemplateChild = pTemplateChild->GetNodeItem(XFA_NODEITEM_NextSibling)) { |
- XFA_ProtoMerge_MergeNodeRecurse(pDocument, pDestNode, pTemplateChild); |
- } |
- { |
- CXFA_NodeIterator sIterator(pDestNode); |
- for (CXFA_Node* pNode = sIterator.GetCurrent(); pNode; |
- pNode = sIterator.MoveToNext()) { |
- pNode->ClearFlag(XFA_NodeFlag_UnusedNode); |
- } |
- } |
-} |
+ |
void CXFA_Document::DoProtoMerge() { |
CXFA_Node* pTemplateRoot = ToNode(GetXFAObject(XFA_HASHCODE_Template)); |
- if (!pTemplateRoot) { |
+ if (!pTemplateRoot) |
return; |
- } |
+ |
CFX_MapPtrTemplate<uint32_t, CXFA_Node*> mIDMap; |
CXFA_NodeSet sUseNodes; |
CXFA_NodeIterator sIterator(pTemplateRoot); |
@@ -357,6 +369,7 @@ void CXFA_Document::DoProtoMerge() { |
sUseNodes.insert(pNode); |
} |
} |
+ |
for (CXFA_Node* pUseHrefNode : sUseNodes) { |
CFX_WideString wsUseVal; |
CFX_WideStringC wsURI, wsID, wsSOM; |
@@ -381,15 +394,15 @@ void CXFA_Document::DoProtoMerge() { |
} |
} else if (pUseHrefNode->TryCData(XFA_ATTRIBUTE_Use, wsUseVal) && |
!wsUseVal.IsEmpty()) { |
- if (wsUseVal[0] == '#') { |
+ if (wsUseVal[0] == '#') |
wsID = CFX_WideStringC(wsUseVal.c_str() + 1, wsUseVal.GetLength() - 1); |
- } else { |
+ else |
wsSOM = CFX_WideStringC(wsUseVal.c_str(), wsUseVal.GetLength()); |
- } |
} |
- if (!wsURI.IsEmpty() && wsURI != FX_WSTRC(L".")) { |
+ |
+ if (!wsURI.IsEmpty() && wsURI != FX_WSTRC(L".")) |
continue; |
- } |
+ |
CXFA_Node* pProtoNode = nullptr; |
if (!wsSOM.IsEmpty()) { |
uint32_t dwFlag = XFA_RESOLVENODE_Children | XFA_RESOLVENODE_Attributes | |
@@ -406,9 +419,9 @@ void CXFA_Document::DoProtoMerge() { |
continue; |
} |
} |
- if (!pProtoNode) { |
+ if (!pProtoNode) |
continue; |
- } |
- XFA_ProtoMerge_MergeNode(this, pUseHrefNode, pProtoNode); |
+ |
+ MergeNode(this, pUseHrefNode, pProtoNode); |
} |
} |