| Index: xfa/src/fxfa/app/xfa_ffdoc.cpp
|
| diff --git a/xfa/src/fxfa/app/xfa_ffdoc.cpp b/xfa/src/fxfa/app/xfa_ffdoc.cpp
|
| deleted file mode 100644
|
| index 0e45417399c9fc87112f33efd7ecda0008700d99..0000000000000000000000000000000000000000
|
| --- a/xfa/src/fxfa/app/xfa_ffdoc.cpp
|
| +++ /dev/null
|
| @@ -1,431 +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/src/fxfa/app/xfa_ffdoc.h"
|
| -
|
| -#include "core/include/fpdfapi/cpdf_array.h"
|
| -#include "core/include/fpdfapi/cpdf_document.h"
|
| -#include "core/include/fpdfdoc/fpdf_doc.h"
|
| -#include "core/include/fxcrt/fx_ext.h"
|
| -#include "xfa/include/fwl/core/fwl_note.h"
|
| -#include "xfa/src/fgas/crt/fgas_algorithm.h"
|
| -#include "xfa/src/fxfa/app/xfa_ffapp.h"
|
| -#include "xfa/src/fxfa/app/xfa_ffdocview.h"
|
| -#include "xfa/src/fxfa/app/xfa_ffnotify.h"
|
| -#include "xfa/src/fxfa/app/xfa_ffwidget.h"
|
| -#include "xfa/src/fxfa/app/xfa_fontmgr.h"
|
| -#include "xfa/src/fxfa/parser/xfa_docdata.h"
|
| -#include "xfa/src/fxfa/parser/xfa_parser.h"
|
| -
|
| -CXFA_FFDoc::CXFA_FFDoc(CXFA_FFApp* pApp, IXFA_DocProvider* pDocProvider)
|
| - : m_pDocProvider(pDocProvider),
|
| - m_pDocument(nullptr),
|
| - m_pStream(nullptr),
|
| - m_pApp(pApp),
|
| - m_pNotify(nullptr),
|
| - m_pPDFDoc(nullptr),
|
| - m_dwDocType(XFA_DOCTYPE_Static),
|
| - m_bOwnStream(TRUE) {}
|
| -CXFA_FFDoc::~CXFA_FFDoc() {
|
| - CloseDoc();
|
| -}
|
| -FX_DWORD CXFA_FFDoc::GetDocType() {
|
| - return m_dwDocType;
|
| -}
|
| -int32_t CXFA_FFDoc::StartLoad() {
|
| - m_pNotify = new CXFA_FFNotify(this);
|
| - IXFA_DocParser* pDocParser = IXFA_DocParser::Create(m_pNotify);
|
| - int32_t iStatus = pDocParser->StartParse(m_pStream);
|
| - m_pDocument = pDocParser->GetDocument();
|
| - return iStatus;
|
| -}
|
| -FX_BOOL XFA_GetPDFContentsFromPDFXML(IFDE_XMLNode* pPDFElement,
|
| - uint8_t*& pByteBuffer,
|
| - int32_t& iBufferSize) {
|
| - IFDE_XMLElement* pDocumentElement = NULL;
|
| - for (IFDE_XMLNode* pXMLNode =
|
| - pPDFElement->GetNodeItem(IFDE_XMLNode::FirstChild);
|
| - pXMLNode; pXMLNode = pXMLNode->GetNodeItem(IFDE_XMLNode::NextSibling)) {
|
| - if (pXMLNode->GetType() == FDE_XMLNODE_Element) {
|
| - CFX_WideString wsTagName;
|
| - IFDE_XMLElement* pXMLElement = (IFDE_XMLElement*)pXMLNode;
|
| - pXMLElement->GetTagName(wsTagName);
|
| - if (wsTagName.Equal(FX_WSTRC(L"document"))) {
|
| - pDocumentElement = pXMLElement;
|
| - break;
|
| - }
|
| - }
|
| - }
|
| - if (!pDocumentElement) {
|
| - return FALSE;
|
| - }
|
| - IFDE_XMLElement* pChunkElement = NULL;
|
| - for (IFDE_XMLNode* pXMLNode =
|
| - pDocumentElement->GetNodeItem(IFDE_XMLNode::FirstChild);
|
| - pXMLNode; pXMLNode = pXMLNode->GetNodeItem(IFDE_XMLNode::NextSibling)) {
|
| - if (pXMLNode->GetType() == FDE_XMLNODE_Element) {
|
| - CFX_WideString wsTagName;
|
| - IFDE_XMLElement* pXMLElement = (IFDE_XMLElement*)pXMLNode;
|
| - pXMLElement->GetTagName(wsTagName);
|
| - if (wsTagName.Equal(FX_WSTRC(L"chunk"))) {
|
| - pChunkElement = pXMLElement;
|
| - break;
|
| - }
|
| - }
|
| - }
|
| - if (!pChunkElement) {
|
| - return FALSE;
|
| - }
|
| - CFX_WideString wsPDFContent;
|
| - pChunkElement->GetTextData(wsPDFContent);
|
| - iBufferSize = FX_Base64DecodeW(wsPDFContent, wsPDFContent.GetLength(), NULL);
|
| - pByteBuffer = FX_Alloc(uint8_t, iBufferSize + 1);
|
| - pByteBuffer[iBufferSize] = '0'; // FIXME: I bet this is wrong.
|
| - FX_Base64DecodeW(wsPDFContent, wsPDFContent.GetLength(), pByteBuffer);
|
| - return TRUE;
|
| -}
|
| -void XFA_XPDPacket_MergeRootNode(CXFA_Node* pOriginRoot, CXFA_Node* pNewRoot) {
|
| - CXFA_Node* pChildNode = pNewRoot->GetNodeItem(XFA_NODEITEM_FirstChild);
|
| - while (pChildNode) {
|
| - CXFA_Node* pOriginChild =
|
| - pOriginRoot->GetFirstChildByName(pChildNode->GetNameHash());
|
| - if (pOriginChild) {
|
| - pChildNode = pChildNode->GetNodeItem(XFA_NODEITEM_NextSibling);
|
| - } else {
|
| - CXFA_Node* pNextSibling =
|
| - pChildNode->GetNodeItem(XFA_NODEITEM_NextSibling);
|
| - pNewRoot->RemoveChild(pChildNode);
|
| - pOriginRoot->InsertChild(pChildNode);
|
| - pChildNode = pNextSibling;
|
| - pNextSibling = NULL;
|
| - }
|
| - }
|
| -}
|
| -int32_t CXFA_FFDoc::DoLoad(IFX_Pause* pPause) {
|
| - int32_t iStatus = m_pDocument->GetParser()->DoParse(pPause);
|
| - if (iStatus == XFA_PARSESTATUS_Done && !m_pPDFDoc) {
|
| - CXFA_Node* pPDFNode = ToNode(m_pDocument->GetXFAObject(XFA_HASHCODE_Pdf));
|
| - if (!pPDFNode) {
|
| - return XFA_PARSESTATUS_SyntaxErr;
|
| - }
|
| - IFDE_XMLNode* pPDFXML = pPDFNode->GetXMLMappingNode();
|
| - if (pPDFXML->GetType() != FDE_XMLNODE_Element) {
|
| - return XFA_PARSESTATUS_SyntaxErr;
|
| - }
|
| - int32_t iBufferSize = 0;
|
| - uint8_t* pByteBuffer = NULL;
|
| - IFX_FileRead* pXFAReader = NULL;
|
| - if (XFA_GetPDFContentsFromPDFXML(pPDFXML, pByteBuffer, iBufferSize)) {
|
| - pXFAReader = FX_CreateMemoryStream(pByteBuffer, iBufferSize, TRUE);
|
| - } else {
|
| - CFX_WideString wsHref;
|
| - ((IFDE_XMLElement*)pPDFXML)->GetString(L"href", wsHref);
|
| - if (!wsHref.IsEmpty()) {
|
| - pXFAReader = GetDocProvider()->OpenLinkedFile(this, wsHref);
|
| - }
|
| - }
|
| - if (!pXFAReader) {
|
| - return XFA_PARSESTATUS_SyntaxErr;
|
| - }
|
| - CPDF_Document* pPDFDocument =
|
| - GetDocProvider()->OpenPDF(this, pXFAReader, TRUE);
|
| - FXSYS_assert(!m_pPDFDoc);
|
| - if (!OpenDoc(pPDFDocument)) {
|
| - return XFA_PARSESTATUS_SyntaxErr;
|
| - }
|
| - IXFA_Parser* pParser = IXFA_Parser::Create(m_pDocument, TRUE);
|
| - if (!pParser) {
|
| - return XFA_PARSESTATUS_SyntaxErr;
|
| - }
|
| - CXFA_Node* pRootNode = NULL;
|
| - if (pParser->StartParse(m_pStream) == XFA_PARSESTATUS_Ready &&
|
| - pParser->DoParse(NULL) == XFA_PARSESTATUS_Done) {
|
| - pRootNode = pParser->GetRootNode();
|
| - }
|
| - if (pRootNode && m_pDocument->GetRoot()) {
|
| - XFA_XPDPacket_MergeRootNode(m_pDocument->GetRoot(), pRootNode);
|
| - iStatus = XFA_PARSESTATUS_Done;
|
| - } else {
|
| - iStatus = XFA_PARSESTATUS_StatusErr;
|
| - }
|
| - pParser->Release();
|
| - pParser = NULL;
|
| - }
|
| - return iStatus;
|
| -}
|
| -void CXFA_FFDoc::StopLoad() {
|
| - m_pApp->GetXFAFontMgr()->LoadDocFonts(this);
|
| - m_dwDocType = XFA_DOCTYPE_Static;
|
| - CXFA_Node* pConfig = ToNode(m_pDocument->GetXFAObject(XFA_HASHCODE_Config));
|
| - if (!pConfig) {
|
| - return;
|
| - }
|
| - CXFA_Node* pAcrobat = pConfig->GetFirstChildByClass(XFA_ELEMENT_Acrobat);
|
| - if (!pAcrobat) {
|
| - return;
|
| - }
|
| - CXFA_Node* pAcrobat7 = pAcrobat->GetFirstChildByClass(XFA_ELEMENT_Acrobat7);
|
| - if (!pAcrobat7) {
|
| - return;
|
| - }
|
| - CXFA_Node* pDynamicRender =
|
| - pAcrobat7->GetFirstChildByClass(XFA_ELEMENT_DynamicRender);
|
| - if (!pDynamicRender) {
|
| - return;
|
| - }
|
| - CFX_WideString wsType;
|
| - if (pDynamicRender->TryContent(wsType) && wsType == FX_WSTRC(L"required")) {
|
| - m_dwDocType = XFA_DOCTYPE_Dynamic;
|
| - }
|
| -}
|
| -IXFA_DocView* CXFA_FFDoc::CreateDocView(FX_DWORD dwView) {
|
| - CXFA_FFDocView* pDocView =
|
| - (CXFA_FFDocView*)m_mapTypeToDocView.GetValueAt((void*)(uintptr_t)dwView);
|
| - if (!pDocView) {
|
| - pDocView = new CXFA_FFDocView(this);
|
| - m_mapTypeToDocView.SetAt((void*)(uintptr_t)dwView, pDocView);
|
| - }
|
| - return pDocView;
|
| -}
|
| -CXFA_FFDocView* CXFA_FFDoc::GetDocView(IXFA_DocLayout* pLayout) {
|
| - FX_POSITION ps = m_mapTypeToDocView.GetStartPosition();
|
| - while (ps) {
|
| - void* pType;
|
| - CXFA_FFDocView* pDocView;
|
| - m_mapTypeToDocView.GetNextAssoc(ps, pType, (void*&)pDocView);
|
| - if (pDocView->GetXFALayout() == pLayout) {
|
| - return pDocView;
|
| - }
|
| - }
|
| - return NULL;
|
| -}
|
| -CXFA_FFDocView* CXFA_FFDoc::GetDocView() {
|
| - FX_POSITION ps = m_mapTypeToDocView.GetStartPosition();
|
| - if (ps) {
|
| - void* pType;
|
| - CXFA_FFDocView* pDocView;
|
| - m_mapTypeToDocView.GetNextAssoc(ps, pType, (void*&)pDocView);
|
| - return pDocView;
|
| - }
|
| - return NULL;
|
| -}
|
| -FX_BOOL CXFA_FFDoc::OpenDoc(IFX_FileRead* pStream, FX_BOOL bTakeOverFile) {
|
| - m_bOwnStream = bTakeOverFile;
|
| - m_pStream = pStream;
|
| - return TRUE;
|
| -}
|
| -FX_BOOL CXFA_FFDoc::OpenDoc(CPDF_Document* pPDFDoc) {
|
| - if (pPDFDoc == NULL) {
|
| - return FALSE;
|
| - }
|
| - CPDF_Dictionary* pRoot = pPDFDoc->GetRoot();
|
| - if (pRoot == NULL) {
|
| - return FALSE;
|
| - }
|
| - CPDF_Dictionary* pAcroForm = pRoot->GetDictBy("AcroForm");
|
| - if (pAcroForm == NULL) {
|
| - return FALSE;
|
| - }
|
| - CPDF_Object* pElementXFA = pAcroForm->GetElementValue("XFA");
|
| - if (pElementXFA == NULL) {
|
| - return FALSE;
|
| - }
|
| - CFX_ArrayTemplate<CPDF_Stream*> xfaStreams;
|
| - if (pElementXFA->IsArray()) {
|
| - CPDF_Array* pXFAArray = (CPDF_Array*)pElementXFA;
|
| - FX_DWORD count = pXFAArray->GetCount() / 2;
|
| - for (FX_DWORD i = 0; i < count; i++) {
|
| - if (CPDF_Stream* pStream = pXFAArray->GetStreamAt(i * 2 + 1))
|
| - xfaStreams.Add(pStream);
|
| - }
|
| - } else if (pElementXFA->IsStream()) {
|
| - xfaStreams.Add((CPDF_Stream*)pElementXFA);
|
| - }
|
| - if (xfaStreams.GetSize() < 1) {
|
| - return FALSE;
|
| - }
|
| - IFX_FileRead* pFileRead = new CXFA_FileRead(xfaStreams);
|
| - m_pPDFDoc = pPDFDoc;
|
| - if (m_pStream) {
|
| - m_pStream->Release();
|
| - m_pStream = NULL;
|
| - }
|
| - m_pStream = pFileRead;
|
| - m_bOwnStream = TRUE;
|
| - return TRUE;
|
| -}
|
| -FX_BOOL CXFA_FFDoc::CloseDoc() {
|
| - FX_POSITION psClose = m_mapTypeToDocView.GetStartPosition();
|
| - while (psClose) {
|
| - void* pType;
|
| - CXFA_FFDocView* pDocView;
|
| - m_mapTypeToDocView.GetNextAssoc(psClose, pType, (void*&)pDocView);
|
| - pDocView->RunDocClose();
|
| - }
|
| - if (m_pDocument) {
|
| - m_pDocument->ClearLayoutData();
|
| - }
|
| - FX_POSITION ps = m_mapTypeToDocView.GetStartPosition();
|
| - while (ps) {
|
| - void* pType;
|
| - CXFA_FFDocView* pDocView;
|
| - m_mapTypeToDocView.GetNextAssoc(ps, pType, (void*&)pDocView);
|
| - delete pDocView;
|
| - }
|
| - m_mapTypeToDocView.RemoveAll();
|
| - if (m_pDocument) {
|
| - IXFA_Parser* pParser = m_pDocument->GetParser();
|
| - pParser->Release();
|
| - m_pDocument = NULL;
|
| - }
|
| - if (m_pNotify) {
|
| - delete m_pNotify;
|
| - m_pNotify = NULL;
|
| - }
|
| - m_pApp->GetXFAFontMgr()->ReleaseDocFonts(this);
|
| - if (m_dwDocType != XFA_DOCTYPE_XDP && m_pStream && m_bOwnStream) {
|
| - m_pStream->Release();
|
| - m_pStream = NULL;
|
| - }
|
| - ps = m_mapNamedImages.GetStartPosition();
|
| - while (ps) {
|
| - void* pName;
|
| - FX_IMAGEDIB_AND_DPI* pImage = NULL;
|
| - m_mapNamedImages.GetNextAssoc(ps, pName, (void*&)pImage);
|
| - if (pImage) {
|
| - delete pImage->pDibSource;
|
| - pImage->pDibSource = NULL;
|
| - FX_Free(pImage);
|
| - pImage = NULL;
|
| - }
|
| - }
|
| - m_mapNamedImages.RemoveAll();
|
| - IFWL_NoteDriver* pNoteDriver = FWL_GetApp()->GetNoteDriver();
|
| - pNoteDriver->ClearEventTargets(FALSE);
|
| - return TRUE;
|
| -}
|
| -void CXFA_FFDoc::SetDocType(FX_DWORD dwType) {
|
| - m_dwDocType = dwType;
|
| -}
|
| -CPDF_Document* CXFA_FFDoc::GetPDFDoc() {
|
| - return m_pPDFDoc;
|
| -}
|
| -
|
| -CFX_DIBitmap* CXFA_FFDoc::GetPDFNamedImage(const CFX_WideStringC& wsName,
|
| - int32_t& iImageXDpi,
|
| - int32_t& iImageYDpi) {
|
| - if (!m_pPDFDoc)
|
| - return nullptr;
|
| -
|
| - FX_DWORD dwHash =
|
| - FX_HashCode_String_GetW(wsName.GetPtr(), wsName.GetLength(), FALSE);
|
| - FX_IMAGEDIB_AND_DPI* imageDIBDpi = nullptr;
|
| - if (m_mapNamedImages.Lookup((void*)(uintptr_t)dwHash, (void*&)imageDIBDpi)) {
|
| - iImageXDpi = imageDIBDpi->iImageXDpi;
|
| - iImageYDpi = imageDIBDpi->iImageYDpi;
|
| - return static_cast<CFX_DIBitmap*>(imageDIBDpi->pDibSource);
|
| - }
|
| -
|
| - CPDF_Dictionary* pRoot = m_pPDFDoc->GetRoot();
|
| - if (!pRoot)
|
| - return nullptr;
|
| -
|
| - CPDF_Dictionary* pNames = pRoot->GetDictBy("Names");
|
| - if (!pNames)
|
| - return nullptr;
|
| -
|
| - CPDF_Dictionary* pXFAImages = pNames->GetDictBy("XFAImages");
|
| - if (!pXFAImages)
|
| - return nullptr;
|
| -
|
| - CPDF_NameTree nametree(pXFAImages);
|
| - CFX_ByteString bsName = PDF_EncodeText(wsName.GetPtr(), wsName.GetLength());
|
| - CPDF_Object* pObject = nametree.LookupValue(bsName);
|
| - if (!pObject) {
|
| - int32_t iCount = nametree.GetCount();
|
| - for (int32_t i = 0; i < iCount; i++) {
|
| - CFX_ByteString bsTemp;
|
| - CPDF_Object* pTempObject = nametree.LookupValue(i, bsTemp);
|
| - if (bsTemp == bsName) {
|
| - pObject = pTempObject;
|
| - break;
|
| - }
|
| - }
|
| - }
|
| -
|
| - if (!pObject || !pObject->IsStream())
|
| - return nullptr;
|
| -
|
| - if (!imageDIBDpi) {
|
| - imageDIBDpi = FX_Alloc(FX_IMAGEDIB_AND_DPI, 1);
|
| - imageDIBDpi->pDibSource = nullptr;
|
| - imageDIBDpi->iImageXDpi = 0;
|
| - imageDIBDpi->iImageYDpi = 0;
|
| - CPDF_StreamAcc streamAcc;
|
| - streamAcc.LoadAllData((CPDF_Stream*)pObject);
|
| - IFX_FileRead* pImageFileRead = FX_CreateMemoryStream(
|
| - (uint8_t*)streamAcc.GetData(), streamAcc.GetSize());
|
| - imageDIBDpi->pDibSource = XFA_LoadImageFromBuffer(
|
| - pImageFileRead, FXCODEC_IMAGE_UNKNOWN, iImageXDpi, iImageYDpi);
|
| - imageDIBDpi->iImageXDpi = iImageXDpi;
|
| - imageDIBDpi->iImageYDpi = iImageYDpi;
|
| - pImageFileRead->Release();
|
| - }
|
| - m_mapNamedImages.SetAt((void*)(uintptr_t)dwHash, imageDIBDpi);
|
| - return (CFX_DIBitmap*)imageDIBDpi->pDibSource;
|
| -}
|
| -
|
| -IFDE_XMLElement* CXFA_FFDoc::GetPackageData(const CFX_WideStringC& wsPackage) {
|
| - FX_DWORD packetHash =
|
| - FX_HashCode_String_GetW(wsPackage.GetPtr(), wsPackage.GetLength());
|
| - CXFA_Node* pNode = ToNode(m_pDocument->GetXFAObject(packetHash));
|
| - if (!pNode) {
|
| - return NULL;
|
| - }
|
| - IFDE_XMLNode* pXMLNode = pNode->GetXMLMappingNode();
|
| - return (pXMLNode && pXMLNode->GetType() == FDE_XMLNODE_Element)
|
| - ? (IFDE_XMLElement*)pXMLNode
|
| - : NULL;
|
| -}
|
| -FX_BOOL CXFA_FFDoc::SavePackage(const CFX_WideStringC& wsPackage,
|
| - IFX_FileWrite* pFile,
|
| - IXFA_ChecksumContext* pCSContext) {
|
| - IXFA_PacketExport* pExport = IXFA_PacketExport::Create(m_pDocument);
|
| - if (!pExport) {
|
| - return FALSE;
|
| - }
|
| - FX_DWORD packetHash =
|
| - FX_HashCode_String_GetW(wsPackage.GetPtr(), wsPackage.GetLength());
|
| - CXFA_Node* pNode = NULL;
|
| - if (packetHash == XFA_HASHCODE_Xfa) {
|
| - pNode = m_pDocument->GetRoot();
|
| - } else {
|
| - pNode = ToNode(m_pDocument->GetXFAObject(packetHash));
|
| - }
|
| - FX_BOOL bFlags = FALSE;
|
| - if (pNode) {
|
| - CFX_ByteString bsChecksum;
|
| - if (pCSContext) {
|
| - pCSContext->GetChecksum(bsChecksum);
|
| - }
|
| - bFlags = pExport->Export(pFile, pNode, 0, bsChecksum.GetLength()
|
| - ? (const FX_CHAR*)bsChecksum
|
| - : NULL);
|
| - } else {
|
| - bFlags = pExport->Export(pFile);
|
| - }
|
| - pExport->Release();
|
| - return bFlags;
|
| -}
|
| -FX_BOOL CXFA_FFDoc::ImportData(IFX_FileRead* pStream, FX_BOOL bXDP) {
|
| - FX_BOOL bRet = FALSE;
|
| - IXFA_PacketImport* pImport = IXFA_PacketImport::Create(m_pDocument);
|
| - if (pImport) {
|
| - bRet = pImport->ImportData(pStream);
|
| - pImport->Release();
|
| - }
|
| - return bRet;
|
| -}
|
|
|