summaryrefslogtreecommitdiff
path: root/core/fpdfapi/fpdf_parser/cpdf_data_avail.h
diff options
context:
space:
mode:
Diffstat (limited to 'core/fpdfapi/fpdf_parser/cpdf_data_avail.h')
-rw-r--r--core/fpdfapi/fpdf_parser/cpdf_data_avail.h253
1 files changed, 253 insertions, 0 deletions
diff --git a/core/fpdfapi/fpdf_parser/cpdf_data_avail.h b/core/fpdfapi/fpdf_parser/cpdf_data_avail.h
new file mode 100644
index 0000000000..44e242eac1
--- /dev/null
+++ b/core/fpdfapi/fpdf_parser/cpdf_data_avail.h
@@ -0,0 +1,253 @@
+// Copyright 2016 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 CORE_FPDFAPI_FPDF_PARSER_CPDF_DATA_AVAIL_H_
+#define CORE_FPDFAPI_FPDF_PARSER_CPDF_DATA_AVAIL_H_
+
+#include "core/fpdfapi/fpdf_parser/cpdf_parser.h"
+#include "core/fpdfapi/fpdf_parser/cpdf_syntax_parser.h"
+#include "core/fxcrt/include/fx_basic.h"
+
+class CPDF_Dictionary;
+class CPDF_HintTables;
+class CPDF_IndirectObjectHolder;
+class CPDF_Parser;
+
+enum PDF_DATAAVAIL_STATUS {
+ PDF_DATAAVAIL_HEADER = 0,
+ PDF_DATAAVAIL_FIRSTPAGE,
+ PDF_DATAAVAIL_FIRSTPAGE_PREPARE,
+ PDF_DATAAVAIL_HINTTABLE,
+ PDF_DATAAVAIL_END,
+ PDF_DATAAVAIL_CROSSREF,
+ PDF_DATAAVAIL_CROSSREF_ITEM,
+ PDF_DATAAVAIL_CROSSREF_STREAM,
+ PDF_DATAAVAIL_TRAILER,
+ PDF_DATAAVAIL_LOADALLCROSSREF,
+ PDF_DATAAVAIL_ROOT,
+ PDF_DATAAVAIL_INFO,
+ PDF_DATAAVAIL_ACROFORM,
+ PDF_DATAAVAIL_ACROFORM_SUBOBJECT,
+ PDF_DATAAVAIL_PAGETREE,
+ PDF_DATAAVAIL_PAGE,
+ PDF_DATAAVAIL_PAGE_LATERLOAD,
+ PDF_DATAAVAIL_RESOURCES,
+ PDF_DATAAVAIL_DONE,
+ PDF_DATAAVAIL_ERROR,
+ PDF_DATAAVAIL_LOADALLFILE,
+ PDF_DATAAVAIL_TRAILER_APPEND
+};
+
+enum PDF_PAGENODE_TYPE {
+ PDF_PAGENODE_UNKNOWN = 0,
+ PDF_PAGENODE_PAGE,
+ PDF_PAGENODE_PAGES,
+ PDF_PAGENODE_ARRAY,
+};
+
+class CPDF_DataAvail final {
+ public:
+ // Must match PDF_DATA_* definitions in public/fpdf_dataavail.h, but cannot
+ // #include that header. fpdfsdk/fpdf_dataavail.cpp has static_asserts
+ // to make sure the two sets of values match.
+ enum DocAvailStatus {
+ DataError = -1, // PDF_DATA_ERROR
+ DataNotAvailable = 0, // PDF_DATA_NOTAVAIL
+ DataAvailable = 1, // PDF_DATA_AVAIL
+ };
+
+ // Must match PDF_*LINEAR* definitions in public/fpdf_dataavail.h, but cannot
+ // #include that header. fpdfsdk/fpdf_dataavail.cpp has static_asserts
+ // to make sure the two sets of values match.
+ enum DocLinearizationStatus {
+ LinearizationUnknown = -1, // PDF_LINEARIZATION_UNKNOWN
+ NotLinearized = 0, // PDF_NOT_LINEARIZED
+ Linearized = 1, // PDF_LINEARIZED
+ };
+
+ // Must match PDF_FORM_* definitions in public/fpdf_dataavail.h, but cannot
+ // #include that header. fpdfsdk/fpdf_dataavail.cpp has static_asserts
+ // to make sure the two sets of values match.
+ enum DocFormStatus {
+ FormError = -1, // PDF_FORM_ERROR
+ FormNotAvailable = 0, // PDF_FORM_NOTAVAIL
+ FormAvailable = 1, // PDF_FORM_AVAIL
+ FormNotExist = 2, // PDF_FORM_NOTEXIST
+ };
+
+ class FileAvail {
+ public:
+ virtual ~FileAvail();
+ virtual FX_BOOL IsDataAvail(FX_FILESIZE offset, uint32_t size) = 0;
+ };
+
+ class DownloadHints {
+ public:
+ virtual ~DownloadHints();
+ virtual void AddSegment(FX_FILESIZE offset, uint32_t size) = 0;
+ };
+
+ CPDF_DataAvail(FileAvail* pFileAvail,
+ IFX_FileRead* pFileRead,
+ FX_BOOL bSupportHintTable);
+ ~CPDF_DataAvail();
+
+ DocAvailStatus IsDocAvail(DownloadHints* pHints);
+ void SetDocument(CPDF_Document* pDoc);
+ DocAvailStatus IsPageAvail(uint32_t dwPage, DownloadHints* pHints);
+ DocFormStatus IsFormAvail(DownloadHints* pHints);
+ DocLinearizationStatus IsLinearizedPDF();
+ FX_BOOL IsLinearized();
+ void GetLinearizedMainXRefInfo(FX_FILESIZE* pPos, uint32_t* pSize);
+ IFX_FileRead* GetFileRead() const { return m_pFileRead; }
+ int GetPageCount() const;
+ CPDF_Dictionary* GetPage(int index);
+
+ friend class CPDF_HintTables;
+
+ protected:
+ class PageNode {
+ public:
+ PageNode();
+ ~PageNode();
+
+ PDF_PAGENODE_TYPE m_type;
+ uint32_t m_dwPageNo;
+ CFX_ArrayTemplate<PageNode*> m_childNode;
+ };
+
+ static const int kMaxDataAvailRecursionDepth = 64;
+ static int s_CurrentDataAvailRecursionDepth;
+ static const int kMaxPageRecursionDepth = 1024;
+
+ uint32_t GetObjectSize(uint32_t objnum, FX_FILESIZE& offset);
+ FX_BOOL IsObjectsAvail(CFX_ArrayTemplate<CPDF_Object*>& obj_array,
+ FX_BOOL bParsePage,
+ DownloadHints* pHints,
+ CFX_ArrayTemplate<CPDF_Object*>& ret_array);
+ FX_BOOL CheckDocStatus(DownloadHints* pHints);
+ FX_BOOL CheckHeader(DownloadHints* pHints);
+ FX_BOOL CheckFirstPage(DownloadHints* pHints);
+ FX_BOOL CheckHintTables(DownloadHints* pHints);
+ FX_BOOL CheckEnd(DownloadHints* pHints);
+ FX_BOOL CheckCrossRef(DownloadHints* pHints);
+ FX_BOOL CheckCrossRefItem(DownloadHints* pHints);
+ FX_BOOL CheckTrailer(DownloadHints* pHints);
+ FX_BOOL CheckRoot(DownloadHints* pHints);
+ FX_BOOL CheckInfo(DownloadHints* pHints);
+ FX_BOOL CheckPages(DownloadHints* pHints);
+ FX_BOOL CheckPage(DownloadHints* pHints);
+ FX_BOOL CheckResources(DownloadHints* pHints);
+ FX_BOOL CheckAnnots(DownloadHints* pHints);
+ FX_BOOL CheckAcroForm(DownloadHints* pHints);
+ FX_BOOL CheckAcroFormSubObject(DownloadHints* pHints);
+ FX_BOOL CheckTrailerAppend(DownloadHints* pHints);
+ FX_BOOL CheckPageStatus(DownloadHints* pHints);
+ FX_BOOL CheckAllCrossRefStream(DownloadHints* pHints);
+
+ int32_t CheckCrossRefStream(DownloadHints* pHints, FX_FILESIZE& xref_offset);
+ FX_BOOL IsLinearizedFile(uint8_t* pData, uint32_t dwLen);
+ void SetStartOffset(FX_FILESIZE dwOffset);
+ FX_BOOL GetNextToken(CFX_ByteString& token);
+ FX_BOOL GetNextChar(uint8_t& ch);
+ CPDF_Object* ParseIndirectObjectAt(
+ FX_FILESIZE pos,
+ uint32_t objnum,
+ CPDF_IndirectObjectHolder* pObjList = nullptr);
+ CPDF_Object* GetObject(uint32_t objnum,
+ DownloadHints* pHints,
+ FX_BOOL* pExistInFile);
+ FX_BOOL GetPageKids(CPDF_Parser* pParser, CPDF_Object* pPages);
+ FX_BOOL PreparePageItem();
+ FX_BOOL LoadPages(DownloadHints* pHints);
+ FX_BOOL LoadAllXref(DownloadHints* pHints);
+ FX_BOOL LoadAllFile(DownloadHints* pHints);
+ DocAvailStatus CheckLinearizedData(DownloadHints* pHints);
+ FX_BOOL CheckPageAnnots(uint32_t dwPage, DownloadHints* pHints);
+
+ DocAvailStatus CheckLinearizedFirstPage(uint32_t dwPage,
+ DownloadHints* pHints);
+ FX_BOOL HaveResourceAncestor(CPDF_Dictionary* pDict);
+ FX_BOOL CheckPage(uint32_t dwPage, DownloadHints* pHints);
+ FX_BOOL LoadDocPages(DownloadHints* pHints);
+ FX_BOOL LoadDocPage(uint32_t dwPage, DownloadHints* pHints);
+ FX_BOOL CheckPageNode(PageNode& pageNodes,
+ int32_t iPage,
+ int32_t& iCount,
+ DownloadHints* pHints,
+ int level);
+ FX_BOOL CheckUnkownPageNode(uint32_t dwPageNo,
+ PageNode* pPageNode,
+ DownloadHints* pHints);
+ FX_BOOL CheckArrayPageNode(uint32_t dwPageNo,
+ PageNode* pPageNode,
+ DownloadHints* pHints);
+ FX_BOOL CheckPageCount(DownloadHints* pHints);
+ bool IsFirstCheck(uint32_t dwPage);
+ void ResetFirstCheck(uint32_t dwPage);
+ FX_BOOL IsDataAvail(FX_FILESIZE offset, uint32_t size, DownloadHints* pHints);
+
+ FileAvail* const m_pFileAvail;
+ IFX_FileRead* const m_pFileRead;
+ CPDF_Parser m_parser;
+ CPDF_SyntaxParser m_syntaxParser;
+ CPDF_Object* m_pRoot;
+ uint32_t m_dwRootObjNum;
+ uint32_t m_dwInfoObjNum;
+ CPDF_Object* m_pLinearized;
+ CPDF_Object* m_pTrailer;
+ FX_BOOL m_bDocAvail;
+ FX_FILESIZE m_dwHeaderOffset;
+ FX_FILESIZE m_dwLastXRefOffset;
+ FX_FILESIZE m_dwXRefOffset;
+ FX_FILESIZE m_dwTrailerOffset;
+ FX_FILESIZE m_dwCurrentOffset;
+ PDF_DATAAVAIL_STATUS m_docStatus;
+ FX_FILESIZE m_dwFileLen;
+ CPDF_Document* m_pDocument;
+ std::set<uint32_t> m_ObjectSet;
+ CFX_ArrayTemplate<CPDF_Object*> m_objs_array;
+ FX_FILESIZE m_Pos;
+ FX_FILESIZE m_bufferOffset;
+ uint32_t m_bufferSize;
+ CFX_ByteString m_WordBuf;
+ uint8_t m_bufferData[512];
+ CFX_ArrayTemplate<uint32_t> m_XRefStreamList;
+ CFX_ArrayTemplate<uint32_t> m_PageObjList;
+ uint32_t m_PagesObjNum;
+ FX_BOOL m_bLinearized;
+ uint32_t m_dwFirstPageNo;
+ FX_BOOL m_bLinearedDataOK;
+ FX_BOOL m_bMainXRefLoadTried;
+ FX_BOOL m_bMainXRefLoadedOK;
+ FX_BOOL m_bPagesTreeLoad;
+ FX_BOOL m_bPagesLoad;
+ CPDF_Parser* m_pCurrentParser;
+ FX_FILESIZE m_dwCurrentXRefSteam;
+ FX_BOOL m_bAnnotsLoad;
+ FX_BOOL m_bHaveAcroForm;
+ uint32_t m_dwAcroFormObjNum;
+ FX_BOOL m_bAcroFormLoad;
+ CPDF_Object* m_pAcroForm;
+ CFX_ArrayTemplate<CPDF_Object*> m_arrayAcroforms;
+ CPDF_Dictionary* m_pPageDict;
+ CPDF_Object* m_pPageResource;
+ FX_BOOL m_bNeedDownLoadResource;
+ FX_BOOL m_bPageLoadedOK;
+ FX_BOOL m_bLinearizedFormParamLoad;
+ CFX_ArrayTemplate<CPDF_Object*> m_PagesArray;
+ uint32_t m_dwEncryptObjNum;
+ FX_FILESIZE m_dwPrevXRefOffset;
+ FX_BOOL m_bTotalLoadPageTree;
+ FX_BOOL m_bCurPageDictLoadOK;
+ PageNode m_pageNodes;
+ std::set<uint32_t> m_pageMapCheckState;
+ std::set<uint32_t> m_pagesLoadState;
+ std::unique_ptr<CPDF_HintTables> m_pHintTables;
+ FX_BOOL m_bSupportHintTable;
+};
+
+#endif // CORE_FPDFAPI_FPDF_PARSER_CPDF_DATA_AVAIL_H_