Index: xfa/fxfa/parser/xfa_document_datamerger_imp.cpp |
diff --git a/xfa/fxfa/parser/xfa_document_datamerger_imp.cpp b/xfa/fxfa/parser/xfa_document_datamerger_imp.cpp |
index 94aa07406b1e9cb6e0fb773582f208ddf125e5b7..4374b7c43d82831c304e102fdcb8e4420e3b11b1 100644 |
--- a/xfa/fxfa/parser/xfa_document_datamerger_imp.cpp |
+++ b/xfa/fxfa/parser/xfa_document_datamerger_imp.cpp |
@@ -12,7 +12,6 @@ |
#include "xfa/fxfa/parser/xfa_basic_imp.h" |
#include "xfa/fxfa/parser/xfa_doclayout.h" |
#include "xfa/fxfa/parser/xfa_document.h" |
-#include "xfa/fxfa/parser/xfa_document_datadescription_imp.h" |
#include "xfa/fxfa/parser/xfa_document_layout_imp.h" |
#include "xfa/fxfa/parser/xfa_localemgr.h" |
#include "xfa/fxfa/parser/xfa_object.h" |
@@ -22,48 +21,62 @@ |
#include "xfa/fxfa/parser/xfa_script_imp.h" |
#include "xfa/fxfa/parser/xfa_utils.h" |
-static FX_BOOL XFA_GetOccurInfo(CXFA_Node* pOccurNode, |
- int32_t& iMin, |
- int32_t& iMax, |
- int32_t& iInit) { |
- if (!pOccurNode) { |
- return FALSE; |
+namespace { |
+ |
+class CXFA_TraverseStrategy_DDGroup { |
+ public: |
+ static CXFA_Node* GetFirstChild(CXFA_Node* pDDGroupNode) { |
+ return pDDGroupNode->GetFirstChildByName(XFA_HASHCODE_Group); |
} |
- CXFA_Occur occur(pOccurNode); |
- return occur.GetOccurInfo(iMin, iMax, iInit); |
-} |
-struct XFA_DataMerge_RecurseRecord { |
+ static CXFA_Node* GetNextSibling(CXFA_Node* pDDGroupNode) { |
+ return pDDGroupNode->GetNextSameNameSibling(XFA_HASHCODE_Group); |
+ } |
+ static CXFA_Node* GetParent(CXFA_Node* pDDGroupNode) { |
+ return pDDGroupNode->GetNodeItem(XFA_NODEITEM_Parent); |
+ } |
+}; |
+ |
+struct RecurseRecord { |
CXFA_Node* pTemplateChild; |
CXFA_Node* pDataChild; |
}; |
-static CXFA_Node* XFA_DataMerge_FormValueNode_CreateChild( |
- CXFA_Node* pValueNode, |
- XFA_Element iType = XFA_Element::Unknown) { |
+ |
+FX_BOOL GetOccurInfo(CXFA_Node* pOccurNode, |
+ int32_t& iMin, |
+ int32_t& iMax, |
+ int32_t& iInit) { |
+ if (!pOccurNode) |
+ return FALSE; |
+ |
+ CXFA_Occur occur(pOccurNode); |
+ return occur.GetOccurInfo(iMin, iMax, iInit); |
+} |
+ |
+CXFA_Node* FormValueNode_CreateChild(CXFA_Node* pValueNode, XFA_Element iType) { |
CXFA_Node* pChildNode = pValueNode->GetNodeItem(XFA_NODEITEM_FirstChild); |
if (!pChildNode) { |
- if (iType == XFA_Element::Unknown) { |
+ if (iType == XFA_Element::Unknown) |
return FALSE; |
- } |
pChildNode = pValueNode->GetProperty(0, iType); |
} |
return pChildNode; |
} |
-static void XFA_DataMerge_FormValueNode_MatchNoneCreateChild( |
- CXFA_Node* pFormNode) { |
+ |
+void FormValueNode_MatchNoneCreateChild(CXFA_Node* pFormNode) { |
CXFA_WidgetData* pWidgetData = pFormNode->GetWidgetData(); |
ASSERT(pWidgetData); |
pWidgetData->GetUIType(); |
} |
-static FX_BOOL XFA_DataMerge_FormValueNode_SetChildContent( |
+ |
+FX_BOOL FormValueNode_SetChildContent( |
CXFA_Node* pValueNode, |
const CFX_WideString& wsContent, |
XFA_Element iType = XFA_Element::Unknown) { |
- if (!pValueNode) { |
+ if (!pValueNode) |
return FALSE; |
- } |
+ |
ASSERT(pValueNode->GetPacketID() == XFA_XDPPACKET_Form); |
- CXFA_Node* pChildNode = |
- XFA_DataMerge_FormValueNode_CreateChild(pValueNode, iType); |
+ CXFA_Node* pChildNode = FormValueNode_CreateChild(pValueNode, iType); |
if (!pChildNode) |
return FALSE; |
@@ -77,37 +90,39 @@ static FX_BOOL XFA_DataMerge_FormValueNode_SetChildContent( |
CFX_WideString wsContentType; |
pChildNode->GetAttribute(XFA_ATTRIBUTE_ContentType, wsContentType, |
FALSE); |
- if (wsContentType == FX_WSTRC(L"text/html")) { |
+ if (wsContentType == FX_WSTRC(L"text/html")) |
element = XFA_Element::SharpxHTML; |
- } else if (wsContentType == FX_WSTRC(L"text/xml")) { |
+ else if (wsContentType == FX_WSTRC(L"text/xml")) |
element = XFA_Element::Sharpxml; |
- } |
} |
pContentRawDataNode = pChildNode->CreateSamePacketNode(element); |
pChildNode->InsertChild(pContentRawDataNode); |
} |
pContentRawDataNode->SetCData(XFA_ATTRIBUTE_Value, wsContent); |
- } break; |
+ break; |
+ } |
case XFA_ObjectType::NodeC: |
case XFA_ObjectType::TextNode: |
case XFA_ObjectType::NodeV: { |
pChildNode->SetCData(XFA_ATTRIBUTE_Value, wsContent); |
- } break; |
+ break; |
+ } |
default: |
ASSERT(FALSE); |
break; |
} |
return TRUE; |
} |
-static void XFA_DataMerge_CreateDataBinding(CXFA_Node* pFormNode, |
- CXFA_Node* pDataNode, |
- FX_BOOL bDataToForm = TRUE) { |
+ |
+void CreateDataBinding(CXFA_Node* pFormNode, |
+ CXFA_Node* pDataNode, |
+ FX_BOOL bDataToForm) { |
pFormNode->SetObject(XFA_ATTRIBUTE_BindingNode, pDataNode); |
pDataNode->AddBindItem(pFormNode); |
XFA_Element eType = pFormNode->GetElementType(); |
- if (eType != XFA_Element::Field && eType != XFA_Element::ExclGroup) { |
+ if (eType != XFA_Element::Field && eType != XFA_Element::ExclGroup) |
return; |
- } |
+ |
CXFA_WidgetData* pWidgetData = pFormNode->GetWidgetData(); |
ASSERT(pWidgetData); |
XFA_Element eUIType = pWidgetData->GetUIType(); |
@@ -131,10 +146,11 @@ static void XFA_DataMerge_CreateDataBinding(CXFA_Node* pFormNode, |
pWidgetData->GetFormatDataValue(wsValue, wsFormatedValue); |
pDataNode->SetAttributeValue(wsValue, wsFormatedValue); |
pDataNode->SetCData(XFA_ATTRIBUTE_ContentType, wsContentType); |
- if (!wsHref.IsEmpty()) { |
+ if (!wsHref.IsEmpty()) |
pXMLDataElement->SetString(L"href", wsHref); |
- } |
- } break; |
+ |
+ break; |
+ } |
case XFA_Element::ChoiceList: |
defValue.GetChildValueContent(wsValue); |
if (pWidgetData->GetChoiceListOpen() == XFA_ATTRIBUTEENUM_MultiSelect) { |
@@ -163,9 +179,9 @@ static void XFA_DataMerge_CreateDataBinding(CXFA_Node* pFormNode, |
break; |
case XFA_Element::CheckButton: |
defValue.GetChildValueContent(wsValue); |
- if (wsValue.IsEmpty()) { |
+ if (wsValue.IsEmpty()) |
break; |
- } |
+ |
pWidgetData->GetFormatDataValue(wsValue, wsFormatedValue); |
pDataNode->SetAttributeValue(wsValue, wsFormatedValue); |
break; |
@@ -173,26 +189,26 @@ static void XFA_DataMerge_CreateDataBinding(CXFA_Node* pFormNode, |
CXFA_Node* pChecked = nullptr; |
CXFA_Node* pChild = pFormNode->GetNodeItem(XFA_NODEITEM_FirstChild); |
for (; pChild; pChild = pChild->GetNodeItem(XFA_NODEITEM_NextSibling)) { |
- if (pChild->GetElementType() != XFA_Element::Field) { |
+ if (pChild->GetElementType() != XFA_Element::Field) |
continue; |
- } |
+ |
CXFA_Node* pValue = pChild->GetChild(0, XFA_Element::Value); |
- if (!pValue) { |
+ if (!pValue) |
continue; |
- } |
+ |
CXFA_Value valueChild(pValue); |
valueChild.GetChildValueContent(wsValue); |
- if (wsValue.IsEmpty()) { |
+ if (wsValue.IsEmpty()) |
continue; |
- } |
+ |
CXFA_Node* pItems = pChild->GetChild(0, XFA_Element::Items); |
- if (!pItems) { |
+ if (!pItems) |
continue; |
- } |
+ |
CXFA_Node* pText = pItems->GetNodeItem(XFA_NODEITEM_FirstChild); |
- if (!pText) { |
+ if (!pText) |
continue; |
- } |
+ |
CFX_WideString wsContent; |
if (pText->TryContent(wsContent) && (wsContent == wsValue)) { |
pChecked = pChild; |
@@ -202,161 +218,161 @@ static void XFA_DataMerge_CreateDataBinding(CXFA_Node* pFormNode, |
break; |
} |
} |
- if (!pChecked) { |
+ if (!pChecked) |
break; |
- } |
+ |
pChild = pFormNode->GetNodeItem(XFA_NODEITEM_FirstChild); |
for (; pChild; pChild = pChild->GetNodeItem(XFA_NODEITEM_NextSibling)) { |
- if (pChild == pChecked) { |
+ if (pChild == pChecked) |
continue; |
- } |
- if (pChild->GetElementType() != XFA_Element::Field) { |
+ if (pChild->GetElementType() != XFA_Element::Field) |
continue; |
- } |
+ |
CXFA_Node* pValue = pChild->GetProperty(0, XFA_Element::Value); |
CXFA_Node* pItems = pChild->GetChild(0, XFA_Element::Items); |
CXFA_Node* pText = |
pItems ? pItems->GetNodeItem(XFA_NODEITEM_FirstChild) : nullptr; |
- if (pText) { |
+ if (pText) |
pText = pText->GetNodeItem(XFA_NODEITEM_NextSibling); |
- } |
+ |
CFX_WideString wsContent; |
- if (pText) { |
+ if (pText) |
pText->TryContent(wsContent); |
- } |
- XFA_DataMerge_FormValueNode_SetChildContent(pValue, wsContent, |
- XFA_Element::Text); |
+ |
+ FormValueNode_SetChildContent(pValue, wsContent, XFA_Element::Text); |
} |
- } break; |
+ break; |
+ } |
case XFA_Element::NumericEdit: { |
defValue.GetChildValueContent(wsValue); |
- if (wsValue.IsEmpty()) { |
+ if (wsValue.IsEmpty()) |
break; |
- } |
+ |
CFX_WideString wsOutput; |
pWidgetData->NormalizeNumStr(wsValue, wsOutput); |
wsValue = wsOutput; |
pWidgetData->GetFormatDataValue(wsValue, wsFormatedValue); |
pDataNode->SetAttributeValue(wsValue, wsFormatedValue); |
CXFA_Node* pValue = pFormNode->GetProperty(0, XFA_Element::Value); |
- XFA_DataMerge_FormValueNode_SetChildContent(pValue, wsValue, |
- XFA_Element::Float); |
- } break; |
+ FormValueNode_SetChildContent(pValue, wsValue, XFA_Element::Float); |
+ break; |
+ } |
default: |
defValue.GetChildValueContent(wsValue); |
- if (wsValue.IsEmpty()) { |
+ if (wsValue.IsEmpty()) |
break; |
- } |
+ |
pWidgetData->GetFormatDataValue(wsValue, wsFormatedValue); |
pDataNode->SetAttributeValue(wsValue, wsFormatedValue); |
break; |
} |
- } else { |
- CFX_WideString wsXMLValue; |
- pDataNode->TryContent(wsXMLValue); |
- CFX_WideString wsNormailizeValue; |
- pWidgetData->GetNormalizeDataValue(wsXMLValue, wsNormailizeValue); |
- pDataNode->SetAttributeValue(wsNormailizeValue, wsXMLValue); |
- switch (eUIType) { |
- case XFA_Element::ImageEdit: { |
- XFA_DataMerge_FormValueNode_SetChildContent( |
- defValue.GetNode(), wsNormailizeValue, XFA_Element::Image); |
- CXFA_Image image = defValue.GetImage(); |
- if (image) { |
- CFDE_XMLElement* pXMLDataElement = |
- static_cast<CFDE_XMLElement*>(pDataNode->GetXMLMappingNode()); |
- ASSERT(pXMLDataElement); |
- CFX_WideString wsContentType; |
- CFX_WideString wsHref; |
- pXMLDataElement->GetString(L"xfa:contentType", wsContentType); |
- if (!wsContentType.IsEmpty()) { |
- pDataNode->SetCData(XFA_ATTRIBUTE_ContentType, wsContentType); |
- image.SetContentType(wsContentType); |
- } |
- pXMLDataElement->GetString(L"href", wsHref); |
- if (!wsHref.IsEmpty()) { |
- image.SetHref(wsHref); |
- } |
+ return; |
+ } |
+ |
+ CFX_WideString wsXMLValue; |
+ pDataNode->TryContent(wsXMLValue); |
+ CFX_WideString wsNormalizeValue; |
+ pWidgetData->GetNormalizeDataValue(wsXMLValue, wsNormalizeValue); |
+ pDataNode->SetAttributeValue(wsNormalizeValue, wsXMLValue); |
+ switch (eUIType) { |
+ case XFA_Element::ImageEdit: { |
+ FormValueNode_SetChildContent(defValue.GetNode(), wsNormalizeValue, |
+ XFA_Element::Image); |
+ CXFA_Image image = defValue.GetImage(); |
+ if (image) { |
+ CFDE_XMLElement* pXMLDataElement = |
+ static_cast<CFDE_XMLElement*>(pDataNode->GetXMLMappingNode()); |
+ ASSERT(pXMLDataElement); |
+ CFX_WideString wsContentType; |
+ CFX_WideString wsHref; |
+ pXMLDataElement->GetString(L"xfa:contentType", wsContentType); |
+ if (!wsContentType.IsEmpty()) { |
+ pDataNode->SetCData(XFA_ATTRIBUTE_ContentType, wsContentType); |
+ image.SetContentType(wsContentType); |
} |
- } break; |
- case XFA_Element::ChoiceList: |
- if (pWidgetData->GetChoiceListOpen() == XFA_ATTRIBUTEENUM_MultiSelect) { |
- CXFA_NodeArray items; |
- pDataNode->GetNodeList(items); |
- int32_t iCounts = items.GetSize(); |
- if (iCounts > 0) { |
- wsNormailizeValue.clear(); |
- CFX_WideString wsItem; |
- for (int32_t i = 0; i < iCounts; i++) { |
- items[i]->TryContent(wsItem); |
- wsItem = (iCounts == 1) ? wsItem : wsItem + FX_WSTRC(L"\n"); |
- wsNormailizeValue += wsItem; |
- } |
- CXFA_ExData exData = defValue.GetExData(); |
- ASSERT(exData); |
- exData.SetContentType(iCounts == 1 ? L"text/plain" : L"text/xml"); |
+ pXMLDataElement->GetString(L"href", wsHref); |
+ if (!wsHref.IsEmpty()) |
+ image.SetHref(wsHref); |
+ } |
+ break; |
+ } |
+ case XFA_Element::ChoiceList: |
+ if (pWidgetData->GetChoiceListOpen() == XFA_ATTRIBUTEENUM_MultiSelect) { |
+ CXFA_NodeArray items; |
+ pDataNode->GetNodeList(items); |
+ int32_t iCounts = items.GetSize(); |
+ if (iCounts > 0) { |
+ wsNormalizeValue.clear(); |
+ CFX_WideString wsItem; |
+ for (int32_t i = 0; i < iCounts; i++) { |
+ items[i]->TryContent(wsItem); |
+ wsItem = (iCounts == 1) ? wsItem : wsItem + FX_WSTRC(L"\n"); |
+ wsNormalizeValue += wsItem; |
} |
- XFA_DataMerge_FormValueNode_SetChildContent( |
- defValue.GetNode(), wsNormailizeValue, XFA_Element::ExData); |
- } else { |
- XFA_DataMerge_FormValueNode_SetChildContent( |
- defValue.GetNode(), wsNormailizeValue, XFA_Element::Text); |
- } |
- break; |
- case XFA_Element::CheckButton: |
- XFA_DataMerge_FormValueNode_SetChildContent( |
- defValue.GetNode(), wsNormailizeValue, XFA_Element::Text); |
- break; |
- case XFA_Element::ExclGroup: { |
- pWidgetData->SetSelectedMemberByValue(wsNormailizeValue.AsStringC(), |
- false, FALSE, FALSE); |
- } break; |
- case XFA_Element::DateTimeEdit: |
- XFA_DataMerge_FormValueNode_SetChildContent( |
- defValue.GetNode(), wsNormailizeValue, XFA_Element::DateTime); |
- break; |
- case XFA_Element::NumericEdit: { |
- CFX_WideString wsPicture; |
- pWidgetData->GetPictureContent(wsPicture, XFA_VALUEPICTURE_DataBind); |
- if (wsPicture.IsEmpty()) { |
- CFX_WideString wsOutput; |
- pWidgetData->NormalizeNumStr(wsNormailizeValue, wsOutput); |
- wsNormailizeValue = wsOutput; |
+ CXFA_ExData exData = defValue.GetExData(); |
+ ASSERT(exData); |
+ exData.SetContentType(iCounts == 1 ? L"text/plain" : L"text/xml"); |
} |
- XFA_DataMerge_FormValueNode_SetChildContent( |
- defValue.GetNode(), wsNormailizeValue, XFA_Element::Float); |
- } break; |
- case XFA_Element::Barcode: |
- case XFA_Element::Button: |
- case XFA_Element::PasswordEdit: |
- case XFA_Element::Signature: |
- case XFA_Element::TextEdit: |
- default: |
- XFA_DataMerge_FormValueNode_SetChildContent( |
- defValue.GetNode(), wsNormailizeValue, XFA_Element::Text); |
- break; |
+ FormValueNode_SetChildContent(defValue.GetNode(), wsNormalizeValue, |
+ XFA_Element::ExData); |
+ } else { |
+ FormValueNode_SetChildContent(defValue.GetNode(), wsNormalizeValue, |
+ XFA_Element::Text); |
+ } |
+ break; |
+ case XFA_Element::CheckButton: |
+ FormValueNode_SetChildContent(defValue.GetNode(), wsNormalizeValue, |
+ XFA_Element::Text); |
+ break; |
+ case XFA_Element::ExclGroup: { |
+ pWidgetData->SetSelectedMemberByValue(wsNormalizeValue.AsStringC(), false, |
+ FALSE, FALSE); |
+ break; |
+ } |
+ case XFA_Element::DateTimeEdit: |
+ FormValueNode_SetChildContent(defValue.GetNode(), wsNormalizeValue, |
+ XFA_Element::DateTime); |
+ break; |
+ case XFA_Element::NumericEdit: { |
+ CFX_WideString wsPicture; |
+ pWidgetData->GetPictureContent(wsPicture, XFA_VALUEPICTURE_DataBind); |
+ if (wsPicture.IsEmpty()) { |
+ CFX_WideString wsOutput; |
+ pWidgetData->NormalizeNumStr(wsNormalizeValue, wsOutput); |
+ wsNormalizeValue = wsOutput; |
+ } |
+ FormValueNode_SetChildContent(defValue.GetNode(), wsNormalizeValue, |
+ XFA_Element::Float); |
+ break; |
} |
+ case XFA_Element::Barcode: |
+ case XFA_Element::Button: |
+ case XFA_Element::PasswordEdit: |
+ case XFA_Element::Signature: |
+ case XFA_Element::TextEdit: |
+ default: |
+ FormValueNode_SetChildContent(defValue.GetNode(), wsNormalizeValue, |
+ XFA_Element::Text); |
+ break; |
} |
} |
-static CXFA_Node* XFA_DataMerge_GetGlobalBinding(CXFA_Document* pDocument, |
- uint32_t dwNameHash) { |
+ |
+CXFA_Node* GetGlobalBinding(CXFA_Document* pDocument, uint32_t dwNameHash) { |
CXFA_Node* pNode = nullptr; |
pDocument->m_rgGlobalBinding.Lookup(dwNameHash, pNode); |
return pNode; |
} |
-static void XFA_DataMerge_RegisterGlobalBinding(CXFA_Document* pDocument, |
- uint32_t dwNameHash, |
- CXFA_Node* pDataNode) { |
+ |
+void RegisterGlobalBinding(CXFA_Document* pDocument, |
+ uint32_t dwNameHash, |
+ CXFA_Node* pDataNode) { |
pDocument->m_rgGlobalBinding.SetAt(dwNameHash, pDataNode); |
} |
-static void XFA_DataMerge_ClearGlobalBinding(CXFA_Document* pDocument) { |
- pDocument->m_rgGlobalBinding.RemoveAll(); |
-} |
-static CXFA_Node* XFA_DataMerge_ScopeMatchGlobalBinding( |
- CXFA_Node* pDataScope, |
- uint32_t dwNameHash, |
- XFA_Element eMatchDataNodeType, |
- FX_BOOL bUpLevel = TRUE) { |
+ |
+CXFA_Node* ScopeMatchGlobalBinding(CXFA_Node* pDataScope, |
+ uint32_t dwNameHash, |
+ XFA_Element eMatchDataNodeType, |
+ FX_BOOL bUpLevel) { |
for (CXFA_Node *pCurDataScope = pDataScope, *pLastDataScope = nullptr; |
pCurDataScope && pCurDataScope->GetPacketID() == XFA_XDPPACKET_Datasets; |
pLastDataScope = pCurDataScope, |
@@ -373,45 +389,44 @@ static CXFA_Node* XFA_DataMerge_ScopeMatchGlobalBinding( |
} |
return pDataChild; |
} |
+ |
for (CXFA_Node* pDataChild = |
pCurDataScope->GetFirstChildByClass(XFA_Element::DataGroup); |
pDataChild; pDataChild = pDataChild->GetNextSameClassSibling( |
XFA_Element::DataGroup)) { |
- CXFA_Node* pDataNode = XFA_DataMerge_ScopeMatchGlobalBinding( |
- pDataChild, dwNameHash, eMatchDataNodeType, FALSE); |
- if (pDataNode) { |
+ CXFA_Node* pDataNode = ScopeMatchGlobalBinding(pDataChild, dwNameHash, |
+ eMatchDataNodeType, FALSE); |
+ if (pDataNode) |
return pDataNode; |
- } |
} |
- if (!bUpLevel) { |
+ if (!bUpLevel) |
break; |
- } |
} |
return nullptr; |
} |
-static CXFA_Node* XFA_DataMerge_FindGlobalDataNode(CXFA_Document* pDocument, |
- CFX_WideStringC wsName, |
- CXFA_Node* pDataScope, |
- XFA_Element eMatchNodeType) { |
+ |
+CXFA_Node* FindGlobalDataNode(CXFA_Document* pDocument, |
+ CFX_WideStringC wsName, |
+ CXFA_Node* pDataScope, |
+ XFA_Element eMatchNodeType) { |
if (wsName.IsEmpty()) |
return nullptr; |
uint32_t dwNameHash = FX_HashCode_GetW(wsName, false); |
- CXFA_Node* pBounded = XFA_DataMerge_GetGlobalBinding(pDocument, dwNameHash); |
+ CXFA_Node* pBounded = GetGlobalBinding(pDocument, dwNameHash); |
if (!pBounded) { |
- pBounded = XFA_DataMerge_ScopeMatchGlobalBinding(pDataScope, dwNameHash, |
- eMatchNodeType); |
- if (pBounded) { |
- XFA_DataMerge_RegisterGlobalBinding(pDocument, dwNameHash, pBounded); |
- } |
+ pBounded = |
+ ScopeMatchGlobalBinding(pDataScope, dwNameHash, eMatchNodeType, TRUE); |
+ if (pBounded) |
+ RegisterGlobalBinding(pDocument, dwNameHash, pBounded); |
} |
return pBounded; |
} |
-static CXFA_Node* XFA_DataMerge_FindOnceDataNode(CXFA_Document* pDocument, |
- CFX_WideStringC wsName, |
- CXFA_Node* pDataScope, |
- XFA_Element eMatchNodeType) { |
+CXFA_Node* FindOnceDataNode(CXFA_Document* pDocument, |
+ CFX_WideStringC wsName, |
+ CXFA_Node* pDataScope, |
+ XFA_Element eMatchNodeType) { |
if (wsName.IsEmpty()) |
return nullptr; |
@@ -435,17 +450,17 @@ static CXFA_Node* XFA_DataMerge_FindOnceDataNode(CXFA_Document* pDocument, |
return nullptr; |
} |
-static CXFA_Node* XFA_DataMerge_FindDataRefDataNode(CXFA_Document* pDocument, |
- CFX_WideStringC wsRef, |
- CXFA_Node* pDataScope, |
- XFA_Element eMatchNodeType, |
- CXFA_Node* pTemplateNode, |
- FX_BOOL bForceBind, |
- FX_BOOL bUpLevel = TRUE) { |
+CXFA_Node* FindDataRefDataNode(CXFA_Document* pDocument, |
+ CFX_WideStringC wsRef, |
+ CXFA_Node* pDataScope, |
+ XFA_Element eMatchNodeType, |
+ CXFA_Node* pTemplateNode, |
+ FX_BOOL bForceBind, |
+ FX_BOOL bUpLevel) { |
uint32_t dFlags = XFA_RESOLVENODE_Children | XFA_RESOLVENODE_BindNew; |
- if (bUpLevel || wsRef != FX_WSTRC(L"name")) { |
+ if (bUpLevel || wsRef != FX_WSTRC(L"name")) |
dFlags |= (XFA_RESOLVENODE_Parent | XFA_RESOLVENODE_Siblings); |
- } |
+ |
XFA_RESOLVENODE_RS rs; |
pDocument->GetScriptContext()->ResolveObjects(pDataScope, wsRef, rs, dFlags, |
pTemplateNode); |
@@ -454,102 +469,33 @@ static CXFA_Node* XFA_DataMerge_FindDataRefDataNode(CXFA_Document* pDocument, |
rs.nodes.GetSize() > 1) { |
return pDocument->GetNotBindNode(rs.nodes); |
} |
+ |
if (rs.dwFlags == XFA_RESOLVENODE_RSTYPE_CreateNodeOne) { |
CXFA_Object* pObject = (rs.nodes.GetSize() > 0) ? rs.nodes[0] : nullptr; |
CXFA_Node* pNode = ToNode(pObject); |
- if (!bForceBind && pNode && pNode->HasBindItem()) { |
- pNode = nullptr; |
- } |
- return pNode; |
+ return (bForceBind || !pNode || !pNode->HasBindItem()) ? pNode : nullptr; |
} |
return nullptr; |
} |
-CXFA_Node* XFA_DataMerge_FindFormDOMInstance(CXFA_Document* pDocument, |
- XFA_Element eType, |
- uint32_t dwNameHash, |
- CXFA_Node* pFormParent) { |
- CXFA_Node* pFormChild = pFormParent->GetNodeItem(XFA_NODEITEM_FirstChild); |
- for (; pFormChild; |
- pFormChild = pFormChild->GetNodeItem(XFA_NODEITEM_NextSibling)) { |
- if (pFormChild->GetElementType() == eType && |
- pFormChild->GetNameHash() == dwNameHash && pFormChild->IsUnusedNode()) { |
- return pFormChild; |
- } |
- } |
- return nullptr; |
-} |
-static FX_BOOL XFA_NeedGenerateForm(CXFA_Node* pTemplateChild, |
- FX_BOOL bUseInstanceManager = TRUE) { |
+ |
+FX_BOOL NeedGenerateForm(CXFA_Node* pTemplateChild, |
+ FX_BOOL bUseInstanceManager) { |
XFA_Element eType = pTemplateChild->GetElementType(); |
- if (eType == XFA_Element::Variables) { |
+ if (eType == XFA_Element::Variables) |
return TRUE; |
- } |
- if (pTemplateChild->IsContainerNode()) { |
+ if (pTemplateChild->IsContainerNode()) |
return FALSE; |
- } |
if (eType == XFA_Element::Proto || |
(bUseInstanceManager && eType == XFA_Element::Occur)) { |
return FALSE; |
} |
return TRUE; |
} |
-CXFA_Node* XFA_NodeMerge_CloneOrMergeContainer(CXFA_Document* pDocument, |
- CXFA_Node* pFormParent, |
- CXFA_Node* pTemplateNode, |
- FX_BOOL bRecursive, |
- CXFA_NodeArray* pSubformArray) { |
- CXFA_Node* pExistingNode = nullptr; |
- if (!pSubformArray) { |
- pExistingNode = XFA_DataMerge_FindFormDOMInstance( |
- pDocument, pTemplateNode->GetElementType(), |
- pTemplateNode->GetNameHash(), pFormParent); |
- } else if (pSubformArray->GetSize() > 0) { |
- pExistingNode = pSubformArray->GetAt(0); |
- pSubformArray->RemoveAt(0); |
- } |
- if (pExistingNode) { |
- if (pSubformArray) { |
- pFormParent->InsertChild(pExistingNode); |
- } else if (pExistingNode->IsContainerNode()) { |
- pFormParent->RemoveChild(pExistingNode); |
- pFormParent->InsertChild(pExistingNode); |
- } |
- pExistingNode->ClearFlag(XFA_NodeFlag_UnusedNode); |
- pExistingNode->SetTemplateNode(pTemplateNode); |
- if (bRecursive && pExistingNode->GetElementType() != XFA_Element::Items) { |
- for (CXFA_Node* pTemplateChild = |
- pTemplateNode->GetNodeItem(XFA_NODEITEM_FirstChild); |
- pTemplateChild; pTemplateChild = pTemplateChild->GetNodeItem( |
- XFA_NODEITEM_NextSibling)) { |
- if (XFA_NeedGenerateForm(pTemplateChild)) { |
- XFA_NodeMerge_CloneOrMergeContainer(pDocument, pExistingNode, |
- pTemplateChild, bRecursive); |
- } |
- } |
- } |
- pExistingNode->SetFlag(XFA_NodeFlag_Initialized, true); |
- return pExistingNode; |
- } |
- CXFA_Node* pNewNode = pTemplateNode->CloneTemplateToForm(FALSE); |
- pFormParent->InsertChild(pNewNode, nullptr); |
- if (bRecursive) { |
- for (CXFA_Node* pTemplateChild = |
- pTemplateNode->GetNodeItem(XFA_NODEITEM_FirstChild); |
- pTemplateChild; pTemplateChild = pTemplateChild->GetNodeItem( |
- XFA_NODEITEM_NextSibling)) { |
- if (XFA_NeedGenerateForm(pTemplateChild)) { |
- CXFA_Node* pNewChild = pTemplateChild->CloneTemplateToForm(TRUE); |
- pNewNode->InsertChild(pNewChild, nullptr); |
- } |
- } |
- } |
- return pNewNode; |
-} |
-static CXFA_Node* XFA_NodeMerge_CloneOrMergeInstanceManager( |
- CXFA_Document* pDocument, |
- CXFA_Node* pFormParent, |
- CXFA_Node* pTemplateNode, |
- CXFA_NodeArray& subforms) { |
+ |
+CXFA_Node* CloneOrMergeInstanceManager(CXFA_Document* pDocument, |
+ CXFA_Node* pFormParent, |
+ CXFA_Node* pTemplateNode, |
+ CXFA_NodeArray& subforms) { |
CFX_WideStringC wsSubformName = pTemplateNode->GetCData(XFA_ATTRIBUTE_Name); |
CFX_WideString wsInstMgrNodeName = FX_WSTRC(L"_") + wsSubformName; |
uint32_t dwInstNameHash = |
@@ -562,17 +508,17 @@ static CXFA_Node* XFA_NodeMerge_CloneOrMergeInstanceManager( |
pExistingNode->GetNodeItem(XFA_NODEITEM_NextSibling); |
pNode;) { |
XFA_Element eCurType = pNode->GetElementType(); |
- if (eCurType == XFA_Element::InstanceManager) { |
+ if (eCurType == XFA_Element::InstanceManager) |
break; |
- } |
+ |
if ((eCurType != XFA_Element::Subform) && |
(eCurType != XFA_Element::SubformSet)) { |
pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling); |
continue; |
} |
- if (dwNameHash != pNode->GetNameHash()) { |
+ if (dwNameHash != pNode->GetNameHash()) |
break; |
- } |
+ |
CXFA_Node* pNextNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling); |
pFormParent->RemoveChild(pNode); |
subforms.Add(pNode); |
@@ -584,6 +530,7 @@ static CXFA_Node* XFA_NodeMerge_CloneOrMergeInstanceManager( |
pExistingNode->SetTemplateNode(pTemplateNode); |
return pExistingNode; |
} |
+ |
CXFA_Node* pNewNode = pDocument->GetParser()->GetFactory()->CreateNode( |
XFA_XDPPACKET_Form, XFA_Element::InstanceManager); |
ASSERT(pNewNode); |
@@ -594,7 +541,8 @@ static CXFA_Node* XFA_NodeMerge_CloneOrMergeInstanceManager( |
pNewNode->SetTemplateNode(pTemplateNode); |
return pNewNode; |
} |
-static CXFA_Node* XFA_DataMerge_FindMatchingDataNode( |
+ |
+CXFA_Node* FindMatchingDataNode( |
CXFA_Document* pDocument, |
CXFA_Node* pTemplateNode, |
CXFA_Node* pDataScope, |
@@ -605,13 +553,14 @@ static CXFA_Node* XFA_DataMerge_FindMatchingDataNode( |
pIterator, |
FX_BOOL& bSelfMatch, |
XFA_ATTRIBUTEENUM& eBindMatch, |
- FX_BOOL bUpLevel = TRUE) { |
+ FX_BOOL bUpLevel) { |
FX_BOOL bOwnIterator = FALSE; |
if (!pIterator) { |
bOwnIterator = TRUE; |
pIterator = new CXFA_NodeIteratorTemplate< |
CXFA_Node, CXFA_TraverseStrategy_XFAContainerNode>(pTemplateNode); |
} |
+ |
CXFA_Node* pResult = nullptr; |
for (CXFA_Node* pCurTemplateNode = pIterator->GetCurrent(); |
pCurTemplateNode;) { |
@@ -636,10 +585,11 @@ static CXFA_Node* XFA_DataMerge_FindMatchingDataNode( |
pCurTemplateNode->GetFirstChildByClass(XFA_Element::Occur); |
int32_t iMin, iMax, iInit; |
if (pTemplateNodeOccur && |
- XFA_GetOccurInfo(pTemplateNodeOccur, iMin, iMax, iInit) && iMax == 0) { |
+ GetOccurInfo(pTemplateNodeOccur, iMin, iMax, iInit) && iMax == 0) { |
pCurTemplateNode = pIterator->MoveToNext(); |
continue; |
} |
+ |
CXFA_Node* pTemplateNodeBind = |
pCurTemplateNode->GetFirstChildByClass(XFA_Element::Bind); |
XFA_ATTRIBUTEENUM eMatch = |
@@ -659,7 +609,7 @@ static CXFA_Node* XFA_DataMerge_FindMatchingDataNode( |
if (eMatchNodeType == XFA_Element::DataValue || |
(eMatchNodeType == XFA_Element::DataGroup && |
XFA_FieldIsMultiListBox(pTemplateNodeBind))) { |
- CXFA_Node* pGlobalBindNode = XFA_DataMerge_FindGlobalDataNode( |
+ CXFA_Node* pGlobalBindNode = FindGlobalDataNode( |
pDocument, pCurTemplateNode->GetCData(XFA_ATTRIBUTE_Name), |
pDataScope, eMatchNodeType); |
if (!pGlobalBindNode) { |
@@ -671,7 +621,7 @@ static CXFA_Node* XFA_DataMerge_FindMatchingDataNode( |
} |
case XFA_ATTRIBUTEENUM_Once: { |
bAccessedDataDOM = TRUE; |
- CXFA_Node* pOnceBindNode = XFA_DataMerge_FindOnceDataNode( |
+ CXFA_Node* pOnceBindNode = FindOnceDataNode( |
pDocument, pCurTemplateNode->GetCData(XFA_ATTRIBUTE_Name), |
pDataScope, eMatchNodeType); |
if (!pOnceBindNode) { |
@@ -679,10 +629,11 @@ static CXFA_Node* XFA_DataMerge_FindMatchingDataNode( |
continue; |
} |
pResult = pOnceBindNode; |
- } break; |
+ break; |
+ } |
case XFA_ATTRIBUTEENUM_DataRef: { |
bAccessedDataDOM = TRUE; |
- CXFA_Node* pDataRefBindNode = XFA_DataMerge_FindDataRefDataNode( |
+ CXFA_Node* pDataRefBindNode = FindDataRefDataNode( |
pDocument, pTemplateNodeBind->GetCData(XFA_ATTRIBUTE_Ref), |
pDataScope, eMatchNodeType, pTemplateNode, bForceBind, bUpLevel); |
if (pDataRefBindNode && |
@@ -693,49 +644,47 @@ static CXFA_Node* XFA_DataMerge_FindMatchingDataNode( |
pCurTemplateNode = pIterator->SkipChildrenAndMoveToNext(); |
continue; |
} |
- } break; |
+ break; |
+ } |
default: |
break; |
} |
- if (pCurTemplateNode == pTemplateNode && pResult) { |
+ if (pCurTemplateNode == pTemplateNode && pResult) |
bSelfMatch = TRUE; |
- } |
break; |
} |
- if (bOwnIterator) { |
+ if (bOwnIterator) |
delete pIterator; |
- } |
return pResult; |
} |
-static void XFA_DataMerge_SortRecurseRecord( |
- CFX_ArrayTemplate<XFA_DataMerge_RecurseRecord>& rgRecords, |
- CXFA_Node* pDataScope, |
- FX_BOOL bChoiceMode = FALSE) { |
+ |
+void SortRecurseRecord(CFX_ArrayTemplate<RecurseRecord>& rgRecords, |
+ CXFA_Node* pDataScope, |
+ FX_BOOL bChoiceMode) { |
int32_t iCount = rgRecords.GetSize(); |
- CFX_ArrayTemplate<XFA_DataMerge_RecurseRecord> rgResultRecord; |
+ CFX_ArrayTemplate<RecurseRecord> rgResultRecord; |
for (CXFA_Node* pChildNode = pDataScope->GetNodeItem(XFA_NODEITEM_FirstChild); |
pChildNode; |
pChildNode = pChildNode->GetNodeItem(XFA_NODEITEM_NextSibling)) { |
for (int32_t i = 0; i < iCount; i++) { |
CXFA_Node* pNode = rgRecords[i].pDataChild; |
if (pChildNode == pNode) { |
- XFA_DataMerge_RecurseRecord sNewRecord = {rgRecords[i].pTemplateChild, |
- pNode}; |
+ RecurseRecord sNewRecord = {rgRecords[i].pTemplateChild, pNode}; |
rgResultRecord.Add(sNewRecord); |
rgRecords.RemoveAt(i); |
iCount--; |
break; |
} |
} |
- if (bChoiceMode && rgResultRecord.GetSize() > 0) { |
+ if (bChoiceMode && rgResultRecord.GetSize() > 0) |
break; |
- } |
} |
+ |
if (rgResultRecord.GetSize() > 0) { |
if (!bChoiceMode) { |
for (int32_t i = 0; i < iCount; i++) { |
- XFA_DataMerge_RecurseRecord sNewRecord = {rgRecords[i].pTemplateChild, |
- rgRecords[i].pDataChild}; |
+ RecurseRecord sNewRecord = {rgRecords[i].pTemplateChild, |
+ rgRecords[i].pDataChild}; |
rgResultRecord.Add(sNewRecord); |
} |
} |
@@ -743,13 +692,13 @@ static void XFA_DataMerge_SortRecurseRecord( |
rgRecords.Copy(rgResultRecord); |
} |
} |
-static CXFA_Node* XFA_DataMerge_CopyContainer_SubformSet( |
- CXFA_Document* pDocument, |
- CXFA_Node* pTemplateNode, |
- CXFA_Node* pFormParentNode, |
- CXFA_Node* pDataScope, |
- FX_BOOL bOneInstance, |
- FX_BOOL bDataMerge) { |
+ |
+CXFA_Node* CopyContainer_SubformSet(CXFA_Document* pDocument, |
+ CXFA_Node* pTemplateNode, |
+ CXFA_Node* pFormParentNode, |
+ CXFA_Node* pDataScope, |
+ FX_BOOL bOneInstance, |
+ FX_BOOL bDataMerge) { |
XFA_Element eType = pTemplateNode->GetElementType(); |
CXFA_Node* pOccurNode = nullptr; |
CXFA_Node* pFirstInstance = nullptr; |
@@ -760,41 +709,41 @@ static CXFA_Node* XFA_DataMerge_CopyContainer_SubformSet( |
CXFA_NodeArray* pSearchArray = nullptr; |
if (!bOneInstance && |
(eType == XFA_Element::SubformSet || eType == XFA_Element::Subform)) { |
- pInstMgrNode = |
- bUseInstanceManager |
- ? XFA_NodeMerge_CloneOrMergeInstanceManager( |
- pDocument, pFormParentNode, pTemplateNode, subformArray) |
- : nullptr; |
+ pInstMgrNode = bUseInstanceManager ? CloneOrMergeInstanceManager( |
+ pDocument, pFormParentNode, |
+ pTemplateNode, subformArray) |
+ : nullptr; |
if (CXFA_Node* pOccurTemplateNode = |
pTemplateNode->GetFirstChildByClass(XFA_Element::Occur)) { |
- pOccurNode = pInstMgrNode |
- ? XFA_NodeMerge_CloneOrMergeContainer( |
- pDocument, pInstMgrNode, pOccurTemplateNode, FALSE) |
- : pOccurTemplateNode; |
+ pOccurNode = pInstMgrNode ? XFA_NodeMerge_CloneOrMergeContainer( |
+ pDocument, pInstMgrNode, |
+ pOccurTemplateNode, FALSE, nullptr) |
+ : pOccurTemplateNode; |
} else if (pInstMgrNode) { |
pOccurNode = pInstMgrNode->GetFirstChildByClass(XFA_Element::Occur); |
- if (pOccurNode) { |
+ if (pOccurNode) |
pOccurNode->ClearFlag(XFA_NodeFlag_UnusedNode); |
- } |
} |
if (pInstMgrNode) { |
pInstMgrNode->SetFlag(XFA_NodeFlag_Initialized, true); |
pSearchArray = &subformArray; |
if (pFormParentNode->GetElementType() == XFA_Element::PageArea) { |
bOneInstance = TRUE; |
- if (subformArray.GetSize() < 1) { |
+ if (subformArray.GetSize() < 1) |
pSearchArray = nullptr; |
- } |
} else if ((pTemplateNode->GetNameHash() == 0) && |
(subformArray.GetSize() < 1)) { |
pSearchArray = nullptr; |
} |
} |
} |
- int32_t iMax = 1, iInit = 1, iMin = 1; |
- if (!bOneInstance) { |
- XFA_GetOccurInfo(pOccurNode, iMin, iMax, iInit); |
- } |
+ |
+ int32_t iMax = 1; |
+ int32_t iInit = 1; |
+ int32_t iMin = 1; |
+ if (!bOneInstance) |
+ GetOccurInfo(pOccurNode, iMin, iMax, iInit); |
+ |
XFA_ATTRIBUTEENUM eRelation = |
eType == XFA_Element::SubformSet |
? pTemplateNode->GetEnum(XFA_ATTRIBUTE_Relation) |
@@ -813,23 +762,24 @@ static CXFA_Node* XFA_DataMerge_CopyContainer_SubformSet( |
for (; iMax < 0 || iCurRepeatIndex < iMax; iCurRepeatIndex++) { |
FX_BOOL bSelfMatch = FALSE; |
XFA_ATTRIBUTEENUM eBindMatch = XFA_ATTRIBUTEENUM_None; |
- CXFA_Node* pDataNode = XFA_DataMerge_FindMatchingDataNode( |
+ CXFA_Node* pDataNode = FindMatchingDataNode( |
pDocument, pTemplateNode, pDataScope, bAccessedDataDOM, FALSE, |
- &sNodeIterator, bSelfMatch, eBindMatch); |
- if (!pDataNode || sNodeIterator.GetCurrent() != pTemplateNode) { |
+ &sNodeIterator, bSelfMatch, eBindMatch, TRUE); |
+ if (!pDataNode || sNodeIterator.GetCurrent() != pTemplateNode) |
break; |
- } |
+ |
eParentBindMatch = eBindMatch; |
CXFA_Node* pSubformNode = XFA_NodeMerge_CloneOrMergeContainer( |
pDocument, pFormParentNode, pTemplateNode, FALSE, pSearchArray); |
- if (!pFirstInstance) { |
+ if (!pFirstInstance) |
pFirstInstance = pSubformNode; |
- } |
- XFA_DataMerge_CreateDataBinding(pSubformNode, pDataNode); |
+ |
+ CreateDataBinding(pSubformNode, pDataNode, TRUE); |
ASSERT(pSubformNode); |
subformMapArray.SetAt(pSubformNode, pDataNode); |
nodeArray.Add(pSubformNode); |
} |
+ |
subformMapArray.GetStartPosition(); |
for (int32_t iIndex = 0; iIndex < nodeArray.GetSize(); iIndex++) { |
CXFA_Node* pSubform = nodeArray[iIndex]; |
@@ -839,9 +789,9 @@ static CXFA_Node* XFA_DataMerge_CopyContainer_SubformSet( |
pTemplateNode->GetNodeItem(XFA_NODEITEM_FirstChild); |
pTemplateChild; pTemplateChild = pTemplateChild->GetNodeItem( |
XFA_NODEITEM_NextSibling)) { |
- if (XFA_NeedGenerateForm(pTemplateChild, bUseInstanceManager)) { |
+ if (NeedGenerateForm(pTemplateChild, bUseInstanceManager)) { |
XFA_NodeMerge_CloneOrMergeContainer(pDocument, pSubform, |
- pTemplateChild, TRUE); |
+ pTemplateChild, TRUE, nullptr); |
} else if (pTemplateChild->IsContainerNode()) { |
pDocument->DataMerge_CopyContainer(pTemplateChild, pSubform, |
pDataNode, FALSE, TRUE, FALSE); |
@@ -850,65 +800,70 @@ static CXFA_Node* XFA_DataMerge_CopyContainer_SubformSet( |
} |
subformMapArray.RemoveAll(); |
} |
+ |
for (; iMax < 0 || iCurRepeatIndex < iMax; iCurRepeatIndex++) { |
FX_BOOL bSelfMatch = FALSE; |
XFA_ATTRIBUTEENUM eBindMatch = XFA_ATTRIBUTEENUM_None; |
- if (!XFA_DataMerge_FindMatchingDataNode( |
- pDocument, pTemplateNode, pDataScope, bAccessedDataDOM, FALSE, |
- &sNodeIterator, bSelfMatch, eBindMatch)) { |
+ if (!FindMatchingDataNode(pDocument, pTemplateNode, pDataScope, |
+ bAccessedDataDOM, FALSE, &sNodeIterator, |
+ bSelfMatch, eBindMatch, TRUE)) { |
break; |
} |
if (eBindMatch == XFA_ATTRIBUTEENUM_DataRef && |
eParentBindMatch == XFA_ATTRIBUTEENUM_DataRef) { |
break; |
} |
+ |
if (eRelation == XFA_ATTRIBUTEENUM_Choice || |
eRelation == XFA_ATTRIBUTEENUM_Unordered) { |
CXFA_Node* pSubformSetNode = XFA_NodeMerge_CloneOrMergeContainer( |
pDocument, pFormParentNode, pTemplateNode, FALSE, pSearchArray); |
ASSERT(pSubformSetNode); |
- if (!pFirstInstance) { |
+ if (!pFirstInstance) |
pFirstInstance = pSubformSetNode; |
- } |
- CFX_ArrayTemplate<XFA_DataMerge_RecurseRecord> rgItemMatchList; |
+ |
+ CFX_ArrayTemplate<RecurseRecord> rgItemMatchList; |
CFX_ArrayTemplate<CXFA_Node*> rgItemUnmatchList; |
for (CXFA_Node* pTemplateChild = |
pTemplateNode->GetNodeItem(XFA_NODEITEM_FirstChild); |
pTemplateChild; pTemplateChild = pTemplateChild->GetNodeItem( |
XFA_NODEITEM_NextSibling)) { |
- if (XFA_NeedGenerateForm(pTemplateChild, bUseInstanceManager)) { |
+ if (NeedGenerateForm(pTemplateChild, bUseInstanceManager)) { |
XFA_NodeMerge_CloneOrMergeContainer(pDocument, pSubformSetNode, |
- pTemplateChild, TRUE); |
+ pTemplateChild, TRUE, nullptr); |
} else if (pTemplateChild->IsContainerNode()) { |
bSelfMatch = FALSE; |
eBindMatch = XFA_ATTRIBUTEENUM_None; |
- CXFA_Node* pDataMatch; |
- if (eRelation != XFA_ATTRIBUTEENUM_Ordered && |
- (pDataMatch = XFA_DataMerge_FindMatchingDataNode( |
- pDocument, pTemplateChild, pDataScope, bAccessedDataDOM, |
- FALSE, nullptr, bSelfMatch, eBindMatch)) != nullptr) { |
- XFA_DataMerge_RecurseRecord sNewRecord = {pTemplateChild, |
- pDataMatch}; |
- if (bSelfMatch) { |
- rgItemMatchList.InsertAt(0, sNewRecord); |
+ if (eRelation != XFA_ATTRIBUTEENUM_Ordered) { |
+ CXFA_Node* pDataMatch = FindMatchingDataNode( |
+ pDocument, pTemplateChild, pDataScope, bAccessedDataDOM, |
+ FALSE, nullptr, bSelfMatch, eBindMatch, TRUE); |
+ if (pDataMatch) { |
+ RecurseRecord sNewRecord = {pTemplateChild, pDataMatch}; |
+ if (bSelfMatch) |
+ rgItemMatchList.InsertAt(0, sNewRecord); |
+ else |
+ rgItemMatchList.Add(sNewRecord); |
} else { |
- rgItemMatchList.Add(sNewRecord); |
+ rgItemUnmatchList.Add(pTemplateChild); |
} |
} else { |
rgItemUnmatchList.Add(pTemplateChild); |
} |
} |
} |
+ |
switch (eRelation) { |
case XFA_ATTRIBUTEENUM_Choice: { |
ASSERT(rgItemMatchList.GetSize()); |
- XFA_DataMerge_SortRecurseRecord(rgItemMatchList, pDataScope, TRUE); |
+ SortRecurseRecord(rgItemMatchList, pDataScope, TRUE); |
pDocument->DataMerge_CopyContainer( |
rgItemMatchList[0].pTemplateChild, pSubformSetNode, pDataScope); |
- } break; |
+ break; |
+ } |
case XFA_ATTRIBUTEENUM_Unordered: { |
if (rgItemMatchList.GetSize()) { |
- XFA_DataMerge_SortRecurseRecord(rgItemMatchList, pDataScope); |
+ SortRecurseRecord(rgItemMatchList, pDataScope, FALSE); |
for (int32_t i = 0, count = rgItemMatchList.GetSize(); i < count; |
i++) { |
pDocument->DataMerge_CopyContainer( |
@@ -921,7 +876,8 @@ static CXFA_Node* XFA_DataMerge_CopyContainer_SubformSet( |
pDocument->DataMerge_CopyContainer(rgItemUnmatchList[i], |
pSubformSetNode, pDataScope); |
} |
- } break; |
+ break; |
+ } |
default: |
break; |
} |
@@ -929,16 +885,16 @@ static CXFA_Node* XFA_DataMerge_CopyContainer_SubformSet( |
CXFA_Node* pSubformSetNode = XFA_NodeMerge_CloneOrMergeContainer( |
pDocument, pFormParentNode, pTemplateNode, FALSE, pSearchArray); |
ASSERT(pSubformSetNode); |
- if (!pFirstInstance) { |
+ if (!pFirstInstance) |
pFirstInstance = pSubformSetNode; |
- } |
+ |
for (CXFA_Node* pTemplateChild = |
pTemplateNode->GetNodeItem(XFA_NODEITEM_FirstChild); |
pTemplateChild; pTemplateChild = pTemplateChild->GetNodeItem( |
XFA_NODEITEM_NextSibling)) { |
- if (XFA_NeedGenerateForm(pTemplateChild, bUseInstanceManager)) { |
+ if (NeedGenerateForm(pTemplateChild, bUseInstanceManager)) { |
XFA_NodeMerge_CloneOrMergeContainer(pDocument, pSubformSetNode, |
- pTemplateChild, TRUE); |
+ pTemplateChild, TRUE, nullptr); |
} else if (pTemplateChild->IsContainerNode()) { |
pDocument->DataMerge_CopyContainer(pTemplateChild, pSubformSetNode, |
pDataScope); |
@@ -946,20 +902,20 @@ static CXFA_Node* XFA_DataMerge_CopyContainer_SubformSet( |
} |
} |
} |
+ |
if (iCurRepeatIndex == 0 && bAccessedDataDOM == FALSE) { |
int32_t iLimit = iMax; |
if (pInstMgrNode && pTemplateNode->GetNameHash() == 0) { |
iLimit = subformArray.GetSize(); |
- if (iLimit < iMin) { |
+ if (iLimit < iMin) |
iLimit = iInit; |
- } |
} |
+ |
for (; (iLimit < 0 || iCurRepeatIndex < iLimit); iCurRepeatIndex++) { |
if (pInstMgrNode) { |
if (pSearchArray && pSearchArray->GetSize() < 1) { |
- if (pTemplateNode->GetNameHash() != 0) { |
+ if (pTemplateNode->GetNameHash() != 0) |
break; |
- } |
pSearchArray = nullptr; |
} |
} else if (!XFA_DataMerge_FindFormDOMInstance( |
@@ -970,16 +926,16 @@ static CXFA_Node* XFA_DataMerge_CopyContainer_SubformSet( |
CXFA_Node* pSubformNode = XFA_NodeMerge_CloneOrMergeContainer( |
pDocument, pFormParentNode, pTemplateNode, FALSE, pSearchArray); |
ASSERT(pSubformNode); |
- if (!pFirstInstance) { |
+ if (!pFirstInstance) |
pFirstInstance = pSubformNode; |
- } |
+ |
for (CXFA_Node* pTemplateChild = |
pTemplateNode->GetNodeItem(XFA_NODEITEM_FirstChild); |
pTemplateChild; pTemplateChild = pTemplateChild->GetNodeItem( |
XFA_NODEITEM_NextSibling)) { |
- if (XFA_NeedGenerateForm(pTemplateChild, bUseInstanceManager)) { |
+ if (NeedGenerateForm(pTemplateChild, bUseInstanceManager)) { |
XFA_NodeMerge_CloneOrMergeContainer(pDocument, pSubformNode, |
- pTemplateChild, TRUE); |
+ pTemplateChild, TRUE, nullptr); |
} else if (pTemplateChild->IsContainerNode()) { |
pDocument->DataMerge_CopyContainer(pTemplateChild, pSubformNode, |
pDataScope); |
@@ -988,26 +944,27 @@ static CXFA_Node* XFA_DataMerge_CopyContainer_SubformSet( |
} |
} |
} |
+ |
int32_t iMinimalLimit = iCurRepeatIndex == 0 ? iInit : iMin; |
for (; iCurRepeatIndex < iMinimalLimit; iCurRepeatIndex++) { |
CXFA_Node* pSubformSetNode = XFA_NodeMerge_CloneOrMergeContainer( |
pDocument, pFormParentNode, pTemplateNode, FALSE, pSearchArray); |
ASSERT(pSubformSetNode); |
- if (!pFirstInstance) { |
+ if (!pFirstInstance) |
pFirstInstance = pSubformSetNode; |
- } |
+ |
FX_BOOL bFound = FALSE; |
for (CXFA_Node* pTemplateChild = |
pTemplateNode->GetNodeItem(XFA_NODEITEM_FirstChild); |
pTemplateChild; pTemplateChild = pTemplateChild->GetNodeItem( |
XFA_NODEITEM_NextSibling)) { |
- if (XFA_NeedGenerateForm(pTemplateChild, bUseInstanceManager)) { |
+ if (NeedGenerateForm(pTemplateChild, bUseInstanceManager)) { |
XFA_NodeMerge_CloneOrMergeContainer(pDocument, pSubformSetNode, |
- pTemplateChild, TRUE); |
+ pTemplateChild, TRUE, nullptr); |
} else if (pTemplateChild->IsContainerNode()) { |
- if (bFound && eRelation == XFA_ATTRIBUTEENUM_Choice) { |
+ if (bFound && eRelation == XFA_ATTRIBUTEENUM_Choice) |
continue; |
- } |
+ |
pDocument->DataMerge_CopyContainer(pTemplateChild, pSubformSetNode, |
pDataScope, FALSE, bDataMerge); |
bFound = TRUE; |
@@ -1016,27 +973,28 @@ static CXFA_Node* XFA_DataMerge_CopyContainer_SubformSet( |
} |
return pFirstInstance; |
} |
-static CXFA_Node* XFA_DataMerge_CopyContainer_Field(CXFA_Document* pDocument, |
- CXFA_Node* pTemplateNode, |
- CXFA_Node* pFormNode, |
- CXFA_Node* pDataScope, |
- FX_BOOL bDataMerge, |
- FX_BOOL bUpLevel = TRUE) { |
+ |
+CXFA_Node* CopyContainer_Field(CXFA_Document* pDocument, |
+ CXFA_Node* pTemplateNode, |
+ CXFA_Node* pFormNode, |
+ CXFA_Node* pDataScope, |
+ FX_BOOL bDataMerge, |
+ FX_BOOL bUpLevel) { |
CXFA_Node* pFieldNode = XFA_NodeMerge_CloneOrMergeContainer( |
- pDocument, pFormNode, pTemplateNode, FALSE); |
+ pDocument, pFormNode, pTemplateNode, FALSE, nullptr); |
ASSERT(pFieldNode); |
for (CXFA_Node* pTemplateChildNode = |
pTemplateNode->GetNodeItem(XFA_NODEITEM_FirstChild); |
pTemplateChildNode; pTemplateChildNode = pTemplateChildNode->GetNodeItem( |
XFA_NODEITEM_NextSibling)) { |
- if (XFA_NeedGenerateForm(pTemplateChildNode)) { |
+ if (NeedGenerateForm(pTemplateChildNode, TRUE)) { |
XFA_NodeMerge_CloneOrMergeContainer(pDocument, pFieldNode, |
- pTemplateChildNode, TRUE); |
+ pTemplateChildNode, TRUE, nullptr); |
} else if (pTemplateNode->GetElementType() == XFA_Element::ExclGroup && |
pTemplateChildNode->IsContainerNode()) { |
if (pTemplateChildNode->GetElementType() == XFA_Element::Field) { |
- XFA_DataMerge_CopyContainer_Field(pDocument, pTemplateChildNode, |
- pFieldNode, nullptr, FALSE); |
+ CopyContainer_Field(pDocument, pTemplateChildNode, pFieldNode, nullptr, |
+ FALSE, TRUE); |
} |
} |
} |
@@ -1044,52 +1002,77 @@ static CXFA_Node* XFA_DataMerge_CopyContainer_Field(CXFA_Document* pDocument, |
FX_BOOL bAccessedDataDOM = FALSE; |
FX_BOOL bSelfMatch = FALSE; |
XFA_ATTRIBUTEENUM eBindMatch; |
- CXFA_Node* pDataNode = XFA_DataMerge_FindMatchingDataNode( |
+ CXFA_Node* pDataNode = FindMatchingDataNode( |
pDocument, pTemplateNode, pDataScope, bAccessedDataDOM, TRUE, nullptr, |
bSelfMatch, eBindMatch, bUpLevel); |
- if (pDataNode) { |
- XFA_DataMerge_CreateDataBinding(pFieldNode, pDataNode); |
- } |
+ if (pDataNode) |
+ CreateDataBinding(pFieldNode, pDataNode, TRUE); |
} else { |
- XFA_DataMerge_FormValueNode_MatchNoneCreateChild(pFieldNode); |
+ FormValueNode_MatchNoneCreateChild(pFieldNode); |
} |
return pFieldNode; |
} |
-CXFA_Node* CXFA_Document::DataMerge_CopyContainer(CXFA_Node* pTemplateNode, |
- CXFA_Node* pFormNode, |
- CXFA_Node* pDataScope, |
- FX_BOOL bOneInstance, |
- FX_BOOL bDataMerge, |
- FX_BOOL bUpLevel) { |
- switch (pTemplateNode->GetElementType()) { |
- case XFA_Element::SubformSet: |
- case XFA_Element::Subform: |
- case XFA_Element::Area: |
- case XFA_Element::PageArea: |
- return XFA_DataMerge_CopyContainer_SubformSet( |
- this, pTemplateNode, pFormNode, pDataScope, bOneInstance, bDataMerge); |
- case XFA_Element::ExclGroup: |
- case XFA_Element::Field: |
- case XFA_Element::Draw: |
- case XFA_Element::ContentArea: |
- return XFA_DataMerge_CopyContainer_Field( |
- this, pTemplateNode, pFormNode, pDataScope, bDataMerge, bUpLevel); |
- case XFA_Element::PageSet: |
- break; |
- case XFA_Element::Variables: |
- break; |
- default: |
- ASSERT(FALSE); |
+ |
+CXFA_Node* MaybeCreateDataNode(CXFA_Document* pDocument, |
+ CXFA_Node* pDataParent, |
+ XFA_Element eNodeType, |
+ const CFX_WideString& wsName) { |
+ if (!pDataParent) |
+ return nullptr; |
+ |
+ CXFA_Node* pParentDDNode = pDataParent->GetDataDescriptionNode(); |
+ if (!pParentDDNode) { |
+ CXFA_Node* pDataNode = |
+ pDocument->CreateNode(XFA_XDPPACKET_Datasets, eNodeType); |
+ pDataNode->SetCData(XFA_ATTRIBUTE_Name, wsName); |
+ pDataNode->CreateXMLMappingNode(); |
+ pDataParent->InsertChild(pDataNode); |
+ pDataNode->SetFlag(XFA_NodeFlag_Initialized, false); |
+ return pDataNode; |
+ } |
+ |
+ CXFA_NodeIteratorTemplate<CXFA_Node, CXFA_TraverseStrategy_DDGroup> sIterator( |
+ pParentDDNode); |
+ for (CXFA_Node* pDDGroupNode = sIterator.GetCurrent(); pDDGroupNode; |
+ pDDGroupNode = sIterator.MoveToNext()) { |
+ if (pDDGroupNode != pParentDDNode) { |
+ if (pDDGroupNode->GetElementType() != XFA_Element::DataGroup) |
+ continue; |
+ |
+ CFX_WideString wsNamespace; |
+ if (!pDDGroupNode->TryNamespace(wsNamespace) || |
+ wsNamespace != FX_WSTRC(L"http://ns.adobe.com/data-description/")) { |
+ continue; |
+ } |
+ } |
+ CXFA_Node* pDDNode = pDDGroupNode->GetFirstChildByName(wsName.AsStringC()); |
+ if (!pDDNode) |
+ continue; |
+ if (pDDNode->GetElementType() != eNodeType) |
break; |
+ |
+ CXFA_Node* pDataNode = |
+ pDocument->CreateNode(XFA_XDPPACKET_Datasets, eNodeType); |
+ pDataNode->SetCData(XFA_ATTRIBUTE_Name, wsName); |
+ pDataNode->CreateXMLMappingNode(); |
+ if (eNodeType == XFA_Element::DataValue && |
+ pDDNode->GetEnum(XFA_ATTRIBUTE_Contains) == |
+ XFA_ATTRIBUTEENUM_MetaData) { |
+ pDataNode->SetEnum(XFA_ATTRIBUTE_Contains, XFA_ATTRIBUTEENUM_MetaData); |
+ } |
+ pDataParent->InsertChild(pDataNode); |
+ pDataNode->SetDataDescriptionNode(pDDNode); |
+ pDataNode->SetFlag(XFA_NodeFlag_Initialized, false); |
+ return pDataNode; |
} |
return nullptr; |
} |
-static void XFA_DataMerge_UpdateBindingRelations(CXFA_Document* pDocument, |
- CXFA_Node* pFormNode, |
- CXFA_Node* pDataScope, |
- FX_BOOL bDataRef, |
- FX_BOOL bParentDataRef) { |
+void UpdateBindingRelations(CXFA_Document* pDocument, |
+ CXFA_Node* pFormNode, |
+ CXFA_Node* pDataScope, |
+ FX_BOOL bDataRef, |
+ FX_BOOL bParentDataRef) { |
FX_BOOL bMatchRef = TRUE; |
XFA_Element eType = pFormNode->GetElementType(); |
CXFA_Node* pDataNode = pFormNode->GetBindData(); |
@@ -1104,9 +1087,8 @@ static void XFA_DataMerge_UpdateBindingRelations(CXFA_Document* pDocument, |
: XFA_ATTRIBUTEENUM_Once; |
switch (eMatch) { |
case XFA_ATTRIBUTEENUM_None: |
- if (!bDataRef || bParentDataRef) { |
- XFA_DataMerge_FormValueNode_MatchNoneCreateChild(pFormNode); |
- } |
+ if (!bDataRef || bParentDataRef) |
+ FormValueNode_MatchNoneCreateChild(pFormNode); |
break; |
case XFA_ATTRIBUTEENUM_Once: |
if (!bDataRef || bParentDataRef) { |
@@ -1118,16 +1100,15 @@ static void XFA_DataMerge_UpdateBindingRelations(CXFA_Document* pDocument, |
XFA_FieldIsMultiListBox(pFormNode)) |
? XFA_Element::DataGroup |
: XFA_Element::DataValue; |
- pDataNode = XFA_DataDescription_MaybeCreateDataNode( |
+ pDataNode = MaybeCreateDataNode( |
pDocument, pDataScope, eDataNodeType, |
CFX_WideString(pFormNode->GetCData(XFA_ATTRIBUTE_Name))); |
- if (pDataNode) { |
- XFA_DataMerge_CreateDataBinding(pFormNode, pDataNode, FALSE); |
- } |
- } |
- if (!pDataNode) { |
- XFA_DataMerge_FormValueNode_MatchNoneCreateChild(pFormNode); |
+ if (pDataNode) |
+ CreateDataBinding(pFormNode, pDataNode, FALSE); |
} |
+ if (!pDataNode) |
+ FormValueNode_MatchNoneCreateChild(pFormNode); |
+ |
} else { |
CXFA_Node* pDataParent = |
pDataNode->GetNodeItem(XFA_NODEITEM_Parent); |
@@ -1143,7 +1124,7 @@ static void XFA_DataMerge_UpdateBindingRelations(CXFA_Document* pDocument, |
if (!bDataRef || bParentDataRef) { |
uint32_t dwNameHash = pFormNode->GetNameHash(); |
if (dwNameHash != 0 && !pDataNode) { |
- pDataNode = XFA_DataMerge_GetGlobalBinding(pDocument, dwNameHash); |
+ pDataNode = GetGlobalBinding(pDocument, dwNameHash); |
if (!pDataNode) { |
XFA_Element eDataNodeType = (eType == XFA_Element::Subform || |
XFA_FieldIsMultiListBox(pFormNode)) |
@@ -1151,21 +1132,20 @@ static void XFA_DataMerge_UpdateBindingRelations(CXFA_Document* pDocument, |
: XFA_Element::DataValue; |
CXFA_Node* pRecordNode = |
ToNode(pDocument->GetXFAObject(XFA_HASHCODE_Record)); |
- pDataNode = XFA_DataDescription_MaybeCreateDataNode( |
+ pDataNode = MaybeCreateDataNode( |
pDocument, pRecordNode, eDataNodeType, |
CFX_WideString(pFormNode->GetCData(XFA_ATTRIBUTE_Name))); |
if (pDataNode) { |
- XFA_DataMerge_CreateDataBinding(pFormNode, pDataNode, FALSE); |
- XFA_DataMerge_RegisterGlobalBinding( |
- pDocument, pFormNode->GetNameHash(), pDataNode); |
+ CreateDataBinding(pFormNode, pDataNode, FALSE); |
+ RegisterGlobalBinding(pDocument, pFormNode->GetNameHash(), |
+ pDataNode); |
} |
} else { |
- XFA_DataMerge_CreateDataBinding(pFormNode, pDataNode); |
+ CreateDataBinding(pFormNode, pDataNode, TRUE); |
} |
} |
- if (!pDataNode) { |
- XFA_DataMerge_FormValueNode_MatchNoneCreateChild(pFormNode); |
- } |
+ if (!pDataNode) |
+ FormValueNode_MatchNoneCreateChild(pFormNode); |
} |
break; |
case XFA_ATTRIBUTEENUM_DataRef: { |
@@ -1183,18 +1163,19 @@ static void XFA_DataMerge_UpdateBindingRelations(CXFA_Document* pDocument, |
(rs.nodes.GetSize() > 0) ? rs.nodes[0] : nullptr; |
pDataNode = ToNode(pObject); |
if (pDataNode) { |
- XFA_DataMerge_CreateDataBinding( |
- pFormNode, pDataNode, |
- rs.dwFlags == XFA_RESOVENODE_RSTYPE_ExistNodes); |
+ CreateDataBinding(pFormNode, pDataNode, |
+ rs.dwFlags == XFA_RESOVENODE_RSTYPE_ExistNodes); |
} else { |
- XFA_DataMerge_FormValueNode_MatchNoneCreateChild(pFormNode); |
+ FormValueNode_MatchNoneCreateChild(pFormNode); |
} |
} |
- } break; |
+ break; |
+ } |
default: |
break; |
} |
} |
+ |
if (bMatchRef && |
(eType == XFA_Element::Subform || eType == XFA_Element::SubformSet || |
eType == XFA_Element::Area || eType == XFA_Element::PageArea || |
@@ -1208,36 +1189,173 @@ static void XFA_DataMerge_UpdateBindingRelations(CXFA_Document* pDocument, |
if (pFormChild->IsUnusedNode()) |
continue; |
- XFA_DataMerge_UpdateBindingRelations(pDocument, pFormChild, |
- pDataNode ? pDataNode : pDataScope, |
- bDataRef, bParentDataRef); |
+ UpdateBindingRelations(pDocument, pFormChild, |
+ pDataNode ? pDataNode : pDataScope, bDataRef, |
+ bParentDataRef); |
} |
} |
} |
+ |
+void UpdateDataRelation(CXFA_Node* pDataNode, CXFA_Node* pDataDescriptionNode) { |
+ ASSERT(pDataDescriptionNode); |
+ for (CXFA_Node* pDataChild = pDataNode->GetNodeItem(XFA_NODEITEM_FirstChild); |
+ pDataChild; |
+ pDataChild = pDataChild->GetNodeItem(XFA_NODEITEM_NextSibling)) { |
+ uint32_t dwNameHash = pDataChild->GetNameHash(); |
+ if (!dwNameHash) |
+ continue; |
+ |
+ CXFA_NodeIteratorTemplate<CXFA_Node, CXFA_TraverseStrategy_DDGroup> |
+ sIterator(pDataDescriptionNode); |
+ for (CXFA_Node* pDDGroupNode = sIterator.GetCurrent(); pDDGroupNode; |
+ pDDGroupNode = sIterator.MoveToNext()) { |
+ if (pDDGroupNode != pDataDescriptionNode) { |
+ if (pDDGroupNode->GetElementType() != XFA_Element::DataGroup) |
+ continue; |
+ |
+ CFX_WideString wsNamespace; |
+ if (!pDDGroupNode->TryNamespace(wsNamespace) || |
+ wsNamespace != FX_WSTRC(L"http://ns.adobe.com/data-description/")) { |
+ continue; |
+ } |
+ } |
+ CXFA_Node* pDDNode = pDDGroupNode->GetFirstChildByName(dwNameHash); |
+ if (!pDDNode) |
+ continue; |
+ if (pDDNode->GetElementType() != pDataChild->GetElementType()) |
+ break; |
+ |
+ pDataChild->SetDataDescriptionNode(pDDNode); |
+ UpdateDataRelation(pDataChild, pDDNode); |
+ break; |
+ } |
+ } |
+} |
+ |
+} // namespace |
+ |
+CXFA_Node* XFA_DataMerge_FindFormDOMInstance(CXFA_Document* pDocument, |
+ XFA_Element eType, |
+ uint32_t dwNameHash, |
+ CXFA_Node* pFormParent) { |
+ CXFA_Node* pFormChild = pFormParent->GetNodeItem(XFA_NODEITEM_FirstChild); |
+ for (; pFormChild; |
+ pFormChild = pFormChild->GetNodeItem(XFA_NODEITEM_NextSibling)) { |
+ if (pFormChild->GetElementType() == eType && |
+ pFormChild->GetNameHash() == dwNameHash && pFormChild->IsUnusedNode()) { |
+ return pFormChild; |
+ } |
+ } |
+ return nullptr; |
+} |
+ |
+CXFA_Node* XFA_NodeMerge_CloneOrMergeContainer(CXFA_Document* pDocument, |
+ CXFA_Node* pFormParent, |
+ CXFA_Node* pTemplateNode, |
+ FX_BOOL bRecursive, |
+ CXFA_NodeArray* pSubformArray) { |
+ CXFA_Node* pExistingNode = nullptr; |
+ if (!pSubformArray) { |
+ pExistingNode = XFA_DataMerge_FindFormDOMInstance( |
+ pDocument, pTemplateNode->GetElementType(), |
+ pTemplateNode->GetNameHash(), pFormParent); |
+ } else if (pSubformArray->GetSize() > 0) { |
+ pExistingNode = pSubformArray->GetAt(0); |
+ pSubformArray->RemoveAt(0); |
+ } |
+ |
+ if (pExistingNode) { |
+ if (pSubformArray) { |
+ pFormParent->InsertChild(pExistingNode); |
+ } else if (pExistingNode->IsContainerNode()) { |
+ pFormParent->RemoveChild(pExistingNode); |
+ pFormParent->InsertChild(pExistingNode); |
+ } |
+ pExistingNode->ClearFlag(XFA_NodeFlag_UnusedNode); |
+ pExistingNode->SetTemplateNode(pTemplateNode); |
+ if (bRecursive && pExistingNode->GetElementType() != XFA_Element::Items) { |
+ for (CXFA_Node* pTemplateChild = |
+ pTemplateNode->GetNodeItem(XFA_NODEITEM_FirstChild); |
+ pTemplateChild; pTemplateChild = pTemplateChild->GetNodeItem( |
+ XFA_NODEITEM_NextSibling)) { |
+ if (NeedGenerateForm(pTemplateChild, TRUE)) { |
+ XFA_NodeMerge_CloneOrMergeContainer( |
+ pDocument, pExistingNode, pTemplateChild, bRecursive, nullptr); |
+ } |
+ } |
+ } |
+ pExistingNode->SetFlag(XFA_NodeFlag_Initialized, true); |
+ return pExistingNode; |
+ } |
+ |
+ CXFA_Node* pNewNode = pTemplateNode->CloneTemplateToForm(FALSE); |
+ pFormParent->InsertChild(pNewNode, nullptr); |
+ if (bRecursive) { |
+ for (CXFA_Node* pTemplateChild = |
+ pTemplateNode->GetNodeItem(XFA_NODEITEM_FirstChild); |
+ pTemplateChild; pTemplateChild = pTemplateChild->GetNodeItem( |
+ XFA_NODEITEM_NextSibling)) { |
+ if (NeedGenerateForm(pTemplateChild, TRUE)) { |
+ CXFA_Node* pNewChild = pTemplateChild->CloneTemplateToForm(TRUE); |
+ pNewNode->InsertChild(pNewChild, nullptr); |
+ } |
+ } |
+ } |
+ return pNewNode; |
+} |
+ |
CXFA_Node* XFA_DataMerge_FindDataScope(CXFA_Node* pParentFormNode) { |
for (CXFA_Node* pRootBoundNode = pParentFormNode; |
pRootBoundNode && pRootBoundNode->IsContainerNode(); |
pRootBoundNode = pRootBoundNode->GetNodeItem(XFA_NODEITEM_Parent)) { |
CXFA_Node* pDataScope = pRootBoundNode->GetBindData(); |
- if (pDataScope) { |
+ if (pDataScope) |
return pDataScope; |
- } |
} |
return ToNode( |
pParentFormNode->GetDocument()->GetXFAObject(XFA_HASHCODE_Data)); |
} |
+ |
+CXFA_Node* CXFA_Document::DataMerge_CopyContainer(CXFA_Node* pTemplateNode, |
+ CXFA_Node* pFormNode, |
+ CXFA_Node* pDataScope, |
+ FX_BOOL bOneInstance, |
+ FX_BOOL bDataMerge, |
+ FX_BOOL bUpLevel) { |
+ switch (pTemplateNode->GetElementType()) { |
+ case XFA_Element::SubformSet: |
+ case XFA_Element::Subform: |
+ case XFA_Element::Area: |
+ case XFA_Element::PageArea: |
+ return CopyContainer_SubformSet(this, pTemplateNode, pFormNode, |
+ pDataScope, bOneInstance, bDataMerge); |
+ case XFA_Element::ExclGroup: |
+ case XFA_Element::Field: |
+ case XFA_Element::Draw: |
+ case XFA_Element::ContentArea: |
+ return CopyContainer_Field(this, pTemplateNode, pFormNode, pDataScope, |
+ bDataMerge, bUpLevel); |
+ case XFA_Element::PageSet: |
+ case XFA_Element::Variables: |
+ break; |
+ default: |
+ ASSERT(FALSE); |
+ break; |
+ } |
+ return nullptr; |
+} |
+ |
void CXFA_Document::DataMerge_UpdateBindingRelations( |
CXFA_Node* pFormUpdateRoot) { |
CXFA_Node* pDataScope = XFA_DataMerge_FindDataScope( |
pFormUpdateRoot->GetNodeItem(XFA_NODEITEM_Parent)); |
- if (!pDataScope) { |
+ if (!pDataScope) |
return; |
- } |
- XFA_DataMerge_UpdateBindingRelations(this, pFormUpdateRoot, pDataScope, FALSE, |
- FALSE); |
- XFA_DataMerge_UpdateBindingRelations(this, pFormUpdateRoot, pDataScope, TRUE, |
- FALSE); |
+ |
+ UpdateBindingRelations(this, pFormUpdateRoot, pDataScope, FALSE, FALSE); |
+ UpdateBindingRelations(this, pFormUpdateRoot, pDataScope, TRUE, FALSE); |
} |
+ |
CXFA_Node* CXFA_Document::GetNotBindNode(CXFA_ObjArray& arrayNodes) { |
for (int32_t i = 0; i < arrayNodes.GetSize(); i++) { |
CXFA_Node* pNode = arrayNodes[i]->AsNode(); |
@@ -1246,6 +1364,7 @@ CXFA_Node* CXFA_Document::GetNotBindNode(CXFA_ObjArray& arrayNodes) { |
} |
return nullptr; |
} |
+ |
void CXFA_Document::DoDataMerge() { |
CXFA_Node* pDatasetsRoot = ToNode(GetXFAObject(XFA_HASHCODE_Datasets)); |
if (!pDatasetsRoot) { |
@@ -1265,30 +1384,25 @@ void CXFA_Document::DoDataMerge() { |
pDatasetsRoot->GetNodeItem(XFA_NODEITEM_FirstChild); |
pChildNode; |
pChildNode = pChildNode->GetNodeItem(XFA_NODEITEM_NextSibling)) { |
- if (pChildNode->GetElementType() != XFA_Element::DataGroup) { |
+ if (pChildNode->GetElementType() != XFA_Element::DataGroup) |
continue; |
- } |
+ |
CFX_WideString wsNamespaceURI; |
if (!pDDRoot && pChildNode->GetNameHash() == XFA_HASHCODE_DataDescription) { |
- if (!pChildNode->TryNamespace(wsNamespaceURI)) { |
+ if (!pChildNode->TryNamespace(wsNamespaceURI)) |
continue; |
- } |
- if (wsNamespaceURI == |
- FX_WSTRC(L"http://ns.adobe.com/data-description/")) { |
+ if (wsNamespaceURI == FX_WSTRC(L"http://ns.adobe.com/data-description/")) |
pDDRoot = pChildNode; |
- } |
} else if (!pDataRoot && pChildNode->GetNameHash() == XFA_HASHCODE_Data) { |
- if (!pChildNode->TryNamespace(wsNamespaceURI)) { |
+ if (!pChildNode->TryNamespace(wsNamespaceURI)) |
continue; |
- } |
- if (wsNamespaceURI == wsDatasetsURI) { |
+ if (wsNamespaceURI == wsDatasetsURI) |
pDataRoot = pChildNode; |
- } |
} |
- if (pDataRoot && pDDRoot) { |
+ if (pDataRoot && pDDRoot) |
break; |
- } |
} |
+ |
if (!pDataRoot) { |
CFDE_XMLElement* pDataRootXMLNode = new CFDE_XMLElement(L"xfa:data"); |
pDataRoot = CreateNode(XFA_XDPPACKET_Datasets, XFA_Element::DataGroup); |
@@ -1296,14 +1410,15 @@ void CXFA_Document::DoDataMerge() { |
pDataRoot->SetXMLMappingNode(pDataRootXMLNode); |
pDatasetsRoot->InsertChild(pDataRoot); |
} |
+ |
CXFA_Node* pDataTopLevel = |
pDataRoot->GetFirstChildByClass(XFA_Element::DataGroup); |
uint32_t dwNameHash = pDataTopLevel ? pDataTopLevel->GetNameHash() : 0; |
CXFA_Node* pTemplateRoot = |
m_pRootNode->GetFirstChildByClass(XFA_Element::Template); |
- if (!pTemplateRoot) { |
+ if (!pTemplateRoot) |
return; |
- } |
+ |
CXFA_Node* pTemplateChosen = |
dwNameHash != 0 ? pTemplateRoot->GetFirstChildByName(dwNameHash) |
: nullptr; |
@@ -1311,9 +1426,9 @@ void CXFA_Document::DoDataMerge() { |
pTemplateChosen->GetElementType() != XFA_Element::Subform) { |
pTemplateChosen = pTemplateRoot->GetFirstChildByClass(XFA_Element::Subform); |
} |
- if (!pTemplateChosen) { |
+ if (!pTemplateChosen) |
return; |
- } |
+ |
CXFA_Node* pFormRoot = m_pRootNode->GetFirstChildByClass(XFA_Element::Form); |
FX_BOOL bEmptyForm = FALSE; |
if (!pFormRoot) { |
@@ -1330,8 +1445,9 @@ void CXFA_Document::DoDataMerge() { |
pNode->SetFlag(XFA_NodeFlag_UnusedNode, true); |
} |
} |
+ |
CXFA_Node* pSubformSetNode = XFA_NodeMerge_CloneOrMergeContainer( |
- this, pFormRoot, pTemplateChosen, FALSE); |
+ this, pFormRoot, pTemplateChosen, FALSE, nullptr); |
ASSERT(pSubformSetNode); |
if (!pDataTopLevel) { |
CFX_WideStringC wsFormName = pSubformSetNode->GetCData(XFA_ATTRIBUTE_Name); |
@@ -1346,22 +1462,23 @@ void CXFA_Document::DoDataMerge() { |
CXFA_Node* pBeforeNode = pDataRoot->GetNodeItem(XFA_NODEITEM_FirstChild); |
pDataRoot->InsertChild(pDataTopLevel, pBeforeNode); |
} |
+ |
ASSERT(pDataTopLevel); |
- XFA_DataMerge_CreateDataBinding(pSubformSetNode, pDataTopLevel); |
+ CreateDataBinding(pSubformSetNode, pDataTopLevel, TRUE); |
for (CXFA_Node* pTemplateChild = |
pTemplateChosen->GetNodeItem(XFA_NODEITEM_FirstChild); |
pTemplateChild; |
pTemplateChild = pTemplateChild->GetNodeItem(XFA_NODEITEM_NextSibling)) { |
- if (XFA_NeedGenerateForm(pTemplateChild)) { |
+ if (NeedGenerateForm(pTemplateChild, TRUE)) { |
XFA_NodeMerge_CloneOrMergeContainer(this, pSubformSetNode, pTemplateChild, |
- TRUE); |
+ TRUE, nullptr); |
} else if (pTemplateChild->IsContainerNode()) { |
DataMerge_CopyContainer(pTemplateChild, pSubformSetNode, pDataTopLevel); |
} |
} |
- if (pDDRoot) { |
- XFA_DataDescription_UpdateDataRelation(pDataRoot, pDDRoot); |
- } |
+ if (pDDRoot) |
+ UpdateDataRelation(pDataRoot, pDDRoot); |
+ |
DataMerge_UpdateBindingRelations(pSubformSetNode); |
CXFA_Node* pPageSetNode = |
pSubformSetNode->GetFirstChildByClass(XFA_Element::PageSet); |
@@ -1372,41 +1489,43 @@ void CXFA_Document::DoDataMerge() { |
pSubformSetNode->RemoveChild(pPageSetNode); |
pPageSetNode = pNextPageSetNode; |
} |
- if (!bEmptyForm) { |
- CXFA_NodeIteratorTemplate<CXFA_Node, CXFA_TraverseStrategy_XFANode> |
- sIterator(pFormRoot); |
- CXFA_Node* pNode = sIterator.MoveToNext(); |
- while (pNode) { |
- if (pNode->IsUnusedNode()) { |
- if (pNode->IsContainerNode() || |
- pNode->GetElementType() == XFA_Element::InstanceManager) { |
- CXFA_Node* pNext = sIterator.SkipChildrenAndMoveToNext(); |
- pNode->GetNodeItem(XFA_NODEITEM_Parent)->RemoveChild(pNode); |
- pNode = pNext; |
- } else { |
- pNode->ClearFlag(XFA_NodeFlag_UnusedNode); |
- pNode->SetFlag(XFA_NodeFlag_Initialized, true); |
- pNode = sIterator.MoveToNext(); |
- } |
+ |
+ if (bEmptyForm) |
+ return; |
+ |
+ CXFA_NodeIteratorTemplate<CXFA_Node, CXFA_TraverseStrategy_XFANode> sIterator( |
+ pFormRoot); |
+ CXFA_Node* pNode = sIterator.MoveToNext(); |
+ while (pNode) { |
+ if (pNode->IsUnusedNode()) { |
+ if (pNode->IsContainerNode() || |
+ pNode->GetElementType() == XFA_Element::InstanceManager) { |
+ CXFA_Node* pNext = sIterator.SkipChildrenAndMoveToNext(); |
+ pNode->GetNodeItem(XFA_NODEITEM_Parent)->RemoveChild(pNode); |
+ pNode = pNext; |
} else { |
+ pNode->ClearFlag(XFA_NodeFlag_UnusedNode); |
pNode->SetFlag(XFA_NodeFlag_Initialized, true); |
pNode = sIterator.MoveToNext(); |
} |
+ } else { |
+ pNode->SetFlag(XFA_NodeFlag_Initialized, true); |
+ pNode = sIterator.MoveToNext(); |
} |
} |
} |
+ |
void CXFA_Document::DoDataRemerge(FX_BOOL bDoDataMerge) { |
CXFA_Node* pFormRoot = ToNode(GetXFAObject(XFA_HASHCODE_Form)); |
if (pFormRoot) { |
- while (CXFA_Node* pNode = pFormRoot->GetNodeItem(XFA_NODEITEM_FirstChild)) { |
+ while (CXFA_Node* pNode = pFormRoot->GetNodeItem(XFA_NODEITEM_FirstChild)) |
pFormRoot->RemoveChild(pNode); |
- } |
pFormRoot->SetObject(XFA_ATTRIBUTE_BindingNode, nullptr); |
} |
- XFA_DataMerge_ClearGlobalBinding(this); |
- if (bDoDataMerge) { |
+ m_rgGlobalBinding.RemoveAll(); |
+ if (bDoDataMerge) |
DoDataMerge(); |
- } |
+ |
CXFA_LayoutProcessor* pLayoutProcessor = GetLayoutProcessor(); |
pLayoutProcessor->SetForceReLayout(TRUE); |
} |