Home | History | Annotate | Download | only in fpdfapi
      1 // Copyright 2014 PDFium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
      6 
      7 #ifndef _FPDF_PARSER_
      8 #define _FPDF_PARSER_
      9 #ifndef _FX_BASIC_H_
     10 #include "../fxcrt/fx_ext.h"
     11 #endif
     12 #ifndef _FPDF_OBJECTS_
     13 #include "fpdf_objects.h"
     14 #endif
     15 class CPDF_Document;
     16 class IPDF_DocParser;
     17 class CPDF_Parser;
     18 class CPDF_SecurityHandler;
     19 class CPDF_StandardSecurityHandler;
     20 class CPDF_CryptoHandler;
     21 class CPDF_Object;
     22 class IFX_FileRead;
     23 class CFDF_Document;
     24 class CFDF_Parser;
     25 class CFX_Font;
     26 class CFX_AffineMatrix;
     27 class CFX_FloatRect;
     28 class CPDF_Point;
     29 class CPDF_DocPageData;
     30 class CPDF_DocRenderData;
     31 class CPDF_ModuleMgr;
     32 class CFX_DIBSource;
     33 class CPDF_Font;
     34 class CPDF_Image;
     35 class CPDF_ColorSpace;
     36 class CPDF_Pattern;
     37 class CPDF_FontEncoding;
     38 class CPDF_IccProfile;
     39 class CFX_PrivateData;
     40 #define FPDFPERM_PRINT			0x0004
     41 #define FPDFPERM_MODIFY			0x0008
     42 #define FPDFPERM_EXTRACT		0x0010
     43 #define FPDFPERM_ANNOT_FORM		0x0020
     44 #define FPDFPERM_FILL_FORM		0x0100
     45 #define FPDFPERM_EXTRACT_ACCESS	0x0200
     46 #define FPDFPERM_ASSEMBLE		0x0400
     47 #define FPDFPERM_PRINT_HIGH		0x0800
     48 #define FPDF_PAGE_MAX_NUM		0xFFFFF
     49 class IPDF_EnumPageHandler
     50 {
     51 public:
     52 
     53     virtual FX_BOOL EnumPage(CPDF_Dictionary* pPageDict) = 0;
     54 };
     55 class CPDF_Document : public CFX_PrivateData, public CPDF_IndirectObjects
     56 {
     57 public:
     58 
     59     CPDF_Document(IPDF_DocParser* pParser);
     60 
     61     CPDF_Document();
     62 
     63     ~CPDF_Document();
     64 
     65     IPDF_DocParser*			GetParser() const
     66     {
     67         return m_pParser;
     68     }
     69 
     70     CPDF_Dictionary*		GetRoot() const
     71     {
     72         return m_pRootDict;
     73     }
     74 
     75     CPDF_Dictionary*		GetInfo() const
     76     {
     77         return m_pInfoDict;
     78     }
     79 
     80     void					GetID(CFX_ByteString& id1, CFX_ByteString& id2) const
     81     {
     82         id1 = m_ID1;
     83         id2 = m_ID2;
     84     }
     85 
     86     int						GetPageCount() const;
     87 
     88     CPDF_Dictionary*		GetPage(int iPage);
     89 
     90     int						GetPageIndex(FX_DWORD objnum);
     91 
     92     void					EnumPages(IPDF_EnumPageHandler* pHandler);
     93 
     94     FX_DWORD				GetUserPermissions(FX_BOOL bCheckRevision = FALSE) const;
     95 
     96     FX_BOOL					IsOwner() const;
     97 
     98 
     99 
    100     CPDF_DocPageData*		GetPageData()
    101     {
    102         return GetValidatePageData();
    103     }
    104 
    105     void					ClearPageData();
    106 
    107     void					RemoveColorSpaceFromPageData(CPDF_Object* pObject);
    108 
    109 
    110     CPDF_DocRenderData*		GetRenderData()
    111     {
    112         return GetValidateRenderData();
    113     }
    114 
    115     void					ClearRenderData();
    116 
    117     void					ClearRenderFont();
    118 
    119 
    120     FX_BOOL					IsFormStream(FX_DWORD objnum, FX_BOOL& bForm) const;
    121 
    122 
    123 
    124 
    125     CPDF_Font*				LoadFont(CPDF_Dictionary* pFontDict);
    126 
    127     CPDF_Font*				FindFont(CPDF_Dictionary* pFontDict);
    128 
    129     CPDF_ColorSpace*		LoadColorSpace(CPDF_Object* pCSObj, CPDF_Dictionary* pResources = NULL);
    130 
    131     CPDF_Pattern*			LoadPattern(CPDF_Object* pObj, FX_BOOL bShading, const CFX_AffineMatrix* matrix = NULL);
    132 
    133     CPDF_Image*				LoadImageF(CPDF_Object* pObj);
    134 
    135     CPDF_StreamAcc*			LoadFontFile(CPDF_Stream* pStream);
    136 
    137     CPDF_IccProfile*		LoadIccProfile(CPDF_Stream* pStream, int nComponents);
    138 
    139 #if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
    140 
    141     CPDF_Font*				AddWindowsFont(LOGFONTA* pLogFont, FX_BOOL bVert, FX_BOOL bTranslateName = FALSE);
    142     CPDF_Font*				AddWindowsFont(LOGFONTW* pLogFont, FX_BOOL bVert, FX_BOOL bTranslateName = FALSE);
    143 #endif
    144 #if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
    145     CPDF_Font*              AddMacFont(CTFontRef pFont, FX_BOOL bVert, FX_BOOL bTranslateName = FALSE);
    146 #endif
    147 
    148     CPDF_Font*				AddStandardFont(const FX_CHAR* font, CPDF_FontEncoding* pEncoding);
    149 
    150 
    151     CPDF_Font*				AddFont(CFX_Font* pFont, int charset, FX_BOOL bVert);
    152 
    153     void					CreateNewDoc();
    154 
    155     CPDF_Dictionary*		CreateNewPage(int iPage);
    156 
    157     void					DeletePage(int iPage);
    158 
    159     void					LoadDoc();
    160     void					LoadAsynDoc(CPDF_Dictionary *pLinearized);
    161     void					LoadPages();
    162 protected:
    163 
    164     CPDF_Dictionary*		m_pRootDict;
    165 
    166     CPDF_Dictionary*		m_pInfoDict;
    167 
    168     CFX_ByteString			m_ID1;
    169 
    170     CFX_ByteString			m_ID2;
    171 
    172 
    173     FX_BOOL					m_bLinearized;
    174 
    175     FX_DWORD				m_dwFirstPageNo;
    176 
    177     FX_DWORD				m_dwFirstPageObjNum;
    178 
    179     CFX_DWordArray			m_PageList;
    180 
    181     int						_GetPageCount() const;
    182     CPDF_Dictionary*		_FindPDFPage(CPDF_Dictionary* pPages, int iPage, int nPagesToGo, int level);
    183     int						_FindPageIndex(CPDF_Dictionary* pNode, FX_DWORD& skip_count, FX_DWORD objnum, int& index, int level = 0);
    184     FX_BOOL					IsContentUsedElsewhere(FX_DWORD objnum, CPDF_Dictionary* pPageDict);
    185     FX_BOOL					CheckOCGVisible(CPDF_Dictionary* pOCG, FX_BOOL bPrinting);
    186     CPDF_DocPageData*		GetValidatePageData();
    187     CPDF_DocRenderData*		GetValidateRenderData();
    188     friend class			CPDF_Creator;
    189     friend class			CPDF_Parser;
    190     friend class			CPDF_DataAvail;
    191     friend class			CPDF_OCContext;
    192 
    193 
    194 
    195     CPDF_DocPageData*		m_pDocPage;
    196 
    197     CPDF_DocRenderData*		m_pDocRender;
    198 
    199 };
    200 
    201 #define PDFWORD_EOF			0
    202 #define PDFWORD_NUMBER		1
    203 #define PDFWORD_TEXT		2
    204 #define PDFWORD_DELIMITER	3
    205 #define PDFWORD_NAME		4
    206 class CPDF_SimpleParser : public CFX_Object
    207 {
    208 public:
    209 
    210     CPDF_SimpleParser(FX_LPCBYTE pData, FX_DWORD dwSize);
    211 
    212     CPDF_SimpleParser(FX_BSTR str);
    213 
    214     CFX_ByteStringC		GetWord();
    215 
    216     FX_BOOL				SearchToken(FX_BSTR token);
    217 
    218     FX_BOOL				SkipWord(FX_BSTR token);
    219 
    220     FX_BOOL				FindTagPair(FX_BSTR start_token, FX_BSTR end_token,
    221                                     FX_DWORD& start_pos, FX_DWORD& end_pos);
    222 
    223     FX_BOOL				FindTagParam(FX_BSTR token, int nParams);
    224 
    225     FX_DWORD			GetPos()
    226     {
    227         return m_dwCurPos;
    228     }
    229 
    230     void				SetPos(FX_DWORD pos)
    231     {
    232         ASSERT(pos <= m_dwSize);
    233         m_dwCurPos = pos;
    234     }
    235 private:
    236 
    237     void				ParseWord(FX_LPCBYTE& pStart, FX_DWORD& dwSize, int& type);
    238 
    239     FX_LPCBYTE			m_pData;
    240 
    241     FX_DWORD			m_dwSize;
    242 
    243     FX_DWORD			m_dwCurPos;
    244 };
    245 class CPDF_SyntaxParser : public CFX_Object
    246 {
    247 public:
    248 
    249     CPDF_SyntaxParser();
    250 
    251     ~CPDF_SyntaxParser();
    252 
    253     void				InitParser(IFX_FileRead* pFileAccess, FX_DWORD HeaderOffset);
    254 
    255     FX_FILESIZE			SavePos()
    256     {
    257         return m_Pos;
    258     }
    259 
    260     void				RestorePos(FX_FILESIZE pos)
    261     {
    262         m_Pos = pos;
    263     }
    264 
    265     CPDF_Object*		GetObject(CPDF_IndirectObjects* pObjList, FX_DWORD objnum, FX_DWORD gennum, int level, struct PARSE_CONTEXT* pContext = NULL, FX_BOOL bDecrypt = TRUE);
    266 
    267 
    268     CPDF_Object*		GetObjectByStrict(CPDF_IndirectObjects* pObjList, FX_DWORD objnum, FX_DWORD gennum, int level, struct PARSE_CONTEXT* pContext = NULL);
    269 
    270     int					GetDirectNum();
    271 
    272     CFX_ByteString		GetString(FX_DWORD objnum, FX_DWORD gennum);
    273 
    274     CFX_ByteString		GetName();
    275 
    276     CFX_ByteString		GetKeyword();
    277 
    278     void				GetBinary(FX_BYTE* buffer, FX_DWORD size);
    279 
    280     void				ToNextLine();
    281 
    282     void				ToNextWord();
    283 
    284     FX_BOOL				SearchWord(FX_BSTR word, FX_BOOL bWholeWord, FX_BOOL bForward, FX_FILESIZE limit);
    285 
    286     int					SearchMultiWord(FX_BSTR words, FX_BOOL bWholeWord, FX_FILESIZE limit);
    287 
    288     FX_FILESIZE			FindTag(FX_BSTR tag, FX_FILESIZE limit);
    289 
    290     void				SetEncrypt(CPDF_CryptoHandler* pCryptoHandler)
    291     {
    292         m_pCryptoHandler = pCryptoHandler;
    293     }
    294 
    295     FX_BOOL				IsEncrypted()
    296     {
    297         return m_pCryptoHandler != NULL;
    298     }
    299 
    300     FX_BOOL				GetCharAt(FX_FILESIZE pos, FX_BYTE& ch);
    301 
    302     FX_BOOL				ReadBlock(FX_BYTE* pBuf, FX_DWORD size);
    303 
    304     CFX_ByteString		GetNextWord(FX_BOOL& bIsNumber);
    305 protected:
    306 
    307     virtual FX_BOOL				GetNextChar(FX_BYTE& ch);
    308 
    309     FX_BOOL				GetCharAtBackward(FX_FILESIZE pos, FX_BYTE& ch);
    310 
    311     void				GetNextWord();
    312 
    313     FX_BOOL				IsWholeWord(FX_FILESIZE startpos, FX_FILESIZE limit, FX_LPCBYTE tag, FX_DWORD taglen);
    314 
    315     CFX_ByteString		ReadString();
    316 
    317     CFX_ByteString		ReadHexString();
    318 
    319     CPDF_Stream*		ReadStream(CPDF_Dictionary* pDict, PARSE_CONTEXT* pContext, FX_DWORD objnum, FX_DWORD gennum);
    320 
    321     FX_FILESIZE			m_Pos;
    322 
    323     FX_BOOL				m_bFileStream;
    324 
    325     int					m_MetadataObjnum;
    326 
    327     IFX_FileRead*		m_pFileAccess;
    328 
    329     FX_DWORD			m_HeaderOffset;
    330 
    331     FX_FILESIZE			m_FileLen;
    332 
    333     FX_BYTE*			m_pFileBuf;
    334 
    335     FX_DWORD			m_BufSize;
    336 
    337     FX_FILESIZE			m_BufOffset;
    338 
    339     CPDF_CryptoHandler*	m_pCryptoHandler;
    340 
    341     FX_BYTE				m_WordBuffer[257];
    342 
    343     FX_DWORD			m_WordSize;
    344 
    345     FX_BOOL				m_bIsNumber;
    346 
    347     FX_FILESIZE			m_dwWordPos;
    348     friend class		CPDF_Parser;
    349     friend class		CPDF_DataAvail;
    350 };
    351 
    352 #define PDFPARSE_TYPEONLY	1
    353 #define PDFPARSE_NOSTREAM	2
    354 struct PARSE_CONTEXT {
    355 
    356     FX_BOOL		m_Flags;
    357 
    358     FX_FILESIZE	m_DictStart;
    359 
    360     FX_FILESIZE	m_DictEnd;
    361 
    362     FX_FILESIZE	m_DataStart;
    363 
    364     FX_FILESIZE	m_DataEnd;
    365 };
    366 class IPDF_DocParser : public CFX_Object
    367 {
    368 public:
    369 
    370     virtual FX_DWORD	GetRootObjNum() = 0;
    371 
    372     virtual FX_DWORD	GetInfoObjNum() = 0;
    373 
    374     virtual CPDF_Object*	ParseIndirectObject(CPDF_IndirectObjects* pObjList, FX_DWORD objnum, PARSE_CONTEXT* pContext = NULL) = 0;
    375 
    376     virtual FX_DWORD	GetLastObjNum() = 0;
    377 
    378     virtual CPDF_Array*	GetIDArray() = 0;
    379 
    380     virtual CPDF_Dictionary*	GetEncryptDict() = 0;
    381 
    382     FX_BOOL				IsEncrypted()
    383     {
    384         return GetEncryptDict() != NULL;
    385     }
    386 
    387     virtual FX_DWORD	GetPermissions(FX_BOOL bCheckRevision = FALSE) = 0;
    388 
    389     virtual FX_BOOL		IsOwner() = 0;
    390 
    391     virtual FX_BOOL		IsFormStream(FX_DWORD objnum, FX_BOOL& bForm) = 0;
    392 };
    393 
    394 #define PDFPARSE_ERROR_SUCCESS		0
    395 #define PDFPARSE_ERROR_FILE			1
    396 #define PDFPARSE_ERROR_FORMAT		2
    397 #define PDFPARSE_ERROR_PASSWORD		3
    398 #define PDFPARSE_ERROR_HANDLER		4
    399 #define PDFPARSE_ERROR_CERT			5
    400 class CPDF_Parser : public IPDF_DocParser
    401 {
    402 public:
    403 
    404     CPDF_Parser();
    405 
    406     ~CPDF_Parser();
    407 
    408     FX_DWORD			StartParse(FX_LPCSTR filename, FX_BOOL bReParse = FALSE);
    409 
    410     FX_DWORD			StartParse(FX_LPCWSTR filename, FX_BOOL bReParse = FALSE);
    411 
    412     FX_DWORD			StartParse(IFX_FileRead* pFile, FX_BOOL bReParse = FALSE, FX_BOOL bOwnFileRead = TRUE);
    413 
    414     void				CloseParser(FX_BOOL bReParse = FALSE);
    415 
    416     virtual FX_DWORD	GetPermissions(FX_BOOL bCheckRevision = FALSE);
    417 
    418     virtual FX_BOOL		IsOwner();
    419 
    420     void				SetPassword(const FX_CHAR* password)
    421     {
    422         m_Password = password;
    423     }
    424 
    425     CFX_ByteString		GetPassword()
    426     {
    427         return m_Password;
    428     }
    429 
    430     CPDF_SecurityHandler* GetSecurityHandler()
    431     {
    432         return m_pSecurityHandler;
    433     }
    434 
    435     CPDF_CryptoHandler*	GetCryptoHandler()
    436     {
    437         return m_Syntax.m_pCryptoHandler;
    438     }
    439 
    440     void				SetSecurityHandler(CPDF_SecurityHandler* pSecurityHandler, FX_BOOL bForced = FALSE);
    441 
    442     CFX_ByteString		GetRecipient()
    443     {
    444         return m_bsRecipient;
    445     }
    446 
    447     CPDF_Dictionary*	GetTrailer()
    448     {
    449         return m_pTrailer;
    450     }
    451 
    452     FX_FILESIZE			GetLastXRefOffset()
    453     {
    454         return m_LastXRefOffset;
    455     }
    456 
    457     CPDF_Document*		GetDocument()
    458     {
    459         return m_pDocument;
    460     }
    461     CFX_ArrayTemplate<CPDF_Dictionary *> * GetOtherTrailers()
    462     {
    463         return &m_Trailers;
    464     }
    465 
    466     virtual FX_DWORD	GetRootObjNum();
    467     virtual FX_DWORD	GetInfoObjNum();
    468     virtual CPDF_Array*	GetIDArray();
    469     virtual CPDF_Dictionary*	GetEncryptDict()
    470     {
    471         return m_pEncryptDict;
    472     }
    473     virtual CPDF_Object*		ParseIndirectObject(CPDF_IndirectObjects* pObjList, FX_DWORD objnum, PARSE_CONTEXT* pContext = NULL);
    474     virtual FX_DWORD	GetLastObjNum();
    475     virtual FX_BOOL		IsFormStream(FX_DWORD objnum, FX_BOOL& bForm);
    476 
    477     FX_FILESIZE			GetObjectOffset(FX_DWORD objnum);
    478 
    479     FX_FILESIZE			GetObjectSize(FX_DWORD objnum);
    480 
    481     int					GetObjectVersion(FX_DWORD objnum)
    482     {
    483         return m_ObjVersion[objnum];
    484     }
    485 
    486     void				GetIndirectBinary(FX_DWORD objnum, FX_BYTE*& pBuffer, FX_DWORD& size);
    487 
    488     FX_BOOL				GetFileStreamOption()
    489     {
    490         return m_Syntax.m_bFileStream;
    491     }
    492 
    493     void				SetFileStreamOption(FX_BOOL b)
    494     {
    495         m_Syntax.m_bFileStream = b;
    496     }
    497 
    498     IFX_FileRead*		GetFileAccess() const
    499     {
    500         return m_Syntax.m_pFileAccess;
    501     }
    502 
    503     int					GetFileVersion() const
    504     {
    505         return m_FileVersion;
    506     }
    507 
    508     FX_BOOL				IsXRefStream() const
    509     {
    510         return m_bXRefStream;
    511     }
    512     CPDF_Object*		ParseIndirectObjectAt(CPDF_IndirectObjects* pObjList, FX_FILESIZE pos, FX_DWORD objnum,
    513             struct PARSE_CONTEXT* pContext);
    514 
    515     CPDF_Object*		ParseIndirectObjectAtByStrict(CPDF_IndirectObjects* pObjList, FX_FILESIZE pos, FX_DWORD objnum,
    516             struct PARSE_CONTEXT* pContext, FX_FILESIZE *pResultPos);
    517 
    518     FX_DWORD			StartAsynParse(IFX_FileRead* pFile, FX_BOOL bReParse = FALSE, FX_BOOL bOwnFileRead = TRUE);
    519 
    520     FX_DWORD			GetFirstPageNo()
    521     {
    522         return m_dwFirstPageNo;
    523     }
    524 protected:
    525 
    526     CPDF_Document*		m_pDocument;
    527 
    528     CPDF_SyntaxParser	m_Syntax;
    529     FX_BOOL				m_bOwnFileRead;
    530     CPDF_Object*		ParseDirect(CPDF_Object* pObj);
    531 
    532     FX_BOOL				LoadAllCrossRefV4(FX_FILESIZE pos);
    533 
    534     FX_BOOL				LoadAllCrossRefV5(FX_FILESIZE pos);
    535 
    536     FX_BOOL				LoadCrossRefV4(FX_FILESIZE pos, FX_FILESIZE streampos, FX_BOOL bSkip, FX_BOOL bFirst);
    537 
    538     FX_BOOL				LoadCrossRefV5(FX_FILESIZE pos, FX_FILESIZE& prev, FX_BOOL bMainXRef);
    539 
    540     CPDF_Dictionary*	LoadTrailerV4();
    541 
    542     FX_BOOL				RebuildCrossRef();
    543 
    544     FX_DWORD			SetEncryptHandler();
    545 
    546     void				ReleaseEncryptHandler();
    547 
    548     FX_BOOL				LoadLinearizedAllCrossRefV4(FX_FILESIZE pos, FX_DWORD dwObjCount);
    549 
    550     FX_BOOL				LoadLinearizedCrossRefV4(FX_FILESIZE pos, FX_DWORD dwObjCount);
    551 
    552     FX_BOOL				LoadLinearizedAllCrossRefV5(FX_FILESIZE pos);
    553 
    554     FX_DWORD			LoadLinearizedMainXRefTable();
    555 
    556     CFX_MapPtrToPtr		m_ObjectStreamMap;
    557 
    558     CPDF_StreamAcc*		GetObjectStream(FX_DWORD number);
    559 
    560     FX_BOOL				IsLinearizedFile(IFX_FileRead* pFileAccess, FX_DWORD offset);
    561 
    562 
    563 
    564     int					m_FileVersion;
    565 
    566     CPDF_Dictionary*	m_pTrailer;
    567 
    568     CPDF_Dictionary*	m_pEncryptDict;
    569     void SetEncryptDictionary(CPDF_Dictionary* pDict);
    570 
    571     FX_FILESIZE			m_LastXRefOffset;
    572 
    573     FX_BOOL				m_bXRefStream;
    574 
    575 
    576     CPDF_SecurityHandler*	m_pSecurityHandler;
    577 
    578     FX_BOOL					m_bForceUseSecurityHandler;
    579 
    580     CFX_ByteString			m_bsRecipient;
    581 
    582     CFX_ByteString		m_FilePath;
    583 
    584     CFX_ByteString		m_Password;
    585 
    586     CFX_FileSizeArray	m_CrossRef;
    587 
    588     CFX_ByteArray		m_V5Type;
    589 
    590     CFX_FileSizeArray	m_SortedOffset;
    591 
    592     CFX_WordArray		m_ObjVersion;
    593     CFX_ArrayTemplate<CPDF_Dictionary *>	m_Trailers;
    594 
    595     FX_BOOL				m_bVersionUpdated;
    596 
    597     CPDF_Object*		m_pLinearized;
    598 
    599     FX_DWORD			m_dwFirstPageNo;
    600 
    601     FX_DWORD			m_dwXrefStartObjNum;
    602     friend class		CPDF_Creator;
    603     friend class		CPDF_DataAvail;
    604 };
    605 #define FXCIPHER_NONE	0
    606 #define FXCIPHER_RC4	1
    607 #define FXCIPHER_AES	2
    608 #define FXCIPHER_AES2   3
    609 class CPDF_SecurityHandler : public CFX_Object
    610 {
    611 public:
    612 
    613     virtual ~CPDF_SecurityHandler() {}
    614 
    615     virtual FX_BOOL		OnInit(CPDF_Parser* pParser, CPDF_Dictionary* pEncryptDict) = 0;
    616 
    617     virtual FX_DWORD	GetPermissions() = 0;
    618 
    619     virtual FX_BOOL		IsOwner() = 0;
    620 
    621     virtual FX_BOOL		GetCryptInfo(int& cipher, FX_LPCBYTE& buffer, int& keylen) = 0;
    622 
    623     virtual FX_BOOL		IsMetadataEncrypted()
    624     {
    625         return TRUE;
    626     }
    627 
    628     virtual CPDF_CryptoHandler*	CreateCryptoHandler() = 0;
    629 
    630     virtual CPDF_StandardSecurityHandler* GetStandardHandler()
    631     {
    632         return NULL;
    633     }
    634 };
    635 #define PDF_ENCRYPT_CONTENT				0
    636 class CPDF_StandardSecurityHandler : public CPDF_SecurityHandler
    637 {
    638 public:
    639     CPDF_StandardSecurityHandler();
    640 
    641     virtual ~CPDF_StandardSecurityHandler();
    642     virtual FX_BOOL		OnInit(CPDF_Parser* pParser, CPDF_Dictionary* pEncryptDict);
    643     virtual FX_DWORD	GetPermissions();
    644     virtual FX_BOOL		IsOwner()
    645     {
    646         return m_bOwner;
    647     }
    648     virtual FX_BOOL		GetCryptInfo(int& cipher, FX_LPCBYTE& buffer, int& keylen);
    649     virtual FX_BOOL		IsMetadataEncrypted();
    650     virtual CPDF_CryptoHandler*	CreateCryptoHandler();
    651     virtual CPDF_StandardSecurityHandler* GetStandardHandler()
    652     {
    653         return this;
    654     }
    655 
    656     void				OnCreate(CPDF_Dictionary* pEncryptDict, CPDF_Array* pIdArray,
    657                                  FX_LPCBYTE user_pass, FX_DWORD user_size,
    658                                  FX_LPCBYTE owner_pass, FX_DWORD owner_size, FX_DWORD type = PDF_ENCRYPT_CONTENT);
    659 
    660     void				OnCreate(CPDF_Dictionary* pEncryptDict, CPDF_Array* pIdArray,
    661                                  FX_LPCBYTE user_pass, FX_DWORD user_size, FX_DWORD type = PDF_ENCRYPT_CONTENT);
    662 
    663     CFX_ByteString		GetUserPassword(FX_LPCBYTE owner_pass, FX_DWORD pass_size);
    664     CFX_ByteString		GetUserPassword(FX_LPCBYTE owner_pass, FX_DWORD pass_size, FX_INT32 key_len);
    665     int					GetVersion()
    666     {
    667         return m_Version;
    668     }
    669     int					GetRevision()
    670     {
    671         return m_Revision;
    672     }
    673 
    674     int					CheckPassword(FX_LPCBYTE password, FX_DWORD pass_size, FX_BOOL bOwner, FX_LPBYTE key);
    675     int					CheckPassword(FX_LPCBYTE password, FX_DWORD pass_size, FX_BOOL bOwner, FX_LPBYTE key, int key_len);
    676 private:
    677 
    678     int					m_Version;
    679 
    680     int					m_Revision;
    681 
    682     CPDF_Parser*		m_pParser;
    683 
    684     CPDF_Dictionary*	m_pEncryptDict;
    685 
    686     FX_BOOL				LoadDict(CPDF_Dictionary* pEncryptDict);
    687     FX_BOOL				LoadDict(CPDF_Dictionary* pEncryptDict, FX_DWORD type, int& cipher, int& key_len);
    688 
    689     FX_BOOL				CheckUserPassword(FX_LPCBYTE password, FX_DWORD pass_size,
    690                                           FX_BOOL bIgnoreEncryptMeta, FX_LPBYTE key, FX_INT32 key_len);
    691 
    692     FX_BOOL				CheckOwnerPassword(FX_LPCBYTE password, FX_DWORD pass_size, FX_LPBYTE key, FX_INT32 key_len);
    693     FX_BOOL				AES256_CheckPassword(FX_LPCBYTE password, FX_DWORD size, FX_BOOL bOwner, FX_LPBYTE key);
    694     void				AES256_SetPassword(CPDF_Dictionary* pEncryptDict, FX_LPCBYTE password, FX_DWORD size, FX_BOOL bOwner, FX_LPCBYTE key);
    695     void				AES256_SetPerms(CPDF_Dictionary* pEncryptDict, FX_DWORD permission, FX_BOOL bEncryptMetadata, FX_LPCBYTE key);
    696     void				OnCreate(CPDF_Dictionary* pEncryptDict, CPDF_Array* pIdArray,
    697                                  FX_LPCBYTE user_pass, FX_DWORD user_size,
    698                                  FX_LPCBYTE owner_pass, FX_DWORD owner_size, FX_BOOL bDefault, FX_DWORD type);
    699     FX_BOOL				CheckSecurity(FX_INT32 key_len);
    700 
    701     FX_BOOL				m_bOwner;
    702 
    703     FX_DWORD			m_Permissions;
    704 
    705     int					m_Cipher;
    706 
    707     FX_BYTE				m_EncryptKey[32];
    708 
    709     int					m_KeyLen;
    710 };
    711 class CPDF_CryptoHandler : public CFX_Object
    712 {
    713 public:
    714 
    715     virtual ~CPDF_CryptoHandler() {}
    716 
    717     virtual FX_BOOL		Init(CPDF_Dictionary* pEncryptDict, CPDF_SecurityHandler* pSecurityHandler) = 0;
    718 
    719     virtual FX_DWORD	DecryptGetSize(FX_DWORD src_size) = 0;
    720 
    721     virtual FX_LPVOID	DecryptStart(FX_DWORD objnum, FX_DWORD gennum) = 0;
    722 
    723     virtual FX_BOOL		DecryptStream(FX_LPVOID context, FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf) = 0;
    724 
    725     virtual FX_BOOL		DecryptFinish(FX_LPVOID context, CFX_BinaryBuf& dest_buf) = 0;
    726 
    727 
    728     virtual FX_DWORD	EncryptGetSize(FX_DWORD objnum, FX_DWORD version, FX_LPCBYTE src_buf, FX_DWORD src_size) = 0;
    729 
    730     virtual FX_BOOL		EncryptContent(FX_DWORD objnum, FX_DWORD version, FX_LPCBYTE src_buf, FX_DWORD src_size,
    731                                        FX_LPBYTE dest_buf, FX_DWORD& dest_size) = 0;
    732 
    733     void				Decrypt(FX_DWORD objnum, FX_DWORD version, CFX_ByteString& str);
    734 };
    735 class CPDF_StandardCryptoHandler : public CPDF_CryptoHandler
    736 {
    737 public:
    738 
    739     CPDF_StandardCryptoHandler();
    740 
    741     virtual ~CPDF_StandardCryptoHandler();
    742 
    743     FX_BOOL				Init(int cipher, FX_LPCBYTE key, int keylen);
    744     virtual FX_BOOL		Init(CPDF_Dictionary* pEncryptDict, CPDF_SecurityHandler* pSecurityHandler);
    745     virtual FX_DWORD	DecryptGetSize(FX_DWORD src_size);
    746     virtual FX_LPVOID	DecryptStart(FX_DWORD objnum, FX_DWORD gennum);
    747     virtual FX_BOOL		DecryptStream(FX_LPVOID context, FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf);
    748     virtual FX_BOOL		DecryptFinish(FX_LPVOID context, CFX_BinaryBuf& dest_buf);
    749     virtual FX_DWORD	EncryptGetSize(FX_DWORD objnum, FX_DWORD version, FX_LPCBYTE src_buf, FX_DWORD src_size);
    750     virtual FX_BOOL		EncryptContent(FX_DWORD objnum, FX_DWORD version, FX_LPCBYTE src_buf, FX_DWORD src_size,
    751                                        FX_LPBYTE dest_buf, FX_DWORD& dest_size);
    752 protected:
    753 
    754     virtual void		CryptBlock(FX_BOOL bEncrypt, FX_DWORD objnum, FX_DWORD gennum, FX_LPCBYTE src_buf, FX_DWORD src_size,
    755                                    FX_LPBYTE dest_buf, FX_DWORD& dest_size);
    756     virtual FX_LPVOID	CryptStart(FX_DWORD objnum, FX_DWORD gennum, FX_BOOL bEncrypt);
    757     virtual FX_BOOL		CryptStream(FX_LPVOID context, FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf, FX_BOOL bEncrypt);
    758     virtual FX_BOOL		CryptFinish(FX_LPVOID context, CFX_BinaryBuf& dest_buf, FX_BOOL bEncrypt);
    759 
    760     FX_BYTE				m_EncryptKey[32];
    761 
    762     int					m_KeyLen;
    763 
    764     int					m_Cipher;
    765 
    766     FX_LPBYTE			m_pAESContext;
    767 };
    768 class CPDF_Point : public CFX_Object
    769 {
    770 public:
    771 
    772     CPDF_Point(FX_FLOAT xx, FX_FLOAT yy)
    773     {
    774         x = xx;
    775         y = yy;
    776     }
    777 
    778     FX_FLOAT			x;
    779 
    780     FX_FLOAT			y;
    781 };
    782 
    783 #define CPDF_Rect		CFX_FloatRect
    784 #define CPDF_Matrix		CFX_AffineMatrix
    785 CFX_ByteString PDF_NameDecode(FX_BSTR orig);
    786 CFX_ByteString PDF_NameDecode(const CFX_ByteString& orig);
    787 CFX_ByteString PDF_NameEncode(const CFX_ByteString& orig);
    788 CFX_ByteString PDF_EncodeString(const CFX_ByteString& src, FX_BOOL bHex = FALSE);
    789 CFX_WideString PDF_DecodeText(const CFX_ByteString& str, CFX_CharMap* pCharMap = NULL);
    790 CFX_WideString PDF_DecodeText(FX_LPCBYTE pData, FX_DWORD size, CFX_CharMap* pCharMap = NULL);
    791 CFX_ByteString PDF_EncodeText(FX_LPCWSTR pString, int len = -1, CFX_CharMap* pCharMap = NULL);
    792 FX_FLOAT PDF_ClipFloat(FX_FLOAT f);
    793 class CFDF_Document : public CPDF_IndirectObjects
    794 {
    795 public:
    796 
    797     static CFDF_Document*	CreateNewDoc();
    798 
    799     static CFDF_Document*	ParseFile(FX_LPCSTR file_path);
    800 
    801     static CFDF_Document*	ParseFile(FX_LPCWSTR file_path);
    802 
    803     static CFDF_Document*	ParseFile(IFX_FileRead *pFile, FX_BOOL bOwnFile = FALSE);
    804 
    805     static CFDF_Document*	ParseMemory(FX_LPCBYTE pData, FX_DWORD size);
    806 
    807     ~CFDF_Document();
    808 
    809     FX_BOOL					WriteFile(FX_LPCSTR file_path) const;
    810 
    811     FX_BOOL					WriteFile(FX_LPCWSTR file_path) const;
    812 
    813     FX_BOOL					WriteFile(IFX_FileWrite *pFile) const;
    814 
    815     FX_BOOL					WriteBuf(CFX_ByteTextBuf& buf) const;
    816 
    817     CPDF_Dictionary*		GetRoot() const
    818     {
    819         return m_pRootDict;
    820     }
    821 
    822     CFX_WideString			GetWin32Path() const;
    823 protected:
    824 
    825     CFDF_Document();
    826     void	ParseStream(IFX_FileRead *pFile, FX_BOOL bOwnFile);
    827     CPDF_Dictionary*		m_pRootDict;
    828     IFX_FileRead*			m_pFile;
    829     FX_BOOL					m_bOwnFile;
    830 };
    831 
    832 CFX_WideString	FPDF_FileSpec_GetWin32Path(const CPDF_Object* pFileSpec);
    833 void			FPDF_FileSpec_SetWin32Path(CPDF_Object* pFileSpec, const CFX_WideString& fullpath);
    834 
    835 void FlateEncode(const FX_BYTE* src_buf, FX_DWORD src_size, FX_LPBYTE& dest_buf, FX_DWORD& dest_size);
    836 FX_DWORD FlateDecode(const FX_BYTE* src_buf, FX_DWORD src_size, FX_LPBYTE& dest_buf, FX_DWORD& dest_size);
    837 FX_DWORD RunLengthDecode(const FX_BYTE* src_buf, FX_DWORD src_size, FX_LPBYTE& dest_buf, FX_DWORD& dest_size);
    838 class CPDF_NumberTree : public CFX_Object
    839 {
    840 public:
    841 
    842     CPDF_NumberTree(CPDF_Dictionary* pRoot)
    843     {
    844         m_pRoot = pRoot;
    845     }
    846 
    847     CPDF_Object*		LookupValue(int num);
    848 protected:
    849 
    850     CPDF_Dictionary*	m_pRoot;
    851 };
    852 
    853 class IFX_FileAvail
    854 {
    855 public:
    856 
    857     virtual FX_BOOL			IsDataAvail( FX_FILESIZE offset, FX_DWORD size) = 0;
    858 };
    859 class IFX_DownloadHints
    860 {
    861 public:
    862 
    863     virtual void			AddSegment(FX_FILESIZE offset, FX_DWORD size) = 0;
    864 };
    865 #define PDF_IS_LINEARIZED			1
    866 #define PDF_NOT_LINEARIZED			0
    867 #define PDF_UNKNOW_LINEARIZED		-1
    868 #define PDFFORM_NOTAVAIL		0
    869 #define PDFFORM_AVAIL			1
    870 #define PDFFORM_NOTEXIST		2
    871 class IPDF_DataAvail
    872 {
    873 public:
    874 
    875     virtual FX_BOOL			IsDocAvail(IFX_DownloadHints* pHints) = 0;
    876 
    877 
    878     virtual void			SetDocument(CPDF_Document* pDoc) = 0;
    879 
    880 
    881     virtual FX_BOOL			IsPageAvail(int iPage, IFX_DownloadHints* pHints) = 0;
    882 
    883     virtual FX_BOOL			IsLinearized() = 0;
    884 
    885     virtual FX_INT32		IsFormAvail(IFX_DownloadHints *pHints) = 0;
    886 
    887     virtual FX_INT32		IsLinearizedPDF() = 0;
    888 
    889     virtual void				GetLinearizedMainXRefInfo(FX_FILESIZE *pPos, FX_DWORD *pSize) = 0;
    890 };
    891 class CPDF_SortObjNumArray : public CFX_Object
    892 {
    893 public:
    894 
    895     void AddObjNum(FX_DWORD dwObjNum);
    896 
    897     FX_BOOL Find(FX_DWORD dwObjNum);
    898 
    899     void RemoveAll()
    900     {
    901         m_number_array.RemoveAll();
    902     }
    903 protected:
    904 
    905     FX_BOOL BinarySearch(FX_DWORD value, int &iNext);
    906 protected:
    907 
    908     CFX_DWordArray			m_number_array;
    909 };
    910 enum PDF_PAGENODE_TYPE {
    911     PDF_PAGENODE_UNKOWN = 0,
    912     PDF_PAGENODE_PAGE,
    913     PDF_PAGENODE_PAGES,
    914     PDF_PAGENODE_ARRAY,
    915 };
    916 class CPDF_PageNode : public CFX_Object
    917 {
    918 public:
    919     CPDF_PageNode() : m_type(PDF_PAGENODE_UNKOWN) {}
    920     ~CPDF_PageNode();
    921     PDF_PAGENODE_TYPE	m_type;
    922     FX_DWORD			m_dwPageNo;
    923     CFX_PtrArray		m_childNode;
    924 };
    925 enum PDF_DATAAVAIL_STATUS {
    926     PDF_DATAAVAIL_HEADER = 0,
    927     PDF_DATAAVAIL_FIRSTPAGE,
    928     PDF_DATAAVAIL_FIRSTPAGE_PREPARE,
    929     PDF_DATAAVAIL_END,
    930     PDF_DATAAVAIL_CROSSREF,
    931     PDF_DATAAVAIL_CROSSREF_ITEM,
    932     PDF_DATAAVAIL_CROSSREF_STREAM,
    933     PDF_DATAAVAIL_TRAILER,
    934     PDF_DATAAVAIL_LOADALLCRSOSSREF,
    935     PDF_DATAAVAIL_ROOT,
    936     PDF_DATAAVAIL_INFO,
    937     PDF_DATAAVAIL_ACROFORM,
    938     PDF_DATAAVAIL_ACROFORM_SUBOBJECT,
    939     PDF_DATAAVAIL_PAGETREE,
    940     PDF_DATAAVAIL_PAGE,
    941     PDF_DATAAVAIL_PAGE_LATERLOAD,
    942     PDF_DATAAVAIL_RESOURCES,
    943     PDF_DATAAVAIL_DONE,
    944     PDF_DATAAVAIL_ERROR,
    945     PDF_DATAAVAIL_LOADALLFILE,
    946     PDF_DATAAVAIL_TRAILER_APPEND
    947 };
    948 class CPDF_DataAvail : public CFX_Object, public IPDF_DataAvail
    949 {
    950 public:
    951 
    952     CPDF_DataAvail(IFX_FileAvail* pFileAvail, IFX_FileRead* pFileRead);
    953     ~CPDF_DataAvail();
    954 
    955     virtual FX_BOOL				IsDocAvail(IFX_DownloadHints* pHints);
    956 
    957 
    958     virtual void				SetDocument(CPDF_Document* pDoc);
    959 
    960 
    961     virtual FX_BOOL				IsPageAvail(int iPage, IFX_DownloadHints* pHints);
    962 
    963     virtual FX_INT32			IsFormAvail(IFX_DownloadHints *pHints);
    964 
    965     virtual FX_INT32			IsLinearizedPDF();
    966 
    967     virtual FX_BOOL				IsLinearized()
    968     {
    969         return m_bLinearized;
    970     }
    971 
    972     virtual void				GetLinearizedMainXRefInfo(FX_FILESIZE *pPos, FX_DWORD *pSize);
    973     IFX_FileRead*				GetFileRead() const
    974     {
    975         return m_pFileRead;
    976     }
    977     IFX_FileAvail*				GetFileAvail() const
    978     {
    979         return m_pFileAvail;
    980     }
    981 protected:
    982     FX_DWORD					GetObjectSize(FX_DWORD objnum, FX_FILESIZE& offset);
    983     FX_BOOL						IsObjectsAvail(CFX_PtrArray& obj_array, FX_BOOL bParsePage, IFX_DownloadHints* pHints, CFX_PtrArray &ret_array);
    984     FX_BOOL						CheckDocStatus(IFX_DownloadHints *pHints);
    985     FX_BOOL						CheckHeader(IFX_DownloadHints* pHints);
    986     FX_BOOL						CheckFirstPage(IFX_DownloadHints *pHints);
    987     FX_BOOL						CheckEnd(IFX_DownloadHints *pHints);
    988     FX_BOOL						CheckCrossRef(IFX_DownloadHints* pHints);
    989     FX_BOOL						CheckCrossRefItem(IFX_DownloadHints *pHints);
    990     FX_BOOL						CheckTrailer(IFX_DownloadHints* pHints);
    991     FX_BOOL						CheckRoot(IFX_DownloadHints* pHints);
    992     FX_BOOL						CheckInfo(IFX_DownloadHints* pHints);
    993     FX_BOOL						CheckPages(IFX_DownloadHints* pHints);
    994     FX_BOOL						CheckPage(IFX_DownloadHints* pHints);
    995     FX_BOOL						CheckResources(IFX_DownloadHints* pHints);
    996     FX_BOOL						CheckAnnots(IFX_DownloadHints* pHints);
    997     FX_BOOL						CheckAcroForm(IFX_DownloadHints* pHints);
    998     FX_BOOL						CheckAcroFormSubObject(IFX_DownloadHints* pHints);
    999     FX_BOOL						CheckTrailerAppend(IFX_DownloadHints* pHints);
   1000     FX_BOOL						CheckPageStatus(IFX_DownloadHints* pHints);
   1001     FX_BOOL						CheckAllCrossRefStream(IFX_DownloadHints *pHints);
   1002 
   1003     FX_DWORD					CheckCrossRefStream(IFX_DownloadHints *pHints, FX_FILESIZE &xref_offset);
   1004     FX_BOOL						IsLinearizedFile(FX_LPBYTE pData, FX_DWORD dwLen);
   1005     void						SetStartOffset(FX_FILESIZE dwOffset);
   1006     FX_BOOL						GetNextToken(CFX_ByteString &token);
   1007     FX_BOOL						GetNextChar(FX_BYTE &ch);
   1008     CPDF_Object	*				ParseIndirectObjectAt(FX_FILESIZE pos, FX_DWORD objnum);
   1009     CPDF_Object	*				GetObject(FX_DWORD objnum, IFX_DownloadHints* pHints, FX_BOOL *pExistInFile);
   1010     FX_BOOL						GetPageKids(CPDF_Parser *pParser, CPDF_Object *pPages);
   1011     FX_BOOL						PreparePageItem();
   1012     FX_BOOL						LoadPages(IFX_DownloadHints* pHints);
   1013     FX_BOOL						LoadAllXref(IFX_DownloadHints* pHints);
   1014     FX_BOOL						LoadAllFile(IFX_DownloadHints* pHints);
   1015     FX_BOOL						CheckLinearizedData(IFX_DownloadHints* pHints);
   1016     FX_BOOL						CheckFileResources(IFX_DownloadHints* pHints);
   1017     FX_BOOL						CheckPageAnnots(int iPage, IFX_DownloadHints* pHints);
   1018 
   1019     FX_BOOL						CheckLinearizedFirstPage(int iPage, IFX_DownloadHints* pHints);
   1020     FX_BOOL						HaveResourceAncestor(CPDF_Dictionary *pDict);
   1021     FX_BOOL						CheckPage(FX_INT32 iPage, IFX_DownloadHints* pHints);
   1022     FX_BOOL						LoadDocPages(IFX_DownloadHints* pHints);
   1023     FX_BOOL						LoadDocPage(FX_INT32 iPage, IFX_DownloadHints* pHints);
   1024     FX_BOOL						CheckPageNode(CPDF_PageNode &pageNodes, FX_INT32 iPage, FX_INT32 &iCount, IFX_DownloadHints* pHints);
   1025     FX_BOOL						CheckUnkownPageNode(FX_DWORD dwPageNo, CPDF_PageNode *pPageNode, IFX_DownloadHints* pHints);
   1026     FX_BOOL						CheckArrayPageNode(FX_DWORD dwPageNo, CPDF_PageNode *pPageNode, IFX_DownloadHints* pHints);
   1027     FX_BOOL                     CheckPageCount(IFX_DownloadHints* pHints);
   1028     FX_BOOL						IsFirstCheck(int iPage);
   1029     void						ResetFirstCheck(int iPage);
   1030 
   1031     CPDF_Parser				m_parser;
   1032 
   1033     CPDF_SyntaxParser		m_syntaxParser;
   1034 
   1035     CPDF_Object				*m_pRoot;
   1036 
   1037     FX_DWORD				m_dwRootObjNum;
   1038 
   1039     FX_DWORD				m_dwInfoObjNum;
   1040 
   1041     CPDF_Object				*m_pLinearized;
   1042 
   1043     CPDF_Object				*m_pTrailer;
   1044 
   1045     FX_BOOL					m_bDocAvail;
   1046 
   1047     FX_FILESIZE				m_dwHeaderOffset;
   1048 
   1049     FX_FILESIZE				m_dwLastXRefOffset;
   1050 
   1051     FX_FILESIZE				m_dwXRefOffset;
   1052 
   1053     FX_FILESIZE				m_dwTrailerOffset;
   1054 
   1055     FX_FILESIZE				m_dwCurrentOffset;
   1056 
   1057     PDF_DATAAVAIL_STATUS	m_docStatus;
   1058 
   1059     IFX_FileAvail*			m_pFileAvail;
   1060 
   1061     IFX_FileRead*			m_pFileRead;
   1062 
   1063     FX_FILESIZE				m_dwFileLen;
   1064 
   1065     CPDF_Document*			m_pDocument;
   1066 
   1067     CPDF_SortObjNumArray	m_objnum_array;
   1068 
   1069     CFX_PtrArray			m_objs_array;
   1070 
   1071     FX_FILESIZE				m_Pos;
   1072 
   1073     FX_FILESIZE				m_bufferOffset;
   1074 
   1075     FX_DWORD				m_bufferSize;
   1076 
   1077     CFX_ByteString			m_WordBuf;
   1078 
   1079     FX_BYTE					m_WordBuffer[257];
   1080 
   1081     FX_DWORD				m_WordSize;
   1082 
   1083     FX_BYTE					m_bufferData[512];
   1084 
   1085     CFX_FileSizeArray		m_CrossOffset;
   1086 
   1087     CFX_DWordArray			m_XRefStreamList;
   1088 
   1089     CFX_DWordArray			m_PageObjList;
   1090 
   1091     FX_DWORD				m_PagesObjNum;
   1092 
   1093     FX_BOOL					m_bLinearized;
   1094 
   1095     FX_DWORD				m_dwFirstPageNo;
   1096 
   1097     FX_BOOL					m_bLinearedDataOK;
   1098 
   1099     FX_BOOL					m_bMainXRefLoad;
   1100 
   1101     FX_BOOL					m_bMainXRefLoadedOK;
   1102 
   1103     FX_BOOL					m_bPagesTreeLoad;
   1104 
   1105     FX_BOOL					m_bPagesLoad;
   1106 
   1107     CPDF_Parser *			m_pCurrentParser;
   1108 
   1109     FX_FILESIZE				m_dwCurrentXRefSteam;
   1110 
   1111     FX_BOOL					m_bAnnotsLoad;
   1112 
   1113     FX_BOOL					m_bHaveAcroForm;
   1114 
   1115     FX_DWORD				m_dwAcroFormObjNum;
   1116 
   1117     FX_BOOL					m_bAcroFormLoad;
   1118 
   1119     CPDF_Object	*			m_pAcroForm;
   1120 
   1121     CFX_PtrArray			m_arrayAcroforms;
   1122 
   1123     CPDF_Dictionary *		m_pPageDict;
   1124 
   1125     CPDF_Object *			m_pPageResource;
   1126 
   1127     FX_BOOL					m_bNeedDownLoadResource;
   1128 
   1129     FX_BOOL					m_bPageLoadedOK;
   1130 
   1131     FX_BOOL					m_bLinearizedFormParamLoad;
   1132 
   1133     CFX_PtrArray			m_PagesArray;
   1134 
   1135     FX_DWORD				m_dwEncryptObjNum;
   1136 
   1137     FX_FILESIZE				m_dwPrevXRefOffset;
   1138 
   1139     FX_BOOL					m_bTotalLoadPageTree;
   1140 
   1141     FX_BOOL					m_bCurPageDictLoadOK;
   1142 
   1143     CPDF_PageNode			m_pageNodes;
   1144 
   1145     CFX_CMapDWordToDWord *	m_pageMapCheckState;
   1146 
   1147     CFX_CMapDWordToDWord *	m_pagesLoadState;
   1148 };
   1149 #endif
   1150