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