| Index: core/src/fpdfapi/fpdf_parser/fpdf_parser_document.cpp
|
| diff --git a/core/src/fpdfapi/fpdf_parser/fpdf_parser_document.cpp b/core/src/fpdfapi/fpdf_parser/fpdf_parser_document.cpp
|
| deleted file mode 100644
|
| index a63b0ed336ce68325333076340303ac2dd615ac4..0000000000000000000000000000000000000000
|
| --- a/core/src/fpdfapi/fpdf_parser/fpdf_parser_document.cpp
|
| +++ /dev/null
|
| @@ -1,338 +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 "core/include/fpdfapi/fpdf_parser.h"
|
| -
|
| -#include <set>
|
| -
|
| -#include "core/include/fpdfapi/fpdf_module.h"
|
| -#include "third_party/base/stl_util.h"
|
| -
|
| -namespace {
|
| -
|
| -int CountPages(CPDF_Dictionary* pPages,
|
| - std::set<CPDF_Dictionary*>* visited_pages) {
|
| - int count = pPages->GetIntegerBy("Count");
|
| - if (count > 0 && count < FPDF_PAGE_MAX_NUM) {
|
| - return count;
|
| - }
|
| - CPDF_Array* pKidList = pPages->GetArrayBy("Kids");
|
| - if (!pKidList) {
|
| - return 0;
|
| - }
|
| - count = 0;
|
| - for (FX_DWORD i = 0; i < pKidList->GetCount(); i++) {
|
| - CPDF_Dictionary* pKid = pKidList->GetDictAt(i);
|
| - if (!pKid || pdfium::ContainsKey(*visited_pages, pKid)) {
|
| - continue;
|
| - }
|
| - if (pKid->KeyExist("Kids")) {
|
| - // Use |visited_pages| to help detect circular references of pages.
|
| - ScopedSetInsertion<CPDF_Dictionary*> local_add(visited_pages, pKid);
|
| - count += CountPages(pKid, visited_pages);
|
| - } else {
|
| - // This page is a leaf node.
|
| - count++;
|
| - }
|
| - }
|
| - pPages->SetAtInteger("Count", count);
|
| - return count;
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| -CPDF_Document::CPDF_Document(CPDF_Parser* pParser)
|
| - : CPDF_IndirectObjectHolder(pParser) {
|
| - ASSERT(pParser);
|
| - m_pRootDict = NULL;
|
| - m_pInfoDict = NULL;
|
| - m_bLinearized = FALSE;
|
| - m_dwFirstPageNo = 0;
|
| - m_dwFirstPageObjNum = 0;
|
| - m_pDocPage = CPDF_ModuleMgr::Get()->GetPageModule()->CreateDocData(this);
|
| - m_pDocRender = CPDF_ModuleMgr::Get()->GetRenderModule()->CreateDocData(this);
|
| -}
|
| -CPDF_DocPageData* CPDF_Document::GetValidatePageData() {
|
| - if (m_pDocPage) {
|
| - return m_pDocPage;
|
| - }
|
| - m_pDocPage = CPDF_ModuleMgr::Get()->GetPageModule()->CreateDocData(this);
|
| - return m_pDocPage;
|
| -}
|
| -CPDF_DocRenderData* CPDF_Document::GetValidateRenderData() {
|
| - if (m_pDocRender) {
|
| - return m_pDocRender;
|
| - }
|
| - m_pDocRender = CPDF_ModuleMgr::Get()->GetRenderModule()->CreateDocData(this);
|
| - return m_pDocRender;
|
| -}
|
| -void CPDF_Document::LoadDoc() {
|
| - m_LastObjNum = m_pParser->GetLastObjNum();
|
| - CPDF_Object* pRootObj = GetIndirectObject(m_pParser->GetRootObjNum());
|
| - if (!pRootObj) {
|
| - return;
|
| - }
|
| - m_pRootDict = pRootObj->GetDict();
|
| - if (!m_pRootDict) {
|
| - return;
|
| - }
|
| - CPDF_Object* pInfoObj = GetIndirectObject(m_pParser->GetInfoObjNum());
|
| - if (pInfoObj) {
|
| - m_pInfoDict = pInfoObj->GetDict();
|
| - }
|
| - CPDF_Array* pIDArray = m_pParser->GetIDArray();
|
| - if (pIDArray) {
|
| - m_ID1 = pIDArray->GetStringAt(0);
|
| - m_ID2 = pIDArray->GetStringAt(1);
|
| - }
|
| - m_PageList.SetSize(RetrievePageCount());
|
| -}
|
| -void CPDF_Document::LoadAsynDoc(CPDF_Dictionary* pLinearized) {
|
| - m_bLinearized = TRUE;
|
| - m_LastObjNum = m_pParser->GetLastObjNum();
|
| - CPDF_Object* pIndirectObj = GetIndirectObject(m_pParser->GetRootObjNum());
|
| - m_pRootDict = pIndirectObj ? pIndirectObj->GetDict() : nullptr;
|
| - if (!m_pRootDict) {
|
| - return;
|
| - }
|
| - pIndirectObj = GetIndirectObject(m_pParser->GetInfoObjNum());
|
| - m_pInfoDict = pIndirectObj ? pIndirectObj->GetDict() : nullptr;
|
| - CPDF_Array* pIDArray = m_pParser->GetIDArray();
|
| - if (pIDArray) {
|
| - m_ID1 = pIDArray->GetStringAt(0);
|
| - m_ID2 = pIDArray->GetStringAt(1);
|
| - }
|
| - FX_DWORD dwPageCount = 0;
|
| - CPDF_Object* pCount = pLinearized->GetElement("N");
|
| - if (ToNumber(pCount))
|
| - dwPageCount = pCount->GetInteger();
|
| -
|
| - m_PageList.SetSize(dwPageCount);
|
| - CPDF_Object* pNo = pLinearized->GetElement("P");
|
| - if (ToNumber(pNo))
|
| - m_dwFirstPageNo = pNo->GetInteger();
|
| -
|
| - CPDF_Object* pObjNum = pLinearized->GetElement("O");
|
| - if (ToNumber(pObjNum))
|
| - m_dwFirstPageObjNum = pObjNum->GetInteger();
|
| -}
|
| -void CPDF_Document::LoadPages() {
|
| - m_PageList.SetSize(RetrievePageCount());
|
| -}
|
| -CPDF_Document::~CPDF_Document() {
|
| - if (m_pDocPage) {
|
| - CPDF_ModuleMgr::Get()->GetPageModule()->ReleaseDoc(this);
|
| - CPDF_ModuleMgr::Get()->GetPageModule()->ClearStockFont(this);
|
| - }
|
| - if (m_pDocRender) {
|
| - CPDF_ModuleMgr::Get()->GetRenderModule()->DestroyDocData(m_pDocRender);
|
| - }
|
| -}
|
| -#define FX_MAX_PAGE_LEVEL 1024
|
| -CPDF_Dictionary* CPDF_Document::_FindPDFPage(CPDF_Dictionary* pPages,
|
| - int iPage,
|
| - int nPagesToGo,
|
| - int level) {
|
| - CPDF_Array* pKidList = pPages->GetArrayBy("Kids");
|
| - if (!pKidList) {
|
| - if (nPagesToGo == 0) {
|
| - return pPages;
|
| - }
|
| - return NULL;
|
| - }
|
| - if (level >= FX_MAX_PAGE_LEVEL) {
|
| - return NULL;
|
| - }
|
| - int nKids = pKidList->GetCount();
|
| - for (int i = 0; i < nKids; i++) {
|
| - CPDF_Dictionary* pKid = pKidList->GetDictAt(i);
|
| - if (!pKid) {
|
| - nPagesToGo--;
|
| - continue;
|
| - }
|
| - if (pKid == pPages) {
|
| - continue;
|
| - }
|
| - if (!pKid->KeyExist("Kids")) {
|
| - if (nPagesToGo == 0) {
|
| - return pKid;
|
| - }
|
| - m_PageList.SetAt(iPage - nPagesToGo, pKid->GetObjNum());
|
| - nPagesToGo--;
|
| - } else {
|
| - int nPages = pKid->GetIntegerBy("Count");
|
| - if (nPagesToGo < nPages) {
|
| - return _FindPDFPage(pKid, iPage, nPagesToGo, level + 1);
|
| - }
|
| - nPagesToGo -= nPages;
|
| - }
|
| - }
|
| - return NULL;
|
| -}
|
| -
|
| -CPDF_Dictionary* CPDF_Document::GetPage(int iPage) {
|
| - if (iPage < 0 || iPage >= m_PageList.GetSize())
|
| - return nullptr;
|
| -
|
| - if (m_bLinearized && (iPage == (int)m_dwFirstPageNo)) {
|
| - if (CPDF_Dictionary* pDict =
|
| - ToDictionary(GetIndirectObject(m_dwFirstPageObjNum))) {
|
| - return pDict;
|
| - }
|
| - }
|
| -
|
| - int objnum = m_PageList.GetAt(iPage);
|
| - if (objnum) {
|
| - if (CPDF_Dictionary* pDict = ToDictionary(GetIndirectObject(objnum)))
|
| - return pDict;
|
| - }
|
| -
|
| - CPDF_Dictionary* pRoot = GetRoot();
|
| - if (!pRoot)
|
| - return nullptr;
|
| -
|
| - CPDF_Dictionary* pPages = pRoot->GetDictBy("Pages");
|
| - if (!pPages)
|
| - return nullptr;
|
| -
|
| - CPDF_Dictionary* pPage = _FindPDFPage(pPages, iPage, iPage, 0);
|
| - if (!pPage)
|
| - return nullptr;
|
| -
|
| - m_PageList.SetAt(iPage, pPage->GetObjNum());
|
| - return pPage;
|
| -}
|
| -
|
| -int CPDF_Document::_FindPageIndex(CPDF_Dictionary* pNode,
|
| - FX_DWORD& skip_count,
|
| - FX_DWORD objnum,
|
| - int& index,
|
| - int level) {
|
| - if (pNode->KeyExist("Kids")) {
|
| - CPDF_Array* pKidList = pNode->GetArrayBy("Kids");
|
| - if (!pKidList) {
|
| - return -1;
|
| - }
|
| - if (level >= FX_MAX_PAGE_LEVEL) {
|
| - return -1;
|
| - }
|
| - FX_DWORD count = pNode->GetIntegerBy("Count");
|
| - if (count <= skip_count) {
|
| - skip_count -= count;
|
| - index += count;
|
| - return -1;
|
| - }
|
| - if (count && count == pKidList->GetCount()) {
|
| - for (FX_DWORD i = 0; i < count; i++) {
|
| - if (CPDF_Reference* pKid = ToReference(pKidList->GetElement(i))) {
|
| - if (pKid->GetRefObjNum() == objnum) {
|
| - m_PageList.SetAt(index + i, objnum);
|
| - return index + i;
|
| - }
|
| - }
|
| - }
|
| - }
|
| - for (FX_DWORD i = 0; i < pKidList->GetCount(); i++) {
|
| - CPDF_Dictionary* pKid = pKidList->GetDictAt(i);
|
| - if (!pKid) {
|
| - continue;
|
| - }
|
| - if (pKid == pNode) {
|
| - continue;
|
| - }
|
| - int found_index =
|
| - _FindPageIndex(pKid, skip_count, objnum, index, level + 1);
|
| - if (found_index >= 0) {
|
| - return found_index;
|
| - }
|
| - }
|
| - } else {
|
| - if (objnum == pNode->GetObjNum()) {
|
| - return index;
|
| - }
|
| - if (skip_count) {
|
| - skip_count--;
|
| - }
|
| - index++;
|
| - }
|
| - return -1;
|
| -}
|
| -int CPDF_Document::GetPageIndex(FX_DWORD objnum) {
|
| - FX_DWORD nPages = m_PageList.GetSize();
|
| - FX_DWORD skip_count = 0;
|
| - FX_BOOL bSkipped = FALSE;
|
| - for (FX_DWORD i = 0; i < nPages; i++) {
|
| - FX_DWORD objnum1 = m_PageList.GetAt(i);
|
| - if (objnum1 == objnum) {
|
| - return i;
|
| - }
|
| - if (!bSkipped && objnum1 == 0) {
|
| - skip_count = i;
|
| - bSkipped = TRUE;
|
| - }
|
| - }
|
| - CPDF_Dictionary* pRoot = GetRoot();
|
| - if (!pRoot) {
|
| - return -1;
|
| - }
|
| - CPDF_Dictionary* pPages = pRoot->GetDictBy("Pages");
|
| - if (!pPages) {
|
| - return -1;
|
| - }
|
| - int index = 0;
|
| - return _FindPageIndex(pPages, skip_count, objnum, index);
|
| -}
|
| -int CPDF_Document::GetPageCount() const {
|
| - return m_PageList.GetSize();
|
| -}
|
| -
|
| -int CPDF_Document::RetrievePageCount() const {
|
| - CPDF_Dictionary* pRoot = GetRoot();
|
| - if (!pRoot) {
|
| - return 0;
|
| - }
|
| - CPDF_Dictionary* pPages = pRoot->GetDictBy("Pages");
|
| - if (!pPages) {
|
| - return 0;
|
| - }
|
| - if (!pPages->KeyExist("Kids")) {
|
| - return 1;
|
| - }
|
| - std::set<CPDF_Dictionary*> visited_pages;
|
| - visited_pages.insert(pPages);
|
| - return CountPages(pPages, &visited_pages);
|
| -}
|
| -
|
| -FX_DWORD CPDF_Document::GetUserPermissions(FX_BOOL bCheckRevision) const {
|
| - if (!m_pParser) {
|
| - return (FX_DWORD)-1;
|
| - }
|
| - return m_pParser->GetPermissions(bCheckRevision);
|
| -}
|
| -
|
| -FX_BOOL CPDF_Document::IsFormStream(FX_DWORD objnum, FX_BOOL& bForm) const {
|
| - auto it = m_IndirectObjs.find(objnum);
|
| - if (it != m_IndirectObjs.end()) {
|
| - CPDF_Stream* pStream = it->second->AsStream();
|
| - bForm = pStream && pStream->GetDict()->GetStringBy("Subtype") == "Form";
|
| - return TRUE;
|
| - }
|
| - if (!m_pParser) {
|
| - bForm = FALSE;
|
| - return TRUE;
|
| - }
|
| - return m_pParser->IsFormStream(objnum, bForm);
|
| -}
|
| -
|
| -void CPDF_Document::ClearPageData() {
|
| - if (m_pDocPage)
|
| - CPDF_ModuleMgr::Get()->GetPageModule()->ClearDoc(this);
|
| -}
|
| -
|
| -void CPDF_Document::ClearRenderData() {
|
| - if (m_pDocRender)
|
| - CPDF_ModuleMgr::Get()->GetRenderModule()->ClearDocData(m_pDocRender);
|
| -}
|
|
|