diff options
Diffstat (limited to 'xfa')
-rw-r--r-- | xfa/fxfa/parser/xfa_document_datadescription_imp.cpp | 121 | ||||
-rw-r--r-- | xfa/fxfa/parser/xfa_document_datadescription_imp.h | 18 | ||||
-rw-r--r-- | xfa/fxfa/parser/xfa_document_datamerger_imp.cpp | 1115 | ||||
-rw-r--r-- | xfa/fxfa/parser/xfa_document_datamerger_imp.h | 11 | ||||
-rw-r--r-- | xfa/fxfa/parser/xfa_layout_pagemgr_new.cpp | 3 |
5 files changed, 624 insertions, 644 deletions
diff --git a/xfa/fxfa/parser/xfa_document_datadescription_imp.cpp b/xfa/fxfa/parser/xfa_document_datadescription_imp.cpp deleted file mode 100644 index bcd6a874b3..0000000000 --- a/xfa/fxfa/parser/xfa_document_datadescription_imp.cpp +++ /dev/null @@ -1,121 +0,0 @@ -// 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/fxfa/parser/xfa_doclayout.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_parser.h" -#include "xfa/fxfa/parser/xfa_script.h" -#include "xfa/fxfa/parser/xfa_utils.h" - -class CXFA_TraverseStrategy_DDGroup { - public: - static inline CXFA_Node* GetFirstChild(CXFA_Node* pDDGroupNode) { - return pDDGroupNode->GetFirstChildByName(XFA_HASHCODE_Group); - } - static inline CXFA_Node* GetNextSibling(CXFA_Node* pDDGroupNode) { - return pDDGroupNode->GetNextSameNameSibling(XFA_HASHCODE_Group); - } - static inline CXFA_Node* GetParent(CXFA_Node* pDDGroupNode) { - return pDDGroupNode->GetNodeItem(XFA_NODEITEM_Parent); - } -}; -void XFA_DataDescription_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); - XFA_DataDescription_UpdateDataRelation(pDataChild, pDDNode); - break; - } - } -} -CXFA_Node* XFA_DataDescription_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); - ASSERT(pDataNode); - pDataNode->SetCData(XFA_ATTRIBUTE_Name, wsName); - pDataNode->CreateXMLMappingNode(); - pDataParent->InsertChild(pDataNode); - pDataNode->SetFlag(XFA_NodeFlag_Initialized, false); - return pDataNode; - } else { - 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); - ASSERT(pDataNode); - 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; - } -} diff --git a/xfa/fxfa/parser/xfa_document_datadescription_imp.h b/xfa/fxfa/parser/xfa_document_datadescription_imp.h deleted file mode 100644 index f0c905c85d..0000000000 --- a/xfa/fxfa/parser/xfa_document_datadescription_imp.h +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef XFA_FXFA_PARSER_XFA_DOCUMENT_DATADESCRIPTION_IMP_H_ -#define XFA_FXFA_PARSER_XFA_DOCUMENT_DATADESCRIPTION_IMP_H_ - -void XFA_DataDescription_UpdateDataRelation(CXFA_Node* pDataNode, - CXFA_Node* pDataDescriptionNode); -CXFA_Node* XFA_DataDescription_MaybeCreateDataNode( - CXFA_Document* pDocument, - CXFA_Node* pDataParent, - XFA_Element eNodeType, - const CFX_WideString& wsName); - -#endif // XFA_FXFA_PARSER_XFA_DOCUMENT_DATADESCRIPTION_IMP_H_ diff --git a/xfa/fxfa/parser/xfa_document_datamerger_imp.cpp b/xfa/fxfa/parser/xfa_document_datamerger_imp.cpp index 94aa07406b..4374b7c43d 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); } diff --git a/xfa/fxfa/parser/xfa_document_datamerger_imp.h b/xfa/fxfa/parser/xfa_document_datamerger_imp.h index a31bb3fd15..f97a7b43b9 100644 --- a/xfa/fxfa/parser/xfa_document_datamerger_imp.h +++ b/xfa/fxfa/parser/xfa_document_datamerger_imp.h @@ -9,12 +9,11 @@ #include "xfa/fxfa/parser/xfa_object.h" -CXFA_Node* XFA_NodeMerge_CloneOrMergeContainer( - CXFA_Document* pDocument, - CXFA_Node* pFormParent, - CXFA_Node* pTemplateNode, - FX_BOOL bRecursive, - CXFA_NodeArray* pSubformArray = nullptr); +CXFA_Node* XFA_NodeMerge_CloneOrMergeContainer(CXFA_Document* pDocument, + CXFA_Node* pFormParent, + CXFA_Node* pTemplateNode, + FX_BOOL bRecursive, + CXFA_NodeArray* pSubformArray); CXFA_Node* XFA_DataMerge_FindDataScope(CXFA_Node* pParentFormNode); CXFA_Node* XFA_DataMerge_FindFormDOMInstance(CXFA_Document* pDocument, XFA_Element eType, diff --git a/xfa/fxfa/parser/xfa_layout_pagemgr_new.cpp b/xfa/fxfa/parser/xfa_layout_pagemgr_new.cpp index 2ade051a81..117e1cec8e 100644 --- a/xfa/fxfa/parser/xfa_layout_pagemgr_new.cpp +++ b/xfa/fxfa/parser/xfa_layout_pagemgr_new.cpp @@ -1698,7 +1698,8 @@ void CXFA_LayoutPageMgr::MergePageSetContents() { case XFA_Element::PageSet: { CXFA_Node* pParentNode = pContainerItem->m_pParent->m_pFormNode; pContainerItem->m_pFormNode = XFA_NodeMerge_CloneOrMergeContainer( - pDocument, pParentNode, pContainerItem->m_pFormNode, TRUE); + pDocument, pParentNode, pContainerItem->m_pFormNode, TRUE, + nullptr); } break; case XFA_Element::PageArea: { CXFA_ContainerLayoutItem* pFormLayout = pContainerItem; |