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#include "../../../include/fpdfapi/fpdf_parser.h"
8ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../../../include/fpdfapi/fpdf_module.h"
9ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../../../include/fpdfapi/fpdf_page.h"
10ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../fpdf_page/pageint.h"
11ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include <limits.h>
12ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define _PARSER_OBJECT_LEVLE_		64
13ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovextern const FX_LPCSTR _PDF_CharType;
14ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL IsSignatureDict(const CPDF_Dictionary* pDict)
15ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
16ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Object* pType = pDict->GetElementValue(FX_BSTRC("Type"));
17ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!pType) {
18ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        pType = pDict->GetElementValue(FX_BSTRC("FT"));
19ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (!pType) {
20ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return FALSE;
21ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
22ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
23ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pType->GetString() == FX_BSTRC("Sig")) {
24ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return TRUE;
25ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
26ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return FALSE;
27ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
28ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic FX_INT32 _CompareDWord(const void* p1, const void* p2)
29ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
30ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return (*(FX_DWORD*)p1) - (*(FX_DWORD*)p2);
31ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
32ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic int _CompareFileSize(const void* p1, const void* p2)
33ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
34ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_FILESIZE ret = (*(FX_FILESIZE*)p1) - (*(FX_FILESIZE*)p2);
35ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (ret > 0) {
36ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return 1;
37ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
38ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (ret < 0) {
39ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return -1;
40ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
41ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return 0;
42ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
43ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Parser::CPDF_Parser()
44ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
45ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_pDocument = NULL;
46ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_pTrailer = NULL;
47ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_pEncryptDict = NULL;
48ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_pSecurityHandler = NULL;
49ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_pLinearized = NULL;
50ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_dwFirstPageNo = 0;
51ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_dwXrefStartObjNum = 0;
52ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_bOwnFileRead = TRUE;
53ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_bForceUseSecurityHandler = FALSE;
54ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
55ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Parser::~CPDF_Parser()
56ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
57ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CloseParser(FALSE);
58ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
59ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_DWORD CPDF_Parser::GetLastObjNum()
60ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
61ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_DWORD dwSize = m_CrossRef.GetSize();
62ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return dwSize ? dwSize - 1 : 0;
63ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
64ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_Parser::SetEncryptDictionary(CPDF_Dictionary* pDict)
65ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
66ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_pEncryptDict = pDict;
67ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
68ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_Parser::CloseParser(FX_BOOL bReParse)
69ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
70ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_bVersionUpdated = FALSE;
71ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_pDocument && !bReParse) {
72ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        delete m_pDocument;
73ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_pDocument = NULL;
74ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
75ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_pTrailer) {
76ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_pTrailer->Release();
77ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_pTrailer = NULL;
78ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
79ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    ReleaseEncryptHandler();
80ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    SetEncryptDictionary(NULL);
81ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_bOwnFileRead && m_Syntax.m_pFileAccess != NULL) {
82ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_Syntax.m_pFileAccess->Release();
83ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_Syntax.m_pFileAccess = NULL;
84ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
85ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_POSITION pos = m_ObjectStreamMap.GetStartPosition();
86ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    while (pos) {
87ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_LPVOID objnum;
88ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_StreamAcc* pStream;
89ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_ObjectStreamMap.GetNextAssoc(pos, objnum, (void*&)pStream);
90ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        delete pStream;
91ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
92ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_ObjectStreamMap.RemoveAll();
93ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_SortedOffset.RemoveAll();
94ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_CrossRef.RemoveAll();
95ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_V5Type.RemoveAll();
96ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_ObjVersion.RemoveAll();
97ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_INT32 iLen = m_Trailers.GetSize();
98ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    for (FX_INT32 i = 0; i < iLen; ++i) {
99ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_Trailers.GetAt(i)->Release();
100ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
101ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_Trailers.RemoveAll();
102ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_pLinearized) {
103ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_pLinearized->Release();
104ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_pLinearized = NULL;
105ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
106ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
107ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic FX_INT32 GetHeaderOffset(IFX_FileRead* pFile)
108ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
109ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_DWORD tag = FXDWORD_FROM_LSBFIRST(0x46445025);
110ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_BYTE buf[4];
111ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_INT32 offset = 0;
112ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    while (1) {
113ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (!pFile->ReadBlock(buf, offset, 4)) {
114ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return -1;
115ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
116ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (*(FX_DWORD*)buf == tag) {
117ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return offset;
118ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
119ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        offset ++;
120ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (offset > 1024) {
121ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return -1;
122ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
123ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
124ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return -1;
125ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
126ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_DWORD CPDF_Parser::StartParse(FX_LPCSTR filename, FX_BOOL bReParse)
127ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
128ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    IFX_FileRead* pFileAccess = FX_CreateFileRead(filename);
129ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!pFileAccess) {
130ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return PDFPARSE_ERROR_FILE;
131ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
132ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return StartParse(pFileAccess, bReParse);
133ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
134ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_DWORD CPDF_Parser::StartParse(FX_LPCWSTR filename, FX_BOOL bReParse)
135ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
136ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    IFX_FileRead* pFileAccess = FX_CreateFileRead(filename);
137ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!pFileAccess) {
138ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return PDFPARSE_ERROR_FILE;
139ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
140ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return StartParse(pFileAccess, bReParse);
141ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
142ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_SecurityHandler* FPDF_CreateStandardSecurityHandler();
143ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_SecurityHandler* FPDF_CreatePubKeyHandler(void*);
144ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_DWORD CPDF_Parser::StartParse(IFX_FileRead* pFileAccess, FX_BOOL bReParse, FX_BOOL bOwnFileRead)
145ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
146ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CloseParser(bReParse);
147ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_bXRefStream = FALSE;
148ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_LastXRefOffset = 0;
149ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_bOwnFileRead = bOwnFileRead;
150ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_INT32 offset = GetHeaderOffset(pFileAccess);
151ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (offset == -1) {
152ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (bOwnFileRead && pFileAccess) {
153ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            pFileAccess->Release();
154ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
155ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return PDFPARSE_ERROR_FORMAT;
156ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
157ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_Syntax.InitParser(pFileAccess, offset);
158ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_BYTE ch;
159ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_Syntax.GetCharAt(5, ch);
160ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_FileVersion = (ch - '0') * 10;
161ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_Syntax.GetCharAt(7, ch);
162ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_FileVersion += ch - '0';
163ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_Syntax.RestorePos(m_Syntax.m_FileLen - m_Syntax.m_HeaderOffset - 9);
164ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!bReParse) {
165ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_pDocument = FX_NEW CPDF_Document(this);
166ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
167ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_BOOL bXRefRebuilt = FALSE;
168ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_Syntax.SearchWord(FX_BSTRC("startxref"), TRUE, FALSE, 4096)) {
169ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_FILESIZE startxref_offset = m_Syntax.SavePos();
170ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_LPVOID pResult = FXSYS_bsearch(&startxref_offset, m_SortedOffset.GetData(), m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), _CompareFileSize);
171ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (pResult == NULL) {
172ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_SortedOffset.Add(startxref_offset);
173ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
174ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_Syntax.GetKeyword();
175ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_BOOL bNumber;
176ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CFX_ByteString xrefpos_str = m_Syntax.GetNextWord(bNumber);
177ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (!bNumber) {
178ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return PDFPARSE_ERROR_FORMAT;
179ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
180ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_LastXRefOffset = (FX_FILESIZE)FXSYS_atoi64(xrefpos_str);
181ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (!LoadAllCrossRefV4(m_LastXRefOffset) && !LoadAllCrossRefV5(m_LastXRefOffset)) {
182ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (!RebuildCrossRef()) {
183ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                return PDFPARSE_ERROR_FORMAT;
184ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
185ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            bXRefRebuilt = TRUE;
186ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_LastXRefOffset = 0;
187ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
188ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    } else {
189ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (!RebuildCrossRef()) {
190ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return PDFPARSE_ERROR_FORMAT;
191ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
192ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        bXRefRebuilt = TRUE;
193ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
194ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_DWORD dwRet = SetEncryptHandler();
195ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (dwRet != PDFPARSE_ERROR_SUCCESS) {
196ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return dwRet;
197ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
198ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_pDocument->LoadDoc();
199ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_pDocument->GetRoot() == NULL || m_pDocument->GetPageCount() == 0) {
200ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (bXRefRebuilt) {
201ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return PDFPARSE_ERROR_FORMAT;
202ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
203ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        ReleaseEncryptHandler();
204ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (!RebuildCrossRef()) {
205ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return PDFPARSE_ERROR_FORMAT;
206ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
207ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        dwRet = SetEncryptHandler();
208ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (dwRet != PDFPARSE_ERROR_SUCCESS) {
209ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return dwRet;
210ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
211ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_pDocument->LoadDoc();
212ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (m_pDocument->GetRoot() == NULL) {
213ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return PDFPARSE_ERROR_FORMAT;
214ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
215ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
216ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FXSYS_qsort(m_SortedOffset.GetData(), m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), _CompareFileSize);
217ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_DWORD RootObjNum = GetRootObjNum();
218ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (RootObjNum == 0) {
219ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        ReleaseEncryptHandler();
220ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        RebuildCrossRef();
221ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        RootObjNum = GetRootObjNum();
222ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (RootObjNum == 0) {
223ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return PDFPARSE_ERROR_FORMAT;
224ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
225ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        dwRet = SetEncryptHandler();
226ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (dwRet != PDFPARSE_ERROR_SUCCESS) {
227ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return dwRet;
228ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
229ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
230ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_pSecurityHandler && !m_pSecurityHandler->IsMetadataEncrypted()) {
231ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_Reference* pMetadata = (CPDF_Reference*)m_pDocument->GetRoot()->GetElement(FX_BSTRC("Metadata"));
232ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (pMetadata && pMetadata->GetType() == PDFOBJ_REFERENCE) {
233ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_Syntax.m_MetadataObjnum = pMetadata->GetRefObjNum();
234ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
235ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
236ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return PDFPARSE_ERROR_SUCCESS;
237ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
238ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_DWORD CPDF_Parser::SetEncryptHandler()
239ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
240ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    ReleaseEncryptHandler();
241ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    SetEncryptDictionary(NULL);
242ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_pTrailer == NULL) {
243ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return PDFPARSE_ERROR_FORMAT;
244ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
245ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Object* pEncryptObj = m_pTrailer->GetElement(FX_BSTRC("Encrypt"));
246ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pEncryptObj) {
247ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (pEncryptObj->GetType() == PDFOBJ_DICTIONARY) {
248ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            SetEncryptDictionary((CPDF_Dictionary*)pEncryptObj);
249ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        } else if (pEncryptObj->GetType() == PDFOBJ_REFERENCE) {
250ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            pEncryptObj = m_pDocument->GetIndirectObject(((CPDF_Reference*)pEncryptObj)->GetRefObjNum());
251ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (pEncryptObj) {
252ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                SetEncryptDictionary(pEncryptObj->GetDict());
253ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
254ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
255ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
256ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_bForceUseSecurityHandler) {
257ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_DWORD err = PDFPARSE_ERROR_HANDLER;
258ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (m_pSecurityHandler == NULL) {
259ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return PDFPARSE_ERROR_HANDLER;
260ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
261ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (!m_pSecurityHandler->OnInit(this, m_pEncryptDict)) {
262ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return err;
263ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
264ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_CryptoHandler* pCryptoHandler = m_pSecurityHandler->CreateCryptoHandler();
265ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (!pCryptoHandler->Init(m_pEncryptDict, m_pSecurityHandler)) {
266ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            delete pCryptoHandler;
267ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            pCryptoHandler = NULL;
268ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return PDFPARSE_ERROR_HANDLER;
269ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
270ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_Syntax.SetEncrypt(pCryptoHandler);
271ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    } else if (m_pEncryptDict) {
272ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CFX_ByteString filter = m_pEncryptDict->GetString(FX_BSTRC("Filter"));
273ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_SecurityHandler* pSecurityHandler = NULL;
274ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_DWORD err = PDFPARSE_ERROR_HANDLER;
275ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (filter == FX_BSTRC("Standard")) {
276ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            pSecurityHandler = FPDF_CreateStandardSecurityHandler();
277ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            err = PDFPARSE_ERROR_PASSWORD;
278ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
279ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (pSecurityHandler == NULL) {
280ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return PDFPARSE_ERROR_HANDLER;
281ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
282ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (!pSecurityHandler->OnInit(this, m_pEncryptDict)) {
283ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            delete pSecurityHandler;
284ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            pSecurityHandler = NULL;
285ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return err;
286ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
287ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_pSecurityHandler = pSecurityHandler;
288ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_CryptoHandler* pCryptoHandler = pSecurityHandler->CreateCryptoHandler();
289ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (!pCryptoHandler->Init(m_pEncryptDict, m_pSecurityHandler)) {
290ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            delete pCryptoHandler;
291ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            pCryptoHandler = NULL;
292ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return PDFPARSE_ERROR_HANDLER;
293ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
294ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_Syntax.SetEncrypt(pCryptoHandler);
295ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
296ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return PDFPARSE_ERROR_SUCCESS;
297ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
298ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_Parser::ReleaseEncryptHandler()
299ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
300ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_Syntax.m_pCryptoHandler) {
301ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        delete m_Syntax.m_pCryptoHandler;
302ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_Syntax.m_pCryptoHandler = NULL;
303ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
304ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_pSecurityHandler && !m_bForceUseSecurityHandler) {
305ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        delete m_pSecurityHandler;
306ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_pSecurityHandler = NULL;
307ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
308ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
309ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_FILESIZE CPDF_Parser::GetObjectOffset(FX_DWORD objnum)
310ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
311ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (objnum >= (FX_DWORD)m_CrossRef.GetSize()) {
312ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return 0;
313ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
314ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_V5Type[objnum] == 1) {
315ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return m_CrossRef[objnum];
316ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
317ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_V5Type[objnum] == 2) {
318ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return m_CrossRef[(FX_INT32)m_CrossRef[objnum]];
319ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
320ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return 0;
321ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
322ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic FX_INT32 GetDirectInteger(CPDF_Dictionary* pDict, FX_BSTR key)
323ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
324ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Object* pObj = pDict->GetElement(key);
325ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pObj == NULL) {
326ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return 0;
327ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
328ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pObj->GetType() == PDFOBJ_NUMBER) {
329ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return ((CPDF_Number*)pObj)->GetInteger();
330ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
331ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return 0;
332ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
333ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic FX_BOOL CheckDirectType(CPDF_Dictionary* pDict, FX_BSTR key, FX_INT32 iType)
334ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
335ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Object* pObj = pDict->GetElement(key);
336ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!pObj) {
337ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return TRUE;
338ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
339ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return pObj->GetType() == iType;
340ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
341ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_Parser::LoadAllCrossRefV4(FX_FILESIZE xrefpos)
342ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
343ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!LoadCrossRefV4(xrefpos, 0, TRUE, FALSE)) {
344ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FALSE;
345ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
346ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_pTrailer = LoadTrailerV4();
347ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_pTrailer == NULL) {
348ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FALSE;
349ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
350ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_INT32 xrefsize = GetDirectInteger(m_pTrailer, FX_BSTRC("Size"));
351ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (xrefsize <= 0 || xrefsize > (1 << 20)) {
352ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FALSE;
353ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
354ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_CrossRef.SetSize(xrefsize);
355ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_V5Type.SetSize(xrefsize);
356ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_FileSizeArray CrossRefList, XRefStreamList;
357ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CrossRefList.Add(xrefpos);
358ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    XRefStreamList.Add(GetDirectInteger(m_pTrailer, FX_BSTRC("XRefStm")));
359ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!CheckDirectType(m_pTrailer, FX_BSTRC("Prev"), PDFOBJ_NUMBER)) {
360ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FALSE;
361ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
362ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_FILESIZE newxrefpos = GetDirectInteger(m_pTrailer, FX_BSTRC("Prev"));
363ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (newxrefpos == xrefpos) {
364ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FALSE;
365ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
366ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    xrefpos = newxrefpos;
367ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    while (xrefpos) {
368ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CrossRefList.InsertAt(0, xrefpos);
369ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        LoadCrossRefV4(xrefpos, 0, TRUE, FALSE);
370ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_Dictionary* pDict = LoadTrailerV4();
371ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (pDict == NULL) {
372ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return FALSE;
373ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
374ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (!CheckDirectType(pDict, FX_BSTRC("Prev"), PDFOBJ_NUMBER)) {
375ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            pDict->Release();
376ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return FALSE;
377ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
378ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        newxrefpos = GetDirectInteger(pDict, FX_BSTRC("Prev"));
379ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (newxrefpos == xrefpos) {
380ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            pDict->Release();
381ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return FALSE;
382ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
383ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        xrefpos = newxrefpos;
384ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        XRefStreamList.InsertAt(0, pDict->GetInteger(FX_BSTRC("XRefStm")));
385ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_Trailers.Add(pDict);
386ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
387ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    for (FX_INT32 i = 0; i < CrossRefList.GetSize(); i ++)
388ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (!LoadCrossRefV4(CrossRefList[i], XRefStreamList[i], FALSE, i == 0)) {
389ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return FALSE;
390ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
391ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return TRUE;
392ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
393ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_Parser::LoadLinearizedAllCrossRefV4(FX_FILESIZE xrefpos, FX_DWORD dwObjCount)
394ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
395ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!LoadLinearizedCrossRefV4(xrefpos, dwObjCount)) {
396ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FALSE;
397ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
398ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_pTrailer = LoadTrailerV4();
399ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_pTrailer == NULL) {
400ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FALSE;
401ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
402ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_INT32 xrefsize = GetDirectInteger(m_pTrailer, FX_BSTRC("Size"));
403ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (xrefsize == 0) {
404ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FALSE;
405ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
406ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_FileSizeArray CrossRefList, XRefStreamList;
407ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CrossRefList.Add(xrefpos);
408ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    XRefStreamList.Add(GetDirectInteger(m_pTrailer, FX_BSTRC("XRefStm")));
409ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    xrefpos = GetDirectInteger(m_pTrailer, FX_BSTRC("Prev"));
410ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    while (xrefpos) {
411ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CrossRefList.InsertAt(0, xrefpos);
412ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        LoadCrossRefV4(xrefpos, 0, TRUE, FALSE);
413ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_Dictionary* pDict = LoadTrailerV4();
414ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (pDict == NULL) {
415ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return FALSE;
416ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
417ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        xrefpos = GetDirectInteger(pDict, FX_BSTRC("Prev"));
418ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        XRefStreamList.InsertAt(0, pDict->GetInteger(FX_BSTRC("XRefStm")));
419ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_Trailers.Add(pDict);
420ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
421ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    for (FX_INT32 i = 1; i < CrossRefList.GetSize(); i ++)
422ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (!LoadCrossRefV4(CrossRefList[i], XRefStreamList[i], FALSE, i == 0)) {
423ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return FALSE;
424ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
425ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return TRUE;
426ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
427ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_Parser::LoadLinearizedCrossRefV4(FX_FILESIZE pos, FX_DWORD dwObjCount)
428ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
429ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_FILESIZE dwStartPos = pos - m_Syntax.m_HeaderOffset;
430ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_Syntax.RestorePos(dwStartPos);
431ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_LPVOID pResult = FXSYS_bsearch(&pos, m_SortedOffset.GetData(), m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), _CompareFileSize);
432ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pResult == NULL) {
433ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_SortedOffset.Add(pos);
434ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
435ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_DWORD start_objnum = 0;
436ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_DWORD count = dwObjCount;
437ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_FILESIZE SavedPos = m_Syntax.SavePos();
438ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_INT32 recordsize = 20;
439ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    char* pBuf = FX_Alloc(char, 1024 * recordsize + 1);
440ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    pBuf[1024 * recordsize] = '\0';
441ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_INT32 nBlocks = count / 1024 + 1;
442ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    for (FX_INT32 block = 0; block < nBlocks; block ++) {
443ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_INT32 block_size = block == nBlocks - 1 ? count % 1024 : 1024;
444ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_DWORD dwReadSize = block_size * recordsize;
445ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if ((FX_FILESIZE)(dwStartPos + dwReadSize) > m_Syntax.m_FileLen) {
446ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            FX_Free(pBuf);
447ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return FALSE;
448ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
449ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (!m_Syntax.ReadBlock((FX_LPBYTE)pBuf, dwReadSize)) {
450ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            FX_Free(pBuf);
451ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return FALSE;
452ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
453ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        for (FX_INT32 i = 0; i < block_size; i ++) {
454ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            FX_DWORD objnum = start_objnum + block * 1024 + i;
455ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            char* pEntry = pBuf + i * recordsize;
456ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (pEntry[17] == 'f') {
457ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                m_CrossRef.SetAtGrow(objnum, 0);
458ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                m_V5Type.SetAtGrow(objnum, 0);
459ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            } else {
460ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                FX_INT32 offset = FXSYS_atoi(pEntry);
461ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                if (offset == 0) {
462ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    for (FX_INT32 c = 0; c < 10; c ++) {
463ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        if (pEntry[c] < '0' || pEntry[c] > '9') {
464ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                            FX_Free(pBuf);
465ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                            return FALSE;
466ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        }
467ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    }
468ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
469ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                m_CrossRef.SetAtGrow(objnum, offset);
470ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                FX_INT32 version = FXSYS_atoi(pEntry + 11);
471ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                if (version >= 1) {
472ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    m_bVersionUpdated = TRUE;
473ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
474ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                m_ObjVersion.SetAtGrow(objnum, version);
475ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                if (m_CrossRef[objnum] < m_Syntax.m_FileLen) {
476ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    FX_LPVOID pResult = FXSYS_bsearch(&m_CrossRef[objnum], m_SortedOffset.GetData(), m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), _CompareFileSize);
477ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    if (pResult == NULL) {
478ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        m_SortedOffset.Add(m_CrossRef[objnum]);
479ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    }
480ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
481ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                m_V5Type.SetAtGrow(objnum, 1);
482ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
483ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
484ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
485ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_Free(pBuf);
486ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_Syntax.RestorePos(SavedPos + count * recordsize);
487ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return TRUE;
488ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
489ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_Parser::LoadCrossRefV4(FX_FILESIZE pos, FX_FILESIZE streampos, FX_BOOL bSkip, FX_BOOL bFirst)
490ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
491ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_Syntax.RestorePos(pos);
492ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_Syntax.GetKeyword() != FX_BSTRC("xref")) {
493ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FALSE;
494ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
495ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_LPVOID pResult = FXSYS_bsearch(&pos, m_SortedOffset.GetData(), m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), _CompareFileSize);
496ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pResult == NULL) {
497ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_SortedOffset.Add(pos);
498ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
499ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (streampos) {
500ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_LPVOID pResult = FXSYS_bsearch(&streampos, m_SortedOffset.GetData(), m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), _CompareFileSize);
501ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (pResult == NULL) {
502ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_SortedOffset.Add(streampos);
503ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
504ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
505ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    while (1) {
506ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_FILESIZE SavedPos = m_Syntax.SavePos();
507ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_BOOL bIsNumber;
508ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CFX_ByteString word = m_Syntax.GetNextWord(bIsNumber);
509ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (word.IsEmpty()) {
510ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return FALSE;
511ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
512ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (!bIsNumber) {
513ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_Syntax.RestorePos(SavedPos);
514ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            break;
515ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
516ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_DWORD start_objnum = FXSYS_atoi(word);
517ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (start_objnum >= (1 << 20)) {
518ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return FALSE;
519ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
520ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_DWORD count = m_Syntax.GetDirectNum();
521ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_Syntax.ToNextWord();
522ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        SavedPos = m_Syntax.SavePos();
523ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_BOOL bFirstItem = FALSE;
524ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_INT32 recordsize = 20;
525ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (bFirst) {
526ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            bFirstItem = TRUE;
527ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
528ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_dwXrefStartObjNum = start_objnum;
529ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (!bSkip) {
530ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            char* pBuf = FX_Alloc(char, 1024 * recordsize + 1);
531ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            pBuf[1024 * recordsize] = '\0';
532ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            FX_INT32 nBlocks = count / 1024 + 1;
533ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            FX_BOOL bFirstBlock = TRUE;
534ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            for (FX_INT32 block = 0; block < nBlocks; block ++) {
535ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                FX_INT32 block_size = block == nBlocks - 1 ? count % 1024 : 1024;
536ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                m_Syntax.ReadBlock((FX_LPBYTE)pBuf, block_size * recordsize);
537ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                for (FX_INT32 i = 0; i < block_size; i ++) {
538ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    FX_DWORD objnum = start_objnum + block * 1024 + i;
539ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    char* pEntry = pBuf + i * recordsize;
540ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    if (pEntry[17] == 'f') {
541ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        if (bFirstItem) {
542ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                            objnum = 0;
543ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                            bFirstItem = FALSE;
544ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        }
545ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        if (bFirstBlock) {
546ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                            FX_FILESIZE offset = (FX_FILESIZE)FXSYS_atoi64(pEntry);
547ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                            FX_INT32 version = FXSYS_atoi(pEntry + 11);
548ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                            if (offset == 0 && version == 65535 && start_objnum != 0) {
549ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                start_objnum--;
550ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                objnum = 0;
551ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                            }
552ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        }
553ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        m_CrossRef.SetAtGrow(objnum, 0);
554ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        m_V5Type.SetAtGrow(objnum, 0);
555ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    } else {
556ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        FX_FILESIZE offset = (FX_FILESIZE)FXSYS_atoi64(pEntry);
557ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        if (offset == 0) {
558ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                            for (FX_INT32 c = 0; c < 10; c ++) {
559ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                if (pEntry[c] < '0' || pEntry[c] > '9') {
560ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                    FX_Free(pBuf);
561ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                    return FALSE;
562ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                }
563ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                            }
564ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        }
565ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        m_CrossRef.SetAtGrow(objnum, offset);
566ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        FX_INT32 version = FXSYS_atoi(pEntry + 11);
567ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        if (version >= 1) {
568ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                            m_bVersionUpdated = TRUE;
569ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        }
570ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        m_ObjVersion.SetAtGrow(objnum, version);
571ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        if (m_CrossRef[objnum] < m_Syntax.m_FileLen) {
572ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                            FX_LPVOID pResult = FXSYS_bsearch(&m_CrossRef[objnum], m_SortedOffset.GetData(), m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), _CompareFileSize);
573ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                            if (pResult == NULL) {
574ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                m_SortedOffset.Add(m_CrossRef[objnum]);
575ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                            }
576ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        }
577ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        m_V5Type.SetAtGrow(objnum, 1);
578ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    }
579ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    if (bFirstBlock) {
580ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        bFirstBlock = FALSE;
581ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    }
582ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
583ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
584ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            FX_Free(pBuf);
585ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
586ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_Syntax.RestorePos(SavedPos + count * recordsize);
587ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
588ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (streampos)
589ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (!LoadCrossRefV5(streampos, streampos, FALSE)) {
590ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return FALSE;
591ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
592ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return TRUE;
593ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
594ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_Parser::LoadAllCrossRefV5(FX_FILESIZE xrefpos)
595ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
596ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!LoadCrossRefV5(xrefpos, xrefpos, TRUE)) {
597ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FALSE;
598ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
599ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    while (xrefpos)
600ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (!LoadCrossRefV5(xrefpos, xrefpos, FALSE)) {
601ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return FALSE;
602ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
603ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_ObjectStreamMap.InitHashTable(101, FALSE);
604ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_bXRefStream = TRUE;
605ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return TRUE;
606ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
607ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_Parser::RebuildCrossRef()
608ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
609ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_CrossRef.RemoveAll();
610ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_V5Type.RemoveAll();
611ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_SortedOffset.RemoveAll();
612ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_ObjVersion.RemoveAll();
613ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_pTrailer) {
614ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_pTrailer->Release();
615ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_pTrailer = NULL;
616ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
617ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_INT32 status = 0;
618ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_INT32 inside_index = 0;
619ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_DWORD objnum, gennum;
620ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_INT32 depth = 0;
621ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_LPBYTE buffer = FX_Alloc(FX_BYTE, 4096);
622ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_FILESIZE pos = m_Syntax.m_HeaderOffset;
623ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_FILESIZE start_pos, start_pos1;
624ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_FILESIZE last_obj = -1, last_xref = -1, last_trailer = -1;
625ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_BOOL bInUpdate = FALSE;
626ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    while (pos < m_Syntax.m_FileLen) {
627ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_BOOL bOverFlow = FALSE;
628ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_DWORD size = (FX_DWORD)(m_Syntax.m_FileLen - pos);
629ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (size > 4096) {
630ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            size = 4096;
631ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
632ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (!m_Syntax.m_pFileAccess->ReadBlock(buffer, pos, size)) {
633ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            break;
634ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
635ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        for (FX_DWORD i = 0; i < size; i ++) {
636ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            FX_BYTE byte = buffer[i];
637ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            FX_LPBYTE pData = buffer + i;
638ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            switch (status) {
639ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                case 0:
640ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    if (_PDF_CharType[byte] == 'W') {
641ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        status = 1;
642ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    }
643ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    if (byte <= '9' && byte >= '0') {
644ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        --i;
645ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        status = 1;
646ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    }
647ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    if (byte == '%') {
648ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        inside_index = 0;
649ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        status = 9;
650ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    }
651ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    if (byte == '(') {
652ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        status = 10;
653ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        depth = 1;
654ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    }
655ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    if (byte == '<') {
656ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        inside_index = 1;
657ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        status = 11;
658ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    }
659ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    if (byte == '\\') {
660ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        status = 13;
661ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    }
662ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    if (byte == 't') {
663ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        status = 7;
664ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        inside_index = 1;
665ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    }
666ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    break;
667ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                case 1:
668ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    if (_PDF_CharType[byte] == 'W') {
669ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        break;
670ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    } else if (byte <= '9' && byte >= '0') {
671ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        start_pos = pos + i;
672ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        status = 2;
673ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        objnum = byte - '0';
674ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    } else if (byte == 't') {
675ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        status = 7;
676ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        inside_index = 1;
677ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    } else if (byte == 'x') {
678ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        status = 8;
679ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        inside_index = 1;
680ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    } else {
681ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        --i;
682ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        status = 0;
683ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    }
684ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    break;
685ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                case 2:
686ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    if (byte <= '9' && byte >= '0') {
687ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        objnum = objnum * 10 + byte - '0';
688ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        break;
689ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    } else if (_PDF_CharType[byte] == 'W') {
690ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        status = 3;
691ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    } else {
692ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        --i;
693ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        status = 14;
694ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        inside_index = 0;
695ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    }
696ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    break;
697ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                case 3:
698ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    if (byte <= '9' && byte >= '0') {
699ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        start_pos1 = pos + i;
700ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        status = 4;
701ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        gennum = byte - '0';
702ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    } else if (_PDF_CharType[byte] == 'W') {
703ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        break;
704ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    } else if (byte == 't') {
705ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        status = 7;
706ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        inside_index = 1;
707ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    } else {
708ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        --i;
709ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        status = 0;
710ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    }
711ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    break;
712ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                case 4:
713ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    if (byte <= '9' && byte >= '0') {
714ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        gennum = gennum * 10 + byte - '0';
715ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        break;
716ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    } else if (_PDF_CharType[byte] == 'W') {
717ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        status = 5;
718ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    } else {
719ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        --i;
720ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        status = 0;
721ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    }
722ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    break;
723ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                case 5:
724ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    if (byte == 'o') {
725ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        status = 6;
726ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        inside_index = 1;
727ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    } else if (_PDF_CharType[byte] == 'W') {
728ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        break;
729ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    } else if (byte <= '9' && byte >= '0') {
730ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        objnum = gennum;
731ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        gennum = byte - '0';
732ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        start_pos = start_pos1;
733ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        start_pos1 = pos + i;
734ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        status = 4;
735ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    } else if (byte == 't') {
736ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        status = 7;
737ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        inside_index = 1;
738ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    } else {
739ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        --i;
740ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        status = 0;
741ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    }
742ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    break;
743ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                case 6:
744ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    switch (inside_index) {
745ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        case 1:
746ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                            if (byte != 'b') {
747ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                --i;
748ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                status = 0;
749ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                            } else {
750ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                inside_index ++;
751ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                            }
752ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                            break;
753ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        case 2:
754ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                            if (byte != 'j') {
755ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                --i;
756ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                status = 0;
757ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                            } else {
758ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                inside_index ++;
759ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                            }
760ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                            break;
761ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        case 3:
762ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                            if (_PDF_CharType[byte] == 'W' || _PDF_CharType[byte] == 'D') {
763ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                if (objnum > 0x1000000) {
764ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                    status = 0;
765ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                    break;
766ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                }
767ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                FX_FILESIZE obj_pos = start_pos - m_Syntax.m_HeaderOffset;
768ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                last_obj = start_pos;
769ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                FX_LPVOID pResult = FXSYS_bsearch(&obj_pos, m_SortedOffset.GetData(), m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), _CompareFileSize);
770ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                if (pResult == NULL) {
771ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                    m_SortedOffset.Add(obj_pos);
772ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                }
773ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                FX_FILESIZE obj_end = 0;
774ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                CPDF_Object *pObject = ParseIndirectObjectAtByStrict(m_pDocument, obj_pos, objnum, NULL, &obj_end);
775ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                if (pObject) {
776ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                    int iType =	pObject->GetType();
777ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                    if (iType == PDFOBJ_STREAM) {
778ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                        CPDF_Stream* pStream = (CPDF_Stream*)pObject;
779ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                        CPDF_Dictionary* pDict = pStream->GetDict();
780ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                        if (pDict) {
781ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                            if (pDict->KeyExist(FX_BSTRC("Type"))) {
782ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                                CFX_ByteString bsValue = pDict->GetString(FX_BSTRC("Type"));
783ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                                if (bsValue == FX_BSTRC("XRef") && pDict->KeyExist(FX_BSTRC("Size"))) {
784ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                                    CPDF_Object* pRoot = pDict->GetElement(FX_BSTRC("Root"));
785ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                                    if (pRoot && pRoot->GetDict() && pRoot->GetDict()->GetElement(FX_BSTRC("Pages"))) {
786ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                                        if (m_pTrailer) {
787ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                                            m_pTrailer->Release();
788ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                                        }
789ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                                        m_pTrailer = (CPDF_Dictionary*)pDict->Clone();
790ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                                    }
791ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                                }
792ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                            }
793ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                        }
794ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                    }
795ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                }
796ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                FX_FILESIZE offset = 0;
797ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                m_Syntax.RestorePos(obj_pos);
798ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                offset = m_Syntax.FindTag(FX_BSTRC("obj"), 0);
799ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                if (offset == -1) {
800ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                    offset = 0;
801ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                } else {
802ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                    offset += 3;
803ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                }
804ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                FX_FILESIZE nLen = obj_end - obj_pos - offset;
805ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                if ((FX_DWORD)nLen > size - i) {
806ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                    pos = obj_end + m_Syntax.m_HeaderOffset;
807ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                    bOverFlow = TRUE;
808ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                } else {
809ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                    i += (FX_DWORD)nLen;
810ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                }
811ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                if (m_CrossRef.GetSize() > (FX_INT32)objnum && m_CrossRef[objnum]) {
812ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                    if (pObject) {
813ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                        FX_DWORD oldgen = m_ObjVersion.GetAt(objnum);
814ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                        m_CrossRef[objnum] = obj_pos;
815ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                        m_ObjVersion.SetAt(objnum, (FX_SHORT)gennum);
816ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                        if (oldgen != gennum) {
817ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                            m_bVersionUpdated = TRUE;
818ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                        }
819ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                    }
820ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                } else {
821ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                    m_CrossRef.SetAtGrow(objnum, obj_pos);
822ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                    m_V5Type.SetAtGrow(objnum, 1);
823ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                    m_ObjVersion.SetAtGrow(objnum, (FX_SHORT)gennum);
824ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                }
825ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                if (pObject) {
826ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                    pObject->Release();
827ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                }
828ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                            }
829ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                            --i;
830ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                            status = 0;
831ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                            break;
832ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    }
833ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    break;
834ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                case 7:
835ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    if (inside_index == 7) {
836ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        if (_PDF_CharType[byte] == 'W' || _PDF_CharType[byte] == 'D') {
837ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                            last_trailer = pos + i - 7;
838ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                            m_Syntax.RestorePos(pos + i - m_Syntax.m_HeaderOffset);
839ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                            CPDF_Object* pObj = m_Syntax.GetObject(m_pDocument, 0, 0, 0);
840ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                            if (pObj) {
841ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                if (pObj->GetType() != PDFOBJ_DICTIONARY && pObj->GetType() != PDFOBJ_STREAM) {
842ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                    pObj->Release();
843ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                } else {
844ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                    CPDF_Dictionary* pTrailer = NULL;
845ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                    if (pObj->GetType() == PDFOBJ_STREAM) {
846ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                        pTrailer = ((CPDF_Stream*)pObj)->GetDict();
847ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                    } else {
848ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                        pTrailer = (CPDF_Dictionary*)pObj;
849ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                    }
850ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                    if (pTrailer) {
851ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                        if (m_pTrailer) {
852ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                            CPDF_Object* pRoot = pTrailer->GetElement(FX_BSTRC("Root"));
853ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                            if (pRoot == NULL || (pRoot->GetType() == PDFOBJ_REFERENCE &&
854ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                                                  (FX_DWORD)m_CrossRef.GetSize() > ((CPDF_Reference*)pRoot)->GetRefObjNum() &&
855ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                                                  m_CrossRef.GetAt(((CPDF_Reference*)pRoot)->GetRefObjNum()) != 0)) {
856ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                                FX_POSITION pos = pTrailer->GetStartPos();
857ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                                while (pos) {
858ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                                    CFX_ByteString key;
859ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                                    CPDF_Object* pObj = pTrailer->GetNextElement(pos, key);
860ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                                    m_pTrailer->SetAt(key, pObj->Clone(), m_pDocument);
861ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                                }
862ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                                pObj->Release();
863ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                            } else {
864ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                                pObj->Release();
865ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                            }
866ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                        } else {
867ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                            if (pObj->GetType() == PDFOBJ_STREAM) {
868ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                                m_pTrailer = (CPDF_Dictionary*)pTrailer->Clone();
869ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                                pObj->Release();
870ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                            } else {
871ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                                m_pTrailer = pTrailer;
872ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                            }
873ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                            FX_FILESIZE dwSavePos = m_Syntax.SavePos();
874ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                            CFX_ByteString strWord = m_Syntax.GetKeyword();
875ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                            if (!strWord.Compare(FX_BSTRC("startxref"))) {
876ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                                FX_BOOL bNumber = FALSE;
877ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                                CFX_ByteString bsOffset = m_Syntax.GetNextWord(bNumber);
878ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                                if (bNumber) {
879ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                                    m_LastXRefOffset = FXSYS_atoi(bsOffset);
880ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                                }
881ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                            }
882ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                            m_Syntax.RestorePos(dwSavePos);
883ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                        }
884ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                    } else {
885ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                        pObj->Release();
886ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                    }
887ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                    bInUpdate = TRUE;
888ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                }
889ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                            }
890ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        }
891ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        --i;
892ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        status = 0;
893ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    } else if (byte == "trailer"[inside_index]) {
894ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        inside_index ++;
895ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    } else {
896ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        --i;
897ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        status = 0;
898ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    }
899ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    break;
900ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                case 8:
901ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    if (inside_index == 4) {
902ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        last_xref = pos + i - 4;
903ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        status = 1;
904ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    } else if (byte == "xref"[inside_index]) {
905ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        inside_index ++;
906ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    } else {
907ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        --i;
908ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        status = 0;
909ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    }
910ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    break;
911ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                case 9:
912ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    if (byte == '\r' || byte == '\n') {
913ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        status = 0;
914ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    }
915ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    break;
916ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                case 10:
917ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    if (byte == ')') {
918ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        if (depth > 0) {
919ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                            depth--;
920ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        }
921ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    } else if (byte == '(') {
922ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        depth++;
923ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    }
924ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    if (!depth) {
925ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        status = 0;
926ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    }
927ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    break;
928ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                case 11:
929ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    if (byte == '<' && inside_index == 1) {
930ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        status = 12;
931ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    } else if (byte == '>') {
932ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        status = 0;
933ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    }
934ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    inside_index = 0;
935ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    break;
936ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                case 12:
937ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    --i;
938ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    status = 0;
939ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    break;
940ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                case 13:
941ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    if (_PDF_CharType[byte] == 'D' || _PDF_CharType[byte] == 'W') {
942ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        --i;
943ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        status = 0;
944ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    }
945ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    break;
946ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                case 14:
947ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    if (_PDF_CharType[byte] == 'W') {
948ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        status = 0;
949ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    } else if (byte == '%' || byte == '(' || byte == '<' || byte == '\\') {
950ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        status = 0;
951ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        --i;
952ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    } else if (inside_index == 6) {
953ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        status = 0;
954ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        --i;
955ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    } else if (byte == "endobj"[inside_index]) {
956ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        inside_index++;
957ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    }
958ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    break;
959ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
960ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (bOverFlow) {
961ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                size = 0;
962ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                break;
963ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
964ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
965ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        pos += size;
966ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
967ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (last_xref != -1 && last_xref > last_obj) {
968ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        last_trailer = last_xref;
969ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    } else if (last_trailer == -1 || last_xref < last_obj) {
970ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        last_trailer = m_Syntax.m_FileLen;
971ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
972ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_FILESIZE offset = last_trailer - m_Syntax.m_HeaderOffset;
973ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_LPVOID pResult = FXSYS_bsearch(&offset, m_SortedOffset.GetData(), m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), _CompareFileSize);
974ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pResult == NULL) {
975ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_SortedOffset.Add(offset);
976ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
977ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_Free(buffer);
978ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return TRUE;
979ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
980ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic FX_DWORD _GetVarInt(FX_LPCBYTE p, FX_INT32 n)
981ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
982ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_DWORD result = 0;
983ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    for (FX_INT32 i = 0; i < n; i ++) {
984ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        result = result * 256 + p[i];
985ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
986ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return result;
987ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
988ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_Parser::LoadCrossRefV5(FX_FILESIZE pos, FX_FILESIZE& prev, FX_BOOL bMainXRef)
989ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
990ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Stream* pStream = (CPDF_Stream*)ParseIndirectObjectAt(m_pDocument, pos, 0, NULL);
991ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!pStream) {
992ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FALSE;
993ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
994ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_pDocument) {
995ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_pDocument->InsertIndirectObject(pStream->m_ObjNum, pStream);
996ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
997ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pStream->GetType() != PDFOBJ_STREAM) {
998ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FALSE;
999ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1000ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    prev = pStream->GetDict()->GetInteger(FX_BSTRC("Prev"));
1001ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_INT32 size = pStream->GetDict()->GetInteger(FX_BSTRC("Size"));
1002ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (size < 0) {
1003ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        pStream->Release();
1004ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FALSE;
1005ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1006ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (bMainXRef) {
1007ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_pTrailer = (CPDF_Dictionary*)pStream->GetDict()->Clone();
1008ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_CrossRef.SetSize(size);
1009ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (m_V5Type.SetSize(size)) {
1010ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            FXSYS_memset32(m_V5Type.GetData(), 0, size);
1011ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1012ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    } else {
1013ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_Trailers.Add((CPDF_Dictionary*)pStream->GetDict()->Clone());
1014ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1015ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_DWordArray IndexArray, WidthArray;
1016ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_DWORD nSegs = 0;
1017ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Array* pArray = pStream->GetDict()->GetArray(FX_BSTRC("Index"));
1018ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pArray == NULL) {
1019ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        IndexArray.Add(0);
1020ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        IndexArray.Add(size);
1021ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        nSegs = 1;
1022ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    } else {
1023ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        for (FX_DWORD i = 0; i < pArray->GetCount(); i ++) {
1024ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            IndexArray.Add(pArray->GetInteger(i));
1025ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1026ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        nSegs = pArray->GetCount() / 2;
1027ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1028ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    pArray = pStream->GetDict()->GetArray(FX_BSTRC("W"));
1029ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pArray == NULL) {
1030ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        pStream->Release();
1031ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FALSE;
1032ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1033ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_DWORD totalwidth = 0;
1034ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_DWORD i;
1035ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    for (i = 0; i < pArray->GetCount(); i ++) {
1036ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        WidthArray.Add(pArray->GetInteger(i));
1037ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (totalwidth + WidthArray[i] < totalwidth) {
1038ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            pStream->Release();
1039ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return FALSE;
1040ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1041ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        totalwidth += WidthArray[i];
1042ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1043ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (totalwidth == 0 || WidthArray.GetSize() < 3) {
1044ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        pStream->Release();
1045ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FALSE;
1046ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1047ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_StreamAcc acc;
1048ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    acc.LoadAllData(pStream);
1049ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_LPCBYTE pData = acc.GetData();
1050ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_DWORD dwTotalSize = acc.GetSize();
1051ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_DWORD segindex = 0;
1052ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    for (i = 0; i < nSegs; i ++) {
1053ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_INT32 startnum = IndexArray[i * 2];
1054ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (startnum < 0) {
1055ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            continue;
1056ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1057ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_dwXrefStartObjNum = startnum;
1058ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_DWORD count = IndexArray[i * 2 + 1];
1059ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (segindex + count < segindex || segindex + count == 0 ||
1060ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                (FX_DWORD)totalwidth >= UINT_MAX / (segindex + count) || (segindex + count) * (FX_DWORD)totalwidth > dwTotalSize) {
1061ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            continue;
1062ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1063ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_LPCBYTE segstart = pData + segindex * (FX_DWORD)totalwidth;
1064ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if ((FX_DWORD)startnum + count < (FX_DWORD)startnum ||
1065ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                (FX_DWORD)startnum + count > (FX_DWORD)m_V5Type.GetSize()) {
1066ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            continue;
1067ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1068ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        for (FX_DWORD j = 0; j < count; j ++) {
1069ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            FX_INT32 type = 1;
1070ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            FX_LPCBYTE entrystart = segstart + j * totalwidth;
1071ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (WidthArray[0]) {
1072ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                type = _GetVarInt(entrystart, WidthArray[0]);
1073ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
1074ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (m_V5Type[startnum + j] == 255) {
1075ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                FX_FILESIZE offset = _GetVarInt(entrystart + WidthArray[0], WidthArray[1]);
1076ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                m_CrossRef[startnum + j] = offset;
1077ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                FX_LPVOID pResult = FXSYS_bsearch(&offset, m_SortedOffset.GetData(), m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), _CompareFileSize);
1078ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                if (pResult == NULL) {
1079ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    m_SortedOffset.Add(offset);
1080ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
1081ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                continue;
1082ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
1083ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (m_V5Type[startnum + j]) {
1084ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                continue;
1085ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
1086ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_V5Type[startnum + j] = type;
1087ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (type == 0) {
1088ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                m_CrossRef[startnum + j] = 0;
1089ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            } else {
1090ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                FX_FILESIZE offset = _GetVarInt(entrystart + WidthArray[0], WidthArray[1]);
1091ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                m_CrossRef[startnum + j] = offset;
1092ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                if (type == 1) {
1093ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    FX_LPVOID pResult = FXSYS_bsearch(&offset, m_SortedOffset.GetData(), m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), _CompareFileSize);
1094ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    if (pResult == NULL) {
1095ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        m_SortedOffset.Add(offset);
1096ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    }
1097ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                } else {
1098ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    if (offset < 0 || offset >= m_V5Type.GetSize()) {
1099ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        pStream->Release();
1100ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        return FALSE;
1101ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    }
1102ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    m_V5Type[offset] = 255;
1103ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
1104ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
1105ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1106ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        segindex += count;
1107ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1108ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    pStream->Release();
1109ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return TRUE;
1110ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
1111ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Array* CPDF_Parser::GetIDArray()
1112ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
1113ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Object* pID = m_pTrailer->GetElement(FX_BSTRC("ID"));
1114ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pID == NULL) {
1115ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return NULL;
1116ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1117ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pID->GetType() == PDFOBJ_REFERENCE) {
1118ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        pID = ParseIndirectObject(NULL, ((CPDF_Reference*)pID)->GetRefObjNum());
1119ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_pTrailer->SetAt(FX_BSTRC("ID"), pID);
1120ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1121ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pID == NULL || pID->GetType() != PDFOBJ_ARRAY) {
1122ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return NULL;
1123ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1124ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return (CPDF_Array*)pID;
1125ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
1126ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_DWORD CPDF_Parser::GetRootObjNum()
1127ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
1128ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Reference* pRef = (CPDF_Reference*)m_pTrailer->GetElement(FX_BSTRC("Root"));
1129ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pRef == NULL || pRef->GetType() != PDFOBJ_REFERENCE) {
1130ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return 0;
1131ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1132ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return pRef->GetRefObjNum();
1133ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
1134ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_DWORD CPDF_Parser::GetInfoObjNum()
1135ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
1136ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Reference* pRef = (CPDF_Reference*)m_pTrailer->GetElement(FX_BSTRC("Info"));
1137ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pRef == NULL || pRef->GetType() != PDFOBJ_REFERENCE) {
1138ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return 0;
1139ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1140ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return pRef->GetRefObjNum();
1141ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
1142ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_Parser::IsFormStream(FX_DWORD objnum, FX_BOOL& bForm)
1143ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
1144ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    bForm = FALSE;
1145ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (objnum >= (FX_DWORD)m_CrossRef.GetSize()) {
1146ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return TRUE;
1147ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1148ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_V5Type[objnum] == 0) {
1149ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return TRUE;
1150ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1151ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_V5Type[objnum] == 2) {
1152ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return TRUE;
1153ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1154ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_FILESIZE pos = m_CrossRef[objnum];
1155ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_LPVOID pResult = FXSYS_bsearch(&pos, m_SortedOffset.GetData(), m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), _CompareFileSize);
1156ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pResult == NULL) {
1157ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return TRUE;
1158ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1159ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if ((FX_FILESIZE*)pResult - (FX_FILESIZE*)m_SortedOffset.GetData() == m_SortedOffset.GetSize() - 1) {
1160ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FALSE;
1161ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1162ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_FILESIZE size = ((FX_FILESIZE*)pResult)[1] - pos;
1163ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_FILESIZE SavedPos = m_Syntax.SavePos();
1164ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_Syntax.RestorePos(pos);
1165ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    bForm = m_Syntax.SearchMultiWord(FX_BSTRC("/Form\0stream"), TRUE, size) == 0;
1166ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_Syntax.RestorePos(SavedPos);
1167ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return TRUE;
1168ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
1169ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Object* CPDF_Parser::ParseIndirectObject(CPDF_IndirectObjects* pObjList, FX_DWORD objnum, PARSE_CONTEXT* pContext)
1170ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
1171ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (objnum >= (FX_DWORD)m_CrossRef.GetSize()) {
1172ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return NULL;
1173ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1174ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_V5Type[objnum] == 1 || m_V5Type[objnum] == 255) {
1175ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_FILESIZE pos = m_CrossRef[objnum];
1176ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (pos <= 0) {
1177ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return NULL;
1178ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1179ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return ParseIndirectObjectAt(pObjList, pos, objnum, pContext);
1180ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1181ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_V5Type[objnum] == 2) {
1182ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_StreamAcc* pObjStream = GetObjectStream((FX_DWORD)m_CrossRef[objnum]);
1183ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (pObjStream == NULL) {
1184ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return NULL;
1185ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1186ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_INT32 n = pObjStream->GetDict()->GetInteger(FX_BSTRC("N"));
1187ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_INT32 offset = pObjStream->GetDict()->GetInteger(FX_BSTRC("First"));
1188ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_SyntaxParser syntax;
1189ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CFX_SmartPointer<IFX_FileStream> file(FX_CreateMemoryStream((FX_LPBYTE)pObjStream->GetData(), (size_t)pObjStream->GetSize(), FALSE));
1190ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        syntax.InitParser((IFX_FileStream*)file, 0);
1191ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_Object* pRet = NULL;
1192ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        while (n) {
1193ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            FX_DWORD thisnum = syntax.GetDirectNum();
1194ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            FX_DWORD thisoff = syntax.GetDirectNum();
1195ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (thisnum == objnum) {
1196ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                syntax.RestorePos(offset + thisoff);
1197ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                pRet = syntax.GetObject(pObjList, 0, 0, 0, pContext);
1198ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                break;
1199ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
1200ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            n --;
1201ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1202ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return pRet;
1203ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1204ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return NULL;
1205ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
1206ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_StreamAcc* CPDF_Parser::GetObjectStream(FX_DWORD objnum)
1207ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
1208ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_StreamAcc* pStreamAcc = NULL;
1209ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_ObjectStreamMap.Lookup((void*)(FX_UINTPTR)objnum, (void*&)pStreamAcc)) {
1210ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return pStreamAcc;
1211ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1212ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    const CPDF_Stream* pStream = (CPDF_Stream*)m_pDocument->GetIndirectObject(objnum);
1213ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pStream == NULL || pStream->GetType() != PDFOBJ_STREAM) {
1214ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return NULL;
1215ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1216ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    pStreamAcc = FX_NEW CPDF_StreamAcc;
1217ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    pStreamAcc->LoadAllData(pStream);
1218ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_ObjectStreamMap.SetAt((void*)(FX_UINTPTR)objnum, pStreamAcc);
1219ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return pStreamAcc;
1220ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
1221ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_FILESIZE CPDF_Parser::GetObjectSize(FX_DWORD objnum)
1222ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
1223ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (objnum >= (FX_DWORD)m_CrossRef.GetSize()) {
1224ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return 0;
1225ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1226ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_V5Type[objnum] == 2) {
1227ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        objnum = (FX_DWORD)m_CrossRef[objnum];
1228ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1229ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_V5Type[objnum] == 1 || m_V5Type[objnum] == 255) {
1230ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_FILESIZE offset = m_CrossRef[objnum];
1231ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (offset == 0) {
1232ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return 0;
1233ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1234ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_LPVOID pResult = FXSYS_bsearch(&offset, m_SortedOffset.GetData(), m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), _CompareFileSize);
1235ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (pResult == NULL) {
1236ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return 0;
1237ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1238ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if ((FX_FILESIZE*)pResult - (FX_FILESIZE*)m_SortedOffset.GetData() == m_SortedOffset.GetSize() - 1) {
1239ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return 0;
1240ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1241ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return ((FX_FILESIZE*)pResult)[1] - offset;
1242ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1243ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return 0;
1244ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
1245ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_Parser::GetIndirectBinary(FX_DWORD objnum, FX_LPBYTE& pBuffer, FX_DWORD& size)
1246ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
1247ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    pBuffer = NULL;
1248ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    size = 0;
1249ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (objnum >= (FX_DWORD)m_CrossRef.GetSize()) {
1250ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return;
1251ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1252ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_V5Type[objnum] == 2) {
1253ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_StreamAcc* pObjStream = GetObjectStream((FX_DWORD)m_CrossRef[objnum]);
1254ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (pObjStream == NULL) {
1255ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return;
1256ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1257ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_INT32 n = pObjStream->GetDict()->GetInteger(FX_BSTRC("N"));
1258ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_INT32 offset = pObjStream->GetDict()->GetInteger(FX_BSTRC("First"));
1259ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_SyntaxParser syntax;
1260ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_LPCBYTE pData = pObjStream->GetData();
1261ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_DWORD totalsize = pObjStream->GetSize();
1262ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CFX_SmartPointer<IFX_FileStream> file(FX_CreateMemoryStream((FX_LPBYTE)pData, (size_t)totalsize, FALSE));
1263ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        syntax.InitParser((IFX_FileStream*)file, 0);
1264ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        while (n) {
1265ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            FX_DWORD thisnum = syntax.GetDirectNum();
1266ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            FX_DWORD thisoff = syntax.GetDirectNum();
1267ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (thisnum == objnum) {
1268ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                if (n == 1) {
1269ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    size = totalsize - (thisoff + offset);
1270ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                } else {
1271ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    FX_DWORD nextnum = syntax.GetDirectNum();
1272ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    FX_DWORD nextoff = syntax.GetDirectNum();
1273ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    size = nextoff - thisoff;
1274ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
1275ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                pBuffer = FX_Alloc(FX_BYTE, size);
1276ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                FXSYS_memcpy32(pBuffer, pData + thisoff + offset, size);
1277ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                return;
1278ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
1279ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            n --;
1280ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1281ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return;
1282ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1283ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_V5Type[objnum] == 1) {
1284ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_FILESIZE pos = m_CrossRef[objnum];
1285ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (pos == 0) {
1286ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return;
1287ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1288ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_FILESIZE SavedPos = m_Syntax.SavePos();
1289ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_Syntax.RestorePos(pos);
1290ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_BOOL bIsNumber;
1291ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CFX_ByteString word = m_Syntax.GetNextWord(bIsNumber);
1292ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (!bIsNumber) {
1293ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_Syntax.RestorePos(SavedPos);
1294ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return;
1295ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1296ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_DWORD real_objnum = FXSYS_atoi(word);
1297ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (real_objnum && real_objnum != objnum) {
1298ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_Syntax.RestorePos(SavedPos);
1299ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return;
1300ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1301ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        word = m_Syntax.GetNextWord(bIsNumber);
1302ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (!bIsNumber) {
1303ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_Syntax.RestorePos(SavedPos);
1304ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return;
1305ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1306ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (m_Syntax.GetKeyword() != FX_BSTRC("obj")) {
1307ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_Syntax.RestorePos(SavedPos);
1308ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return;
1309ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1310ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_LPVOID pResult = FXSYS_bsearch(&pos, m_SortedOffset.GetData(), m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), _CompareFileSize);
1311ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (pResult == NULL) {
1312ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_Syntax.RestorePos(SavedPos);
1313ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return;
1314ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1315ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_FILESIZE nextoff = ((FX_FILESIZE*)pResult)[1];
1316ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_BOOL bNextOffValid = FALSE;
1317ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (nextoff != pos) {
1318ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_Syntax.RestorePos(nextoff);
1319ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            word = m_Syntax.GetNextWord(bIsNumber);
1320ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (word == FX_BSTRC("xref")) {
1321ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                bNextOffValid = TRUE;
1322ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            } else if (bIsNumber) {
1323ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                word = m_Syntax.GetNextWord(bIsNumber);
1324ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                if (bIsNumber && m_Syntax.GetKeyword() == FX_BSTRC("obj")) {
1325ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    bNextOffValid = TRUE;
1326ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
1327ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
1328ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1329ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (!bNextOffValid) {
1330ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_Syntax.RestorePos(pos);
1331ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            while (1) {
1332ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                if (m_Syntax.GetKeyword() == FX_BSTRC("endobj")) {
1333ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    break;
1334ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
1335ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                if (m_Syntax.SavePos() == m_Syntax.m_FileLen) {
1336ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    break;
1337ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
1338ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
1339ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            nextoff = m_Syntax.SavePos();
1340ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1341ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        size = (FX_DWORD)(nextoff - pos);
1342ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        pBuffer = FX_Alloc(FX_BYTE, size);
1343ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_Syntax.RestorePos(pos);
1344ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_Syntax.ReadBlock(pBuffer, size);
1345ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_Syntax.RestorePos(SavedPos);
1346ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1347ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
1348ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Object* CPDF_Parser::ParseIndirectObjectAt(CPDF_IndirectObjects* pObjList, FX_FILESIZE pos, FX_DWORD objnum,
1349ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        PARSE_CONTEXT* pContext)
1350ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
1351ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_FILESIZE SavedPos = m_Syntax.SavePos();
1352ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_Syntax.RestorePos(pos);
1353ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_BOOL bIsNumber;
1354ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_ByteString word = m_Syntax.GetNextWord(bIsNumber);
1355ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!bIsNumber) {
1356ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_Syntax.RestorePos(SavedPos);
1357ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return NULL;
1358ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1359ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_FILESIZE objOffset = m_Syntax.SavePos();
1360ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    objOffset -= word.GetLength();
1361ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_DWORD real_objnum = FXSYS_atoi(word);
1362ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (objnum && real_objnum != objnum) {
1363ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_Syntax.RestorePos(SavedPos);
1364ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return NULL;
1365ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1366ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    word = m_Syntax.GetNextWord(bIsNumber);
1367ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!bIsNumber) {
1368ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_Syntax.RestorePos(SavedPos);
1369ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return NULL;
1370ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1371ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_DWORD gennum = FXSYS_atoi(word);
1372ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_Syntax.GetKeyword() != FX_BSTRC("obj")) {
1373ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_Syntax.RestorePos(SavedPos);
1374ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return NULL;
1375ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1376ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Object* pObj = m_Syntax.GetObject(pObjList, objnum, gennum, 0, pContext);
1377ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_FILESIZE endOffset = m_Syntax.SavePos();
1378ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_ByteString bsWord = m_Syntax.GetKeyword();
1379ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (bsWord == FX_BSTRC("endobj")) {
1380ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        endOffset = m_Syntax.SavePos();
1381ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1382ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_DWORD objSize = endOffset - objOffset;
1383ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_Syntax.RestorePos(SavedPos);
1384ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pObj && !objnum) {
1385ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        pObj->m_ObjNum = real_objnum;
1386ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1387ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return pObj;
1388ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
1389ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Object* CPDF_Parser::ParseIndirectObjectAtByStrict(CPDF_IndirectObjects* pObjList, FX_FILESIZE pos, FX_DWORD objnum,
1390ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        struct PARSE_CONTEXT* pContext, FX_FILESIZE *pResultPos)
1391ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
1392ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_FILESIZE SavedPos = m_Syntax.SavePos();
1393ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_Syntax.RestorePos(pos);
1394ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_BOOL bIsNumber;
1395ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_ByteString word = m_Syntax.GetNextWord(bIsNumber);
1396ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!bIsNumber) {
1397ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_Syntax.RestorePos(SavedPos);
1398ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return NULL;
1399ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1400ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_DWORD real_objnum = FXSYS_atoi(word);
1401ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (objnum && real_objnum != objnum) {
1402ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_Syntax.RestorePos(SavedPos);
1403ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return NULL;
1404ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1405ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    word = m_Syntax.GetNextWord(bIsNumber);
1406ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!bIsNumber) {
1407ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_Syntax.RestorePos(SavedPos);
1408ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return NULL;
1409ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1410ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_DWORD gennum = FXSYS_atoi(word);
1411ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_Syntax.GetKeyword() != FX_BSTRC("obj")) {
1412ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_Syntax.RestorePos(SavedPos);
1413ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return NULL;
1414ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1415ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Object* pObj = m_Syntax.GetObjectByStrict(pObjList, objnum, gennum, 0, pContext);
1416ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pResultPos) {
1417ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        *pResultPos = m_Syntax.m_Pos;
1418ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1419ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_Syntax.RestorePos(SavedPos);
1420ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return pObj;
1421ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
1422ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Dictionary* CPDF_Parser::LoadTrailerV4()
1423ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
1424ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_Syntax.GetKeyword() != FX_BSTRC("trailer")) {
1425ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return NULL;
1426ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1427ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Object* pObj = m_Syntax.GetObject(m_pDocument, 0, 0, 0);
1428ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pObj == NULL || pObj->GetType() != PDFOBJ_DICTIONARY) {
1429ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (pObj) {
1430ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            pObj->Release();
1431ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1432ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return NULL;
1433ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1434ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return (CPDF_Dictionary*)pObj;
1435ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
1436ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_DWORD CPDF_Parser::GetPermissions(FX_BOOL bCheckRevision)
1437ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
1438ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_pSecurityHandler == NULL) {
1439ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return (FX_DWORD) - 1;
1440ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1441ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_DWORD dwPermission = m_pSecurityHandler->GetPermissions();
1442ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_pEncryptDict && m_pEncryptDict->GetString(FX_BSTRC("Filter")) == FX_BSTRC("Standard")) {
1443ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        dwPermission &= 0xFFFFFFFC;
1444ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        dwPermission |= 0xFFFFF0C0;
1445ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if(bCheckRevision && m_pEncryptDict->GetInteger(FX_BSTRC("R")) == 2) {
1446ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            dwPermission &= 0xFFFFF0FF;
1447ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1448ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1449ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return dwPermission;
1450ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
1451ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_Parser::IsOwner()
1452ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
1453ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return m_pSecurityHandler == NULL ? TRUE : m_pSecurityHandler->IsOwner();
1454ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
1455ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_Parser::SetSecurityHandler(CPDF_SecurityHandler* pSecurityHandler, FX_BOOL bForced)
1456ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
1457ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    ASSERT(m_pSecurityHandler == NULL);
1458ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_pSecurityHandler && !m_bForceUseSecurityHandler) {
1459ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        delete m_pSecurityHandler;
1460ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_pSecurityHandler = NULL;
1461ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1462ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_bForceUseSecurityHandler = bForced;
1463ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_pSecurityHandler = pSecurityHandler;
1464ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_bForceUseSecurityHandler) {
1465ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return;
1466ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1467ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_Syntax.m_pCryptoHandler = pSecurityHandler->CreateCryptoHandler();
1468ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_Syntax.m_pCryptoHandler->Init(NULL, pSecurityHandler);
1469ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
1470ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_Parser::IsLinearizedFile(IFX_FileRead* pFileAccess, FX_DWORD offset)
1471ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
1472ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_Syntax.InitParser(pFileAccess, offset);
1473ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_Syntax.RestorePos(m_Syntax.m_HeaderOffset + 9);
1474ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_FILESIZE SavedPos = m_Syntax.SavePos();
1475ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_BOOL bIsNumber;
1476ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_ByteString word = m_Syntax.GetNextWord(bIsNumber);
1477ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!bIsNumber) {
1478ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FALSE;
1479ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1480ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_DWORD objnum = FXSYS_atoi(word);
1481ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    word = m_Syntax.GetNextWord(bIsNumber);
1482ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!bIsNumber) {
1483ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FALSE;
1484ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1485ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_DWORD gennum = FXSYS_atoi(word);
1486ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_Syntax.GetKeyword() != FX_BSTRC("obj")) {
1487ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_Syntax.RestorePos(SavedPos);
1488ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FALSE;
1489ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1490ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_pLinearized = m_Syntax.GetObject(NULL, objnum, gennum, 0);
1491ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!m_pLinearized) {
1492ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FALSE;
1493ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1494ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_pLinearized->GetDict()->GetElement(FX_BSTRC("Linearized"))) {
1495ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_Syntax.GetNextWord(bIsNumber);
1496ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_Object *pLen = m_pLinearized->GetDict()->GetElement(FX_BSTRC("L"));
1497ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (!pLen) {
1498ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_pLinearized->Release();
1499ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return FALSE;
1500ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1501ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (pLen->GetInteger() != (int)pFileAccess->GetSize()) {
1502ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return FALSE;
1503ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1504ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_Object *pNo = m_pLinearized->GetDict()->GetElement(FX_BSTRC("P"));
1505ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (pNo && pNo->GetType() == PDFOBJ_NUMBER) {
1506ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_dwFirstPageNo = pNo->GetInteger();
1507ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1508ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_Object *pTable = m_pLinearized->GetDict()->GetElement(FX_BSTRC("T"));
1509ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (pTable && pTable->GetType() == PDFOBJ_NUMBER) {
1510ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_LastXRefOffset = pTable->GetInteger();
1511ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1512ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return TRUE;
1513ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1514ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_pLinearized->Release();
1515ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_pLinearized = NULL;
1516ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return FALSE;
1517ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
1518ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_DWORD CPDF_Parser::StartAsynParse(IFX_FileRead* pFileAccess, FX_BOOL bReParse, FX_BOOL bOwnFileRead)
1519ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
1520ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CloseParser(bReParse);
1521ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_bXRefStream = FALSE;
1522ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_LastXRefOffset = 0;
1523ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_bOwnFileRead = bOwnFileRead;
1524ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_INT32 offset = GetHeaderOffset(pFileAccess);
1525ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (offset == -1) {
1526ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return PDFPARSE_ERROR_FORMAT;
1527ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1528ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!IsLinearizedFile(pFileAccess, offset)) {
1529ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_Syntax.m_pFileAccess = NULL;
1530ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return StartParse(pFileAccess, bReParse, bOwnFileRead);
1531ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1532ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!bReParse) {
1533ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_pDocument = FX_NEW CPDF_Document(this);
1534ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1535ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_FILESIZE dwFirstXRefOffset = m_Syntax.SavePos();
1536ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_BOOL bXRefRebuilt = FALSE;
1537ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_BOOL bLoadV4 = FALSE;
1538ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!(bLoadV4 = LoadCrossRefV4(dwFirstXRefOffset, 0, FALSE, FALSE)) && !LoadCrossRefV5(dwFirstXRefOffset, dwFirstXRefOffset, TRUE)) {
1539ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (!RebuildCrossRef()) {
1540ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return PDFPARSE_ERROR_FORMAT;
1541ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1542ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        bXRefRebuilt = TRUE;
1543ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_LastXRefOffset = 0;
1544ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1545ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (bLoadV4) {
1546ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_pTrailer = LoadTrailerV4();
1547ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (m_pTrailer == NULL) {
1548ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return FALSE;
1549ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1550ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_INT32 xrefsize = GetDirectInteger(m_pTrailer, FX_BSTRC("Size"));
1551ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (xrefsize == 0) {
1552ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return FALSE;
1553ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1554ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_CrossRef.SetSize(xrefsize);
1555ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_V5Type.SetSize(xrefsize);
1556ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1557ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_DWORD dwRet = SetEncryptHandler();
1558ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (dwRet != PDFPARSE_ERROR_SUCCESS) {
1559ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return dwRet;
1560ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1561ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_pDocument->LoadAsynDoc(m_pLinearized->GetDict());
1562ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_pDocument->GetRoot() == NULL || m_pDocument->GetPageCount() == 0) {
1563ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (bXRefRebuilt) {
1564ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return PDFPARSE_ERROR_FORMAT;
1565ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1566ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        ReleaseEncryptHandler();
1567ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (!RebuildCrossRef()) {
1568ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return PDFPARSE_ERROR_FORMAT;
1569ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1570ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        dwRet = SetEncryptHandler();
1571ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (dwRet != PDFPARSE_ERROR_SUCCESS) {
1572ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return dwRet;
1573ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1574ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_pDocument->LoadAsynDoc(m_pLinearized->GetDict());
1575ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (m_pDocument->GetRoot() == NULL) {
1576ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return PDFPARSE_ERROR_FORMAT;
1577ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1578ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1579ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FXSYS_qsort(m_SortedOffset.GetData(), m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), _CompareFileSize);
1580ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_DWORD RootObjNum = GetRootObjNum();
1581ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (RootObjNum == 0) {
1582ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        ReleaseEncryptHandler();
1583ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        RebuildCrossRef();
1584ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        RootObjNum = GetRootObjNum();
1585ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (RootObjNum == 0) {
1586ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return PDFPARSE_ERROR_FORMAT;
1587ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1588ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        dwRet = SetEncryptHandler();
1589ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (dwRet != PDFPARSE_ERROR_SUCCESS) {
1590ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return dwRet;
1591ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1592ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1593ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_pSecurityHandler && m_pSecurityHandler->IsMetadataEncrypted()) {
1594ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_Reference* pMetadata = (CPDF_Reference*)m_pDocument->GetRoot()->GetElement(FX_BSTRC("Metadata"));
1595ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (pMetadata && pMetadata->GetType() == PDFOBJ_REFERENCE) {
1596ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_Syntax.m_MetadataObjnum = pMetadata->GetRefObjNum();
1597ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1598ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1599ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return PDFPARSE_ERROR_SUCCESS;
1600ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
1601ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_Parser::LoadLinearizedAllCrossRefV5(FX_FILESIZE xrefpos)
1602ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
1603ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!LoadCrossRefV5(xrefpos, xrefpos, FALSE)) {
1604ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FALSE;
1605ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1606ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    while (xrefpos)
1607ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (!LoadCrossRefV5(xrefpos, xrefpos, FALSE)) {
1608ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return FALSE;
1609ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1610ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_ObjectStreamMap.InitHashTable(101, FALSE);
1611ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_bXRefStream = TRUE;
1612ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return TRUE;
1613ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
1614ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_DWORD CPDF_Parser::LoadLinearizedMainXRefTable()
1615ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
1616ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_DWORD dwSaveMetadataObjnum = m_Syntax.m_MetadataObjnum;
1617ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_Syntax.m_MetadataObjnum = 0;
1618ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_pTrailer) {
1619ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_pTrailer->Release();
1620ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_pTrailer = NULL;
1621ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1622ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_Syntax.RestorePos(m_LastXRefOffset - m_Syntax.m_HeaderOffset);
1623ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_FILESIZE dwSavedPos = m_Syntax.SavePos();
1624ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_BYTE ch = 0;
1625ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_DWORD dwCount = 0;
1626ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_Syntax.GetNextChar(ch);
1627ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_INT32 type = _PDF_CharType[ch];
1628ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    while (type == 'W') {
1629ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        ++dwCount;
1630ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (m_Syntax.m_FileLen >= (FX_FILESIZE)(m_Syntax.SavePos() + m_Syntax.m_HeaderOffset)) {
1631ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            break;
1632ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1633ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_Syntax.GetNextChar(ch);
1634ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        type = _PDF_CharType[ch];
1635ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1636ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_LastXRefOffset += dwCount;
1637ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_POSITION pos = m_ObjectStreamMap.GetStartPosition();
1638ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    while (pos) {
1639ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_LPVOID objnum;
1640ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_StreamAcc* pStream;
1641ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_ObjectStreamMap.GetNextAssoc(pos, objnum, (void*&)pStream);
1642ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        delete pStream;
1643ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1644ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_ObjectStreamMap.RemoveAll();
1645ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!LoadLinearizedAllCrossRefV4(m_LastXRefOffset, m_dwXrefStartObjNum) && !LoadLinearizedAllCrossRefV5(m_LastXRefOffset)) {
1646ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_LastXRefOffset = 0;
1647ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_Syntax.m_MetadataObjnum = dwSaveMetadataObjnum;
1648ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return PDFPARSE_ERROR_FORMAT;
1649ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1650ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FXSYS_qsort(m_SortedOffset.GetData(), m_SortedOffset.GetSize(), sizeof(FX_DWORD), _CompareDWord);
1651ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_Syntax.m_MetadataObjnum = dwSaveMetadataObjnum;
1652ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return PDFPARSE_ERROR_SUCCESS;
1653ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
1654ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_SyntaxParser::CPDF_SyntaxParser()
1655ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
1656ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_pFileAccess = NULL;
1657ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_pCryptoHandler = NULL;
1658ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_pFileBuf = NULL;
1659ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_BufSize = CPDF_ModuleMgr::Get()->m_FileBufSize;
1660ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_pFileBuf = NULL;
1661ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_MetadataObjnum = 0;
1662ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_dwWordPos = 0;
1663ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#if defined(_FPDFAPI_MINI_)
1664ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_bFileStream = TRUE;
1665ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#else
1666ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_bFileStream = FALSE;
1667ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
1668ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
1669ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_SyntaxParser::~CPDF_SyntaxParser()
1670ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
1671ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_pFileBuf) {
1672ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_Free(m_pFileBuf);
1673ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1674ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
1675ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_SyntaxParser::GetCharAt(FX_FILESIZE pos, FX_BYTE& ch)
1676ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
1677ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_FILESIZE save_pos = m_Pos;
1678ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_Pos = pos;
1679ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_BOOL ret = GetNextChar(ch);
1680ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_Pos = save_pos;
1681ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return ret;
1682ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
1683ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_SyntaxParser::GetNextChar(FX_BYTE& ch)
1684ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
1685ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_FILESIZE pos = m_Pos + m_HeaderOffset;
1686ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pos >= m_FileLen) {
1687ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FALSE;
1688ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1689ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_BufOffset >= pos || (FX_FILESIZE)(m_BufOffset + m_BufSize) <= pos) {
1690ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_FILESIZE read_pos = pos;
1691ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_DWORD read_size = m_BufSize;
1692ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if ((FX_FILESIZE)read_size > m_FileLen) {
1693ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            read_size = (FX_DWORD)m_FileLen;
1694ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1695ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if ((FX_FILESIZE)(read_pos + read_size) > m_FileLen) {
1696ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (m_FileLen < (FX_FILESIZE)read_size) {
1697ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                read_pos = 0;
1698ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                read_size = (FX_DWORD)m_FileLen;
1699ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            } else {
1700ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                read_pos = m_FileLen - read_size;
1701ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
1702ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1703ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (!m_pFileAccess->ReadBlock(m_pFileBuf, read_pos, read_size)) {
1704ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return FALSE;
1705ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1706ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_BufOffset = read_pos;
1707ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1708ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    ch = m_pFileBuf[pos - m_BufOffset];
1709ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_Pos ++;
1710ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return TRUE;
1711ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
1712ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_SyntaxParser::GetCharAtBackward(FX_FILESIZE pos, FX_BYTE& ch)
1713ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
1714ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    pos += m_HeaderOffset;
1715ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pos >= m_FileLen) {
1716ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FALSE;
1717ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1718ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_BufOffset >= pos || (FX_FILESIZE)(m_BufOffset + m_BufSize) <= pos) {
1719ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_FILESIZE read_pos;
1720ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (pos < (FX_FILESIZE)m_BufSize) {
1721ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            read_pos = 0;
1722ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        } else {
1723ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            read_pos = pos - m_BufSize + 1;
1724ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1725ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_DWORD read_size = m_BufSize;
1726ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if ((FX_FILESIZE)(read_pos + read_size) > m_FileLen) {
1727ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (m_FileLen < (FX_FILESIZE)read_size) {
1728ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                read_pos = 0;
1729ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                read_size = (FX_DWORD)m_FileLen;
1730ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            } else {
1731ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                read_pos = m_FileLen - read_size;
1732ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
1733ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1734ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (!m_pFileAccess->ReadBlock(m_pFileBuf, read_pos, read_size)) {
1735ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return FALSE;
1736ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1737ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_BufOffset = read_pos;
1738ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1739ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    ch = m_pFileBuf[pos - m_BufOffset];
1740ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return TRUE;
1741ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
1742ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_SyntaxParser::ReadBlock(FX_LPBYTE pBuf, FX_DWORD size)
1743ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
1744ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!m_pFileAccess->ReadBlock(pBuf, m_Pos + m_HeaderOffset, size)) {
1745ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FALSE;
1746ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1747ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_Pos += size;
1748ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return TRUE;
1749ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
1750ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define MAX_WORD_BUFFER 256
1751ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_SyntaxParser::GetNextWord()
1752ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
1753ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_WordSize = 0;
1754ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_bIsNumber = TRUE;
1755ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_BYTE ch;
1756ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!GetNextChar(ch)) {
1757ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return;
1758ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1759ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_BYTE type = _PDF_CharType[ch];
1760ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    while (1) {
1761ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        while (type == 'W') {
1762ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (!GetNextChar(ch)) {
1763ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                return;
1764ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
1765ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            type = _PDF_CharType[ch];
1766ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1767ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (ch != '%') {
1768ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            break;
1769ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1770ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        while (1) {
1771ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (!GetNextChar(ch)) {
1772ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                return;
1773ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
1774ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (ch == '\r' || ch == '\n') {
1775ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                break;
1776ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
1777ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1778ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        type = _PDF_CharType[ch];
1779ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1780ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (type == 'D') {
1781ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_bIsNumber = FALSE;
1782ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_WordBuffer[m_WordSize++] = ch;
1783ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (ch == '/') {
1784ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            while (1) {
1785ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                if (!GetNextChar(ch)) {
1786ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    return;
1787ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
1788ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                type = _PDF_CharType[ch];
1789ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                if (type != 'R' && type != 'N') {
1790ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    m_Pos --;
1791ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    return;
1792ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
1793ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                if (m_WordSize < MAX_WORD_BUFFER) {
1794ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    m_WordBuffer[m_WordSize++] = ch;
1795ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
1796ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
1797ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        } else if (ch == '<') {
1798ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (!GetNextChar(ch)) {
1799ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                return;
1800ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
1801ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (ch == '<') {
1802ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                m_WordBuffer[m_WordSize++] = ch;
1803ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            } else {
1804ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                m_Pos --;
1805ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
1806ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        } else if (ch == '>') {
1807ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (!GetNextChar(ch)) {
1808ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                return;
1809ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
1810ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (ch == '>') {
1811ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                m_WordBuffer[m_WordSize++] = ch;
1812ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            } else {
1813ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                m_Pos --;
1814ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
1815ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1816ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return;
1817ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1818ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    while (1) {
1819ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (m_WordSize < MAX_WORD_BUFFER) {
1820ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_WordBuffer[m_WordSize++] = ch;
1821ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1822ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (type != 'N') {
1823ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_bIsNumber = FALSE;
1824ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1825ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (!GetNextChar(ch)) {
1826ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return;
1827ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1828ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        type = _PDF_CharType[ch];
1829ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (type == 'D' || type == 'W') {
1830ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_Pos --;
1831ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            break;
1832ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1833ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1834ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
1835ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCFX_ByteString CPDF_SyntaxParser::ReadString()
1836ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
1837ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_BYTE ch;
1838ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!GetNextChar(ch)) {
1839ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return CFX_ByteString();
1840ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1841ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_ByteTextBuf buf;
1842ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_INT32 parlevel = 0;
1843ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_INT32 status = 0, iEscCode = 0;
1844ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    while (1) {
1845ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        switch (status) {
1846ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            case 0:
1847ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                if (ch == ')') {
1848ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    if (parlevel == 0) {
1849ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        return buf.GetByteString();
1850ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    }
1851ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    parlevel --;
1852ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    buf.AppendChar(')');
1853ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                } else if (ch == '(') {
1854ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    parlevel ++;
1855ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    buf.AppendChar('(');
1856ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                } else if (ch == '\\') {
1857ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    status = 1;
1858ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                } else {
1859ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    buf.AppendChar(ch);
1860ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
1861ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                break;
1862ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            case 1:
1863ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                if (ch >= '0' && ch <= '7') {
1864ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    iEscCode = ch - '0';
1865ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    status = 2;
1866ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    break;
1867ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
1868ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                if (ch == 'n') {
1869ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    buf.AppendChar('\n');
1870ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                } else if (ch == 'r') {
1871ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    buf.AppendChar('\r');
1872ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                } else if (ch == 't') {
1873ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    buf.AppendChar('\t');
1874ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                } else if (ch == 'b') {
1875ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    buf.AppendChar('\b');
1876ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                } else if (ch == 'f') {
1877ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    buf.AppendChar('\f');
1878ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                } else if (ch == '\r') {
1879ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    status = 4;
1880ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    break;
1881ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                } else if (ch == '\n') {
1882ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                } else {
1883ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    buf.AppendChar(ch);
1884ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
1885ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                status = 0;
1886ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                break;
1887ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            case 2:
1888ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                if (ch >= '0' && ch <= '7') {
1889ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    iEscCode = iEscCode * 8 + ch - '0';
1890ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    status = 3;
1891ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                } else {
1892ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    buf.AppendChar(iEscCode);
1893ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    status = 0;
1894ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    continue;
1895ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
1896ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                break;
1897ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            case 3:
1898ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                if (ch >= '0' && ch <= '7') {
1899ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    iEscCode = iEscCode * 8 + ch - '0';
1900ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    buf.AppendChar(iEscCode);
1901ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    status = 0;
1902ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                } else {
1903ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    buf.AppendChar(iEscCode);
1904ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    status = 0;
1905ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    continue;
1906ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
1907ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                break;
1908ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            case 4:
1909ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                status = 0;
1910ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                if (ch != '\n') {
1911ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    continue;
1912ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
1913ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                break;
1914ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1915ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (!GetNextChar(ch)) {
1916ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            break;
1917ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1918ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1919ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    GetNextChar(ch);
1920ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return buf.GetByteString();
1921ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
1922ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCFX_ByteString CPDF_SyntaxParser::ReadHexString()
1923ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
1924ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_BYTE ch;
1925ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!GetNextChar(ch)) {
1926ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return CFX_ByteString();
1927ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1928ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_BinaryBuf buf;
1929ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_BOOL bFirst = TRUE;
1930ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_BYTE code = 0;
1931ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    while (1) {
1932ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (ch == '>') {
1933ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            break;
1934ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1935ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (ch >= '0' && ch <= '9') {
1936ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (bFirst) {
1937ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                code = (ch - '0') * 16;
1938ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            } else {
1939ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                code += ch - '0';
1940ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                buf.AppendByte((FX_BYTE)code);
1941ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
1942ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            bFirst = !bFirst;
1943ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        } else if (ch >= 'A' && ch <= 'F') {
1944ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (bFirst) {
1945ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                code = (ch - 'A' + 10) * 16;
1946ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            } else {
1947ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                code += ch - 'A' + 10;
1948ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                buf.AppendByte((FX_BYTE)code);
1949ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
1950ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            bFirst = !bFirst;
1951ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        } else if (ch >= 'a' && ch <= 'f') {
1952ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (bFirst) {
1953ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                code = (ch - 'a' + 10) * 16;
1954ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            } else {
1955ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                code += ch - 'a' + 10;
1956ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                buf.AppendByte((FX_BYTE)code);
1957ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
1958ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            bFirst = !bFirst;
1959ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1960ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (!GetNextChar(ch)) {
1961ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            break;
1962ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1963ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1964ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!bFirst) {
1965ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        buf.AppendByte((FX_BYTE)code);
1966ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1967ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return buf.GetByteString();
1968ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
1969ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_SyntaxParser::ToNextLine()
1970ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
1971ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_BYTE ch;
1972ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    while (1) {
1973ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (!GetNextChar(ch)) {
1974ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return;
1975ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1976ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (ch == '\n') {
1977ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return;
1978ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1979ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (ch == '\r') {
1980ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            GetNextChar(ch);
1981ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (ch == '\n') {
1982ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                return;
1983ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            } else {
1984ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                m_Pos --;
1985ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                return;
1986ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
1987ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1988ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1989ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
1990ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_SyntaxParser::ToNextWord()
1991ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
1992ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_BYTE ch;
1993ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!GetNextChar(ch)) {
1994ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return;
1995ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1996ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_BYTE type = _PDF_CharType[ch];
1997ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    while (1) {
1998ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        while (type == 'W') {
1999ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_dwWordPos = m_Pos;
2000ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (!GetNextChar(ch)) {
2001ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                return;
2002ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
2003ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            type = _PDF_CharType[ch];
2004ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
2005ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (ch != '%') {
2006ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            break;
2007ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
2008ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        while (1) {
2009ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (!GetNextChar(ch)) {
2010ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                return;
2011ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
2012ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (ch == '\r' || ch == '\n') {
2013ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                break;
2014ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
2015ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
2016ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        type = _PDF_CharType[ch];
2017ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
2018ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_Pos --;
2019ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
2020ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCFX_ByteString CPDF_SyntaxParser::GetNextWord(FX_BOOL& bIsNumber)
2021ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
2022ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    GetNextWord();
2023ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    bIsNumber = m_bIsNumber;
2024ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return CFX_ByteString((FX_LPCSTR)m_WordBuffer, m_WordSize);
2025ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
2026ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCFX_ByteString CPDF_SyntaxParser::GetKeyword()
2027ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
2028ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    GetNextWord();
2029ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return CFX_ByteString((FX_LPCSTR)m_WordBuffer, m_WordSize);
2030ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
2031ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Object* CPDF_SyntaxParser::GetObject(CPDF_IndirectObjects* pObjList, FX_DWORD objnum, FX_DWORD gennum, FX_INT32 level, PARSE_CONTEXT* pContext, FX_BOOL bDecrypt)
2032ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
2033ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (level > _PARSER_OBJECT_LEVLE_) {
2034ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return NULL;
2035ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
2036ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_FILESIZE SavedPos = m_Pos;
2037ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_BOOL bTypeOnly = pContext && (pContext->m_Flags & PDFPARSE_TYPEONLY);
2038ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_BOOL bIsNumber;
2039ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_ByteString word = GetNextWord(bIsNumber);
2040ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Object* pRet = NULL;
2041ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (word.GetLength() == 0) {
2042ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (bTypeOnly) {
2043ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return (CPDF_Object*)PDFOBJ_INVALID;
2044ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
2045ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return NULL;
2046ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
2047ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_FILESIZE wordOffset = m_Pos - word.GetLength();
2048ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (bIsNumber) {
2049ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_FILESIZE SavedPos = m_Pos;
2050ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CFX_ByteString nextword = GetNextWord(bIsNumber);
2051ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (bIsNumber) {
2052ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            CFX_ByteString nextword2 = GetNextWord(bIsNumber);
2053ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (nextword2 == FX_BSTRC("R")) {
2054ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                FX_DWORD objnum = FXSYS_atoi(word);
2055ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                if (bTypeOnly) {
2056ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    return (CPDF_Object*)PDFOBJ_REFERENCE;
2057ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
2058ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                pRet = CPDF_Reference::Create(pObjList, objnum);
2059ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                return pRet;
2060ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            } else {
2061ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                m_Pos = SavedPos;
2062ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                if (bTypeOnly) {
2063ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    return (CPDF_Object*)PDFOBJ_NUMBER;
2064ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
2065ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                pRet = CPDF_Number::Create(word);
2066ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                return pRet;
2067ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
2068ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        } else {
2069ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_Pos = SavedPos;
2070ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (bTypeOnly) {
2071ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                return (CPDF_Object*)PDFOBJ_NUMBER;
2072ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
2073ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            pRet = CPDF_Number::Create(word);
2074ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return pRet;
2075ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
2076ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
2077ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (word == FX_BSTRC("true") || word == FX_BSTRC("false")) {
2078ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (bTypeOnly) {
2079ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return (CPDF_Object*)PDFOBJ_BOOLEAN;
2080ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
2081ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        pRet = CPDF_Boolean::Create(word == FX_BSTRC("true"));
2082ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return pRet;
2083ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
2084ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (word == FX_BSTRC("null")) {
2085ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (bTypeOnly) {
2086ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return (CPDF_Object*)PDFOBJ_NULL;
2087ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
2088ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        pRet = CPDF_Null::Create();
2089ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return pRet;
2090ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
2091ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (word == FX_BSTRC("(")) {
2092ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (bTypeOnly) {
2093ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return (CPDF_Object*)PDFOBJ_STRING;
2094ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
2095ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_FILESIZE SavedPos = m_Pos - 1;
2096ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CFX_ByteString str = ReadString();
2097ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (m_pCryptoHandler && bDecrypt) {
2098ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_pCryptoHandler->Decrypt(objnum, gennum, str);
2099ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
2100ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        pRet = CPDF_String::Create(str, FALSE);
2101ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return pRet;
2102ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
2103ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (word == FX_BSTRC("<")) {
2104ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (bTypeOnly) {
2105ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return (CPDF_Object*)PDFOBJ_STRING;
2106ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
2107ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_FILESIZE SavedPos = m_Pos - 1;
2108ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CFX_ByteString str = ReadHexString();
2109ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (m_pCryptoHandler && bDecrypt) {
2110ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_pCryptoHandler->Decrypt(objnum, gennum, str);
2111ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
2112ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        pRet = CPDF_String::Create(str, TRUE);
2113ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return pRet;
2114ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
2115ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (word == FX_BSTRC("[")) {
2116ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (bTypeOnly) {
2117ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return (CPDF_Object*)PDFOBJ_ARRAY;
2118ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
2119ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_Array* pArray = CPDF_Array::Create();
2120ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_FILESIZE firstPos = m_Pos - 1;
2121ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        while (1) {
2122ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            FX_FILESIZE SavedPos = m_Pos;
2123ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            CPDF_Object* pObj = GetObject(pObjList, objnum, gennum, level + 1);
2124ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (pObj == NULL) {
2125ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                return pArray;
2126ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
2127ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            pArray->Add(pObj);
2128ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
2129ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
2130ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (word[0] == '/') {
2131ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (bTypeOnly) {
2132ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return (CPDF_Object*)PDFOBJ_NAME;
2133ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
2134ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        pRet = CPDF_Name::Create(PDF_NameDecode(CFX_ByteStringC(m_WordBuffer + 1, m_WordSize - 1)));
2135ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return pRet;
2136ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
2137ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (word == FX_BSTRC("<<")) {
2138ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_FILESIZE saveDictOffset = m_Pos - 2;
2139ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_DWORD dwDictSize = 0;
2140ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (bTypeOnly) {
2141ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return (CPDF_Object*)PDFOBJ_DICTIONARY;
2142ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
2143ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (pContext) {
2144ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            pContext->m_DictStart = SavedPos;
2145ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
2146ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_Dictionary* pDict = CPDF_Dictionary::Create();
2147ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_INT32 nKeys = 0;
2148ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_FILESIZE dwSignValuePos = 0;
2149ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        while (1) {
2150ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            FX_BOOL bIsNumber;
2151ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            CFX_ByteString key = GetNextWord(bIsNumber);
2152ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (key.IsEmpty()) {
2153ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                pDict->Release();
2154ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                return NULL;
2155ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
2156ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            FX_FILESIZE SavedPos = m_Pos - key.GetLength();
2157ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (key == FX_BSTRC(">>")) {
2158ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                dwDictSize = m_Pos - saveDictOffset;
2159ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                break;
2160ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
2161ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (key == FX_BSTRC("endobj")) {
2162ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                dwDictSize = m_Pos - 6 - saveDictOffset;
2163ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                m_Pos = SavedPos;
2164ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                break;
2165ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
2166ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (key[0] != '/') {
2167ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                continue;
2168ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
2169ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            nKeys ++;
2170ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            key = PDF_NameDecode(key);
2171ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (key == FX_BSTRC("/Contents")) {
2172ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                dwSignValuePos = m_Pos;
2173ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
2174ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            CPDF_Object* pObj = GetObject(pObjList, objnum, gennum, level + 1);
2175ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (pObj == NULL) {
2176ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                continue;
2177ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
2178ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (key.GetLength() == 1) {
2179ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                pDict->SetAt(CFX_ByteStringC(((FX_LPCSTR)key) + 1, key.GetLength() - 1), pObj);
2180ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            } else {
2181ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                if (nKeys < 32) {
2182ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    pDict->SetAt(CFX_ByteStringC(((FX_LPCSTR)key) + 1, key.GetLength() - 1), pObj);
2183ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                } else {
2184ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    pDict->AddValue(CFX_ByteStringC(((FX_LPCSTR)key) + 1, key.GetLength() - 1), pObj);
2185ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
2186ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
2187ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
2188ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (IsSignatureDict(pDict)) {
2189ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            FX_FILESIZE dwSavePos = m_Pos;
2190ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_Pos = dwSignValuePos;
2191ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            CPDF_Object* pObj = GetObject(pObjList, objnum, gennum, level + 1, NULL, FALSE);
2192ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            pDict->SetAt(FX_BSTRC("Contents"), pObj);
2193ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_Pos = dwSavePos;
2194ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
2195ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (pContext) {
2196ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            pContext->m_DictEnd = m_Pos;
2197ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (pContext->m_Flags & PDFPARSE_NOSTREAM) {
2198ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                return pDict;
2199ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
2200ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
2201ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_FILESIZE SavedPos = m_Pos;
2202ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_BOOL bIsNumber;
2203ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CFX_ByteString nextword = GetNextWord(bIsNumber);
2204ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (nextword == FX_BSTRC("stream")) {
2205ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            CPDF_Stream* pStream = ReadStream(pDict, pContext, objnum, gennum);
2206ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (pStream) {
2207ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                return pStream;
2208ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
2209ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            pDict->Release();
2210ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return NULL;
2211ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        } else {
2212ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_Pos = SavedPos;
2213ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return pDict;
2214ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
2215ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
2216ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (word == FX_BSTRC(">>")) {
2217ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_Pos = SavedPos;
2218ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return NULL;
2219ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
2220ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (bTypeOnly) {
2221ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return (CPDF_Object*)PDFOBJ_INVALID;
2222ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
2223ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return NULL;
2224ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
2225ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Object* CPDF_SyntaxParser::GetObjectByStrict(CPDF_IndirectObjects* pObjList, FX_DWORD objnum, FX_DWORD gennum,
2226ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_INT32 level, struct PARSE_CONTEXT* pContext)
2227ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
2228ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (level > _PARSER_OBJECT_LEVLE_) {
2229ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return NULL;
2230ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
2231ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_FILESIZE SavedPos = m_Pos;
2232ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_BOOL bTypeOnly = pContext && (pContext->m_Flags & PDFPARSE_TYPEONLY);
2233ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_BOOL bIsNumber;
2234ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_ByteString word = GetNextWord(bIsNumber);
2235ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (word.GetLength() == 0) {
2236ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (bTypeOnly) {
2237ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return (CPDF_Object*)PDFOBJ_INVALID;
2238ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
2239ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return NULL;
2240ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
2241ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (bIsNumber) {
2242ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_FILESIZE SavedPos = m_Pos;
2243ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CFX_ByteString nextword = GetNextWord(bIsNumber);
2244ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (bIsNumber) {
2245ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            CFX_ByteString nextword2 = GetNextWord(bIsNumber);
2246ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (nextword2 == FX_BSTRC("R")) {
2247ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                FX_DWORD objnum = FXSYS_atoi(word);
2248ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                if (bTypeOnly) {
2249ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    return (CPDF_Object*)PDFOBJ_REFERENCE;
2250ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
2251ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                return CPDF_Reference::Create(pObjList, objnum);
2252ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            } else {
2253ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                m_Pos = SavedPos;
2254ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                if (bTypeOnly) {
2255ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    return (CPDF_Object*)PDFOBJ_NUMBER;
2256ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
2257ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                return CPDF_Number::Create(word);
2258ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
2259ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        } else {
2260ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_Pos = SavedPos;
2261ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (bTypeOnly) {
2262ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                return (CPDF_Object*)PDFOBJ_NUMBER;
2263ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
2264ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return CPDF_Number::Create(word);
2265ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
2266ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
2267ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (word == FX_BSTRC("true") || word == FX_BSTRC("false")) {
2268ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (bTypeOnly) {
2269ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return (CPDF_Object*)PDFOBJ_BOOLEAN;
2270ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
2271ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return CPDF_Boolean::Create(word == FX_BSTRC("true"));
2272ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
2273ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (word == FX_BSTRC("null")) {
2274ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (bTypeOnly) {
2275ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return (CPDF_Object*)PDFOBJ_NULL;
2276ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
2277ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return CPDF_Null::Create();
2278ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
2279ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (word == FX_BSTRC("(")) {
2280ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (bTypeOnly) {
2281ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return (CPDF_Object*)PDFOBJ_STRING;
2282ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
2283ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CFX_ByteString str = ReadString();
2284ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (m_pCryptoHandler) {
2285ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_pCryptoHandler->Decrypt(objnum, gennum, str);
2286ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
2287ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return CPDF_String::Create(str, FALSE);
2288ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
2289ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (word == FX_BSTRC("<")) {
2290ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (bTypeOnly) {
2291ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return (CPDF_Object*)PDFOBJ_STRING;
2292ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
2293ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CFX_ByteString str = ReadHexString();
2294ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (m_pCryptoHandler) {
2295ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_pCryptoHandler->Decrypt(objnum, gennum, str);
2296ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
2297ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return CPDF_String::Create(str, TRUE);
2298ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
2299ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (word == FX_BSTRC("[")) {
2300ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (bTypeOnly) {
2301ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return (CPDF_Object*)PDFOBJ_ARRAY;
2302ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
2303ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_Array* pArray = CPDF_Array::Create();
2304ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        while (1) {
2305ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            CPDF_Object* pObj = GetObject(pObjList, objnum, gennum, level + 1);
2306ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (pObj == NULL) {
2307ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                if (m_WordBuffer[0] == ']') {
2308ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    return pArray;
2309ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
2310ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                pArray->Release();
2311ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                return NULL;
2312ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
2313ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            pArray->Add(pObj);
2314ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
2315ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
2316ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (word[0] == '/') {
2317ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (bTypeOnly) {
2318ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return (CPDF_Object*)PDFOBJ_NAME;
2319ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
2320ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return CPDF_Name::Create(PDF_NameDecode(CFX_ByteStringC(m_WordBuffer + 1, m_WordSize - 1)));
2321ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
2322ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (word == FX_BSTRC("<<")) {
2323ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (bTypeOnly) {
2324ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return (CPDF_Object*)PDFOBJ_DICTIONARY;
2325ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
2326ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (pContext) {
2327ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            pContext->m_DictStart = SavedPos;
2328ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
2329ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_Dictionary* pDict = CPDF_Dictionary::Create();
2330ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        while (1) {
2331ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            FX_BOOL bIsNumber;
2332ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            FX_FILESIZE SavedPos = m_Pos;
2333ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            CFX_ByteString key = GetNextWord(bIsNumber);
2334ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (key.IsEmpty()) {
2335ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                pDict->Release();
2336ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                return NULL;
2337ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
2338ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (key == FX_BSTRC(">>")) {
2339ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                break;
2340ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
2341ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (key == FX_BSTRC("endobj")) {
2342ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                m_Pos = SavedPos;
2343ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                break;
2344ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
2345ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (key[0] != '/') {
2346ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                continue;
2347ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
2348ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            key = PDF_NameDecode(key);
2349ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            CPDF_Object* pObj = GetObject(pObjList, objnum, gennum, level + 1);
2350ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (pObj == NULL) {
2351ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                pDict->Release();
2352ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                FX_BYTE ch;
2353ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                while (1) {
2354ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    if (!GetNextChar(ch)) {
2355ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        break;
2356ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    }
2357ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    if (ch == 0x0A || ch == 0x0D) {
2358ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        break;
2359ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    }
2360ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
2361ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                return NULL;
2362ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
2363ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (key.GetLength() == 1) {
2364ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                pDict->SetAt(CFX_ByteStringC(((FX_LPCSTR)key) + 1, key.GetLength() - 1), pObj);
2365ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            } else {
2366ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                pDict->AddValue(CFX_ByteStringC(((FX_LPCSTR)key) + 1, key.GetLength() - 1), pObj);
2367ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
2368ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
2369ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (pContext) {
2370ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            pContext->m_DictEnd = m_Pos;
2371ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (pContext->m_Flags & PDFPARSE_NOSTREAM) {
2372ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                return pDict;
2373ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
2374ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
2375ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_FILESIZE SavedPos = m_Pos;
2376ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_BOOL bIsNumber;
2377ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CFX_ByteString nextword = GetNextWord(bIsNumber);
2378ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (nextword == FX_BSTRC("stream")) {
2379ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            CPDF_Stream* pStream = ReadStream(pDict, pContext, objnum, gennum);
2380ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (pStream) {
2381ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                return pStream;
2382ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
2383ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            pDict->Release();
2384ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return NULL;
2385ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        } else {
2386ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_Pos = SavedPos;
2387ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return pDict;
2388ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
2389ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
2390ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (word == FX_BSTRC(">>")) {
2391ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_Pos = SavedPos;
2392ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return NULL;
2393ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
2394ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (bTypeOnly) {
2395ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return (CPDF_Object*)PDFOBJ_INVALID;
2396ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
2397ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return NULL;
2398ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
2399ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Stream* CPDF_SyntaxParser::ReadStream(CPDF_Dictionary* pDict, PARSE_CONTEXT* pContext,
2400ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_DWORD objnum, FX_DWORD gennum)
2401ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
2402ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Object* pLenObj = pDict->GetElement(FX_BSTRC("Length"));
2403ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_DWORD len = 0;
2404ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pLenObj && (pLenObj->GetType() != PDFOBJ_REFERENCE ||
2405ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    ((((CPDF_Reference*)pLenObj)->GetObjList() != NULL) &&
2406ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                     ((CPDF_Reference*)pLenObj)->GetRefObjNum() != objnum))) {
2407ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_FILESIZE pos = m_Pos;
2408ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (pLenObj) {
2409ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            len = pLenObj->GetInteger();
2410ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
2411ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_Pos = pos;
2412ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (len > 0x40000000) {
2413ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return NULL;
2414ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
2415ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
2416ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    ToNextLine();
2417ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_FILESIZE StreamStartPos = m_Pos;
2418ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pContext) {
2419ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        pContext->m_DataStart = m_Pos;
2420ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
2421ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_Pos += len;
2422ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_CryptoHandler* pCryptoHandler = objnum == (FX_DWORD)m_MetadataObjnum ? NULL : m_pCryptoHandler;
2423ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pCryptoHandler == NULL) {
2424ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_FILESIZE SavedPos = m_Pos;
2425ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        GetNextWord();
2426ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (m_WordSize < 9 || FXSYS_memcmp32(m_WordBuffer, "endstream", 9)) {
2427ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_Pos = StreamStartPos;
2428ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            FX_FILESIZE offset = FindTag(FX_BSTRC("endstream"), 0);
2429ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (offset >= 0) {
2430ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                FX_FILESIZE curPos = m_Pos;
2431ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                m_Pos = StreamStartPos;
2432ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                FX_FILESIZE endobjOffset = FindTag(FX_BSTRC("endobj"), 0);
2433ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                if (endobjOffset < offset && endobjOffset >= 0) {
2434ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    offset = endobjOffset;
2435ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                } else {
2436ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    m_Pos = curPos;
2437ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
2438ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                FX_BYTE byte1, byte2;
2439ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                GetCharAt(StreamStartPos + offset - 1, byte1);
2440ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                GetCharAt(StreamStartPos + offset - 2, byte2);
2441ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                if (byte1 == 0x0a && byte2 == 0x0d) {
2442ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    len -= 2;
2443ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                } else if (byte1 == 0x0a || byte1 == 0x0d) {
2444ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    len --;
2445ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
2446ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                len = (FX_DWORD)offset;
2447ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                pDict->SetAtInteger(FX_BSTRC("Length"), len);
2448ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            } else {
2449ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                m_Pos = StreamStartPos;
2450ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                if (FindTag(FX_BSTRC("endobj"), 0) < 0) {
2451ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    return NULL;
2452ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
2453ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
2454ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
2455ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
2456ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_Pos = StreamStartPos;
2457ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Stream* pStream;
2458ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#if defined(_FPDFAPI_MINI_) && !defined(_FXCORE_FEATURE_ALL_)
2459ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    pStream = FX_NEW CPDF_Stream(m_pFileAccess, pCryptoHandler, m_HeaderOffset + m_Pos, len, pDict, gennum);
2460ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_Pos += len;
2461ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#else
2462ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_LPBYTE pData = FX_Alloc(FX_BYTE, len);
2463ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!pData) {
2464ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return NULL;
2465ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
2466ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    ReadBlock(pData, len);
2467ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pCryptoHandler) {
2468ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CFX_BinaryBuf dest_buf;
2469ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        dest_buf.EstimateSize(pCryptoHandler->DecryptGetSize(len));
2470ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_LPVOID context = pCryptoHandler->DecryptStart(objnum, gennum);
2471ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        pCryptoHandler->DecryptStream(context, pData, len, dest_buf);
2472ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        pCryptoHandler->DecryptFinish(context, dest_buf);
2473ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_Free(pData);
2474ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        pData = dest_buf.GetBuffer();
2475ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        len = dest_buf.GetSize();
2476ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        dest_buf.DetachBuffer();
2477ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
2478ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    pStream = FX_NEW CPDF_Stream(pData, len, pDict);
2479ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
2480ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pContext) {
2481ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        pContext->m_DataEnd = pContext->m_DataStart + len;
2482ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
2483ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    StreamStartPos = m_Pos;
2484ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    GetNextWord();
2485ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_WordSize == 6 && 0 == FXSYS_memcmp32(m_WordBuffer, "endobj", 6)) {
2486ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_Pos = StreamStartPos;
2487ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
2488ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return pStream;
2489ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
2490ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_SyntaxParser::InitParser(IFX_FileRead* pFileAccess, FX_DWORD HeaderOffset)
2491ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
2492ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_pFileBuf) {
2493ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_Free(m_pFileBuf);
2494ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_pFileBuf = NULL;
2495ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
2496ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_pFileBuf = FX_Alloc(FX_BYTE, m_BufSize);
2497ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_HeaderOffset = HeaderOffset;
2498ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_FileLen = pFileAccess->GetSize();
2499ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_Pos = 0;
2500ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_pFileAccess = pFileAccess;
2501ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_BufOffset = 0;
2502ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    pFileAccess->ReadBlock(m_pFileBuf, 0, (size_t)((FX_FILESIZE)m_BufSize > m_FileLen ? m_FileLen : m_BufSize));
2503ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
2504ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_INT32 CPDF_SyntaxParser::GetDirectNum()
2505ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
2506ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    GetNextWord();
2507ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!m_bIsNumber) {
2508ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return 0;
2509ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
2510ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_WordBuffer[m_WordSize] = 0;
2511ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return FXSYS_atoi((FX_LPCSTR)m_WordBuffer);
2512ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
2513ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_SyntaxParser::IsWholeWord(FX_FILESIZE startpos, FX_FILESIZE limit, FX_LPCBYTE tag, FX_DWORD taglen)
2514ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
2515ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_BYTE type = _PDF_CharType[tag[0]];
2516ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_BOOL bCheckLeft = type != 'D' && type != 'W';
2517ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    type = _PDF_CharType[tag[taglen - 1]];
2518ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_BOOL bCheckRight = type != 'D' || type != 'W';
2519ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_BYTE ch;
2520ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (bCheckRight && startpos + (FX_INT32)taglen <= limit && GetCharAt(startpos + (FX_INT32)taglen, ch)) {
2521ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_BYTE type = _PDF_CharType[ch];
2522ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (type == 'N' || type == 'R') {
2523ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return FALSE;
2524ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
2525ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
2526ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (bCheckLeft && startpos > 0 && GetCharAt(startpos - 1, ch)) {
2527ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_BYTE type = _PDF_CharType[ch];
2528ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (type == 'N' || type == 'R') {
2529ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return FALSE;
2530ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
2531ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
2532ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return TRUE;
2533ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
2534ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_SyntaxParser::SearchWord(FX_BSTR tag, FX_BOOL bWholeWord, FX_BOOL bForward, FX_FILESIZE limit)
2535ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
2536ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_INT32 taglen = tag.GetLength();
2537ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (taglen == 0) {
2538ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FALSE;
2539ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
2540ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_FILESIZE pos = m_Pos;
2541ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_INT32 offset = 0;
2542ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!bForward) {
2543ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        offset = taglen - 1;
2544ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
2545ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_LPCBYTE tag_data = tag;
2546ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_BYTE byte;
2547ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    while (1) {
2548ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (bForward) {
2549ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (limit) {
2550ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                if (pos >= m_Pos + limit) {
2551ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    return FALSE;
2552ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
2553ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
2554ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (!GetCharAt(pos, byte)) {
2555ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                return FALSE;
2556ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
2557ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        } else {
2558ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (limit) {
2559ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                if (pos <= m_Pos - limit) {
2560ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    return FALSE;
2561ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
2562ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
2563ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (!GetCharAtBackward(pos, byte)) {
2564ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                return FALSE;
2565ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
2566ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
2567ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (byte == tag_data[offset]) {
2568ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (bForward) {
2569ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                offset ++;
2570ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                if (offset < taglen) {
2571ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    pos ++;
2572ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    continue;
2573ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
2574ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            } else {
2575ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                offset --;
2576ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                if (offset >= 0) {
2577ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    pos --;
2578ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    continue;
2579ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
2580ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
2581ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            FX_FILESIZE startpos = bForward ? pos - taglen + 1 : pos;
2582ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (!bWholeWord || IsWholeWord(startpos, limit, tag, taglen)) {
2583ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                m_Pos = startpos;
2584ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                return TRUE;
2585ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
2586ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
2587ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (bForward) {
2588ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            offset = byte == tag_data[0] ? 1 : 0;
2589ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            pos ++;
2590ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        } else {
2591ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            offset = byte == tag_data[taglen - 1] ? taglen - 2 : taglen - 1;
2592ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            pos --;
2593ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
2594ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (pos < 0) {
2595ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return FALSE;
2596ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
2597ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
2598ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return FALSE;
2599ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
2600ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstruct _SearchTagRecord {
2601ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_LPCBYTE	m_pTag;
2602ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_DWORD	m_Len;
2603ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_DWORD	m_Offset;
2604ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov};
2605ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_INT32 CPDF_SyntaxParser::SearchMultiWord(FX_BSTR tags, FX_BOOL bWholeWord, FX_FILESIZE limit)
2606ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
2607ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_INT32 ntags = 1, i;
2608ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    for (i = 0; i < tags.GetLength(); i ++)
2609ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (tags[i] == 0) {
2610ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            ntags ++;
2611ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
2612ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    _SearchTagRecord* pPatterns = FX_Alloc(_SearchTagRecord, ntags);
2613ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_DWORD start = 0, itag = 0, max_len = 0;
2614ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    for (i = 0; i <= tags.GetLength(); i ++) {
2615ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (tags[i] == 0) {
2616ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            FX_DWORD len = i - start;
2617ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (len > max_len) {
2618ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                max_len = len;
2619ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
2620ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            pPatterns[itag].m_pTag = tags.GetPtr() + start;
2621ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            pPatterns[itag].m_Len = len;
2622ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            pPatterns[itag].m_Offset = 0;
2623ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            start = i + 1;
2624ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            itag ++;
2625ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
2626ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
2627ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_FILESIZE pos = m_Pos;
2628ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_BYTE byte;
2629ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    GetCharAt(pos++, byte);
2630ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_INT32 found = -1;
2631ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    while (1) {
2632ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        for (i = 0; i < ntags; i ++) {
2633ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (pPatterns[i].m_pTag[pPatterns[i].m_Offset] == byte) {
2634ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                pPatterns[i].m_Offset ++;
2635ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                if (pPatterns[i].m_Offset == pPatterns[i].m_Len) {
2636ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    if (!bWholeWord || IsWholeWord(pos - pPatterns[i].m_Len, limit, pPatterns[i].m_pTag, pPatterns[i].m_Len)) {
2637ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        found = i;
2638ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        goto end;
2639ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    } else {
2640ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        if (pPatterns[i].m_pTag[0] == byte) {
2641ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                            pPatterns[i].m_Offset = 1;
2642ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        } else {
2643ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                            pPatterns[i].m_Offset = 0;
2644ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        }
2645ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    }
2646ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
2647ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            } else {
2648ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                if (pPatterns[i].m_pTag[0] == byte) {
2649ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    pPatterns[i].m_Offset = 1;
2650ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                } else {
2651ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    pPatterns[i].m_Offset = 0;
2652ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
2653ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
2654ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
2655ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (limit && pos >= m_Pos + limit) {
2656ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            goto end;
2657ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
2658ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (!GetCharAt(pos, byte)) {
2659ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            goto end;
2660ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
2661ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        pos ++;
2662ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
2663ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovend:
2664ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_Free(pPatterns);
2665ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return found;
2666ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
2667ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_FILESIZE CPDF_SyntaxParser::FindTag(FX_BSTR tag, FX_FILESIZE limit)
2668ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
2669ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_INT32 taglen = tag.GetLength();
2670ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_INT32 match = 0;
2671ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    limit += m_Pos;
2672ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_FILESIZE startpos = m_Pos;
2673ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    while (1) {
2674ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_BYTE ch;
2675ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (!GetNextChar(ch)) {
2676ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return -1;
2677ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
2678ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (ch == tag[match]) {
2679ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            match ++;
2680ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (match == taglen) {
2681ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                return m_Pos - startpos - taglen;
2682ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
2683ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        } else {
2684ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            match = ch == tag[0] ? 1 : 0;
2685ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
2686ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (limit && m_Pos == limit) {
2687ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return -1;
2688ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
2689ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
2690ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return -1;
2691ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
2692ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_SyntaxParser::GetBinary(FX_BYTE* buffer, FX_DWORD size)
2693ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
2694ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_DWORD offset = 0;
2695ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_BYTE ch;
2696ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    while (1) {
2697ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (!GetNextChar(ch)) {
2698ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return;
2699ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
2700ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        buffer[offset++] = ch;
2701ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (offset == size) {
2702ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            break;
2703ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
2704ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
2705ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
2706ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_DataAvail::CPDF_DataAvail(IFX_FileAvail* pFileAvail, IFX_FileRead* pFileRead)
2707ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
2708ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_pFileAvail = pFileAvail;
2709ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_pFileRead = pFileRead;
2710ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_Pos = 0;
2711ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_dwFileLen = 0;
2712ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_pFileRead) {
2713ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_dwFileLen = (FX_DWORD)m_pFileRead->GetSize();
2714ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
2715ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_dwCurrentOffset = 0;
2716ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_WordSize = 0;
2717ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_dwXRefOffset = 0;
2718ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_bufferOffset = 0;
2719ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_dwFirstPageNo = 0;
2720ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_bufferSize = 0;
2721ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_PagesObjNum = 0;
2722ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_dwCurrentXRefSteam = 0;
2723ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_dwAcroFormObjNum = 0;
2724ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_dwInfoObjNum = 0;
2725ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_pDocument = 0;
2726ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_dwEncryptObjNum = 0;
2727ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_dwPrevXRefOffset = 0;
2728ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_dwLastXRefOffset = 0;
2729ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_bDocAvail = FALSE;
2730ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_bMainXRefLoad = FALSE;
2731ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_bDocAvail = FALSE;
2732ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_bLinearized = FALSE;
2733ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_bPagesLoad = FALSE;
2734ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_bPagesTreeLoad = FALSE;
2735ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_bMainXRefLoadedOK = FALSE;
2736ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_bAnnotsLoad = FALSE;
2737ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_bHaveAcroForm = FALSE;
2738ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_bAcroFormLoad = FALSE;
2739ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_bPageLoadedOK = FALSE;
2740ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_bNeedDownLoadResource = FALSE;
2741ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_bLinearizedFormParamLoad = FALSE;
2742ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_pLinearized = NULL;
2743ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_pRoot = NULL;
2744ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_pTrailer = NULL;
2745ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_pCurrentParser = NULL;
2746ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_pAcroForm = NULL;
2747ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_pPageDict = NULL;
2748ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_pPageResource = NULL;
2749ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_pageMapCheckState = NULL;
2750ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_docStatus = PDF_DATAAVAIL_HEADER;
2751ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_parser.m_bOwnFileRead = FALSE;
2752ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_bTotalLoadPageTree = FALSE;
2753ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_bCurPageDictLoadOK = FALSE;
2754ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_bLinearedDataOK = FALSE;
2755ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_pagesLoadState = NULL;
2756ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
2757ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_DataAvail::~CPDF_DataAvail()
2758ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
2759ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_pLinearized)	{
2760ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_pLinearized->Release();
2761ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
2762ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_pRoot) {
2763ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_pRoot->Release();
2764ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
2765ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_pTrailer) {
2766ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_pTrailer->Release();
2767ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
2768ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_pageMapCheckState) {
2769ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        delete m_pageMapCheckState;
2770ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
2771ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_pagesLoadState) {
2772ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        delete m_pagesLoadState;
2773ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
2774ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_INT32 i = 0;
2775ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_INT32 iSize = m_arrayAcroforms.GetSize();
2776ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    for (i = 0; i < iSize; ++i) {
2777ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        ((CPDF_Object *)m_arrayAcroforms.GetAt(i))->Release();
2778ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
2779ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
2780ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_DataAvail::SetDocument(CPDF_Document* pDoc)
2781ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
2782ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_pDocument = pDoc;
2783ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
2784ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_DWORD CPDF_DataAvail::GetObjectSize(FX_DWORD objnum, FX_FILESIZE& offset)
2785ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
2786ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Parser *pParser = (CPDF_Parser *)(m_pDocument->GetParser());
2787ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pParser == NULL) {
2788ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return 0;
2789ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
2790ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (objnum >= (FX_DWORD)pParser->m_CrossRef.GetSize()) {
2791ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return 0;
2792ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
2793ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pParser->m_V5Type[objnum] == 2) {
2794ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        objnum = (FX_DWORD)pParser->m_CrossRef[objnum];
2795ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
2796ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pParser->m_V5Type[objnum] == 1 || pParser->m_V5Type[objnum] == 255) {
2797ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        offset = pParser->m_CrossRef[objnum];
2798ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (offset == 0) {
2799ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return 0;
2800ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
2801ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_LPVOID pResult = FXSYS_bsearch(&offset, pParser->m_SortedOffset.GetData(), pParser->m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), _CompareFileSize);
2802ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (pResult == NULL) {
2803ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return 0;
2804ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
2805ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if ((FX_FILESIZE*)pResult - (FX_FILESIZE*)pParser->m_SortedOffset.GetData() == pParser->m_SortedOffset.GetSize() - 1) {
2806ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return 0;
2807ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
2808ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return (FX_DWORD)(((FX_FILESIZE*)pResult)[1] - offset);
2809ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
2810ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return 0;
2811ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
2812ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_DataAvail::IsObjectsAvail(CFX_PtrArray& obj_array, FX_BOOL bParsePage, IFX_DownloadHints* pHints, CFX_PtrArray &ret_array)
2813ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
2814ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!obj_array.GetSize()) {
2815ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return TRUE;
2816ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
2817ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_DWORD count = 0;
2818ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_PtrArray new_obj_array;
2819ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_INT32 i = 0;
2820ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    for (i = 0; i < obj_array.GetSize(); i++) {
2821ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_Object *pObj = (CPDF_Object *)obj_array[i];
2822ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (!pObj) {
2823ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            continue;
2824ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
2825ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_INT32 type = pObj->GetType();
2826ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        switch (type) {
2827ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            case PDFOBJ_ARRAY: {
2828ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    CPDF_Array *pArray = pObj->GetArray();
2829ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    for (FX_DWORD k = 0; k < pArray->GetCount(); k++) {
2830ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        new_obj_array.Add(pArray->GetElement(k));
2831ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    }
2832ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
2833ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                break;
2834ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            case PDFOBJ_STREAM:
2835ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                pObj = pObj->GetDict();
2836ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            case PDFOBJ_DICTIONARY: {
2837ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    CPDF_Dictionary *pDict = pObj->GetDict();
2838ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    if (pDict->GetString("Type") == "Page" && !bParsePage) {
2839ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        continue;
2840ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    }
2841ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    FX_POSITION pos = pDict->GetStartPos();
2842ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    while (pos) {
2843ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        CPDF_Object *value;
2844ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        CFX_ByteString key;
2845ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        value = pDict->GetNextElement(pos, key);
2846ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        if (key != "Parent") {
2847ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                            new_obj_array.Add(value);
2848ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        }
2849ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    }
2850ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
2851ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                break;
2852ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            case PDFOBJ_REFERENCE: {
2853ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    CPDF_Reference *pRef = (CPDF_Reference*)pObj;
2854ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    FX_DWORD dwNum = pRef->GetRefObjNum();
2855ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    FX_FILESIZE offset;
2856ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    FX_DWORD size = GetObjectSize(pRef->GetRefObjNum(), offset);
2857ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    if (!size) {
2858ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        break;
2859ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    }
2860ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    size = (FX_DWORD)((FX_FILESIZE)(offset + size + 512) > m_dwFileLen ? m_dwFileLen - offset : size + 512);
2861ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    if (!m_pFileAvail->IsDataAvail(offset, size)) {
2862ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        pHints->AddSegment(offset, size);
2863ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        ret_array.Add(pObj);
2864ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        count++;
2865ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    } else if (!m_objnum_array.Find(dwNum)) {
2866ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        m_objnum_array.AddObjNum(dwNum);
2867ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        CPDF_Object *pReferred = m_pDocument->GetIndirectObject(pRef->GetRefObjNum(), NULL);
2868ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        if (pReferred) {
2869ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                            new_obj_array.Add(pReferred);
2870ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        }
2871ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    }
2872ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
2873ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                break;
2874ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
2875ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
2876ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (count > 0) {
2877ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_INT32 iSize = new_obj_array.GetSize();
2878ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        for (i = 0; i < iSize; ++i) {
2879ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            CPDF_Object *pObj = (CPDF_Object *)new_obj_array[i];
2880ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            FX_INT32 type = pObj->GetType();
2881ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (type == PDFOBJ_REFERENCE) {
2882ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                CPDF_Reference *pRef = (CPDF_Reference *)pObj;
2883ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                FX_DWORD dwNum = pRef->GetRefObjNum();
2884ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                if (!m_objnum_array.Find(dwNum)) {
2885ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    ret_array.Add(pObj);
2886ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
2887ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            } else {
2888ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                ret_array.Add(pObj);
2889ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
2890ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
2891ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FALSE;
2892ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
2893ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    obj_array.RemoveAll();
2894ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    obj_array.Append(new_obj_array);
2895ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return IsObjectsAvail(obj_array, FALSE, pHints, ret_array);
2896ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
2897ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_DataAvail::IsDocAvail(IFX_DownloadHints* pHints)
2898ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
2899ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!m_dwFileLen && m_pFileRead) {
2900ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_dwFileLen = (FX_DWORD)m_pFileRead->GetSize();
2901ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (!m_dwFileLen) {
2902ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return TRUE;
2903ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
2904ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
2905ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    while (!m_bDocAvail) {
2906ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (!CheckDocStatus(pHints)) {
2907ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return FALSE;
2908ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
2909ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
2910ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return TRUE;
2911ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
2912ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_DataAvail::CheckAcroFormSubObject(IFX_DownloadHints* pHints)
2913ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
2914ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!m_objs_array.GetSize()) {
2915ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_objs_array.RemoveAll();
2916ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_objnum_array.RemoveAll();
2917ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CFX_PtrArray obj_array;
2918ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        obj_array.Append(m_arrayAcroforms);
2919ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_BOOL bRet = IsObjectsAvail(obj_array, FALSE, pHints, m_objs_array);
2920ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (bRet) {
2921ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_objs_array.RemoveAll();
2922ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
2923ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return bRet;
2924ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    } else {
2925ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CFX_PtrArray new_objs_array;
2926ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_BOOL bRet = IsObjectsAvail(m_objs_array, FALSE, pHints, new_objs_array);
2927ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (bRet) {
2928ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            FX_INT32 iSize = m_arrayAcroforms.GetSize();
2929ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            for (FX_INT32 i = 0; i < iSize; ++i) {
2930ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                ((CPDF_Object *)m_arrayAcroforms.GetAt(i))->Release();
2931ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
2932ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_arrayAcroforms.RemoveAll();
2933ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        } else {
2934ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_objs_array.RemoveAll();
2935ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_objs_array.Append(new_objs_array);
2936ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
2937ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return bRet;
2938ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
2939ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
2940ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_DataAvail::CheckAcroForm(IFX_DownloadHints* pHints)
2941ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
2942ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_BOOL bExist = FALSE;
2943ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_pAcroForm = GetObject(m_dwAcroFormObjNum, pHints, &bExist);
2944ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!bExist) {
2945ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_docStatus = PDF_DATAAVAIL_PAGETREE;
2946ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return TRUE;
2947ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
2948ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!m_pAcroForm) {
2949ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (m_docStatus == PDF_DATAAVAIL_ERROR) {
2950ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_docStatus = PDF_DATAAVAIL_LOADALLFILE;
2951ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return TRUE;
2952ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
2953ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FALSE;
2954ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
2955ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_arrayAcroforms.Add(m_pAcroForm);
2956ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_docStatus = PDF_DATAAVAIL_PAGETREE;
2957ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return TRUE;
2958ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
2959ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_DataAvail::CheckDocStatus(IFX_DownloadHints *pHints)
2960ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
2961ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    switch (m_docStatus) {
2962ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        case PDF_DATAAVAIL_HEADER:
2963ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return CheckHeader(pHints);
2964ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        case PDF_DATAAVAIL_FIRSTPAGE:
2965ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        case PDF_DATAAVAIL_FIRSTPAGE_PREPARE:
2966ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return CheckFirstPage(pHints);
2967ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        case PDF_DATAAVAIL_END:
2968ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return CheckEnd(pHints);
2969ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        case PDF_DATAAVAIL_CROSSREF:
2970ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return CheckCrossRef(pHints);
2971ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        case PDF_DATAAVAIL_CROSSREF_ITEM:
2972ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return CheckCrossRefItem(pHints);
2973ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        case PDF_DATAAVAIL_CROSSREF_STREAM:
2974ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return CheckAllCrossRefStream(pHints);
2975ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        case PDF_DATAAVAIL_TRAILER:
2976ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return CheckTrailer(pHints);
2977ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        case PDF_DATAAVAIL_TRAILER_APPEND:
2978ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return CheckTrailerAppend(pHints);
2979ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        case PDF_DATAAVAIL_LOADALLCRSOSSREF:
2980ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return LoadAllXref(pHints);
2981ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        case PDF_DATAAVAIL_LOADALLFILE:
2982ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return LoadAllFile(pHints);
2983ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        case PDF_DATAAVAIL_ROOT:
2984ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return CheckRoot(pHints);
2985ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        case PDF_DATAAVAIL_INFO:
2986ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return CheckInfo(pHints);
2987ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        case PDF_DATAAVAIL_ACROFORM:
2988ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return CheckAcroForm(pHints);
2989ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        case PDF_DATAAVAIL_PAGETREE:
2990ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (m_bTotalLoadPageTree) {
2991ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                return CheckPages(pHints);
2992ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            } else {
2993ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                return LoadDocPages(pHints);
2994ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
2995ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        case PDF_DATAAVAIL_PAGE:
2996ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (m_bTotalLoadPageTree) {
2997ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                return CheckPage(pHints);
2998ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            } else {
2999ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                m_docStatus = PDF_DATAAVAIL_PAGE_LATERLOAD;
3000ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                return TRUE;
3001ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
3002ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        case PDF_DATAAVAIL_ERROR:
3003ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return LoadAllFile(pHints);
3004ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        case PDF_DATAAVAIL_PAGE_LATERLOAD:
3005ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_docStatus = PDF_DATAAVAIL_PAGE;
3006ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        default:
3007ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_bDocAvail = TRUE;
3008ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return TRUE;
3009ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
3010ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
3011ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL	CPDF_DataAvail::CheckPageStatus(IFX_DownloadHints* pHints)
3012ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
3013ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    switch (m_docStatus) {
3014ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        case PDF_DATAAVAIL_PAGETREE:
3015ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return CheckPages(pHints);
3016ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        case PDF_DATAAVAIL_PAGE:
3017ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return CheckPage(pHints);
3018ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        case PDF_DATAAVAIL_ERROR:
3019ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return LoadAllFile(pHints);
3020ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        default:
3021ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_bPagesTreeLoad = TRUE;
3022ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_bPagesLoad = TRUE;
3023ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return TRUE;
3024ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
3025ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
3026ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_DataAvail::LoadAllFile(IFX_DownloadHints* pHints)
3027ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
3028ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_pFileAvail->IsDataAvail(0, (FX_DWORD)m_dwFileLen)) {
3029ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_docStatus = PDF_DATAAVAIL_DONE;
3030ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return TRUE;
3031ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
3032ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    pHints->AddSegment(0, (FX_DWORD)m_dwFileLen);
3033ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return FALSE;
3034ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
3035ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_DataAvail::LoadAllXref(IFX_DownloadHints* pHints)
3036ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
3037ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_parser.m_Syntax.InitParser(m_pFileRead, (FX_DWORD)m_dwHeaderOffset);
3038ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_parser.m_bOwnFileRead = FALSE;
3039ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!m_parser.LoadAllCrossRefV4(m_dwLastXRefOffset) && !m_parser.LoadAllCrossRefV5(m_dwLastXRefOffset)) {
3040ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_docStatus = PDF_DATAAVAIL_LOADALLFILE;
3041ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FALSE;
3042ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
3043ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FXSYS_qsort(m_parser.m_SortedOffset.GetData(), m_parser.m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), _CompareFileSize);
3044ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_dwRootObjNum = m_parser.GetRootObjNum();
3045ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_dwInfoObjNum = m_parser.GetInfoObjNum();
3046ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_pCurrentParser = &m_parser;
3047ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_docStatus = PDF_DATAAVAIL_ROOT;
3048ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return TRUE;
3049ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
3050ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Object* CPDF_DataAvail::GetObject(FX_DWORD objnum, IFX_DownloadHints* pHints, FX_BOOL *pExistInFile)
3051ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
3052ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Object *pRet = NULL;
3053ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pExistInFile) {
3054ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        *pExistInFile = TRUE;
3055ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
3056ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_pDocument == NULL) {
3057ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_FILESIZE offset = m_parser.GetObjectOffset(objnum);
3058ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (offset < 0) {
3059ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            *pExistInFile = FALSE;
3060ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return NULL;
3061ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
3062ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_DWORD size = (FX_DWORD)m_parser.GetObjectSize(objnum);
3063ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        size = (FX_DWORD)(((FX_FILESIZE)(offset + size + 512)) > m_dwFileLen ? m_dwFileLen - offset : size + 512);
3064ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (!m_pFileAvail->IsDataAvail(offset, size)) {
3065ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            pHints->AddSegment(offset, size);
3066ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return NULL;
3067ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
3068ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        pRet = m_parser.ParseIndirectObject(NULL, objnum);
3069ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (!pRet && pExistInFile) {
3070ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            *pExistInFile = FALSE;
3071ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
3072ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return pRet;
3073ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
3074ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_FILESIZE offset;
3075ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_DWORD size = GetObjectSize(objnum, offset);
3076ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    size = (FX_DWORD)((FX_FILESIZE)(offset + size + 512) > m_dwFileLen ? m_dwFileLen - offset : size + 512);
3077ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!m_pFileAvail->IsDataAvail(offset, size)) {
3078ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        pHints->AddSegment(offset, size);
3079ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return NULL;
3080ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
3081ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Parser *pParser = (CPDF_Parser *)(m_pDocument->GetParser());
3082ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    pRet = pParser->ParseIndirectObject(NULL, objnum, NULL);
3083ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!pRet && pExistInFile) {
3084ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        *pExistInFile = FALSE;
3085ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
3086ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return pRet;
3087ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
3088ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_DataAvail::CheckInfo(IFX_DownloadHints* pHints)
3089ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
3090ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_BOOL bExist = FALSE;
3091ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Object *pInfo = GetObject(m_dwInfoObjNum, pHints, &bExist);
3092ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!bExist) {
3093ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (m_bHaveAcroForm) {
3094ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_docStatus = PDF_DATAAVAIL_ACROFORM;
3095ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        } else {
3096ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_docStatus = PDF_DATAAVAIL_PAGETREE;
3097ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
3098ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return TRUE;
3099ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
3100ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!pInfo) {
3101ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (m_docStatus == PDF_DATAAVAIL_ERROR) {
3102ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_docStatus = PDF_DATAAVAIL_LOADALLFILE;
3103ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return TRUE;
3104ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
3105ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (m_Pos == m_dwFileLen) {
3106ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_docStatus = PDF_DATAAVAIL_ERROR;
3107ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
3108ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FALSE;
3109ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
3110ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pInfo) {
3111ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        pInfo->Release();
3112ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
3113ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_bHaveAcroForm) {
3114ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_docStatus = PDF_DATAAVAIL_ACROFORM;
3115ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    } else {
3116ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_docStatus = PDF_DATAAVAIL_PAGETREE;
3117ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
3118ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return TRUE;
3119ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
3120ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_DataAvail::CheckRoot(IFX_DownloadHints* pHints)
3121ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
3122ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_BOOL bExist = FALSE;
3123ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_pRoot = GetObject(m_dwRootObjNum, pHints, &bExist);
3124ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!bExist) {
3125ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_docStatus = PDF_DATAAVAIL_LOADALLFILE;
3126ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return TRUE;
3127ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
3128ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!m_pRoot) {
3129ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (m_docStatus == PDF_DATAAVAIL_ERROR) {
3130ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_docStatus = PDF_DATAAVAIL_LOADALLFILE;
3131ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return TRUE;
3132ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
3133ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FALSE;
3134ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
3135ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Reference* pRef = (CPDF_Reference*)m_pRoot->GetDict()->GetElement(FX_BSTRC("Pages"));
3136ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pRef == NULL || pRef->GetType() != PDFOBJ_REFERENCE) {
3137ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_docStatus = PDF_DATAAVAIL_ERROR;
3138ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FALSE;
3139ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
3140ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_PagesObjNum = pRef->GetRefObjNum();
3141ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Reference* pAcroFormRef = (CPDF_Reference*)m_pRoot->GetDict()->GetElement(FX_BSTRC("AcroForm"));
3142ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pAcroFormRef && pAcroFormRef->GetType() == PDFOBJ_REFERENCE) {
3143ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_bHaveAcroForm = TRUE;
3144ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_dwAcroFormObjNum = pAcroFormRef->GetRefObjNum();
3145ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
3146ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_dwInfoObjNum) {
3147ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_docStatus = PDF_DATAAVAIL_INFO;
3148ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    } else {
3149ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (m_bHaveAcroForm) {
3150ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_docStatus = PDF_DATAAVAIL_ACROFORM;
3151ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        } else {
3152ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_docStatus = PDF_DATAAVAIL_PAGETREE;
3153ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
3154ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
3155ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return TRUE;
3156ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
3157ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_DataAvail::PreparePageItem()
3158ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
3159ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Dictionary *pRoot = m_pDocument->GetRoot();
3160ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Reference* pRef = (CPDF_Reference*)pRoot->GetElement(FX_BSTRC("Pages"));
3161ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pRef == NULL || pRef->GetType() != PDFOBJ_REFERENCE) {
3162ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_docStatus = PDF_DATAAVAIL_ERROR;
3163ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FALSE;
3164ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
3165ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_PagesObjNum = pRef->GetRefObjNum();
3166ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_pCurrentParser = (CPDF_Parser *)m_pDocument->GetParser();
3167ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_docStatus = PDF_DATAAVAIL_PAGETREE;
3168ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return TRUE;
3169ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
3170ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_DataAvail::IsFirstCheck(int iPage)
3171ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
3172ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (NULL == m_pageMapCheckState) {
3173ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_pageMapCheckState = FX_NEW CFX_CMapDWordToDWord();
3174ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
3175ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_DWORD dwValue = 0;
3176ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!m_pageMapCheckState->Lookup(iPage, dwValue)) {
3177ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_pageMapCheckState->SetAt(iPage, 1);
3178ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return TRUE;
3179ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
3180ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (dwValue != 0) {
3181ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FALSE;
3182ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
3183ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_pageMapCheckState->SetAt(iPage, 1);
3184ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return TRUE;
3185ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
3186ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_DataAvail::ResetFirstCheck(int iPage)
3187ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
3188ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (NULL == m_pageMapCheckState) {
3189ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_pageMapCheckState = FX_NEW CFX_CMapDWordToDWord();
3190ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
3191ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_DWORD dwValue = 1;
3192ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!m_pageMapCheckState->Lookup(iPage, dwValue)) {
3193ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return;
3194ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
3195ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_pageMapCheckState->SetAt(iPage, 0);
3196ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
3197ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_DataAvail::CheckPage(IFX_DownloadHints* pHints)
3198ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
3199ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_DWORD i = 0;
3200ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_DWORD iLen = m_PageObjList.GetSize();
3201ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_DWordArray UnavailObjList;
3202ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    for (; i < iLen; ++i) {
3203ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_DWORD dwPageObjNum = m_PageObjList.GetAt(i);
3204ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_BOOL bExist = FALSE;
3205ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_Object *pObj = GetObject(dwPageObjNum, pHints, &bExist);
3206ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (!pObj) {
3207ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (bExist) {
3208ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                UnavailObjList.Add(dwPageObjNum);
3209ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
3210ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            continue;
3211ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
3212ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (pObj->GetType() == PDFOBJ_ARRAY) {
3213ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            CPDF_Array *pArray = pObj->GetArray();
3214ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (pArray) {
3215ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                FX_INT32 iSize = pArray->GetCount();
3216ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                CPDF_Object *pItem = NULL;
3217ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                for (FX_INT32 j = 0; j < iSize; ++j) {
3218ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    pItem = pArray->GetElement(j);
3219ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    if (pItem && pItem->GetType() == PDFOBJ_REFERENCE) {
3220ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        UnavailObjList.Add(((CPDF_Reference *)pItem)->GetRefObjNum());
3221ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    }
3222ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
3223ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
3224ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
3225ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (pObj->GetType() != PDFOBJ_DICTIONARY) {
3226ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            pObj->Release();
3227ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            continue;
3228ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
3229ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CFX_ByteString type = pObj->GetDict()->GetString(FX_BSTRC("Type"));
3230ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (type == FX_BSTRC("Pages")) {
3231ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_PagesArray.Add(pObj);
3232ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            continue;
3233ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
3234ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        pObj->Release();
3235ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
3236ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_PageObjList.RemoveAll();
3237ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (UnavailObjList.GetSize()) {
3238ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_PageObjList.Append(UnavailObjList);
3239ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FALSE;
3240ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
3241ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    i = 0;
3242ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    iLen = m_PagesArray.GetSize();
3243ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    for (; i < iLen; ++i) {
3244ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_Object *pPages = (CPDF_Object *)m_PagesArray.GetAt(i);
3245ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (!pPages) {
3246ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            continue;
3247ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
3248ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (!GetPageKids(m_pCurrentParser, pPages)) {
3249ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            pPages->Release();
3250ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            while (i++ < iLen) {
3251ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                pPages = (CPDF_Object *)m_PagesArray.GetAt(i);
3252ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                pPages->Release();
3253ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
3254ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_PagesArray.RemoveAll();
3255ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_docStatus = PDF_DATAAVAIL_ERROR;
3256ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return FALSE;
3257ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
3258ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        pPages->Release();
3259ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
3260ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_PagesArray.RemoveAll();
3261ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!m_PageObjList.GetSize()) {
3262ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_docStatus = PDF_DATAAVAIL_DONE;
3263ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return TRUE;
3264ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
3265ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return TRUE;
3266ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
3267ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_DataAvail::GetPageKids(CPDF_Parser *pParser, CPDF_Object *pPages)
3268ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
3269ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!pParser) {
3270ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_docStatus = PDF_DATAAVAIL_ERROR;
3271ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FALSE;
3272ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
3273ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Object *pKids = pPages->GetDict()->GetElement(FX_BSTRC("Kids"));
3274ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!pKids) {
3275ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return TRUE;
3276ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
3277ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    switch (pKids->GetType()) {
3278ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        case PDFOBJ_REFERENCE: {
3279ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                CPDF_Reference *pKid = (CPDF_Reference *)pKids;
3280ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                m_PageObjList.Add(pKid->GetRefObjNum());
3281ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
3282ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            break;
3283ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        case PDFOBJ_ARRAY: {
3284ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                CPDF_Array *pKidsArray = (CPDF_Array *)pKids;
3285ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                for (FX_DWORD i = 0; i < pKidsArray->GetCount(); ++i) {
3286ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    CPDF_Reference *pKid = (CPDF_Reference *)pKidsArray->GetElement(i);
3287ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    m_PageObjList.Add(pKid->GetRefObjNum());
3288ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
3289ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
3290ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            break;
3291ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        default:
3292ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_docStatus = PDF_DATAAVAIL_ERROR;
3293ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return FALSE;
3294ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
3295ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return TRUE;
3296ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
3297ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_DataAvail::CheckPages(IFX_DownloadHints* pHints)
3298ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
3299ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_BOOL bExist = FALSE;
3300ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Object *pPages = GetObject(m_PagesObjNum, pHints, &bExist);
3301ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!bExist) {
3302ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_docStatus = PDF_DATAAVAIL_LOADALLFILE;
3303ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return TRUE;
3304ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
3305ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!pPages) {
3306ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (m_docStatus == PDF_DATAAVAIL_ERROR) {
3307ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_docStatus = PDF_DATAAVAIL_LOADALLFILE;
3308ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return TRUE;
3309ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
3310ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FALSE;
3311ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
3312ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_BOOL bNeedLoad = FALSE;
3313ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!GetPageKids(m_pCurrentParser, pPages)) {
3314ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        pPages->Release();
3315ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_docStatus = PDF_DATAAVAIL_ERROR;
3316ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FALSE;
3317ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
3318ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    pPages->Release();
3319ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_docStatus = PDF_DATAAVAIL_PAGE;
3320ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return TRUE;
3321ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
3322ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_DataAvail::CheckHeader(IFX_DownloadHints* pHints)
3323ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
3324ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_DWORD req_size = 1024;
3325ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if ((FX_FILESIZE)req_size > m_dwFileLen) {
3326ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        req_size = (FX_DWORD)m_dwFileLen;
3327ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
3328ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_pFileAvail->IsDataAvail(0, req_size)) {
3329ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_BYTE buffer[1024];
3330ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_pFileRead->ReadBlock(buffer, 0, req_size);
3331ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (IsLinearizedFile(buffer, req_size)) {
3332ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_docStatus = PDF_DATAAVAIL_FIRSTPAGE;
3333ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        } else {
3334ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (m_docStatus == PDF_DATAAVAIL_ERROR) {
3335ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                return FALSE;
3336ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
3337ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_docStatus = PDF_DATAAVAIL_END;
3338ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
3339ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return TRUE;
3340ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
3341ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    pHints->AddSegment(0, req_size);
3342ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return FALSE;
3343ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
3344ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_DataAvail::CheckFirstPage(IFX_DownloadHints *pHints)
3345ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
3346ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_DWORD dwFirstPageEndOffset = 0;
3347ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Object *pEndOffSet = m_pLinearized->GetDict()->GetElement(FX_BSTRC("E"));
3348ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!pEndOffSet) {
3349ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_docStatus = PDF_DATAAVAIL_ERROR;
3350ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FALSE;
3351ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
3352ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Object *pXRefOffset  = m_pLinearized->GetDict()->GetElement(FX_BSTRC("T"));
3353ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!pXRefOffset) {
3354ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_docStatus = PDF_DATAAVAIL_ERROR;
3355ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FALSE;
3356ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
3357ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Object *pFileLen = m_pLinearized->GetDict()->GetElement(FX_BSTRC("L"));
3358ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!pFileLen) {
3359ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_docStatus = PDF_DATAAVAIL_ERROR;
3360ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FALSE;
3361ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
3362ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_BOOL bNeedDownLoad = FALSE;
3363ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pEndOffSet->GetType() == PDFOBJ_NUMBER) {
3364ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_DWORD dwEnd = pEndOffSet->GetInteger();
3365ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        dwEnd += 512;
3366ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if ((FX_FILESIZE)dwEnd > m_dwFileLen) {
3367ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            dwEnd = (FX_DWORD)m_dwFileLen;
3368ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
3369ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_INT32 iStartPos = (FX_INT32)(m_dwFileLen > 1024 ? 1024 : m_dwFileLen);
3370ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_INT32 iSize = dwEnd > 1024 ? dwEnd - 1024 : 0;
3371ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (!m_pFileAvail->IsDataAvail(iStartPos, iSize)) {
3372ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            pHints->AddSegment(iStartPos, iSize);
3373ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            bNeedDownLoad = TRUE;
3374ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
3375ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
3376ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_dwLastXRefOffset = 0;
3377ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_FILESIZE dwFileLen = 0;
3378ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pXRefOffset->GetType() == PDFOBJ_NUMBER) {
3379ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_dwLastXRefOffset = pXRefOffset->GetInteger();
3380ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
3381ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pFileLen->GetType() == PDFOBJ_NUMBER) {
3382ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        dwFileLen = pFileLen->GetInteger();
3383ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
3384ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!m_pFileAvail->IsDataAvail(m_dwLastXRefOffset, (FX_DWORD)(dwFileLen - m_dwLastXRefOffset))) {
3385ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (m_docStatus == PDF_DATAAVAIL_FIRSTPAGE)	{
3386ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            FX_DWORD dwSize = (FX_DWORD)(dwFileLen - m_dwLastXRefOffset);
3387ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            FX_FILESIZE offset = m_dwLastXRefOffset;
3388ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (dwSize < 512 && dwFileLen > 512) {
3389ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                dwSize = 512;
3390ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                offset = dwFileLen - 512;
3391ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
3392ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            pHints->AddSegment(offset, dwSize);
3393ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
3394ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    } else {
3395ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_docStatus = PDF_DATAAVAIL_FIRSTPAGE_PREPARE;
3396ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
3397ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!bNeedDownLoad && m_docStatus == PDF_DATAAVAIL_FIRSTPAGE_PREPARE) {
3398ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_docStatus = PDF_DATAAVAIL_DONE;
3399ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return TRUE;
3400ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
3401ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_docStatus = PDF_DATAAVAIL_FIRSTPAGE_PREPARE;
3402ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return FALSE;
3403ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
3404ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Object	* CPDF_DataAvail::ParseIndirectObjectAt(FX_FILESIZE pos, FX_DWORD objnum)
3405ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
3406ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_FILESIZE SavedPos = m_syntaxParser.SavePos();
3407ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_syntaxParser.RestorePos(pos);
3408ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_BOOL bIsNumber;
3409ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_ByteString word = m_syntaxParser.GetNextWord(bIsNumber);
3410ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!bIsNumber) {
3411ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return NULL;
3412ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
3413ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_DWORD real_objnum = FXSYS_atoi(word);
3414ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (objnum && real_objnum != objnum) {
3415ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return NULL;
3416ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
3417ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    word = m_syntaxParser.GetNextWord(bIsNumber);
3418ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!bIsNumber) {
3419ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return NULL;
3420ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
3421ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_DWORD gennum = FXSYS_atoi(word);
3422ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_syntaxParser.GetKeyword() != FX_BSTRC("obj")) {
3423ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_syntaxParser.RestorePos(SavedPos);
3424ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return NULL;
3425ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
3426ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Object* pObj = m_syntaxParser.GetObject(NULL, objnum, gennum, 0);
3427ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_syntaxParser.RestorePos(SavedPos);
3428ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return pObj;
3429ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
3430ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_INT32 CPDF_DataAvail::IsLinearizedPDF()
3431ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
3432ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_DWORD req_size = 1024;
3433ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!m_pFileAvail->IsDataAvail(0, req_size)) {
3434ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return PDF_UNKNOW_LINEARIZED;
3435ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
3436ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!m_pFileRead) {
3437ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return PDF_NOT_LINEARIZED;
3438ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
3439ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_FILESIZE dwSize = m_pFileRead->GetSize();
3440ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (dwSize < (FX_FILESIZE)req_size) {
3441ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return PDF_UNKNOW_LINEARIZED;
3442ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
3443ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_BYTE buffer[1024];
3444ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_pFileRead->ReadBlock(buffer, 0, req_size);
3445ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (IsLinearizedFile(buffer, req_size)) {
3446ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return PDF_IS_LINEARIZED;
3447ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
3448ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return PDF_NOT_LINEARIZED;
3449ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
3450ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_DataAvail::IsLinearizedFile(FX_LPBYTE pData, FX_DWORD dwLen)
3451ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
3452ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_SmartPointer<IFX_FileStream> file(FX_CreateMemoryStream(pData, (size_t)dwLen, FALSE));
3453ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_INT32 offset = GetHeaderOffset((IFX_FileStream*)file);
3454ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (offset == -1) {
3455ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_docStatus = PDF_DATAAVAIL_ERROR;
3456ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FALSE;
3457ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
3458ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_dwHeaderOffset = offset;
3459ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_syntaxParser.InitParser((IFX_FileStream*)file, offset);
3460ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_syntaxParser.RestorePos(m_syntaxParser.m_HeaderOffset + 9);
3461ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_BOOL bNumber = FALSE;
3462ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_FILESIZE dwSavePos = m_syntaxParser.SavePos();
3463ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_ByteString wordObjNum = m_syntaxParser.GetNextWord(bNumber);
3464ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!bNumber) {
3465ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FALSE;
3466ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
3467ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_DWORD objnum = FXSYS_atoi(wordObjNum);
3468ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_pLinearized) {
3469ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_pLinearized->Release();
3470ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_pLinearized = NULL;
3471ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
3472ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_pLinearized = ParseIndirectObjectAt(m_syntaxParser.m_HeaderOffset + 9, objnum);
3473ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!m_pLinearized) {
3474ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FALSE;
3475ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
3476ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_pLinearized->GetDict()->GetElement(FX_BSTRC("Linearized"))) {
3477ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_Object *pLen = m_pLinearized->GetDict()->GetElement(FX_BSTRC("L"));
3478ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (!pLen) {
3479ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return FALSE;
3480ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
3481ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if ((FX_FILESIZE)pLen->GetInteger() != m_pFileRead->GetSize()) {
3482ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return FALSE;
3483ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
3484ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_bLinearized = TRUE;
3485ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_Object *pNo = m_pLinearized->GetDict()->GetElement(FX_BSTRC("P"));
3486ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (pNo && pNo->GetType() == PDFOBJ_NUMBER) {
3487ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_dwFirstPageNo = pNo->GetInteger();
3488ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
3489ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return TRUE;
3490ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
3491ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return FALSE;
3492ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
3493ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_DataAvail::CheckEnd(IFX_DownloadHints* pHints)
3494ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
3495ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_DWORD req_pos = (FX_DWORD)(m_dwFileLen > 1024 ? m_dwFileLen - 1024 : 0);
3496ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_DWORD dwSize = (FX_DWORD)(m_dwFileLen - req_pos);
3497ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_pFileAvail->IsDataAvail(req_pos, dwSize)) {
3498ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_BYTE buffer[1024];
3499ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_pFileRead->ReadBlock(buffer, req_pos, dwSize);
3500ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CFX_SmartPointer<IFX_FileStream> file(FX_CreateMemoryStream(buffer, (size_t)dwSize, FALSE));
3501ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_syntaxParser.InitParser((IFX_FileStream*)file, 0);
3502ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_syntaxParser.RestorePos(dwSize - 1);
3503ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (m_syntaxParser.SearchWord(FX_BSTRC("startxref"), TRUE, FALSE, dwSize)) {
3504ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            FX_BOOL bNumber;
3505ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_syntaxParser.GetNextWord(bNumber);
3506ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            CFX_ByteString xrefpos_str = m_syntaxParser.GetNextWord(bNumber);
3507ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (!bNumber) {
3508ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                m_docStatus = PDF_DATAAVAIL_ERROR;
3509ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                return FALSE;
3510ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
3511ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_dwXRefOffset = (FX_FILESIZE)FXSYS_atoi64(xrefpos_str);
3512ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (!m_dwXRefOffset || m_dwXRefOffset > m_dwFileLen) {
3513ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                m_docStatus = PDF_DATAAVAIL_LOADALLFILE;
3514ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                return TRUE;
3515ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
3516ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_dwLastXRefOffset = m_dwXRefOffset;
3517ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            SetStartOffset(m_dwXRefOffset);
3518ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_docStatus = PDF_DATAAVAIL_CROSSREF;
3519ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return TRUE;
3520ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        } else {
3521ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_docStatus = PDF_DATAAVAIL_LOADALLFILE;
3522ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return TRUE;
3523ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
3524ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
3525ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    pHints->AddSegment(req_pos, dwSize);
3526ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return FALSE;
3527ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
3528ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_DWORD CPDF_DataAvail::CheckCrossRefStream(IFX_DownloadHints* pHints, FX_FILESIZE &xref_offset)
3529ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
3530ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    xref_offset = 0;
3531ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_DWORD req_size = (FX_DWORD)(m_Pos + 512 > m_dwFileLen ? m_dwFileLen - m_Pos : 512);
3532ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_pFileAvail->IsDataAvail(m_Pos, req_size)) {
3533ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_INT32 iSize = (FX_INT32)(m_Pos + req_size - m_dwCurrentXRefSteam);
3534ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CFX_BinaryBuf buf(iSize);
3535ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_LPBYTE pBuf = buf.GetBuffer();
3536ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_pFileRead->ReadBlock(pBuf, m_dwCurrentXRefSteam, iSize);
3537ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CFX_SmartPointer<IFX_FileStream> file(FX_CreateMemoryStream(pBuf, (size_t)iSize, FALSE));
3538ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_parser.m_Syntax.InitParser((IFX_FileStream*)file, 0);
3539ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_BOOL bNumber = FALSE;
3540ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_FILESIZE dwSavePos = m_parser.m_Syntax.SavePos();
3541ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CFX_ByteString objnum = m_parser.m_Syntax.GetNextWord(bNumber);
3542ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (!bNumber) {
3543ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return -1;
3544ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
3545ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_DWORD objNum = FXSYS_atoi(objnum);
3546ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_Object *pObj = m_parser.ParseIndirectObjectAt(NULL, 0, objNum, NULL);
3547ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (!pObj) {
3548ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_Pos += m_parser.m_Syntax.SavePos();
3549ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return 0;
3550ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
3551ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_Object *pName = pObj->GetDict()->GetElement(FX_BSTRC("Type"));
3552ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (pName && pName->GetType() == PDFOBJ_NAME) {
3553ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (pName->GetString() == FX_BSTRC("XRef")) {
3554ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                m_Pos += m_parser.m_Syntax.SavePos();
3555ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                xref_offset = pObj->GetDict()->GetInteger(FX_BSTRC("Prev"));
3556ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                pObj->Release();
3557ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                return 1;
3558ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            } else {
3559ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                pObj->Release();
3560ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                return -1;
3561ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
3562ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
3563ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        pObj->Release();
3564ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return -1;
3565ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
3566ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    pHints->AddSegment(m_Pos, req_size);
3567ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return 0;
3568ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
3569ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovinline void CPDF_DataAvail::SetStartOffset(FX_FILESIZE dwOffset)
3570ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
3571ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_Pos = dwOffset;
3572ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
3573ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define MAX_WORD_BUFFER 256
3574ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_DataAvail::GetNextToken(CFX_ByteString &token)
3575ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
3576ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_WordSize = 0;
3577ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_BYTE ch;
3578ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!GetNextChar(ch)) {
3579ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FALSE;
3580ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
3581ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_BYTE type = _PDF_CharType[ch];
3582ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    while (1) {
3583ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        while (type == 'W') {
3584ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (!GetNextChar(ch)) {
3585ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                return FALSE;
3586ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
3587ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            type = _PDF_CharType[ch];
3588ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
3589ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (ch != '%') {
3590ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            break;
3591ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
3592ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        while (1) {
3593ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (!GetNextChar(ch)) {
3594ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                return FALSE;
3595ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
3596ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (ch == '\r' || ch == '\n') {
3597ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                break;
3598ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
3599ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
3600ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        type = _PDF_CharType[ch];
3601ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
3602ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (type == 'D') {
3603ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_WordBuffer[m_WordSize++] = ch;
3604ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (ch == '/') {
3605ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            while (1) {
3606ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                if (!GetNextChar(ch)) {
3607ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    return FALSE;
3608ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
3609ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                type = _PDF_CharType[ch];
3610ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                if (type != 'R' && type != 'N') {
3611ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    m_Pos --;
3612ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    CFX_ByteString ret(m_WordBuffer, m_WordSize);
3613ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    token = ret;
3614ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    return TRUE;
3615ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
3616ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                if (m_WordSize < MAX_WORD_BUFFER) {
3617ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    m_WordBuffer[m_WordSize++] = ch;
3618ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
3619ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
3620ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        } else if (ch == '<') {
3621ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (!GetNextChar(ch)) {
3622ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                return FALSE;
3623ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
3624ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (ch == '<') {
3625ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                m_WordBuffer[m_WordSize++] = ch;
3626ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            } else {
3627ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                m_Pos --;
3628ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
3629ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        } else if (ch == '>') {
3630ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (!GetNextChar(ch)) {
3631ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                return FALSE;
3632ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
3633ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (ch == '>') {
3634ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                m_WordBuffer[m_WordSize++] = ch;
3635ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            } else {
3636ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                m_Pos --;
3637ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
3638ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
3639ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CFX_ByteString ret(m_WordBuffer, m_WordSize);
3640ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        token = ret;
3641ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return TRUE;
3642ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
3643ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    while (1) {
3644ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (m_WordSize < MAX_WORD_BUFFER) {
3645ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_WordBuffer[m_WordSize++] = ch;
3646ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
3647ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (!GetNextChar(ch)) {
3648ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return FALSE;
3649ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
3650ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        type = _PDF_CharType[ch];
3651ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (type == 'D' || type == 'W') {
3652ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_Pos --;
3653ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            break;
3654ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
3655ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
3656ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_ByteString ret(m_WordBuffer, m_WordSize);
3657ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    token = ret;
3658ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return TRUE;
3659ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
3660ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_DataAvail::GetNextChar(FX_BYTE &ch)
3661ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
3662ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_FILESIZE pos = m_Pos;
3663ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pos >= m_dwFileLen) {
3664ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FALSE;
3665ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
3666ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_bufferOffset >= pos || (FX_FILESIZE)(m_bufferOffset + m_bufferSize) <= pos) {
3667ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_FILESIZE read_pos = pos;
3668ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_DWORD read_size = 512;
3669ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if ((FX_FILESIZE)read_size > m_dwFileLen) {
3670ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            read_size = (FX_DWORD)m_dwFileLen;
3671ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
3672ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if ((FX_FILESIZE)(read_pos + read_size) > m_dwFileLen) {
3673ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            read_pos = m_dwFileLen - read_size;
3674ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
3675ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (!m_pFileRead->ReadBlock(m_bufferData, read_pos, read_size)) {
3676ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return FALSE;
3677ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
3678ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_bufferOffset = read_pos;
3679ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_bufferSize = read_size;
3680ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
3681ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    ch = m_bufferData[pos - m_bufferOffset];
3682ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_Pos ++;
3683ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return TRUE;
3684ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
3685ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_DataAvail::CheckCrossRefItem(IFX_DownloadHints *pHints)
3686ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
3687ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_INT32 iSize = 0;
3688ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_ByteString token;
3689ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    while (1) {
3690ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (!GetNextToken(token)) {
3691ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            iSize = (FX_INT32)(m_Pos + 512 > m_dwFileLen ? m_dwFileLen - m_Pos : 512);
3692ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            pHints->AddSegment(m_Pos, iSize);
3693ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return FALSE;
3694ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
3695ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (token == "trailer") {
3696ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_dwTrailerOffset = m_Pos;
3697ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_docStatus = PDF_DATAAVAIL_TRAILER;
3698ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return TRUE;
3699ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
3700ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
3701ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
3702ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_DataAvail::CheckAllCrossRefStream(IFX_DownloadHints *pHints)
3703ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
3704ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_FILESIZE xref_offset = 0;
3705ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_DWORD dwRet = CheckCrossRefStream(pHints, xref_offset);
3706ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (dwRet == 1) {
3707ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (!xref_offset) {
3708ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_docStatus = PDF_DATAAVAIL_LOADALLCRSOSSREF;
3709ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        } else {
3710ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_dwCurrentXRefSteam = xref_offset;
3711ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_Pos = xref_offset;
3712ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
3713ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return TRUE;
3714ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    } else if (dwRet == -1) {
3715ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_docStatus = PDF_DATAAVAIL_ERROR;
3716ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
3717ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return FALSE;
3718ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
3719ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_DataAvail::CheckCrossRef(IFX_DownloadHints* pHints)
3720ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
3721ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_FILESIZE dwSavePos = m_Pos;
3722ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_INT32 iSize = 0;
3723ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_ByteString token;
3724ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!GetNextToken(token)) {
3725ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        iSize = (FX_INT32)(m_Pos + 512 > m_dwFileLen ? m_dwFileLen - m_Pos : 512);
3726ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        pHints->AddSegment(m_Pos, iSize);
3727ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FALSE;
3728ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
3729ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (token == "xref") {
3730ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_CrossOffset.InsertAt(0, m_dwXRefOffset);
3731ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        while (1) {
3732ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (!GetNextToken(token)) {
3733ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                iSize = (FX_INT32)(m_Pos + 512 > m_dwFileLen ? m_dwFileLen - m_Pos : 512);
3734ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                pHints->AddSegment(m_Pos, iSize);
3735ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                m_docStatus = PDF_DATAAVAIL_CROSSREF_ITEM;
3736ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                return FALSE;
3737ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
3738ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (token == "trailer") {
3739ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                m_dwTrailerOffset = m_Pos;
3740ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                m_docStatus = PDF_DATAAVAIL_TRAILER;
3741ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                return TRUE;
3742ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
3743ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
3744ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    } else {
3745ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_docStatus = PDF_DATAAVAIL_LOADALLFILE;
3746ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return TRUE;
3747ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
3748ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return FALSE;
3749ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
3750ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_DataAvail::CheckTrailerAppend(IFX_DownloadHints* pHints)
3751ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
3752ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_Pos < m_dwFileLen) {
3753ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_FILESIZE dwAppendPos = m_Pos + m_syntaxParser.SavePos();
3754ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_INT32 iSize = (FX_INT32)(dwAppendPos + 512 > m_dwFileLen ? m_dwFileLen - dwAppendPos : 512);
3755ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (!m_pFileAvail->IsDataAvail(dwAppendPos, iSize)) {
3756ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            pHints->AddSegment(dwAppendPos, iSize);
3757ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return FALSE;
3758ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
3759ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
3760ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_dwPrevXRefOffset) {
3761ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        SetStartOffset(m_dwPrevXRefOffset);
3762ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_docStatus = PDF_DATAAVAIL_CROSSREF;
3763ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    } else {
3764ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_docStatus = PDF_DATAAVAIL_LOADALLCRSOSSREF;
3765ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
3766ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return TRUE;
3767ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
3768ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_DataAvail::CheckTrailer(IFX_DownloadHints* pHints)
3769ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
3770ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_INT32 iTrailerSize = (FX_INT32)(m_Pos + 512 > m_dwFileLen ? m_dwFileLen - m_Pos : 512);
3771ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_pFileAvail->IsDataAvail(m_Pos, iTrailerSize)) {
3772ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_INT32 iSize = (FX_INT32)(m_Pos + iTrailerSize - m_dwTrailerOffset);
3773ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CFX_BinaryBuf buf(iSize);
3774ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_LPBYTE pBuf = buf.GetBuffer();
3775ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (!pBuf) {
3776ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_docStatus = PDF_DATAAVAIL_ERROR;
3777ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return FALSE;
3778ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
3779ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (!m_pFileRead->ReadBlock(pBuf, m_dwTrailerOffset, iSize)) {
3780ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return FALSE;
3781ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
3782ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CFX_SmartPointer<IFX_FileStream> file(FX_CreateMemoryStream(pBuf, (size_t)iSize, FALSE));
3783ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_syntaxParser.InitParser((IFX_FileStream*)file, 0);
3784ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_Object *pTrailer = m_syntaxParser.GetObject(NULL, 0, 0, 0);
3785ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (!pTrailer) {
3786ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_Pos += m_syntaxParser.SavePos();
3787ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            pHints->AddSegment(m_Pos, iTrailerSize);
3788ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return FALSE;
3789ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
3790ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_Dictionary *pTrailerDict = pTrailer->GetDict();
3791ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (pTrailerDict) {
3792ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            CPDF_Object *pEncrypt = pTrailerDict->GetElement("Encrypt");
3793ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (pEncrypt && pEncrypt->GetType() == PDFOBJ_REFERENCE) {
3794ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                m_docStatus = PDF_DATAAVAIL_LOADALLFILE;
3795ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                pTrailer->Release();
3796ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                return TRUE;
3797ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
3798ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
3799ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_DWORD xrefpos = GetDirectInteger(pTrailer->GetDict(), FX_BSTRC("Prev"));
3800ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (xrefpos) {
3801ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_dwPrevXRefOffset = GetDirectInteger(pTrailer->GetDict(), FX_BSTRC("XRefStm"));
3802ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            pTrailer->Release();
3803ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (m_dwPrevXRefOffset) {
3804ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                m_docStatus = PDF_DATAAVAIL_LOADALLFILE;
3805ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            } else {
3806ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                m_dwPrevXRefOffset = xrefpos;
3807ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                if (m_dwPrevXRefOffset >= m_dwFileLen) {
3808ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    m_docStatus = PDF_DATAAVAIL_LOADALLFILE;
3809ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                } else {
3810ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    SetStartOffset(m_dwPrevXRefOffset);
3811ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    m_docStatus = PDF_DATAAVAIL_TRAILER_APPEND;
3812ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
3813ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
3814ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return TRUE;
3815ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        } else {
3816ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_dwPrevXRefOffset = 0;
3817ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_docStatus = PDF_DATAAVAIL_TRAILER_APPEND;
3818ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            pTrailer->Release();
3819ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
3820ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return TRUE;
3821ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
3822ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    pHints->AddSegment(m_Pos, iTrailerSize);
3823ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return FALSE;
3824ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
3825ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_DataAvail::CheckPage(FX_INT32 iPage, IFX_DownloadHints* pHints)
3826ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
3827ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    while (TRUE) {
3828ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        switch (m_docStatus) {
3829ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            case PDF_DATAAVAIL_PAGETREE:
3830ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                if (!LoadDocPages(pHints)) {
3831ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    return FALSE;
3832ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
3833ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                break;
3834ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            case PDF_DATAAVAIL_PAGE:
3835ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                if (!LoadDocPage(iPage, pHints)) {
3836ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    return FALSE;
3837ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
3838ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                break;
3839ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            case PDF_DATAAVAIL_ERROR:
3840ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                return LoadAllFile(pHints);
3841ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            default:
3842ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                m_bPagesTreeLoad = TRUE;
3843ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                m_bPagesLoad = TRUE;
3844ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                m_bCurPageDictLoadOK = TRUE;
3845ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                m_docStatus = PDF_DATAAVAIL_PAGE;
3846ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                return TRUE;
3847ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
3848ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
3849ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
3850ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL	CPDF_DataAvail::CheckArrayPageNode(FX_DWORD dwPageNo, CPDF_PageNode *pPageNode, IFX_DownloadHints* pHints)
3851ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
3852ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_BOOL bExist = FALSE;
3853ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Object *pPages = GetObject(dwPageNo, pHints, &bExist);
3854ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!bExist) {
3855ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_docStatus = PDF_DATAAVAIL_ERROR;
3856ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FALSE;
3857ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
3858ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!pPages) {
3859ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (m_docStatus == PDF_DATAAVAIL_ERROR) {
3860ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_docStatus = PDF_DATAAVAIL_ERROR;
3861ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return FALSE;
3862ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
3863ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FALSE;
3864ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
3865ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pPages->GetType() != PDFOBJ_ARRAY) {
3866ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        pPages->Release();
3867ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_docStatus = PDF_DATAAVAIL_ERROR;
3868ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FALSE;
3869ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
3870ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    pPageNode->m_type = PDF_PAGENODE_PAGES;
3871ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Array* pArray = (CPDF_Array*)pPages;
3872ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    for (FX_DWORD i = 0; i < pArray->GetCount(); ++i) {
3873ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_Object *pKid = (CPDF_Object *)pArray->GetElement(i);
3874ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (!pKid || pKid->GetType() != PDFOBJ_REFERENCE) {
3875ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            continue;
3876ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
3877ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_PageNode *pNode = FX_NEW CPDF_PageNode();
3878ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        pPageNode->m_childNode.Add(pNode);
3879ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        pNode->m_dwPageNo = ((CPDF_Reference*)pKid)->GetRefObjNum();
3880ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
3881ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    pPages->Release();
3882ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return TRUE;
3883ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
3884ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_DataAvail::CheckUnkownPageNode(FX_DWORD dwPageNo, CPDF_PageNode *pPageNode, IFX_DownloadHints* pHints)
3885ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
3886ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_BOOL bExist = FALSE;
3887ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Object *pPage = GetObject(dwPageNo, pHints, &bExist);
3888ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!bExist) {
3889ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_docStatus = PDF_DATAAVAIL_ERROR;
3890ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FALSE;
3891ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
3892ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!pPage) {
3893ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (m_docStatus == PDF_DATAAVAIL_ERROR) {
3894ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_docStatus = PDF_DATAAVAIL_ERROR;
3895ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return FALSE;
3896ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
3897ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FALSE;
3898ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
3899ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pPage->GetType() == PDFOBJ_ARRAY) {
3900ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        pPageNode->m_dwPageNo = dwPageNo;
3901ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        pPageNode->m_type = PDF_PAGENODE_ARRAY;
3902ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        pPage->Release();
3903ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return TRUE;
3904ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
3905ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pPage->GetType() != PDFOBJ_DICTIONARY) {
3906ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        pPage->Release();
3907ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_docStatus = PDF_DATAAVAIL_ERROR;
3908ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FALSE;
3909ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
3910ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    pPageNode->m_dwPageNo = dwPageNo;
3911ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_ByteString type = pPage->GetDict()->GetString(FX_BSTRC("Type"));
3912ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (type == FX_BSTRC("Pages")) {
3913ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        pPageNode->m_type = PDF_PAGENODE_PAGES;
3914ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_Object *pKids = pPage->GetDict()->GetElement(FX_BSTRC("Kids"));
3915ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (!pKids) {
3916ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_docStatus = PDF_DATAAVAIL_PAGE;
3917ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return TRUE;
3918ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
3919ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        switch (pKids->GetType()) {
3920ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            case PDFOBJ_REFERENCE: {
3921ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    CPDF_Reference *pKid = (CPDF_Reference *)pKids;
3922ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    CPDF_PageNode *pNode = FX_NEW CPDF_PageNode();
3923ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    pPageNode->m_childNode.Add(pNode);
3924ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    pNode->m_dwPageNo = pKid->GetRefObjNum();
3925ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
3926ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                break;
3927ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            case PDFOBJ_ARRAY: {
3928ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    CPDF_Array *pKidsArray = (CPDF_Array *)pKids;
3929ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    for (FX_DWORD i = 0; i < pKidsArray->GetCount(); ++i) {
3930ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        CPDF_Object *pKid = (CPDF_Object *)pKidsArray->GetElement(i);
3931ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        if (!pKid || pKid->GetType() != PDFOBJ_REFERENCE) {
3932ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                            continue;
3933ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        }
3934ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        CPDF_PageNode *pNode = FX_NEW CPDF_PageNode();
3935ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        pPageNode->m_childNode.Add(pNode);
3936ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        pNode->m_dwPageNo = ((CPDF_Reference*)pKid)->GetRefObjNum();
3937ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    }
3938ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
3939ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                break;
3940ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            default:
3941ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                break;
3942ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
3943ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    } else if (type == FX_BSTRC("Page")) {
3944ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        pPageNode->m_type = PDF_PAGENODE_PAGE;
3945ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    } else {
3946ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        pPage->Release();
3947ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_docStatus = PDF_DATAAVAIL_ERROR;
3948ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FALSE;
3949ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
3950ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    pPage->Release();
3951ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return TRUE;
3952ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
3953ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_DataAvail::CheckPageNode(CPDF_PageNode &pageNodes, FX_INT32 iPage, FX_INT32 &iCount, IFX_DownloadHints* pHints)
3954ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
3955ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_INT32 iSize = pageNodes.m_childNode.GetSize();
3956ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!iSize) {
3957ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_docStatus = PDF_DATAAVAIL_ERROR;
3958ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FALSE;
3959ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
3960ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    for (FX_INT32 i = 0; i < iSize; ++i) {
3961ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_PageNode *pNode = (CPDF_PageNode*)pageNodes.m_childNode.GetAt(i);
3962ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (!pNode) {
3963ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            continue;
3964ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
3965ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        switch (pNode->m_type) {
3966ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            case PDF_PAGENODE_UNKOWN:
3967ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                if (!CheckUnkownPageNode(pNode->m_dwPageNo, pNode, pHints)) {
3968ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    return FALSE;
3969ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
3970ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                --i;
3971ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                break;
3972ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            case PDF_PAGENODE_PAGE:
3973ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                iCount++;
3974ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                if (iPage == iCount && m_pDocument) {
3975ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    m_pDocument->m_PageList.SetAt(iPage, pNode->m_dwPageNo);
3976ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
3977ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                break;
3978ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            case PDF_PAGENODE_PAGES:
3979ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                if (!CheckPageNode(*pNode, iPage, iCount, pHints)) {
3980ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    return FALSE;
3981ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
3982ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                break;
3983ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            case PDF_PAGENODE_ARRAY:
3984ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                if (!CheckArrayPageNode(pNode->m_dwPageNo, pNode, pHints)) {
3985ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    return FALSE;
3986ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
3987ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                --i;
3988ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                break;
3989ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
3990ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (iPage == iCount) {
3991ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_docStatus = PDF_DATAAVAIL_DONE;
3992ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return TRUE;
3993ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
3994ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
3995ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return TRUE;
3996ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
3997ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_DataAvail::LoadDocPage(FX_INT32 iPage, IFX_DownloadHints* pHints)
3998ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
3999ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_pDocument->GetPageCount() <= iPage || m_pDocument->m_PageList.GetAt(iPage)) {
4000ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_docStatus = PDF_DATAAVAIL_DONE;
4001ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return TRUE;
4002ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
4003ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_pageNodes.m_type == PDF_PAGENODE_PAGE) {
4004ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (iPage == 0) {
4005ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_docStatus = PDF_DATAAVAIL_DONE;
4006ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return TRUE;
4007ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
4008ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_docStatus = PDF_DATAAVAIL_ERROR;
4009ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return TRUE;
4010ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
4011ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_INT32 iCount = -1;
4012ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return CheckPageNode(m_pageNodes, iPage, iCount, pHints);
4013ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
4014ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_DataAvail::CheckPageCount(IFX_DownloadHints* pHints)
4015ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
4016ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_BOOL bExist = FALSE;
4017ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Object *pPages = GetObject(m_PagesObjNum, pHints, &bExist);
4018ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!bExist) {
4019ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_docStatus = PDF_DATAAVAIL_ERROR;
4020ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FALSE;
4021ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
4022ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!pPages) {
4023ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FALSE;
4024ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
4025ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Dictionary* pPagesDict = pPages->GetDict();
4026ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!pPagesDict) {
4027ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        pPages->Release();
4028ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_docStatus = PDF_DATAAVAIL_ERROR;
4029ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FALSE;
4030ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
4031ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!pPagesDict->KeyExist(FX_BSTRC("Kids"))) {
4032ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        pPages->Release();
4033ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return TRUE;
4034ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
4035ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    int count = pPagesDict->GetInteger(FX_BSTRC("Count"));
4036ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (count > 0) {
4037ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        pPages->Release();
4038ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return TRUE;
4039ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
4040ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    pPages->Release();
4041ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return FALSE;
4042ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
4043ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_DataAvail::LoadDocPages(IFX_DownloadHints* pHints)
4044ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
4045ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!CheckUnkownPageNode(m_PagesObjNum, &m_pageNodes, pHints)) {
4046ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FALSE;
4047ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
4048ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (CheckPageCount(pHints)) {
4049ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_docStatus = PDF_DATAAVAIL_PAGE;
4050ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return TRUE;
4051ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    } else {
4052ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_bTotalLoadPageTree = TRUE;
4053ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
4054ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return FALSE;
4055ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
4056ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_DataAvail::LoadPages(IFX_DownloadHints* pHints)
4057ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
4058ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    while (!m_bPagesTreeLoad) {
4059ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (!CheckPageStatus(pHints)) {
4060ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return FALSE;
4061ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
4062ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
4063ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_bPagesLoad) {
4064ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return TRUE;
4065ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
4066ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_pDocument->LoadPages();
4067ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return FALSE;
4068ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
4069ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_DataAvail::CheckLinearizedData(IFX_DownloadHints* pHints)
4070ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
4071ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_bLinearedDataOK) {
4072ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return TRUE;
4073ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
4074ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!m_pFileAvail->IsDataAvail(m_dwLastXRefOffset, (FX_DWORD)(m_dwFileLen - m_dwLastXRefOffset))) {
4075ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        pHints->AddSegment(m_dwLastXRefOffset, (FX_DWORD)(m_dwFileLen - m_dwLastXRefOffset));
4076ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FALSE;
4077ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
4078ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_DWORD dwRet = 0;
4079ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!m_bMainXRefLoad) {
4080ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        dwRet = ((CPDF_Parser *)m_pDocument->GetParser())->LoadLinearizedMainXRefTable();
4081ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (dwRet == PDFPARSE_ERROR_SUCCESS) {
4082ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (!PreparePageItem()) {
4083ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                return FALSE;
4084ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
4085ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_bMainXRefLoadedOK = TRUE;
4086ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
4087ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_bMainXRefLoad = TRUE;
4088ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
4089ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_bLinearedDataOK = TRUE;
4090ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return TRUE;
4091ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
4092ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_DataAvail::CheckPageAnnots(FX_INT32 iPage, IFX_DownloadHints* pHints)
4093ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
4094ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!m_objs_array.GetSize()) {
4095ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_objs_array.RemoveAll();
4096ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_objnum_array.RemoveAll();
4097ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_Dictionary *pPageDict = m_pDocument->GetPage(iPage);
4098ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (!pPageDict) {
4099ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return TRUE;
4100ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
4101ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_Object *pAnnots = pPageDict->GetElement(FX_BSTRC("Annots"));
4102ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (!pAnnots) {
4103ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return TRUE;
4104ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
4105ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CFX_PtrArray obj_array;
4106ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        obj_array.Add(pAnnots);
4107ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_BOOL bRet = IsObjectsAvail(obj_array, FALSE, pHints, m_objs_array);
4108ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (bRet) {
4109ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_objs_array.RemoveAll();
4110ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
4111ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return bRet;
4112ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    } else {
4113ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CFX_PtrArray new_objs_array;
4114ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_BOOL bRet = IsObjectsAvail(m_objs_array, FALSE, pHints, new_objs_array);
4115ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_objs_array.RemoveAll();
4116ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (!bRet) {
4117ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_objs_array.Append(new_objs_array);
4118ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
4119ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return bRet;
4120ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
4121ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
4122ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_DataAvail::CheckLinearizedFirstPage(FX_INT32 iPage, IFX_DownloadHints* pHints)
4123ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
4124ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!m_bAnnotsLoad) {
4125ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (!CheckPageAnnots(iPage, pHints)) {
4126ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return FALSE;
4127ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
4128ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_bAnnotsLoad = TRUE;
4129ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
4130ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_bAnnotsLoad)
4131ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (!CheckLinearizedData(pHints)) {
4132ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return FALSE;
4133ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
4134ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_bPageLoadedOK = FALSE;
4135ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return TRUE;
4136ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
4137ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_DataAvail::HaveResourceAncestor(CPDF_Dictionary *pDict)
4138ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
4139ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Object *pParent = pDict->GetElement("Parent");
4140ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!pParent) {
4141ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FALSE;
4142ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
4143ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Dictionary *pParentDict = pParent->GetDict();
4144ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!pParentDict) {
4145ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FALSE;
4146ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
4147ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Object *pRet = pParentDict->GetElement("Resource");
4148ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pRet) {
4149ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_pPageResource = pRet;
4150ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return TRUE;
4151ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    } else {
4152ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return HaveResourceAncestor(pParentDict);
4153ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
4154ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
4155ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_DataAvail::IsPageAvail(FX_INT32 iPage, IFX_DownloadHints* pHints)
4156ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
4157ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!m_pDocument) {
4158ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FALSE;
4159ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
4160ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (IsFirstCheck(iPage)) {
4161ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_bCurPageDictLoadOK = FALSE;
4162ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_bPageLoadedOK = FALSE;
4163ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_bAnnotsLoad = FALSE;
4164ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_bNeedDownLoadResource = FALSE;
4165ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_objs_array.RemoveAll();
4166ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_objnum_array.RemoveAll();
4167ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
4168ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_pagesLoadState == NULL) {
4169ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_pagesLoadState = FX_NEW CFX_CMapDWordToDWord();
4170ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
4171ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_DWORD dwPageLoad = 0;
4172ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_pagesLoadState->Lookup(iPage, dwPageLoad) && dwPageLoad != 0) {
4173ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return TRUE;
4174ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
4175ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_bLinearized) {
4176ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if ((FX_DWORD)iPage == m_dwFirstPageNo) {
4177ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_pagesLoadState->SetAt(iPage, TRUE);
4178ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return TRUE;
4179ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
4180ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (!CheckLinearizedData(pHints)) {
4181ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return FALSE;
4182ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
4183ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (m_bMainXRefLoadedOK) {
4184ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (m_bTotalLoadPageTree) {
4185ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                if (!LoadPages(pHints)) {
4186ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    return FALSE;
4187ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
4188ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            } else {
4189ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                if (!m_bCurPageDictLoadOK && !CheckPage(iPage, pHints)) {
4190ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    return FALSE;
4191ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
4192ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
4193ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        } else {
4194ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (!LoadAllFile(pHints)) {
4195ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                return FALSE;
4196ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
4197ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            ((CPDF_Parser *)m_pDocument->GetParser())->RebuildCrossRef();
4198ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            ResetFirstCheck(iPage);
4199ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return TRUE;
4200ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
4201ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    } else {
4202ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (!m_bTotalLoadPageTree) {
4203ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (!m_bCurPageDictLoadOK && !CheckPage(iPage, pHints)) {
4204ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                return FALSE;
4205ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
4206ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
4207ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
4208ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_bHaveAcroForm && !m_bAcroFormLoad) {
4209ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (!CheckAcroFormSubObject(pHints)) {
4210ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return FALSE;
4211ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
4212ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_bAcroFormLoad = TRUE;
4213ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
4214ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!m_bPageLoadedOK) {
4215ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (!m_objs_array.GetSize()) {
4216ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_objs_array.RemoveAll();
4217ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_objnum_array.RemoveAll();
4218ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_pPageDict = m_pDocument->GetPage(iPage);
4219ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (!m_pPageDict) {
4220ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                ResetFirstCheck(iPage);
4221ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                return TRUE;
4222ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
4223ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            CFX_PtrArray obj_array;
4224ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            obj_array.Add(m_pPageDict);
4225ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            FX_BOOL bRet = IsObjectsAvail(obj_array, TRUE, pHints, m_objs_array);
4226ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (bRet) {
4227ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                m_objs_array.RemoveAll();
4228ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                m_bPageLoadedOK = TRUE;
4229ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            } else {
4230ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                return bRet;
4231ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
4232ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        } else {
4233ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            CFX_PtrArray new_objs_array;
4234ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            FX_BOOL bRet = IsObjectsAvail(m_objs_array, FALSE, pHints, new_objs_array);
4235ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_objs_array.RemoveAll();
4236ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (bRet) {
4237ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                m_bPageLoadedOK = TRUE;
4238ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            } else {
4239ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                m_objs_array.Append(new_objs_array);
4240ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                return bRet;
4241ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
4242ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
4243ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
4244ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_bPageLoadedOK) {
4245ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (!m_bAnnotsLoad) {
4246ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (!CheckPageAnnots(iPage, pHints)) {
4247ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                return FALSE;
4248ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
4249ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_bAnnotsLoad = TRUE;
4250ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
4251ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
4252ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_pPageDict && !m_bNeedDownLoadResource) {
4253ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_Object *pRes = m_pPageDict->GetElement("Resource");
4254ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (!pRes) {
4255ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_bNeedDownLoadResource = HaveResourceAncestor(m_pPageDict);
4256ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
4257ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_bNeedDownLoadResource = FALSE;
4258ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
4259ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_bNeedDownLoadResource) {
4260ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_BOOL bRet = CheckResources(pHints);
4261ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (!bRet) {
4262ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return FALSE;
4263ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
4264ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_bNeedDownLoadResource = FALSE;
4265ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
4266ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_bPageLoadedOK = FALSE;
4267ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_bAnnotsLoad = FALSE;
4268ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_bCurPageDictLoadOK = FALSE;
4269ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    ResetFirstCheck(iPage);
4270ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_pagesLoadState->SetAt(iPage, TRUE);
4271ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return TRUE;
4272ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
4273ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_DataAvail::CheckResources(IFX_DownloadHints* pHints)
4274ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
4275ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!m_objs_array.GetSize()) {
4276ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_objs_array.RemoveAll();
4277ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CFX_PtrArray obj_array;
4278ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        obj_array.Add(m_pPageResource);
4279ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_BOOL bRet = IsObjectsAvail(obj_array, TRUE, pHints, m_objs_array);
4280ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (bRet) {
4281ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_objs_array.RemoveAll();
4282ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
4283ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return bRet;
4284ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    } else {
4285ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CFX_PtrArray new_objs_array;
4286ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_BOOL bRet = IsObjectsAvail(m_objs_array, FALSE, pHints, new_objs_array);
4287ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_objs_array.RemoveAll();
4288ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (!bRet) {
4289ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_objs_array.Append(new_objs_array);
4290ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
4291ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return bRet;
4292ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
4293ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
4294ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_DataAvail::GetLinearizedMainXRefInfo(FX_FILESIZE *pPos, FX_DWORD *pSize)
4295ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
4296ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pPos) {
4297ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        *pPos = m_dwLastXRefOffset;
4298ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
4299ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pSize) {
4300ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        *pSize = (FX_DWORD)(m_dwFileLen - m_dwLastXRefOffset);
4301ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
4302ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
4303ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_INT32 CPDF_DataAvail::IsFormAvail(IFX_DownloadHints *pHints)
4304ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
4305ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!m_pDocument) {
4306ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return PDFFORM_AVAIL;
4307ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
4308ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!m_bLinearizedFormParamLoad) {
4309ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_Dictionary *pRoot = m_pDocument->GetRoot();
4310ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (!pRoot) {
4311ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return PDFFORM_AVAIL;
4312ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
4313ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_Object *pAcroForm = pRoot->GetElement(FX_BSTRC("AcroForm"));
4314ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (!pAcroForm) {
4315ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return PDFFORM_NOTEXIST;
4316ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
4317ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (!m_bMainXRefLoad && !CheckLinearizedData(pHints)) {
4318ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return PDFFORM_NOTAVAIL;
4319ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
4320ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (!m_objs_array.GetSize()) {
4321ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_objs_array.Add(pAcroForm->GetDict());
4322ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
4323ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_bLinearizedFormParamLoad = TRUE;
4324ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
4325ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_PtrArray new_objs_array;
4326ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_BOOL bRet = IsObjectsAvail(m_objs_array, FALSE, pHints, new_objs_array);
4327ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_objs_array.RemoveAll();
4328ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!bRet) {
4329ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_objs_array.Append(new_objs_array);
4330ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return PDFFORM_NOTAVAIL;
4331ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
4332ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return PDFFORM_AVAIL;
4333ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
4334ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_SortObjNumArray::AddObjNum(FX_DWORD dwObjNum)
4335ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
4336ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_INT32 iNext = 0;
4337ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (BinarySearch(dwObjNum, iNext)) {
4338ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return;
4339ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
4340ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_number_array.InsertAt(iNext, dwObjNum);
4341ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
4342ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_SortObjNumArray::Find(FX_DWORD dwObjNum)
4343ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
4344ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_INT32 iNext = 0;
4345ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return BinarySearch(dwObjNum, iNext);
4346ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
4347ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_SortObjNumArray::BinarySearch(FX_DWORD value, FX_INT32 &iNext)
4348ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
4349ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_INT32 iLen = m_number_array.GetSize();
4350ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_INT32 iLow = 0;
4351ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_INT32 iHigh = iLen - 1;
4352ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_INT32 iMid = 0;
4353ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    while (iLow <= iHigh) {
4354ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        iMid = (iLow + iHigh) / 2;
4355ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_DWORD tt = m_number_array.GetAt(iMid);
4356ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (m_number_array.GetAt(iMid) == value) {
4357ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            iNext = iMid;
4358ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return TRUE;
4359ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        } else if (m_number_array.GetAt(iMid) > value) {
4360ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            iHigh = iMid - 1;
4361ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        } else if (m_number_array.GetAt(iMid) < value) {
4362ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            iLow = iMid + 1;
4363ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
4364ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
4365ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    iNext = iLow;
4366ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return FALSE;
4367ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
4368ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_PageNode::~CPDF_PageNode()
4369ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
4370ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_INT32 iSize = m_childNode.GetSize();
4371ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    for (FX_INT32 i = 0; i < iSize; ++i) {
4372ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_PageNode *pNode = (CPDF_PageNode*)m_childNode[i];
4373ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (pNode) {
4374ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            delete pNode;
4375ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
4376ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
4377ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_childNode.RemoveAll();
4378ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
4379