Index: xfa/fxfa/parser/cxfa_dataexporter.cpp |
diff --git a/xfa/fxfa/parser/xfa_document_serialize.cpp b/xfa/fxfa/parser/cxfa_dataexporter.cpp |
similarity index 69% |
rename from xfa/fxfa/parser/xfa_document_serialize.cpp |
rename to xfa/fxfa/parser/cxfa_dataexporter.cpp |
index ae30165a2d86c2de7c509140d22f96144c857d56..fbb9e70b9411c8cd1ced1b8dec8eea714214ba5c 100644 |
--- a/xfa/fxfa/parser/xfa_document_serialize.cpp |
+++ b/xfa/fxfa/parser/cxfa_dataexporter.cpp |
@@ -4,64 +4,18 @@ |
// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
-#include "xfa/fxfa/parser/xfa_document_serialize.h" |
+#include "xfa/fxfa/parser/cxfa_dataexporter.h" |
+#include "core/fxcrt/include/fx_basic.h" |
#include "xfa/fde/xml/fde_xml_imp.h" |
#include "xfa/fgas/crt/fgas_codepage.h" |
#include "xfa/fxfa/parser/cxfa_document.h" |
-#include "xfa/fxfa/parser/cxfa_simple_parser.h" |
-#include "xfa/fxfa/parser/xfa_localemgr.h" |
+#include "xfa/fxfa/parser/cxfa_widgetdata.h" |
#include "xfa/fxfa/parser/xfa_object.h" |
-#include "xfa/fxfa/parser/xfa_utils.h" |
-CXFA_DataImporter::CXFA_DataImporter(CXFA_Document* pDocument) |
- : m_pDocument(pDocument) { |
- ASSERT(m_pDocument); |
-} |
-FX_BOOL CXFA_DataImporter::ImportData(IFX_FileRead* pDataDocument) { |
- std::unique_ptr<CXFA_SimpleParser> pDataDocumentParser( |
- new CXFA_SimpleParser(m_pDocument, false)); |
- if (!pDataDocumentParser) |
- return FALSE; |
- |
- if (pDataDocumentParser->StartParse(pDataDocument, XFA_XDPPACKET_Datasets) != |
- XFA_PARSESTATUS_Ready) { |
- return FALSE; |
- } |
- if (pDataDocumentParser->DoParse(nullptr) < XFA_PARSESTATUS_Done) |
- return FALSE; |
+namespace { |
- CXFA_Node* pImportDataRoot = pDataDocumentParser->GetRootNode(); |
- if (!pImportDataRoot) |
- return FALSE; |
- |
- CXFA_Node* pDataModel = |
- ToNode(m_pDocument->GetXFAObject(XFA_HASHCODE_Datasets)); |
- if (!pDataModel) |
- return FALSE; |
- |
- CXFA_Node* pDataNode = ToNode(m_pDocument->GetXFAObject(XFA_HASHCODE_Data)); |
- if (pDataNode) |
- pDataModel->RemoveChild(pDataNode); |
- |
- if (pImportDataRoot->GetElementType() == XFA_Element::DataModel) { |
- while (CXFA_Node* pChildNode = |
- pImportDataRoot->GetNodeItem(XFA_NODEITEM_FirstChild)) { |
- pImportDataRoot->RemoveChild(pChildNode); |
- pDataModel->InsertChild(pChildNode); |
- } |
- } else { |
- CFDE_XMLNode* pXMLNode = pImportDataRoot->GetXMLMappingNode(); |
- CFDE_XMLNode* pParentXMLNode = pXMLNode->GetNodeItem(CFDE_XMLNode::Parent); |
- if (pParentXMLNode) |
- pParentXMLNode->RemoveChildNode(pXMLNode); |
- pDataModel->InsertChild(pImportDataRoot); |
- } |
- m_pDocument->DoDataRemerge(FALSE); |
- return TRUE; |
-} |
- |
-CFX_WideString XFA_ExportEncodeAttribute(const CFX_WideString& str) { |
+CFX_WideString ExportEncodeAttribute(const CFX_WideString& str) { |
CFX_WideTextBuf textBuf; |
int32_t iLen = str.GetLength(); |
for (int32_t i = 0; i < iLen; i++) { |
@@ -87,14 +41,15 @@ CFX_WideString XFA_ExportEncodeAttribute(const CFX_WideString& str) { |
} |
return textBuf.MakeString(); |
} |
-CFX_WideString XFA_ExportEncodeContent(const CFX_WideStringC& str) { |
+ |
+CFX_WideString ExportEncodeContent(const CFX_WideStringC& str) { |
CFX_WideTextBuf textBuf; |
int32_t iLen = str.GetLength(); |
for (int32_t i = 0; i < iLen; i++) { |
FX_WCHAR ch = str.GetAt(i); |
- if (!FDE_IsXMLValidChar(ch)) { |
+ if (!FDE_IsXMLValidChar(ch)) |
continue; |
- } |
+ |
if (ch == '&') { |
textBuf << FX_WSTRC(L"&"); |
} else if (ch == '<') { |
@@ -117,34 +72,34 @@ CFX_WideString XFA_ExportEncodeContent(const CFX_WideStringC& str) { |
} |
return textBuf.MakeString(); |
} |
-static void XFA_SaveAttribute(CXFA_Node* pNode, |
- XFA_ATTRIBUTE eName, |
- const CFX_WideStringC& wsName, |
- FX_BOOL bProto, |
- CFX_WideString& wsOutput) { |
+ |
+void SaveAttribute(CXFA_Node* pNode, |
+ XFA_ATTRIBUTE eName, |
+ const CFX_WideStringC& wsName, |
+ FX_BOOL bProto, |
+ CFX_WideString& wsOutput) { |
CFX_WideString wsValue; |
if ((!bProto && !pNode->HasAttribute((XFA_ATTRIBUTE)eName, bProto)) || |
!pNode->GetAttribute((XFA_ATTRIBUTE)eName, wsValue, FALSE)) { |
return; |
} |
- wsValue = XFA_ExportEncodeAttribute(wsValue); |
+ wsValue = ExportEncodeAttribute(wsValue); |
wsOutput += FX_WSTRC(L" "); |
wsOutput += wsName; |
wsOutput += FX_WSTRC(L"=\""); |
wsOutput += wsValue; |
wsOutput += FX_WSTRC(L"\""); |
} |
-static FX_BOOL XFA_DataExporter_AttributeSaveInDataModel( |
- CXFA_Node* pNode, |
- XFA_ATTRIBUTE eAttribute) { |
+ |
+FX_BOOL AttributeSaveInDataModel(CXFA_Node* pNode, XFA_ATTRIBUTE eAttribute) { |
FX_BOOL bSaveInDataModel = FALSE; |
- if (pNode->GetElementType() != XFA_Element::Image) { |
+ if (pNode->GetElementType() != XFA_Element::Image) |
return bSaveInDataModel; |
- } |
+ |
CXFA_Node* pValueNode = pNode->GetNodeItem(XFA_NODEITEM_Parent); |
- if (!pValueNode || pValueNode->GetElementType() != XFA_Element::Value) { |
+ if (!pValueNode || pValueNode->GetElementType() != XFA_Element::Value) |
return bSaveInDataModel; |
- } |
+ |
CXFA_Node* pFieldNode = pValueNode->GetNodeItem(XFA_NODEITEM_Parent); |
if (pFieldNode && pFieldNode->GetBindData() && |
eAttribute == XFA_ATTRIBUTE_Href) { |
@@ -152,7 +107,8 @@ static FX_BOOL XFA_DataExporter_AttributeSaveInDataModel( |
} |
return bSaveInDataModel; |
} |
-FX_BOOL XFA_DataExporter_ContentNodeNeedtoExport(CXFA_Node* pContentNode) { |
+ |
+FX_BOOL ContentNodeNeedtoExport(CXFA_Node* pContentNode) { |
CFX_WideString wsContent; |
if (!pContentNode->TryContent(wsContent, FALSE, FALSE)) |
return FALSE; |
@@ -170,33 +126,32 @@ FX_BOOL XFA_DataExporter_ContentNodeNeedtoExport(CXFA_Node* pContentNode) { |
CXFA_WidgetData* pWidgetData = pGrandParentNode->GetWidgetData(); |
XFA_Element eUIType = pWidgetData->GetUIType(); |
- if (eUIType == XFA_Element::PasswordEdit) { |
+ if (eUIType == XFA_Element::PasswordEdit) |
return FALSE; |
- } |
return TRUE; |
} |
-static void XFA_DataExporter_RecognizeXFAVersionNumber( |
- CXFA_Node* pTemplateRoot, |
- CFX_WideString& wsVersionNumber) { |
+ |
+void RecognizeXFAVersionNumber(CXFA_Node* pTemplateRoot, |
+ CFX_WideString& wsVersionNumber) { |
wsVersionNumber.clear(); |
- if (!pTemplateRoot) { |
+ if (!pTemplateRoot) |
return; |
- } |
+ |
CFX_WideString wsTemplateNS; |
- if (!pTemplateRoot->TryNamespace(wsTemplateNS)) { |
+ if (!pTemplateRoot->TryNamespace(wsTemplateNS)) |
return; |
- } |
+ |
XFA_VERSION eVersion = |
pTemplateRoot->GetDocument()->RecognizeXFAVersionNumber(wsTemplateNS); |
- if (eVersion == XFA_VERSION_UNKNOWN) { |
+ if (eVersion == XFA_VERSION_UNKNOWN) |
eVersion = XFA_VERSION_DEFAULT; |
- } |
+ |
wsVersionNumber.Format(L"%i.%i", eVersion / 100, eVersion % 100); |
} |
-static void XFA_DataExporter_RegenerateFormFile_Changed( |
- CXFA_Node* pNode, |
- CFX_WideTextBuf& buf, |
- FX_BOOL bSaveXML = FALSE) { |
+ |
+void RegenerateFormFile_Changed(CXFA_Node* pNode, |
+ CFX_WideTextBuf& buf, |
+ FX_BOOL bSaveXML) { |
CFX_WideString wsAttrs; |
int32_t iAttrs = 0; |
const uint8_t* pAttrs = |
@@ -205,20 +160,20 @@ static void XFA_DataExporter_RegenerateFormFile_Changed( |
const XFA_ATTRIBUTEINFO* pAttr = |
XFA_GetAttributeByID((XFA_ATTRIBUTE)pAttrs[iAttrs]); |
if (pAttr->eName == XFA_ATTRIBUTE_Name || |
- (XFA_DataExporter_AttributeSaveInDataModel(pNode, pAttr->eName) && |
- !bSaveXML)) { |
+ (AttributeSaveInDataModel(pNode, pAttr->eName) && !bSaveXML)) { |
continue; |
} |
CFX_WideString wsAttr; |
- XFA_SaveAttribute(pNode, pAttr->eName, pAttr->pName, bSaveXML, wsAttr); |
+ SaveAttribute(pNode, pAttr->eName, pAttr->pName, bSaveXML, wsAttr); |
wsAttrs += wsAttr; |
} |
+ |
CFX_WideString wsChildren; |
switch (pNode->GetObjectType()) { |
case XFA_ObjectType::ContentNode: { |
- if (!bSaveXML && !XFA_DataExporter_ContentNodeNeedtoExport(pNode)) { |
+ if (!bSaveXML && !ContentNodeNeedtoExport(pNode)) |
break; |
- } |
+ |
CXFA_Node* pRawValueNode = pNode->GetNodeItem(XFA_NODEITEM_FirstChild); |
while (pRawValueNode && |
pRawValueNode->GetElementType() != XFA_Element::SharpxHTML && |
@@ -226,22 +181,22 @@ static void XFA_DataExporter_RegenerateFormFile_Changed( |
pRawValueNode->GetElementType() != XFA_Element::Sharpxml) { |
pRawValueNode = pRawValueNode->GetNodeItem(XFA_NODEITEM_NextSibling); |
} |
- if (!pRawValueNode) { |
+ if (!pRawValueNode) |
break; |
- } |
+ |
CFX_WideString wsContentType; |
pNode->GetAttribute(XFA_ATTRIBUTE_ContentType, wsContentType, FALSE); |
if (pRawValueNode->GetElementType() == XFA_Element::SharpxHTML && |
wsContentType == FX_WSTRC(L"text/html")) { |
CFDE_XMLNode* pExDataXML = pNode->GetXMLMappingNode(); |
- if (!pExDataXML) { |
+ if (!pExDataXML) |
break; |
- } |
+ |
CFDE_XMLNode* pRichTextXML = |
pExDataXML->GetNodeItem(CFDE_XMLNode::FirstChild); |
- if (!pRichTextXML) { |
+ if (!pRichTextXML) |
break; |
- } |
+ |
IFX_MemoryStream* pMemStream = FX_CreateMemoryStream(TRUE); |
IFX_Stream* pTempStream = IFX_Stream::CreateStream( |
(IFX_FileWrite*)pMemStream, FX_STREAMACCESS_Text | |
@@ -257,9 +212,9 @@ static void XFA_DataExporter_RegenerateFormFile_Changed( |
wsContentType == FX_WSTRC(L"text/xml")) { |
CFX_WideString wsRawValue; |
pRawValueNode->GetAttribute(XFA_ATTRIBUTE_Value, wsRawValue, FALSE); |
- if (wsRawValue.IsEmpty()) { |
+ if (wsRawValue.IsEmpty()) |
break; |
- } |
+ |
CFX_WideStringArray wsSelTextArray; |
int32_t iStart = 0; |
int32_t iEnd = wsRawValue.Find(L'\n', iStart); |
@@ -267,9 +222,9 @@ static void XFA_DataExporter_RegenerateFormFile_Changed( |
while (iEnd >= iStart) { |
wsSelTextArray.Add(wsRawValue.Mid(iStart, iEnd - iStart)); |
iStart = iEnd + 1; |
- if (iStart >= wsRawValue.GetLength()) { |
+ if (iStart >= wsRawValue.GetLength()) |
break; |
- } |
+ |
iEnd = wsRawValue.Find(L'\n', iStart); |
} |
CXFA_Node* pParentNode = pNode->GetNodeItem(XFA_NODEITEM_Parent); |
@@ -279,15 +234,15 @@ static void XFA_DataExporter_RegenerateFormFile_Changed( |
ASSERT(pGrandparentNode); |
CFX_WideString bodyTagName; |
bodyTagName = pGrandparentNode->GetCData(XFA_ATTRIBUTE_Name); |
- if (bodyTagName.IsEmpty()) { |
+ if (bodyTagName.IsEmpty()) |
bodyTagName = FX_WSTRC(L"ListBox1"); |
- } |
+ |
buf << FX_WSTRC(L"<"); |
buf << bodyTagName; |
buf << FX_WSTRC(L" xmlns=\"\"\n>"); |
for (int32_t i = 0; i < wsSelTextArray.GetSize(); i++) { |
buf << FX_WSTRC(L"<value\n>"); |
- buf << XFA_ExportEncodeContent(wsSelTextArray[i].AsStringC()); |
+ buf << ExportEncodeContent(wsSelTextArray[i].AsStringC()); |
buf << FX_WSTRC(L"</value\n>"); |
} |
buf << FX_WSTRC(L"</"); |
@@ -297,15 +252,17 @@ static void XFA_DataExporter_RegenerateFormFile_Changed( |
buf.Clear(); |
} else { |
CFX_WideStringC wsValue = pRawValueNode->GetCData(XFA_ATTRIBUTE_Value); |
- wsChildren += XFA_ExportEncodeContent(wsValue); |
+ wsChildren += ExportEncodeContent(wsValue); |
} |
- } break; |
+ break; |
+ } |
case XFA_ObjectType::TextNode: |
case XFA_ObjectType::NodeC: |
case XFA_ObjectType::NodeV: { |
CFX_WideStringC wsValue = pNode->GetCData(XFA_ATTRIBUTE_Value); |
- wsChildren += XFA_ExportEncodeContent(wsValue); |
- } break; |
+ wsChildren += ExportEncodeContent(wsValue); |
+ break; |
+ } |
default: |
if (pNode->GetElementType() == XFA_Element::Items) { |
CXFA_Node* pTemplateNode = pNode->GetTemplateNode(); |
@@ -318,8 +275,7 @@ static void XFA_DataExporter_RegenerateFormFile_Changed( |
CFX_WideTextBuf newBuf; |
CXFA_Node* pChildNode = pNode->GetNodeItem(XFA_NODEITEM_FirstChild); |
while (pChildNode) { |
- XFA_DataExporter_RegenerateFormFile_Changed(pChildNode, newBuf, |
- bSaveXML); |
+ RegenerateFormFile_Changed(pChildNode, newBuf, bSaveXML); |
wsChildren += newBuf.AsStringC(); |
newBuf.Clear(); |
pChildNode = pChildNode->GetNodeItem(XFA_NODEITEM_NextSibling); |
@@ -330,7 +286,7 @@ static void XFA_DataExporter_RegenerateFormFile_Changed( |
bSaveXML = TRUE; |
CXFA_Node* pChild = pNode->GetNodeItem(XFA_NODEITEM_FirstChild); |
while (pChild) { |
- XFA_DataExporter_RegenerateFormFile_Changed(pChild, newBuf, bSaveXML); |
+ RegenerateFormFile_Changed(pChild, newBuf, bSaveXML); |
wsChildren += newBuf.AsStringC(); |
newBuf.Clear(); |
pChild = pChild->GetNodeItem(XFA_NODEITEM_NextSibling); |
@@ -338,12 +294,12 @@ static void XFA_DataExporter_RegenerateFormFile_Changed( |
} |
break; |
} |
+ |
if (!wsChildren.IsEmpty() || !wsAttrs.IsEmpty() || |
pNode->HasAttribute(XFA_ATTRIBUTE_Name)) { |
CFX_WideStringC wsElement = pNode->GetClassName(); |
CFX_WideString wsName; |
- XFA_SaveAttribute(pNode, XFA_ATTRIBUTE_Name, FX_WSTRC(L"name"), TRUE, |
- wsName); |
+ SaveAttribute(pNode, XFA_ATTRIBUTE_Name, FX_WSTRC(L"name"), TRUE, wsName); |
buf << FX_WSTRC(L"<"); |
buf << wsElement; |
buf << wsName; |
@@ -359,27 +315,26 @@ static void XFA_DataExporter_RegenerateFormFile_Changed( |
} |
} |
} |
-static void XFA_DataExporter_RegenerateFormFile_Container( |
- CXFA_Node* pNode, |
- IFX_Stream* pStream, |
- FX_BOOL bSaveXML = FALSE) { |
+ |
+void RegenerateFormFile_Container(CXFA_Node* pNode, |
+ IFX_Stream* pStream, |
+ FX_BOOL bSaveXML = FALSE) { |
XFA_Element eType = pNode->GetElementType(); |
if (eType == XFA_Element::Field || eType == XFA_Element::Draw || |
!pNode->IsContainerNode()) { |
CFX_WideTextBuf buf; |
- XFA_DataExporter_RegenerateFormFile_Changed(pNode, buf, bSaveXML); |
+ RegenerateFormFile_Changed(pNode, buf, bSaveXML); |
FX_STRSIZE nLen = buf.GetLength(); |
- if (nLen > 0) { |
+ if (nLen > 0) |
pStream->WriteString((const FX_WCHAR*)buf.GetBuffer(), nLen); |
- } |
return; |
} |
+ |
CFX_WideStringC wsElement = pNode->GetClassName(); |
pStream->WriteString(L"<", 1); |
pStream->WriteString(wsElement.c_str(), wsElement.GetLength()); |
CFX_WideString wsOutput; |
- XFA_SaveAttribute(pNode, XFA_ATTRIBUTE_Name, FX_WSTRC(L"name"), TRUE, |
- wsOutput); |
+ SaveAttribute(pNode, XFA_ATTRIBUTE_Name, FX_WSTRC(L"name"), TRUE, wsOutput); |
CFX_WideString wsAttrs; |
int32_t iAttrs = 0; |
const uint8_t* pAttrs = |
@@ -387,22 +342,22 @@ static void XFA_DataExporter_RegenerateFormFile_Container( |
while (iAttrs--) { |
const XFA_ATTRIBUTEINFO* pAttr = |
XFA_GetAttributeByID((XFA_ATTRIBUTE)pAttrs[iAttrs]); |
- if (pAttr->eName == XFA_ATTRIBUTE_Name) { |
+ if (pAttr->eName == XFA_ATTRIBUTE_Name) |
continue; |
- } |
+ |
CFX_WideString wsAttr; |
- XFA_SaveAttribute(pNode, pAttr->eName, pAttr->pName, FALSE, wsAttr); |
+ SaveAttribute(pNode, pAttr->eName, pAttr->pName, FALSE, wsAttr); |
wsOutput += wsAttr; |
} |
- if (!wsOutput.IsEmpty()) { |
+ |
+ if (!wsOutput.IsEmpty()) |
pStream->WriteString(wsOutput.c_str(), wsOutput.GetLength()); |
- } |
+ |
CXFA_Node* pChildNode = pNode->GetNodeItem(XFA_NODEITEM_FirstChild); |
if (pChildNode) { |
pStream->WriteString(L"\n>", 2); |
while (pChildNode) { |
- XFA_DataExporter_RegenerateFormFile_Container(pChildNode, pStream, |
- bSaveXML); |
+ RegenerateFormFile_Container(pChildNode, pStream, bSaveXML); |
pChildNode = pChildNode->GetNodeItem(XFA_NODEITEM_NextSibling); |
} |
pStream->WriteString(L"</", 2); |
@@ -412,6 +367,9 @@ static void XFA_DataExporter_RegenerateFormFile_Container( |
pStream->WriteString(L"\n/>", 3); |
} |
} |
+ |
+} // namespace |
+ |
void XFA_DataExporter_RegenerateFormFile(CXFA_Node* pNode, |
IFX_Stream* pStream, |
const FX_CHAR* pChecksum, |
@@ -431,7 +389,7 @@ void XFA_DataExporter_RegenerateFormFile(CXFA_Node* pNode, |
const FX_WCHAR* pURI = XFA_GetPacketByIndex(XFA_PACKET_Form)->pURI; |
pStream->WriteString(pURI, FXSYS_wcslen(pURI)); |
CFX_WideString wsVersionNumber; |
- XFA_DataExporter_RecognizeXFAVersionNumber( |
+ RecognizeXFAVersionNumber( |
ToNode(pNode->GetDocument()->GetXFAObject(XFA_HASHCODE_Template)), |
wsVersionNumber); |
if (wsVersionNumber.IsEmpty()) { |
@@ -441,22 +399,55 @@ void XFA_DataExporter_RegenerateFormFile(CXFA_Node* pNode, |
pStream->WriteString(wsVersionNumber.c_str(), wsVersionNumber.GetLength()); |
CXFA_Node* pChildNode = pNode->GetNodeItem(XFA_NODEITEM_FirstChild); |
while (pChildNode) { |
- XFA_DataExporter_RegenerateFormFile_Container(pChildNode, pStream); |
+ RegenerateFormFile_Container(pChildNode, pStream); |
pChildNode = pChildNode->GetNodeItem(XFA_NODEITEM_NextSibling); |
} |
pStream->WriteString(s_pwsClose, FXSYS_wcslen(s_pwsClose)); |
} else { |
- XFA_DataExporter_RegenerateFormFile_Container(pNode, pStream, bSaveXML); |
+ RegenerateFormFile_Container(pNode, pStream, bSaveXML); |
} |
} |
+void XFA_DataExporter_DealWithDataGroupNode(CXFA_Node* pDataNode) { |
+ if (!pDataNode || pDataNode->GetElementType() == XFA_Element::DataValue) |
+ return; |
+ |
+ int32_t iChildNum = 0; |
+ for (CXFA_Node* pChildNode = pDataNode->GetNodeItem(XFA_NODEITEM_FirstChild); |
+ pChildNode; |
+ pChildNode = pChildNode->GetNodeItem(XFA_NODEITEM_NextSibling)) { |
+ iChildNum++; |
+ XFA_DataExporter_DealWithDataGroupNode(pChildNode); |
+ } |
+ |
+ if (pDataNode->GetElementType() != XFA_Element::DataGroup) |
+ return; |
+ |
+ if (iChildNum > 0) { |
+ CFDE_XMLNode* pXMLNode = pDataNode->GetXMLMappingNode(); |
+ ASSERT(pXMLNode->GetType() == FDE_XMLNODE_Element); |
+ CFDE_XMLElement* pXMLElement = static_cast<CFDE_XMLElement*>(pXMLNode); |
+ if (pXMLElement->HasAttribute(L"xfa:dataNode")) |
+ pXMLElement->RemoveAttribute(L"xfa:dataNode"); |
+ |
+ return; |
+ } |
+ |
+ CFDE_XMLNode* pXMLNode = pDataNode->GetXMLMappingNode(); |
+ ASSERT(pXMLNode->GetType() == FDE_XMLNODE_Element); |
+ static_cast<CFDE_XMLElement*>(pXMLNode)->SetString(L"xfa:dataNode", |
+ L"dataGroup"); |
+} |
+ |
CXFA_DataExporter::CXFA_DataExporter(CXFA_Document* pDocument) |
: m_pDocument(pDocument) { |
ASSERT(m_pDocument); |
} |
+ |
FX_BOOL CXFA_DataExporter::Export(IFX_FileWrite* pWrite) { |
- return Export(pWrite, m_pDocument->GetRoot()); |
+ return Export(pWrite, m_pDocument->GetRoot(), 0, nullptr); |
} |
+ |
FX_BOOL CXFA_DataExporter::Export(IFX_FileWrite* pWrite, |
CXFA_Node* pNode, |
uint32_t dwFlag, |
@@ -468,14 +459,15 @@ FX_BOOL CXFA_DataExporter::Export(IFX_FileWrite* pWrite, |
IFX_Stream* pStream = IFX_Stream::CreateStream( |
pWrite, |
FX_STREAMACCESS_Text | FX_STREAMACCESS_Write | FX_STREAMACCESS_Append); |
- if (!pStream) { |
+ if (!pStream) |
return FALSE; |
- } |
+ |
pStream->SetCodePage(FX_CODEPAGE_UTF8); |
FX_BOOL bRet = Export(pStream, pNode, dwFlag, pChecksum); |
pStream->Release(); |
return bRet; |
} |
+ |
FX_BOOL CXFA_DataExporter::Export(IFX_Stream* pStream, |
CXFA_Node* pNode, |
uint32_t dwFlag, |
@@ -493,80 +485,57 @@ FX_BOOL CXFA_DataExporter::Export(IFX_Stream* pStream, |
} |
static const FX_WCHAR s_pwsPostamble[] = L"</xdp:xdp\n>"; |
pStream->WriteString(s_pwsPostamble, FXSYS_wcslen(s_pwsPostamble)); |
- } break; |
+ break; |
+ } |
case XFA_XDPPACKET_Datasets: { |
CFDE_XMLElement* pElement = |
static_cast<CFDE_XMLElement*>(pNode->GetXMLMappingNode()); |
- if (!pElement || pElement->GetType() != FDE_XMLNODE_Element) { |
+ if (!pElement || pElement->GetType() != FDE_XMLNODE_Element) |
return FALSE; |
- } |
+ |
CXFA_Node* pDataNode = pNode->GetNodeItem(XFA_NODEITEM_FirstChild); |
ASSERT(pDataNode); |
XFA_DataExporter_DealWithDataGroupNode(pDataNode); |
pXMLDoc->SaveXMLNode(pStream, pElement); |
- } break; |
+ break; |
+ } |
case XFA_XDPPACKET_Form: { |
XFA_DataExporter_RegenerateFormFile(pNode, pStream, pChecksum); |
- } break; |
+ break; |
+ } |
case XFA_XDPPACKET_Template: |
default: { |
CFDE_XMLElement* pElement = |
static_cast<CFDE_XMLElement*>(pNode->GetXMLMappingNode()); |
- if (!pElement || pElement->GetType() != FDE_XMLNODE_Element) { |
+ if (!pElement || pElement->GetType() != FDE_XMLNODE_Element) |
return FALSE; |
- } |
+ |
pXMLDoc->SaveXMLNode(pStream, pElement); |
- } break; |
- } |
- } else { |
- CXFA_Node* pDataNode = pNode->GetNodeItem(XFA_NODEITEM_Parent); |
- CXFA_Node* pExportNode = pNode; |
- for (CXFA_Node* pChildNode = |
- pDataNode->GetNodeItem(XFA_NODEITEM_FirstChild); |
- pChildNode; |
- pChildNode = pChildNode->GetNodeItem(XFA_NODEITEM_NextSibling)) { |
- if (pChildNode != pNode) { |
- pExportNode = pDataNode; |
break; |
} |
} |
- CFDE_XMLElement* pElement = |
- static_cast<CFDE_XMLElement*>(pExportNode->GetXMLMappingNode()); |
- if (!pElement || pElement->GetType() != FDE_XMLNODE_Element) { |
- return FALSE; |
- } |
- XFA_DataExporter_DealWithDataGroupNode(pExportNode); |
- pElement->SetString(L"xmlns:xfa", |
- L"http://www.xfa.org/schema/xfa-data/1.0/"); |
- pXMLDoc->SaveXMLNode(pStream, pElement); |
- pElement->RemoveAttribute(L"xmlns:xfa"); |
- } |
- return TRUE; |
-} |
-void XFA_DataExporter_DealWithDataGroupNode(CXFA_Node* pDataNode) { |
- if (!pDataNode || pDataNode->GetElementType() == XFA_Element::DataValue) { |
- return; |
+ return TRUE; |
} |
- int32_t iChildNum = 0; |
+ |
+ CXFA_Node* pDataNode = pNode->GetNodeItem(XFA_NODEITEM_Parent); |
+ CXFA_Node* pExportNode = pNode; |
for (CXFA_Node* pChildNode = pDataNode->GetNodeItem(XFA_NODEITEM_FirstChild); |
pChildNode; |
pChildNode = pChildNode->GetNodeItem(XFA_NODEITEM_NextSibling)) { |
- iChildNum++; |
- XFA_DataExporter_DealWithDataGroupNode(pChildNode); |
- } |
- if (pDataNode->GetElementType() == XFA_Element::DataGroup) { |
- if (iChildNum > 0) { |
- CFDE_XMLNode* pXMLNode = pDataNode->GetXMLMappingNode(); |
- ASSERT(pXMLNode->GetType() == FDE_XMLNODE_Element); |
- CFDE_XMLElement* pXMLElement = static_cast<CFDE_XMLElement*>(pXMLNode); |
- if (pXMLElement->HasAttribute(L"xfa:dataNode")) { |
- pXMLElement->RemoveAttribute(L"xfa:dataNode"); |
- } |
- } else { |
- CFDE_XMLNode* pXMLNode = pDataNode->GetXMLMappingNode(); |
- ASSERT(pXMLNode->GetType() == FDE_XMLNODE_Element); |
- static_cast<CFDE_XMLElement*>(pXMLNode)->SetString(L"xfa:dataNode", |
- L"dataGroup"); |
+ if (pChildNode != pNode) { |
+ pExportNode = pDataNode; |
+ break; |
} |
} |
+ CFDE_XMLElement* pElement = |
+ static_cast<CFDE_XMLElement*>(pExportNode->GetXMLMappingNode()); |
+ if (!pElement || pElement->GetType() != FDE_XMLNODE_Element) |
+ return FALSE; |
+ |
+ XFA_DataExporter_DealWithDataGroupNode(pExportNode); |
+ pElement->SetString(L"xmlns:xfa", L"http://www.xfa.org/schema/xfa-data/1.0/"); |
+ pXMLDoc->SaveXMLNode(pStream, pElement); |
+ pElement->RemoveAttribute(L"xmlns:xfa"); |
+ |
+ return TRUE; |
} |