1ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann// Copyright 2014 PDFium Authors. All rights reserved.
2ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann// Use of this source code is governed by a BSD-style license that can be
3ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann// found in the LICENSE file.
4ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
5ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
7ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "xfa/src/foxitlib.h"
8ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "xfa/src/fxfa/src/common/xfa_common.h"
9ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "xfa_ffapp.h"
10ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "xfa_ffdoc.h"
11ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "xfa_ffdocview.h"
12ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "xfa_ffwidget.h"
13ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "xfa_ffnotify.h"
14ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "xfa_fontmgr.h"
15ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCXFA_FFDoc::CXFA_FFDoc(CXFA_FFApp* pApp, IXFA_DocProvider* pDocProvider)
16ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    : m_pDocProvider(pDocProvider),
17ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_pDocument(nullptr),
18ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_pStream(nullptr),
19ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_pApp(pApp),
20ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_pNotify(nullptr),
21ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_pPDFDoc(nullptr),
22ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_dwDocType(XFA_DOCTYPE_Static),
23ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_bOwnStream(TRUE) {
24ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
25ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCXFA_FFDoc::~CXFA_FFDoc() {
26ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CloseDoc();
27ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
28ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_DWORD CXFA_FFDoc::GetDocType() {
29ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return m_dwDocType;
30ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
31ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CXFA_FFDoc::StartLoad() {
32ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pNotify = new CXFA_FFNotify(this);
33ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  IXFA_DocParser* pDocParser = IXFA_DocParser::Create(m_pNotify);
34ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t iStatus = pDocParser->StartParse(m_pStream);
35ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pDocument = pDocParser->GetDocument();
36ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return iStatus;
37ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
38ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL XFA_GetPDFContentsFromPDFXML(IFDE_XMLNode* pPDFElement,
39ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                     uint8_t*& pByteBuffer,
40ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                     int32_t& iBufferSize) {
41ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  IFDE_XMLElement* pDocumentElement = NULL;
42ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  for (IFDE_XMLNode* pXMLNode =
43ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann           pPDFElement->GetNodeItem(IFDE_XMLNode::FirstChild);
44ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann       pXMLNode; pXMLNode = pXMLNode->GetNodeItem(IFDE_XMLNode::NextSibling)) {
45ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (pXMLNode->GetType() == FDE_XMLNODE_Element) {
46ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      CFX_WideString wsTagName;
47ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      IFDE_XMLElement* pXMLElement = (IFDE_XMLElement*)pXMLNode;
48ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      pXMLElement->GetTagName(wsTagName);
49ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (wsTagName.Equal(FX_WSTRC(L"document"))) {
50ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        pDocumentElement = pXMLElement;
51ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        break;
52ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
53ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
54ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
55ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!pDocumentElement) {
56ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return FALSE;
57ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
58ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  IFDE_XMLElement* pChunkElement = NULL;
59ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  for (IFDE_XMLNode* pXMLNode =
60ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann           pDocumentElement->GetNodeItem(IFDE_XMLNode::FirstChild);
61ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann       pXMLNode; pXMLNode = pXMLNode->GetNodeItem(IFDE_XMLNode::NextSibling)) {
62ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (pXMLNode->GetType() == FDE_XMLNODE_Element) {
63ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      CFX_WideString wsTagName;
64ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      IFDE_XMLElement* pXMLElement = (IFDE_XMLElement*)pXMLNode;
65ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      pXMLElement->GetTagName(wsTagName);
66ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (wsTagName.Equal(FX_WSTRC(L"chunk"))) {
67ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        pChunkElement = pXMLElement;
68ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        break;
69ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
70ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
71ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
72ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!pChunkElement) {
73ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return FALSE;
74ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
75ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CFX_WideString wsPDFContent;
76ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pChunkElement->GetTextData(wsPDFContent);
77ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  iBufferSize = FX_Base64DecodeW(wsPDFContent, wsPDFContent.GetLength(), NULL);
78ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pByteBuffer = FX_Alloc(uint8_t, iBufferSize + 1);
79ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pByteBuffer[iBufferSize] = '0';  // FIXME: I bet this is wrong.
80ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_Base64DecodeW(wsPDFContent, wsPDFContent.GetLength(), pByteBuffer);
81ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return TRUE;
82ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
83ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid XFA_XPDPacket_MergeRootNode(CXFA_Node* pOriginRoot, CXFA_Node* pNewRoot) {
84ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CXFA_Node* pChildNode = pNewRoot->GetNodeItem(XFA_NODEITEM_FirstChild);
85ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  while (pChildNode) {
86ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CXFA_Node* pOriginChild =
87ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        pOriginRoot->GetFirstChildByName(pChildNode->GetNameHash());
88ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (pOriginChild) {
89ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      pChildNode = pChildNode->GetNodeItem(XFA_NODEITEM_NextSibling);
90ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    } else {
91ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      CXFA_Node* pNextSibling =
92ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          pChildNode->GetNodeItem(XFA_NODEITEM_NextSibling);
93ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      pNewRoot->RemoveChild(pChildNode);
94ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      pOriginRoot->InsertChild(pChildNode);
95ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      pChildNode = pNextSibling;
96ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      pNextSibling = NULL;
97ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
98ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
99ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
100ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CXFA_FFDoc::DoLoad(IFX_Pause* pPause) {
101ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t iStatus = m_pDocument->GetParser()->DoParse(pPause);
102ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (iStatus == XFA_PARSESTATUS_Done && !m_pPDFDoc) {
103ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CXFA_Node* pPDFNode = (CXFA_Node*)m_pDocument->GetXFANode(XFA_HASHCODE_Pdf);
104ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (!pPDFNode) {
105ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return XFA_PARSESTATUS_SyntaxErr;
106ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
107ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    IFDE_XMLNode* pPDFXML = pPDFNode->GetXMLMappingNode();
108ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (pPDFXML->GetType() != FDE_XMLNODE_Element) {
109ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return XFA_PARSESTATUS_SyntaxErr;
110ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
111ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    int32_t iBufferSize = 0;
112ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    uint8_t* pByteBuffer = NULL;
113ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    IFX_FileRead* pXFAReader = NULL;
114ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (XFA_GetPDFContentsFromPDFXML(pPDFXML, pByteBuffer, iBufferSize)) {
115ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      pXFAReader = FX_CreateMemoryStream(pByteBuffer, iBufferSize, TRUE);
116ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (!pXFAReader) {
117ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (pByteBuffer) {
118ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          FX_Free(pByteBuffer);
119ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          pByteBuffer = NULL;
120ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        }
121ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        return XFA_PARSESTATUS_SyntaxErr;
122ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
123ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    } else {
124ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      CFX_WideString wsHref;
125ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      ((IFDE_XMLElement*)pPDFXML)->GetString(L"href", wsHref);
126ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (!wsHref.IsEmpty()) {
127ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        pXFAReader = GetDocProvider()->OpenLinkedFile(this, wsHref);
128ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
129ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
130ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (!pXFAReader) {
131ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return XFA_PARSESTATUS_SyntaxErr;
132ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
133ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CPDF_Document* pPDFDocument =
134ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        GetDocProvider()->OpenPDF(this, pXFAReader, TRUE);
135ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    FXSYS_assert(!m_pPDFDoc);
136ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (!OpenDoc(pPDFDocument)) {
137ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return XFA_PARSESTATUS_SyntaxErr;
138ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
139ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    IXFA_Parser* pParser = IXFA_Parser::Create(m_pDocument, TRUE);
140ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (!pParser) {
141ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return XFA_PARSESTATUS_SyntaxErr;
142ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
143ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CXFA_Node* pRootNode = NULL;
144ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (pParser->StartParse(m_pStream) == XFA_PARSESTATUS_Ready &&
145ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        pParser->DoParse(NULL) == XFA_PARSESTATUS_Done) {
146ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      pRootNode = pParser->GetRootNode();
147ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
148ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (pRootNode && m_pDocument->GetRoot()) {
149ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      XFA_XPDPacket_MergeRootNode(m_pDocument->GetRoot(), pRootNode);
150ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      iStatus = XFA_PARSESTATUS_Done;
151ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    } else {
152ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      iStatus = XFA_PARSESTATUS_StatusErr;
153ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
154ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    pParser->Release();
155ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    pParser = NULL;
156ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
157ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return iStatus;
158ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
159ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CXFA_FFDoc::StopLoad() {
160ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pApp->GetXFAFontMgr()->LoadDocFonts(this);
161ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_dwDocType = XFA_DOCTYPE_Static;
162ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CXFA_Node* pConfig = (CXFA_Node*)m_pDocument->GetXFANode(XFA_HASHCODE_Config);
163ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!pConfig) {
164ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
165ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
166ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CXFA_Node* pAcrobat = pConfig->GetFirstChildByClass(XFA_ELEMENT_Acrobat);
167ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!pAcrobat) {
168ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
169ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
170ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CXFA_Node* pAcrobat7 = pAcrobat->GetFirstChildByClass(XFA_ELEMENT_Acrobat7);
171ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!pAcrobat7) {
172ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
173ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
174ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CXFA_Node* pDynamicRender =
175ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      pAcrobat7->GetFirstChildByClass(XFA_ELEMENT_DynamicRender);
176ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!pDynamicRender) {
177ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
178ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
179ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CFX_WideString wsType;
180ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (pDynamicRender->TryContent(wsType) && wsType == FX_WSTRC(L"required")) {
181ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_dwDocType = XFA_DOCTYPE_Dynamic;
182ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
183ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
184ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannIXFA_DocView* CXFA_FFDoc::CreateDocView(FX_DWORD dwView) {
185ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CXFA_FFDocView* pDocView =
186ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      (CXFA_FFDocView*)m_mapTypeToDocView.GetValueAt((void*)(uintptr_t)dwView);
187ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!pDocView) {
188ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    pDocView = new CXFA_FFDocView(this);
189ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_mapTypeToDocView.SetAt((void*)(uintptr_t)dwView, pDocView);
190ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
191ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return pDocView;
192ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
193ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCXFA_FFDocView* CXFA_FFDoc::GetDocView(IXFA_DocLayout* pLayout) {
194ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_POSITION ps = m_mapTypeToDocView.GetStartPosition();
195ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  while (ps) {
196ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    void* pType;
197ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CXFA_FFDocView* pDocView;
198ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_mapTypeToDocView.GetNextAssoc(ps, pType, (void*&)pDocView);
199ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (pDocView->GetXFALayout() == pLayout) {
200ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return pDocView;
201ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
202ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
203ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return NULL;
204ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
205ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCXFA_FFDocView* CXFA_FFDoc::GetDocView() {
206ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_POSITION ps = m_mapTypeToDocView.GetStartPosition();
207ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (ps) {
208ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    void* pType;
209ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CXFA_FFDocView* pDocView;
210ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_mapTypeToDocView.GetNextAssoc(ps, pType, (void*&)pDocView);
211ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return pDocView;
212ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
213ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return NULL;
214ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
215ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CXFA_FFDoc::OpenDoc(IFX_FileRead* pStream, FX_BOOL bTakeOverFile) {
216ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_bOwnStream = bTakeOverFile;
217ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pStream = pStream;
218ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return TRUE;
219ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
220ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CXFA_FFDoc::OpenDoc(CPDF_Document* pPDFDoc) {
221ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (pPDFDoc == NULL) {
222ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return FALSE;
223ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
224ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_Dictionary* pRoot = pPDFDoc->GetRoot();
225ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (pRoot == NULL) {
226ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return FALSE;
227ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
228ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_Dictionary* pAcroForm = pRoot->GetDict("AcroForm");
229ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (pAcroForm == NULL) {
230ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return FALSE;
231ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
232ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_Object* pElementXFA = pAcroForm->GetElementValue("XFA");
233ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (pElementXFA == NULL) {
234ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return FALSE;
235ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
236ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t iObjType = pElementXFA->GetType();
237ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CFX_ArrayTemplate<CPDF_Stream*> xfaStreams;
238ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (iObjType == PDFOBJ_ARRAY) {
239ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CPDF_Array* pXFAArray = (CPDF_Array*)pElementXFA;
240ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    FX_DWORD count = pXFAArray->GetCount() / 2;
241ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    for (FX_DWORD i = 0; i < count; i++) {
242ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      CPDF_Stream* pStream = pXFAArray->GetStream(i * 2 + 1);
243ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (pStream != NULL) {
244ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        xfaStreams.Add(pStream);
245ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
246ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
247ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } else if (iObjType == PDFOBJ_STREAM) {
248ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    xfaStreams.Add((CPDF_Stream*)pElementXFA);
249ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
250ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (xfaStreams.GetSize() < 1) {
251ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return FALSE;
252ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
253ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  IFX_FileRead* pFileRead = new CXFA_FileRead(xfaStreams);
254ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pPDFDoc = pPDFDoc;
255ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_pStream) {
256ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pStream->Release();
257ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pStream = NULL;
258ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
259ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pStream = pFileRead;
260ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_bOwnStream = TRUE;
261ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return TRUE;
262ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
263ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CXFA_FFDoc::CloseDoc() {
264ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_POSITION psClose = m_mapTypeToDocView.GetStartPosition();
265ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  while (psClose) {
266ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    void* pType;
267ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CXFA_FFDocView* pDocView;
268ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_mapTypeToDocView.GetNextAssoc(psClose, pType, (void*&)pDocView);
269ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    pDocView->RunDocClose();
270ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
271ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_pDocument) {
272ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pDocument->ClearLayoutData();
273ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
274ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_POSITION ps = m_mapTypeToDocView.GetStartPosition();
275ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  while (ps) {
276ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    void* pType;
277ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CXFA_FFDocView* pDocView;
278ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_mapTypeToDocView.GetNextAssoc(ps, pType, (void*&)pDocView);
279ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    delete pDocView;
280ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
281ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_mapTypeToDocView.RemoveAll();
282ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_pDocument) {
283ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    IXFA_Parser* pParser = m_pDocument->GetParser();
284ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    pParser->Release();
285ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pDocument = NULL;
286ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
287ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_pNotify) {
288ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    delete m_pNotify;
289ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pNotify = NULL;
290ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
291ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pApp->GetXFAFontMgr()->ReleaseDocFonts(this);
292ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_dwDocType != XFA_DOCTYPE_XDP && m_pStream && m_bOwnStream) {
293ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pStream->Release();
294ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pStream = NULL;
295ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
296ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  ps = m_mapNamedImages.GetStartPosition();
297ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  while (ps) {
298ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    void* pName;
299ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    FX_IMAGEDIB_AND_DPI* pImage = NULL;
300ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_mapNamedImages.GetNextAssoc(ps, pName, (void*&)pImage);
301ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (pImage) {
302ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      delete pImage->pDibSource;
303ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      pImage->pDibSource = NULL;
304ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      FX_Free(pImage);
305ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      pImage = NULL;
306ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
307ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
308ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_mapNamedImages.RemoveAll();
309ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  IFWL_NoteDriver* pNoteDriver = FWL_GetApp()->GetNoteDriver();
310ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pNoteDriver->ClearEventTargets(FALSE);
311ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return TRUE;
312ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
313ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CXFA_FFDoc::SetDocType(FX_DWORD dwType) {
314ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_dwDocType = dwType;
315ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
316ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_Document* CXFA_FFDoc::GetPDFDoc() {
317ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return m_pPDFDoc;
318ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
319ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define _FXLIB_NEW_VERSION_
320ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFX_DIBitmap* CXFA_FFDoc::GetPDFNamedImage(const CFX_WideStringC& wsName,
321ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                           int32_t& iImageXDpi,
322ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                           int32_t& iImageYDpi) {
323ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!m_pPDFDoc) {
324ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return NULL;
325ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
326ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_DWORD dwHash =
327ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      FX_HashCode_String_GetW(wsName.GetPtr(), wsName.GetLength(), FALSE);
328ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_IMAGEDIB_AND_DPI* imageDIBDpi = NULL;
329ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_mapNamedImages.Lookup((void*)(uintptr_t)dwHash, (void*&)imageDIBDpi)) {
330ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    iImageXDpi = imageDIBDpi->iImageXDpi;
331ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    iImageYDpi = imageDIBDpi->iImageYDpi;
332ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return (CFX_DIBitmap*)imageDIBDpi->pDibSource;
333ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
334ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_Dictionary* pRoot = m_pPDFDoc->GetRoot();
335ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (pRoot == NULL) {
336ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return NULL;
337ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
338ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_Dictionary* pNames = pRoot->GetDict("Names");
339ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!pNames) {
340ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return NULL;
341ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
342ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_Dictionary* pXFAImages = pNames->GetDict("XFAImages");
343ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!pXFAImages) {
344ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return NULL;
345ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
346ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_NameTree nametree(pXFAImages);
347ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#ifdef _FXLIB_NEW_VERSION_
348ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CFX_ByteString bsName = PDF_EncodeText(wsName.GetPtr(), wsName.GetLength());
349ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_Object* pObject = nametree.LookupValue(bsName);
350ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!pObject) {
351ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    int32_t iCount = nametree.GetCount();
352ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    for (int32_t i = 0; i < iCount; i++) {
353ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      CFX_ByteString bsTemp;
354ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      CPDF_Object* pTempObject = nametree.LookupValue(i, bsTemp);
355ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (bsTemp == bsName) {
356ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        pObject = pTempObject;
357ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        break;
358ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
359ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
360ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
361ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#else
362ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_Object* pObject = nametree.LookupValue(wsName);
363ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!pObject) {
364ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    int32_t iCount = nametree.GetCount();
365ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    for (int32_t i = 0; i < iCount; i++) {
366ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      CFX_WideString wsTemp;
367ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      CPDF_Object* pTempObject = nametree.LookupValue(i, wsTemp);
368ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (wsTemp == wsName) {
369ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        pObject = pTempObject;
370ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        break;
371ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
372ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
373ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
374ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#endif
375ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!pObject || pObject->GetType() != PDFOBJ_STREAM) {
376ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return NULL;
377ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
378ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!imageDIBDpi) {
379ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    imageDIBDpi = FX_Alloc(FX_IMAGEDIB_AND_DPI, 1);
380ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    imageDIBDpi->pDibSource = NULL;
381ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    imageDIBDpi->iImageXDpi = 0;
382ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    imageDIBDpi->iImageYDpi = 0;
383ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CPDF_StreamAcc streamAcc;
384ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    streamAcc.LoadAllData((CPDF_Stream*)pObject);
385ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    IFX_FileRead* pImageFileRead = FX_CreateMemoryStream(
386ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        (uint8_t*)streamAcc.GetData(), streamAcc.GetSize());
387ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    imageDIBDpi->pDibSource = XFA_LoadImageFromBuffer(
388ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        pImageFileRead, FXCODEC_IMAGE_UNKNOWN, iImageXDpi, iImageYDpi);
389ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    imageDIBDpi->iImageXDpi = iImageXDpi;
390ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    imageDIBDpi->iImageYDpi = iImageYDpi;
391ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    pImageFileRead->Release();
392ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
393ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_mapNamedImages.SetAt((void*)(uintptr_t)dwHash, imageDIBDpi);
394ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return (CFX_DIBitmap*)imageDIBDpi->pDibSource;
395ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
396ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannIFDE_XMLElement* CXFA_FFDoc::GetPackageData(const CFX_WideStringC& wsPackage) {
397ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_DWORD packetHash =
398ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      FX_HashCode_String_GetW(wsPackage.GetPtr(), wsPackage.GetLength());
399ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CXFA_Object* pObject = m_pDocument->GetXFANode(packetHash);
400ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CXFA_Node* pNode =
401ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      (pObject && pObject->IsNode()) ? (CXFA_Node*)pObject : NULL;
402ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!pNode) {
403ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return NULL;
404ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
405ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  IFDE_XMLNode* pXMLNode = pNode->GetXMLMappingNode();
406ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return (pXMLNode && pXMLNode->GetType() == FDE_XMLNODE_Element)
407ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann             ? (IFDE_XMLElement*)pXMLNode
408ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann             : NULL;
409ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
410ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CXFA_FFDoc::SavePackage(const CFX_WideStringC& wsPackage,
411ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                IFX_FileWrite* pFile,
412ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                IXFA_ChecksumContext* pCSContext) {
413ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  IXFA_PacketExport* pExport = IXFA_PacketExport::Create(m_pDocument);
414ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!pExport) {
415ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return FALSE;
416ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
417ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_DWORD packetHash =
418ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      FX_HashCode_String_GetW(wsPackage.GetPtr(), wsPackage.GetLength());
419ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CXFA_Node* pNode = NULL;
420ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (packetHash == XFA_HASHCODE_Xfa) {
421ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    pNode = m_pDocument->GetRoot();
422ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } else {
423ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CXFA_Object* pObject = m_pDocument->GetXFANode(packetHash);
424ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    pNode = (pObject && pObject->IsNode()) ? (CXFA_Node*)pObject : NULL;
425ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
426ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_BOOL bFlags = FALSE;
427ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (pNode) {
428ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CFX_ByteString bsChecksum;
429ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (pCSContext) {
430ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      pCSContext->GetChecksum(bsChecksum);
431ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
432ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    bFlags = pExport->Export(pFile, pNode, 0, bsChecksum.GetLength()
433ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                                  ? (const FX_CHAR*)bsChecksum
434ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                                  : NULL);
435ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } else {
436ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    bFlags = pExport->Export(pFile);
437ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
438ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pExport->Release();
439ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return bFlags;
440ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
441ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CXFA_FFDoc::ImportData(IFX_FileRead* pStream, FX_BOOL bXDP) {
442ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_BOOL bRet = FALSE;
443ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  IXFA_PacketImport* pImport = IXFA_PacketImport::Create(m_pDocument);
444ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (pImport) {
445ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    bRet = pImport->ImportData(pStream);
446ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    pImport->Release();
447ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
448ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return bRet;
449ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
450