Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(98)

Side by Side Diff: core/src/fpdfapi/fpdf_parser/cpdf_data_avail.cpp

Issue 1778173002: Split apart the remainder of fpdf_render_render.cpp into per-class files. (Closed) Base URL: https://pdfium.googlesource.com/pdfium.git@master
Patch Set: remove more stray includes. Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 PDFium Authors. All rights reserved. 1 // Copyright 2016 PDFium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6 6
7 #include "core/include/fpdfapi/fpdf_parser.h"
8
9 #include <algorithm>
10 #include <memory>
11 #include <set>
12 #include <utility>
13 #include <vector>
14
15 #include "core/include/fpdfapi/cpdf_document.h" 7 #include "core/include/fpdfapi/cpdf_document.h"
16 #include "core/include/fpdfapi/cpdf_parser.h" 8 #include "core/include/fpdfapi/fpdf_objects.h"
17 #include "core/include/fpdfapi/fpdf_module.h"
18 #include "core/include/fpdfapi/fpdf_page.h"
19 #include "core/include/fxcrt/fx_ext.h" 9 #include "core/include/fxcrt/fx_ext.h"
20 #include "core/include/fxcrt/fx_safe_types.h" 10 #include "core/include/fxcrt/fx_safe_types.h"
21 #include "core/src/fpdfapi/fpdf_page/pageint.h" 11 #include "core/src/fpdfapi/fpdf_parser/cpdf_data_avail.h"
22 #include "core/src/fpdfapi/fpdf_parser/cpdf_syntax_parser.h"
23 #include "core/src/fpdfapi/fpdf_parser/fpdf_parser_utility.h" 12 #include "core/src/fpdfapi/fpdf_parser/fpdf_parser_utility.h"
24 #include "core/src/fpdfapi/fpdf_parser/parser_int.h"
25 #include "third_party/base/stl_util.h" 13 #include "third_party/base/stl_util.h"
26 14
27 namespace { 15 IPDF_DataAvail::IPDF_DataAvail(IPDF_DataAvail::FileAvail* pFileAvail,
28
29 bool CanReadFromBitStream(const CFX_BitStream* hStream,
30 const FX_SAFE_DWORD& num_bits) {
31 return num_bits.IsValid() &&
32 hStream->BitsRemaining() >= num_bits.ValueOrDie();
33 }
34
35 } // namespace
36
37 bool IsSignatureDict(const CPDF_Dictionary* pDict) {
38 CPDF_Object* pType = pDict->GetElementValue("Type");
39 if (!pType)
40 pType = pDict->GetElementValue("FT");
41 return pType && pType->GetString() == "Sig";
42 }
43
44
45 class CPDF_DataAvail final : public IPDF_DataAvail {
46 public:
47 CPDF_DataAvail(IFX_FileAvail* pFileAvail,
48 IFX_FileRead* pFileRead,
49 FX_BOOL bSupportHintTable);
50 ~CPDF_DataAvail() override;
51
52 // IPDF_DataAvail:
53 DocAvailStatus IsDocAvail(IFX_DownloadHints* pHints) override;
54 void SetDocument(CPDF_Document* pDoc) override;
55 DocAvailStatus IsPageAvail(int iPage, IFX_DownloadHints* pHints) override;
56 DocFormStatus IsFormAvail(IFX_DownloadHints* pHints) override;
57 DocLinearizationStatus IsLinearizedPDF() override;
58 FX_BOOL IsLinearized() override { return m_bLinearized; }
59 void GetLinearizedMainXRefInfo(FX_FILESIZE* pPos, FX_DWORD* pSize) override;
60
61 int GetPageCount() const;
62 CPDF_Dictionary* GetPage(int index);
63
64 friend class CPDF_HintTables;
65
66 protected:
67 static const int kMaxDataAvailRecursionDepth = 64;
68 static int s_CurrentDataAvailRecursionDepth;
69 static const int kMaxPageRecursionDepth = 1024;
70
71 FX_DWORD GetObjectSize(FX_DWORD objnum, FX_FILESIZE& offset);
72 FX_BOOL IsObjectsAvail(CFX_ArrayTemplate<CPDF_Object*>& obj_array,
73 FX_BOOL bParsePage,
74 IFX_DownloadHints* pHints,
75 CFX_ArrayTemplate<CPDF_Object*>& ret_array);
76 FX_BOOL CheckDocStatus(IFX_DownloadHints* pHints);
77 FX_BOOL CheckHeader(IFX_DownloadHints* pHints);
78 FX_BOOL CheckFirstPage(IFX_DownloadHints* pHints);
79 FX_BOOL CheckHintTables(IFX_DownloadHints* pHints);
80 FX_BOOL CheckEnd(IFX_DownloadHints* pHints);
81 FX_BOOL CheckCrossRef(IFX_DownloadHints* pHints);
82 FX_BOOL CheckCrossRefItem(IFX_DownloadHints* pHints);
83 FX_BOOL CheckTrailer(IFX_DownloadHints* pHints);
84 FX_BOOL CheckRoot(IFX_DownloadHints* pHints);
85 FX_BOOL CheckInfo(IFX_DownloadHints* pHints);
86 FX_BOOL CheckPages(IFX_DownloadHints* pHints);
87 FX_BOOL CheckPage(IFX_DownloadHints* pHints);
88 FX_BOOL CheckResources(IFX_DownloadHints* pHints);
89 FX_BOOL CheckAnnots(IFX_DownloadHints* pHints);
90 FX_BOOL CheckAcroForm(IFX_DownloadHints* pHints);
91 FX_BOOL CheckAcroFormSubObject(IFX_DownloadHints* pHints);
92 FX_BOOL CheckTrailerAppend(IFX_DownloadHints* pHints);
93 FX_BOOL CheckPageStatus(IFX_DownloadHints* pHints);
94 FX_BOOL CheckAllCrossRefStream(IFX_DownloadHints* pHints);
95
96 int32_t CheckCrossRefStream(IFX_DownloadHints* pHints,
97 FX_FILESIZE& xref_offset);
98 FX_BOOL IsLinearizedFile(uint8_t* pData, FX_DWORD dwLen);
99 void SetStartOffset(FX_FILESIZE dwOffset);
100 FX_BOOL GetNextToken(CFX_ByteString& token);
101 FX_BOOL GetNextChar(uint8_t& ch);
102 CPDF_Object* ParseIndirectObjectAt(
103 FX_FILESIZE pos,
104 FX_DWORD objnum,
105 CPDF_IndirectObjectHolder* pObjList = nullptr);
106 CPDF_Object* GetObject(FX_DWORD objnum,
107 IFX_DownloadHints* pHints,
108 FX_BOOL* pExistInFile);
109 FX_BOOL GetPageKids(CPDF_Parser* pParser, CPDF_Object* pPages);
110 FX_BOOL PreparePageItem();
111 FX_BOOL LoadPages(IFX_DownloadHints* pHints);
112 FX_BOOL LoadAllXref(IFX_DownloadHints* pHints);
113 FX_BOOL LoadAllFile(IFX_DownloadHints* pHints);
114 DocAvailStatus CheckLinearizedData(IFX_DownloadHints* pHints);
115 FX_BOOL CheckPageAnnots(int iPage, IFX_DownloadHints* pHints);
116
117 DocAvailStatus CheckLinearizedFirstPage(int iPage, IFX_DownloadHints* pHints);
118 FX_BOOL HaveResourceAncestor(CPDF_Dictionary* pDict);
119 FX_BOOL CheckPage(int32_t iPage, IFX_DownloadHints* pHints);
120 FX_BOOL LoadDocPages(IFX_DownloadHints* pHints);
121 FX_BOOL LoadDocPage(int32_t iPage, IFX_DownloadHints* pHints);
122 FX_BOOL CheckPageNode(CPDF_PageNode& pageNodes,
123 int32_t iPage,
124 int32_t& iCount,
125 IFX_DownloadHints* pHints,
126 int level);
127 FX_BOOL CheckUnkownPageNode(FX_DWORD dwPageNo,
128 CPDF_PageNode* pPageNode,
129 IFX_DownloadHints* pHints);
130 FX_BOOL CheckArrayPageNode(FX_DWORD dwPageNo,
131 CPDF_PageNode* pPageNode,
132 IFX_DownloadHints* pHints);
133 FX_BOOL CheckPageCount(IFX_DownloadHints* pHints);
134 bool IsFirstCheck(int iPage);
135 void ResetFirstCheck(int iPage);
136 FX_BOOL IsDataAvail(FX_FILESIZE offset,
137 FX_DWORD size,
138 IFX_DownloadHints* pHints);
139
140 CPDF_Parser m_parser;
141 CPDF_SyntaxParser m_syntaxParser;
142 CPDF_Object* m_pRoot;
143 FX_DWORD m_dwRootObjNum;
144 FX_DWORD m_dwInfoObjNum;
145 CPDF_Object* m_pLinearized;
146 CPDF_Object* m_pTrailer;
147 FX_BOOL m_bDocAvail;
148 FX_FILESIZE m_dwHeaderOffset;
149 FX_FILESIZE m_dwLastXRefOffset;
150 FX_FILESIZE m_dwXRefOffset;
151 FX_FILESIZE m_dwTrailerOffset;
152 FX_FILESIZE m_dwCurrentOffset;
153 PDF_DATAAVAIL_STATUS m_docStatus;
154 FX_FILESIZE m_dwFileLen;
155 CPDF_Document* m_pDocument;
156 std::set<FX_DWORD> m_ObjectSet;
157 CFX_ArrayTemplate<CPDF_Object*> m_objs_array;
158 FX_FILESIZE m_Pos;
159 FX_FILESIZE m_bufferOffset;
160 FX_DWORD m_bufferSize;
161 CFX_ByteString m_WordBuf;
162 uint8_t m_bufferData[512];
163 CFX_DWordArray m_XRefStreamList;
164 CFX_DWordArray m_PageObjList;
165 FX_DWORD m_PagesObjNum;
166 FX_BOOL m_bLinearized;
167 FX_DWORD m_dwFirstPageNo;
168 FX_BOOL m_bLinearedDataOK;
169 FX_BOOL m_bMainXRefLoadTried;
170 FX_BOOL m_bMainXRefLoadedOK;
171 FX_BOOL m_bPagesTreeLoad;
172 FX_BOOL m_bPagesLoad;
173 CPDF_Parser* m_pCurrentParser;
174 FX_FILESIZE m_dwCurrentXRefSteam;
175 FX_BOOL m_bAnnotsLoad;
176 FX_BOOL m_bHaveAcroForm;
177 FX_DWORD m_dwAcroFormObjNum;
178 FX_BOOL m_bAcroFormLoad;
179 CPDF_Object* m_pAcroForm;
180 CFX_ArrayTemplate<CPDF_Object*> m_arrayAcroforms;
181 CPDF_Dictionary* m_pPageDict;
182 CPDF_Object* m_pPageResource;
183 FX_BOOL m_bNeedDownLoadResource;
184 FX_BOOL m_bPageLoadedOK;
185 FX_BOOL m_bLinearizedFormParamLoad;
186 CFX_ArrayTemplate<CPDF_Object*> m_PagesArray;
187 FX_DWORD m_dwEncryptObjNum;
188 FX_FILESIZE m_dwPrevXRefOffset;
189 FX_BOOL m_bTotalLoadPageTree;
190 FX_BOOL m_bCurPageDictLoadOK;
191 CPDF_PageNode m_pageNodes;
192 std::set<FX_DWORD> m_pageMapCheckState;
193 std::set<FX_DWORD> m_pagesLoadState;
194 std::unique_ptr<CPDF_HintTables> m_pHintTables;
195 FX_BOOL m_bSupportHintTable;
196 };
197
198 IPDF_DataAvail::IPDF_DataAvail(IFX_FileAvail* pFileAvail,
199 IFX_FileRead* pFileRead) 16 IFX_FileRead* pFileRead)
200 : m_pFileAvail(pFileAvail), m_pFileRead(pFileRead) {} 17 : m_pFileAvail(pFileAvail), m_pFileRead(pFileRead) {}
201 18
202 // static 19 // static
203 IPDF_DataAvail* IPDF_DataAvail::Create(IFX_FileAvail* pFileAvail, 20 IPDF_DataAvail* IPDF_DataAvail::Create(IPDF_DataAvail::FileAvail* pFileAvail,
204 IFX_FileRead* pFileRead) { 21 IFX_FileRead* pFileRead) {
205 return new CPDF_DataAvail(pFileAvail, pFileRead, TRUE); 22 return new CPDF_DataAvail(pFileAvail, pFileRead, TRUE);
206 } 23 }
207 24
208 // static 25 // static
209 int CPDF_DataAvail::s_CurrentDataAvailRecursionDepth = 0; 26 int CPDF_DataAvail::s_CurrentDataAvailRecursionDepth = 0;
210 27
211 CPDF_DataAvail::CPDF_DataAvail(IFX_FileAvail* pFileAvail, 28 CPDF_DataAvail::CPDF_DataAvail(IPDF_DataAvail::FileAvail* pFileAvail,
212 IFX_FileRead* pFileRead, 29 IFX_FileRead* pFileRead,
213 FX_BOOL bSupportHintTable) 30 FX_BOOL bSupportHintTable)
214 : IPDF_DataAvail(pFileAvail, pFileRead) { 31 : IPDF_DataAvail(pFileAvail, pFileRead) {
215 m_Pos = 0; 32 m_Pos = 0;
216 m_dwFileLen = 0; 33 m_dwFileLen = 0;
217 if (m_pFileRead) { 34 if (m_pFileRead) {
218 m_dwFileLen = (FX_DWORD)m_pFileRead->GetSize(); 35 m_dwFileLen = (FX_DWORD)m_pFileRead->GetSize();
219 } 36 }
220 m_dwCurrentOffset = 0; 37 m_dwCurrentOffset = 0;
221 m_dwXRefOffset = 0; 38 m_dwXRefOffset = 0;
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
297 if (it == pParser->m_SortedOffset.end() || 114 if (it == pParser->m_SortedOffset.end() ||
298 ++it == pParser->m_SortedOffset.end()) { 115 ++it == pParser->m_SortedOffset.end()) {
299 return 0; 116 return 0;
300 } 117 }
301 return *it - offset; 118 return *it - offset;
302 } 119 }
303 120
304 FX_BOOL CPDF_DataAvail::IsObjectsAvail( 121 FX_BOOL CPDF_DataAvail::IsObjectsAvail(
305 CFX_ArrayTemplate<CPDF_Object*>& obj_array, 122 CFX_ArrayTemplate<CPDF_Object*>& obj_array,
306 FX_BOOL bParsePage, 123 FX_BOOL bParsePage,
307 IFX_DownloadHints* pHints, 124 IPDF_DataAvail::DownloadHints* pHints,
308 CFX_ArrayTemplate<CPDF_Object*>& ret_array) { 125 CFX_ArrayTemplate<CPDF_Object*>& ret_array) {
309 if (!obj_array.GetSize()) 126 if (!obj_array.GetSize())
310 return TRUE; 127 return TRUE;
311 128
312 FX_DWORD count = 0; 129 FX_DWORD count = 0;
313 CFX_ArrayTemplate<CPDF_Object*> new_obj_array; 130 CFX_ArrayTemplate<CPDF_Object*> new_obj_array;
314 int32_t i = 0; 131 int32_t i = 0;
315 for (i = 0; i < obj_array.GetSize(); i++) { 132 for (i = 0; i < obj_array.GetSize(); i++) {
316 CPDF_Object* pObj = obj_array[i]; 133 CPDF_Object* pObj = obj_array[i];
317 if (!pObj) 134 if (!pObj)
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
375 } 192 }
376 return FALSE; 193 return FALSE;
377 } 194 }
378 195
379 obj_array.RemoveAll(); 196 obj_array.RemoveAll();
380 obj_array.Append(new_obj_array); 197 obj_array.Append(new_obj_array);
381 return IsObjectsAvail(obj_array, FALSE, pHints, ret_array); 198 return IsObjectsAvail(obj_array, FALSE, pHints, ret_array);
382 } 199 }
383 200
384 IPDF_DataAvail::DocAvailStatus CPDF_DataAvail::IsDocAvail( 201 IPDF_DataAvail::DocAvailStatus CPDF_DataAvail::IsDocAvail(
385 IFX_DownloadHints* pHints) { 202 IPDF_DataAvail::DownloadHints* pHints) {
386 if (!m_dwFileLen && m_pFileRead) { 203 if (!m_dwFileLen && m_pFileRead) {
387 m_dwFileLen = (FX_DWORD)m_pFileRead->GetSize(); 204 m_dwFileLen = (FX_DWORD)m_pFileRead->GetSize();
388 if (!m_dwFileLen) 205 if (!m_dwFileLen)
389 return DataError; 206 return DataError;
390 } 207 }
391 208
392 while (!m_bDocAvail) { 209 while (!m_bDocAvail) {
393 if (!CheckDocStatus(pHints)) 210 if (!CheckDocStatus(pHints))
394 return DataNotAvailable; 211 return DataNotAvailable;
395 } 212 }
396 213
397 return DataAvailable; 214 return DataAvailable;
398 } 215 }
399 216
400 FX_BOOL CPDF_DataAvail::CheckAcroFormSubObject(IFX_DownloadHints* pHints) { 217 FX_BOOL CPDF_DataAvail::CheckAcroFormSubObject(
218 IPDF_DataAvail::DownloadHints* pHints) {
401 if (!m_objs_array.GetSize()) { 219 if (!m_objs_array.GetSize()) {
402 m_objs_array.RemoveAll(); 220 m_objs_array.RemoveAll();
403 m_ObjectSet.clear(); 221 m_ObjectSet.clear();
404 CFX_ArrayTemplate<CPDF_Object*> obj_array; 222 CFX_ArrayTemplate<CPDF_Object*> obj_array;
405 obj_array.Append(m_arrayAcroforms); 223 obj_array.Append(m_arrayAcroforms);
406 FX_BOOL bRet = IsObjectsAvail(obj_array, FALSE, pHints, m_objs_array); 224 FX_BOOL bRet = IsObjectsAvail(obj_array, FALSE, pHints, m_objs_array);
407 if (bRet) 225 if (bRet)
408 m_objs_array.RemoveAll(); 226 m_objs_array.RemoveAll();
409 return bRet; 227 return bRet;
410 } 228 }
411 229
412 CFX_ArrayTemplate<CPDF_Object*> new_objs_array; 230 CFX_ArrayTemplate<CPDF_Object*> new_objs_array;
413 FX_BOOL bRet = IsObjectsAvail(m_objs_array, FALSE, pHints, new_objs_array); 231 FX_BOOL bRet = IsObjectsAvail(m_objs_array, FALSE, pHints, new_objs_array);
414 if (bRet) { 232 if (bRet) {
415 int32_t iSize = m_arrayAcroforms.GetSize(); 233 int32_t iSize = m_arrayAcroforms.GetSize();
416 for (int32_t i = 0; i < iSize; ++i) { 234 for (int32_t i = 0; i < iSize; ++i) {
417 m_arrayAcroforms.GetAt(i)->Release(); 235 m_arrayAcroforms.GetAt(i)->Release();
418 } 236 }
419 m_arrayAcroforms.RemoveAll(); 237 m_arrayAcroforms.RemoveAll();
420 } else { 238 } else {
421 m_objs_array.RemoveAll(); 239 m_objs_array.RemoveAll();
422 m_objs_array.Append(new_objs_array); 240 m_objs_array.Append(new_objs_array);
423 } 241 }
424 return bRet; 242 return bRet;
425 } 243 }
426 244
427 FX_BOOL CPDF_DataAvail::CheckAcroForm(IFX_DownloadHints* pHints) { 245 FX_BOOL CPDF_DataAvail::CheckAcroForm(IPDF_DataAvail::DownloadHints* pHints) {
428 FX_BOOL bExist = FALSE; 246 FX_BOOL bExist = FALSE;
429 m_pAcroForm = GetObject(m_dwAcroFormObjNum, pHints, &bExist); 247 m_pAcroForm = GetObject(m_dwAcroFormObjNum, pHints, &bExist);
430 if (!bExist) { 248 if (!bExist) {
431 m_docStatus = PDF_DATAAVAIL_PAGETREE; 249 m_docStatus = PDF_DATAAVAIL_PAGETREE;
432 return TRUE; 250 return TRUE;
433 } 251 }
434 252
435 if (!m_pAcroForm) { 253 if (!m_pAcroForm) {
436 if (m_docStatus == PDF_DATAAVAIL_ERROR) { 254 if (m_docStatus == PDF_DATAAVAIL_ERROR) {
437 m_docStatus = PDF_DATAAVAIL_LOADALLFILE; 255 m_docStatus = PDF_DATAAVAIL_LOADALLFILE;
438 return TRUE; 256 return TRUE;
439 } 257 }
440 return FALSE; 258 return FALSE;
441 } 259 }
442 260
443 m_arrayAcroforms.Add(m_pAcroForm); 261 m_arrayAcroforms.Add(m_pAcroForm);
444 m_docStatus = PDF_DATAAVAIL_PAGETREE; 262 m_docStatus = PDF_DATAAVAIL_PAGETREE;
445 return TRUE; 263 return TRUE;
446 } 264 }
447 265
448 FX_BOOL CPDF_DataAvail::CheckDocStatus(IFX_DownloadHints* pHints) { 266 FX_BOOL CPDF_DataAvail::CheckDocStatus(IPDF_DataAvail::DownloadHints* pHints) {
449 switch (m_docStatus) { 267 switch (m_docStatus) {
450 case PDF_DATAAVAIL_HEADER: 268 case PDF_DATAAVAIL_HEADER:
451 return CheckHeader(pHints); 269 return CheckHeader(pHints);
452 case PDF_DATAAVAIL_FIRSTPAGE: 270 case PDF_DATAAVAIL_FIRSTPAGE:
453 case PDF_DATAAVAIL_FIRSTPAGE_PREPARE: 271 case PDF_DATAAVAIL_FIRSTPAGE_PREPARE:
454 return CheckFirstPage(pHints); 272 return CheckFirstPage(pHints);
455 case PDF_DATAAVAIL_HINTTABLE: 273 case PDF_DATAAVAIL_HINTTABLE:
456 return CheckHintTables(pHints); 274 return CheckHintTables(pHints);
457 case PDF_DATAAVAIL_END: 275 case PDF_DATAAVAIL_END:
458 return CheckEnd(pHints); 276 return CheckEnd(pHints);
(...skipping 29 matching lines...) Expand all
488 case PDF_DATAAVAIL_ERROR: 306 case PDF_DATAAVAIL_ERROR:
489 return LoadAllFile(pHints); 307 return LoadAllFile(pHints);
490 case PDF_DATAAVAIL_PAGE_LATERLOAD: 308 case PDF_DATAAVAIL_PAGE_LATERLOAD:
491 m_docStatus = PDF_DATAAVAIL_PAGE; 309 m_docStatus = PDF_DATAAVAIL_PAGE;
492 default: 310 default:
493 m_bDocAvail = TRUE; 311 m_bDocAvail = TRUE;
494 return TRUE; 312 return TRUE;
495 } 313 }
496 } 314 }
497 315
498 FX_BOOL CPDF_DataAvail::CheckPageStatus(IFX_DownloadHints* pHints) { 316 FX_BOOL CPDF_DataAvail::CheckPageStatus(IPDF_DataAvail::DownloadHints* pHints) {
499 switch (m_docStatus) { 317 switch (m_docStatus) {
500 case PDF_DATAAVAIL_PAGETREE: 318 case PDF_DATAAVAIL_PAGETREE:
501 return CheckPages(pHints); 319 return CheckPages(pHints);
502 case PDF_DATAAVAIL_PAGE: 320 case PDF_DATAAVAIL_PAGE:
503 return CheckPage(pHints); 321 return CheckPage(pHints);
504 case PDF_DATAAVAIL_ERROR: 322 case PDF_DATAAVAIL_ERROR:
505 return LoadAllFile(pHints); 323 return LoadAllFile(pHints);
506 default: 324 default:
507 m_bPagesTreeLoad = TRUE; 325 m_bPagesTreeLoad = TRUE;
508 m_bPagesLoad = TRUE; 326 m_bPagesLoad = TRUE;
509 return TRUE; 327 return TRUE;
510 } 328 }
511 } 329 }
512 330
513 FX_BOOL CPDF_DataAvail::LoadAllFile(IFX_DownloadHints* pHints) { 331 FX_BOOL CPDF_DataAvail::LoadAllFile(IPDF_DataAvail::DownloadHints* pHints) {
514 if (m_pFileAvail->IsDataAvail(0, (FX_DWORD)m_dwFileLen)) { 332 if (m_pFileAvail->IsDataAvail(0, (FX_DWORD)m_dwFileLen)) {
515 m_docStatus = PDF_DATAAVAIL_DONE; 333 m_docStatus = PDF_DATAAVAIL_DONE;
516 return TRUE; 334 return TRUE;
517 } 335 }
518 336
519 pHints->AddSegment(0, (FX_DWORD)m_dwFileLen); 337 pHints->AddSegment(0, (FX_DWORD)m_dwFileLen);
520 return FALSE; 338 return FALSE;
521 } 339 }
522 340
523 FX_BOOL CPDF_DataAvail::LoadAllXref(IFX_DownloadHints* pHints) { 341 FX_BOOL CPDF_DataAvail::LoadAllXref(IPDF_DataAvail::DownloadHints* pHints) {
524 m_parser.m_pSyntax->InitParser(m_pFileRead, (FX_DWORD)m_dwHeaderOffset); 342 m_parser.m_pSyntax->InitParser(m_pFileRead, (FX_DWORD)m_dwHeaderOffset);
525 m_parser.m_bOwnFileRead = false; 343 m_parser.m_bOwnFileRead = false;
526 if (!m_parser.LoadAllCrossRefV4(m_dwLastXRefOffset) && 344 if (!m_parser.LoadAllCrossRefV4(m_dwLastXRefOffset) &&
527 !m_parser.LoadAllCrossRefV5(m_dwLastXRefOffset)) { 345 !m_parser.LoadAllCrossRefV5(m_dwLastXRefOffset)) {
528 m_docStatus = PDF_DATAAVAIL_LOADALLFILE; 346 m_docStatus = PDF_DATAAVAIL_LOADALLFILE;
529 return FALSE; 347 return FALSE;
530 } 348 }
531 349
532 m_dwRootObjNum = m_parser.GetRootObjNum(); 350 m_dwRootObjNum = m_parser.GetRootObjNum();
533 m_dwInfoObjNum = m_parser.GetInfoObjNum(); 351 m_dwInfoObjNum = m_parser.GetInfoObjNum();
534 m_pCurrentParser = &m_parser; 352 m_pCurrentParser = &m_parser;
535 m_docStatus = PDF_DATAAVAIL_ROOT; 353 m_docStatus = PDF_DATAAVAIL_ROOT;
536 return TRUE; 354 return TRUE;
537 } 355 }
538 356
539 CPDF_Object* CPDF_DataAvail::GetObject(FX_DWORD objnum, 357 CPDF_Object* CPDF_DataAvail::GetObject(FX_DWORD objnum,
540 IFX_DownloadHints* pHints, 358 IPDF_DataAvail::DownloadHints* pHints,
541 FX_BOOL* pExistInFile) { 359 FX_BOOL* pExistInFile) {
542 CPDF_Object* pRet = nullptr; 360 CPDF_Object* pRet = nullptr;
543 FX_DWORD size = 0; 361 FX_DWORD size = 0;
544 FX_FILESIZE offset = 0; 362 FX_FILESIZE offset = 0;
545 CPDF_Parser* pParser = nullptr; 363 CPDF_Parser* pParser = nullptr;
546 364
547 if (pExistInFile) 365 if (pExistInFile)
548 *pExistInFile = TRUE; 366 *pExistInFile = TRUE;
549 367
550 if (m_pDocument) { 368 if (m_pDocument) {
(...skipping 10 matching lines...) Expand all
561 379
562 if (pParser) 380 if (pParser)
563 pRet = pParser->ParseIndirectObject(nullptr, objnum); 381 pRet = pParser->ParseIndirectObject(nullptr, objnum);
564 382
565 if (!pRet && pExistInFile) 383 if (!pRet && pExistInFile)
566 *pExistInFile = FALSE; 384 *pExistInFile = FALSE;
567 385
568 return pRet; 386 return pRet;
569 } 387 }
570 388
571 FX_BOOL CPDF_DataAvail::CheckInfo(IFX_DownloadHints* pHints) { 389 FX_BOOL CPDF_DataAvail::CheckInfo(IPDF_DataAvail::DownloadHints* pHints) {
572 FX_BOOL bExist = FALSE; 390 FX_BOOL bExist = FALSE;
573 CPDF_Object* pInfo = GetObject(m_dwInfoObjNum, pHints, &bExist); 391 CPDF_Object* pInfo = GetObject(m_dwInfoObjNum, pHints, &bExist);
574 if (!bExist) { 392 if (!bExist) {
575 m_docStatus = 393 m_docStatus =
576 (m_bHaveAcroForm ? PDF_DATAAVAIL_ACROFORM : PDF_DATAAVAIL_PAGETREE); 394 (m_bHaveAcroForm ? PDF_DATAAVAIL_ACROFORM : PDF_DATAAVAIL_PAGETREE);
577 return TRUE; 395 return TRUE;
578 } 396 }
579 397
580 if (!pInfo) { 398 if (!pInfo) {
581 if (m_docStatus == PDF_DATAAVAIL_ERROR) { 399 if (m_docStatus == PDF_DATAAVAIL_ERROR) {
582 m_docStatus = PDF_DATAAVAIL_LOADALLFILE; 400 m_docStatus = PDF_DATAAVAIL_LOADALLFILE;
583 return TRUE; 401 return TRUE;
584 } 402 }
585 403
586 if (m_Pos == m_dwFileLen) 404 if (m_Pos == m_dwFileLen)
587 m_docStatus = PDF_DATAAVAIL_ERROR; 405 m_docStatus = PDF_DATAAVAIL_ERROR;
588 return FALSE; 406 return FALSE;
589 } 407 }
590 408
591 if (pInfo) 409 if (pInfo)
592 pInfo->Release(); 410 pInfo->Release();
593 411
594 m_docStatus = 412 m_docStatus =
595 (m_bHaveAcroForm ? PDF_DATAAVAIL_ACROFORM : PDF_DATAAVAIL_PAGETREE); 413 (m_bHaveAcroForm ? PDF_DATAAVAIL_ACROFORM : PDF_DATAAVAIL_PAGETREE);
596 414
597 return TRUE; 415 return TRUE;
598 } 416 }
599 417
600 FX_BOOL CPDF_DataAvail::CheckRoot(IFX_DownloadHints* pHints) { 418 FX_BOOL CPDF_DataAvail::CheckRoot(IPDF_DataAvail::DownloadHints* pHints) {
601 FX_BOOL bExist = FALSE; 419 FX_BOOL bExist = FALSE;
602 m_pRoot = GetObject(m_dwRootObjNum, pHints, &bExist); 420 m_pRoot = GetObject(m_dwRootObjNum, pHints, &bExist);
603 if (!bExist) { 421 if (!bExist) {
604 m_docStatus = PDF_DATAAVAIL_LOADALLFILE; 422 m_docStatus = PDF_DATAAVAIL_LOADALLFILE;
605 return TRUE; 423 return TRUE;
606 } 424 }
607 425
608 if (!m_pRoot) { 426 if (!m_pRoot) {
609 if (m_docStatus == PDF_DATAAVAIL_ERROR) { 427 if (m_docStatus == PDF_DATAAVAIL_ERROR) {
610 m_docStatus = PDF_DATAAVAIL_LOADALLFILE; 428 m_docStatus = PDF_DATAAVAIL_LOADALLFILE;
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
658 } 476 }
659 477
660 bool CPDF_DataAvail::IsFirstCheck(int iPage) { 478 bool CPDF_DataAvail::IsFirstCheck(int iPage) {
661 return m_pageMapCheckState.insert(iPage).second; 479 return m_pageMapCheckState.insert(iPage).second;
662 } 480 }
663 481
664 void CPDF_DataAvail::ResetFirstCheck(int iPage) { 482 void CPDF_DataAvail::ResetFirstCheck(int iPage) {
665 m_pageMapCheckState.erase(iPage); 483 m_pageMapCheckState.erase(iPage);
666 } 484 }
667 485
668 FX_BOOL CPDF_DataAvail::CheckPage(IFX_DownloadHints* pHints) { 486 FX_BOOL CPDF_DataAvail::CheckPage(IPDF_DataAvail::DownloadHints* pHints) {
669 FX_DWORD iPageObjs = m_PageObjList.GetSize(); 487 FX_DWORD iPageObjs = m_PageObjList.GetSize();
670 CFX_DWordArray UnavailObjList; 488 CFX_DWordArray UnavailObjList;
671 for (FX_DWORD i = 0; i < iPageObjs; ++i) { 489 for (FX_DWORD i = 0; i < iPageObjs; ++i) {
672 FX_DWORD dwPageObjNum = m_PageObjList.GetAt(i); 490 FX_DWORD dwPageObjNum = m_PageObjList.GetAt(i);
673 FX_BOOL bExist = FALSE; 491 FX_BOOL bExist = FALSE;
674 CPDF_Object* pObj = GetObject(dwPageObjNum, pHints, &bExist); 492 CPDF_Object* pObj = GetObject(dwPageObjNum, pHints, &bExist);
675 if (!pObj) { 493 if (!pObj) {
676 if (bExist) 494 if (bExist)
677 UnavailObjList.Add(dwPageObjNum); 495 UnavailObjList.Add(dwPageObjNum);
678 continue; 496 continue;
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
756 m_PageObjList.Add(pRef->GetRefObjNum()); 574 m_PageObjList.Add(pRef->GetRefObjNum());
757 } 575 }
758 } break; 576 } break;
759 default: 577 default:
760 m_docStatus = PDF_DATAAVAIL_ERROR; 578 m_docStatus = PDF_DATAAVAIL_ERROR;
761 return FALSE; 579 return FALSE;
762 } 580 }
763 return TRUE; 581 return TRUE;
764 } 582 }
765 583
766 FX_BOOL CPDF_DataAvail::CheckPages(IFX_DownloadHints* pHints) { 584 FX_BOOL CPDF_DataAvail::CheckPages(IPDF_DataAvail::DownloadHints* pHints) {
767 FX_BOOL bExist = FALSE; 585 FX_BOOL bExist = FALSE;
768 CPDF_Object* pPages = GetObject(m_PagesObjNum, pHints, &bExist); 586 CPDF_Object* pPages = GetObject(m_PagesObjNum, pHints, &bExist);
769 if (!bExist) { 587 if (!bExist) {
770 m_docStatus = PDF_DATAAVAIL_LOADALLFILE; 588 m_docStatus = PDF_DATAAVAIL_LOADALLFILE;
771 return TRUE; 589 return TRUE;
772 } 590 }
773 591
774 if (!pPages) { 592 if (!pPages) {
775 if (m_docStatus == PDF_DATAAVAIL_ERROR) { 593 if (m_docStatus == PDF_DATAAVAIL_ERROR) {
776 m_docStatus = PDF_DATAAVAIL_LOADALLFILE; 594 m_docStatus = PDF_DATAAVAIL_LOADALLFILE;
777 return TRUE; 595 return TRUE;
778 } 596 }
779 return FALSE; 597 return FALSE;
780 } 598 }
781 599
782 if (!GetPageKids(m_pCurrentParser, pPages)) { 600 if (!GetPageKids(m_pCurrentParser, pPages)) {
783 pPages->Release(); 601 pPages->Release();
784 m_docStatus = PDF_DATAAVAIL_ERROR; 602 m_docStatus = PDF_DATAAVAIL_ERROR;
785 return FALSE; 603 return FALSE;
786 } 604 }
787 605
788 pPages->Release(); 606 pPages->Release();
789 m_docStatus = PDF_DATAAVAIL_PAGE; 607 m_docStatus = PDF_DATAAVAIL_PAGE;
790 return TRUE; 608 return TRUE;
791 } 609 }
792 610
793 FX_BOOL CPDF_DataAvail::CheckHeader(IFX_DownloadHints* pHints) { 611 FX_BOOL CPDF_DataAvail::CheckHeader(IPDF_DataAvail::DownloadHints* pHints) {
794 FX_DWORD req_size = 1024; 612 FX_DWORD req_size = 1024;
795 if ((FX_FILESIZE)req_size > m_dwFileLen) 613 if ((FX_FILESIZE)req_size > m_dwFileLen)
796 req_size = (FX_DWORD)m_dwFileLen; 614 req_size = (FX_DWORD)m_dwFileLen;
797 615
798 if (m_pFileAvail->IsDataAvail(0, req_size)) { 616 if (m_pFileAvail->IsDataAvail(0, req_size)) {
799 uint8_t buffer[1024]; 617 uint8_t buffer[1024];
800 m_pFileRead->ReadBlock(buffer, 0, req_size); 618 m_pFileRead->ReadBlock(buffer, 0, req_size);
801 619
802 if (IsLinearizedFile(buffer, req_size)) { 620 if (IsLinearizedFile(buffer, req_size)) {
803 m_docStatus = PDF_DATAAVAIL_FIRSTPAGE; 621 m_docStatus = PDF_DATAAVAIL_FIRSTPAGE;
804 } else { 622 } else {
805 if (m_docStatus == PDF_DATAAVAIL_ERROR) 623 if (m_docStatus == PDF_DATAAVAIL_ERROR)
806 return FALSE; 624 return FALSE;
807 m_docStatus = PDF_DATAAVAIL_END; 625 m_docStatus = PDF_DATAAVAIL_END;
808 } 626 }
809 return TRUE; 627 return TRUE;
810 } 628 }
811 629
812 pHints->AddSegment(0, req_size); 630 pHints->AddSegment(0, req_size);
813 return FALSE; 631 return FALSE;
814 } 632 }
815 633
816 FX_BOOL CPDF_DataAvail::CheckFirstPage(IFX_DownloadHints* pHints) { 634 FX_BOOL CPDF_DataAvail::CheckFirstPage(IPDF_DataAvail::DownloadHints* pHints) {
817 CPDF_Dictionary* pDict = m_pLinearized->GetDict(); 635 CPDF_Dictionary* pDict = m_pLinearized->GetDict();
818 CPDF_Object* pEndOffSet = pDict ? pDict->GetElement("E") : NULL; 636 CPDF_Object* pEndOffSet = pDict ? pDict->GetElement("E") : NULL;
819 if (!pEndOffSet) { 637 if (!pEndOffSet) {
820 m_docStatus = PDF_DATAAVAIL_ERROR; 638 m_docStatus = PDF_DATAAVAIL_ERROR;
821 return FALSE; 639 return FALSE;
822 } 640 }
823 641
824 CPDF_Object* pXRefOffset = pDict ? pDict->GetElement("T") : NULL; 642 CPDF_Object* pXRefOffset = pDict ? pDict->GetElement("T") : NULL;
825 if (!pXRefOffset) { 643 if (!pXRefOffset) {
826 m_docStatus = PDF_DATAAVAIL_ERROR; 644 m_docStatus = PDF_DATAAVAIL_ERROR;
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
876 return FALSE; 694 return FALSE;
877 } 695 }
878 696
879 m_docStatus = 697 m_docStatus =
880 m_bSupportHintTable ? PDF_DATAAVAIL_HINTTABLE : PDF_DATAAVAIL_DONE; 698 m_bSupportHintTable ? PDF_DATAAVAIL_HINTTABLE : PDF_DATAAVAIL_DONE;
881 return TRUE; 699 return TRUE;
882 } 700 }
883 701
884 FX_BOOL CPDF_DataAvail::IsDataAvail(FX_FILESIZE offset, 702 FX_BOOL CPDF_DataAvail::IsDataAvail(FX_FILESIZE offset,
885 FX_DWORD size, 703 FX_DWORD size,
886 IFX_DownloadHints* pHints) { 704 IPDF_DataAvail::DownloadHints* pHints) {
887 if (offset > m_dwFileLen) 705 if (offset > m_dwFileLen)
888 return TRUE; 706 return TRUE;
889 707
890 FX_SAFE_DWORD safeSize = pdfium::base::checked_cast<FX_DWORD>(offset); 708 FX_SAFE_DWORD safeSize = pdfium::base::checked_cast<FX_DWORD>(offset);
891 safeSize += size; 709 safeSize += size;
892 safeSize += 512; 710 safeSize += 512;
893 if (!safeSize.IsValid() || safeSize.ValueOrDie() > m_dwFileLen) 711 if (!safeSize.IsValid() || safeSize.ValueOrDie() > m_dwFileLen)
894 size = m_dwFileLen - offset; 712 size = m_dwFileLen - offset;
895 else 713 else
896 size += 512; 714 size += 512;
897 715
898 if (!m_pFileAvail->IsDataAvail(offset, size)) { 716 if (!m_pFileAvail->IsDataAvail(offset, size)) {
899 pHints->AddSegment(offset, size); 717 pHints->AddSegment(offset, size);
900 return FALSE; 718 return FALSE;
901 } 719 }
902 return TRUE; 720 return TRUE;
903 } 721 }
904 722
905 FX_BOOL CPDF_DataAvail::CheckHintTables(IFX_DownloadHints* pHints) { 723 FX_BOOL CPDF_DataAvail::CheckHintTables(IPDF_DataAvail::DownloadHints* pHints) {
906 CPDF_Dictionary* pDict = m_pLinearized->GetDict(); 724 CPDF_Dictionary* pDict = m_pLinearized->GetDict();
907 if (!pDict) { 725 if (!pDict) {
908 m_docStatus = PDF_DATAAVAIL_ERROR; 726 m_docStatus = PDF_DATAAVAIL_ERROR;
909 return FALSE; 727 return FALSE;
910 } 728 }
911 729
912 if (!pDict->KeyExist("H") || !pDict->KeyExist("O") || !pDict->KeyExist("N")) { 730 if (!pDict->KeyExist("H") || !pDict->KeyExist("O") || !pDict->KeyExist("N")) {
913 m_docStatus = PDF_DATAAVAIL_ERROR; 731 m_docStatus = PDF_DATAAVAIL_ERROR;
914 return FALSE; 732 return FALSE;
915 } 733 }
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after
1043 m_bLinearized = TRUE; 861 m_bLinearized = TRUE;
1044 862
1045 if (CPDF_Number* pNo = ToNumber(pDict->GetElement("P"))) 863 if (CPDF_Number* pNo = ToNumber(pDict->GetElement("P")))
1046 m_dwFirstPageNo = pNo->GetInteger(); 864 m_dwFirstPageNo = pNo->GetInteger();
1047 865
1048 return TRUE; 866 return TRUE;
1049 } 867 }
1050 return FALSE; 868 return FALSE;
1051 } 869 }
1052 870
1053 FX_BOOL CPDF_DataAvail::CheckEnd(IFX_DownloadHints* pHints) { 871 FX_BOOL CPDF_DataAvail::CheckEnd(IPDF_DataAvail::DownloadHints* pHints) {
1054 FX_DWORD req_pos = (FX_DWORD)(m_dwFileLen > 1024 ? m_dwFileLen - 1024 : 0); 872 FX_DWORD req_pos = (FX_DWORD)(m_dwFileLen > 1024 ? m_dwFileLen - 1024 : 0);
1055 FX_DWORD dwSize = (FX_DWORD)(m_dwFileLen - req_pos); 873 FX_DWORD dwSize = (FX_DWORD)(m_dwFileLen - req_pos);
1056 874
1057 if (m_pFileAvail->IsDataAvail(req_pos, dwSize)) { 875 if (m_pFileAvail->IsDataAvail(req_pos, dwSize)) {
1058 uint8_t buffer[1024]; 876 uint8_t buffer[1024];
1059 m_pFileRead->ReadBlock(buffer, req_pos, dwSize); 877 m_pFileRead->ReadBlock(buffer, req_pos, dwSize);
1060 878
1061 ScopedFileStream file(FX_CreateMemoryStream(buffer, (size_t)dwSize, FALSE)); 879 ScopedFileStream file(FX_CreateMemoryStream(buffer, (size_t)dwSize, FALSE));
1062 m_syntaxParser.InitParser(file.get(), 0); 880 m_syntaxParser.InitParser(file.get(), 0);
1063 m_syntaxParser.RestorePos(dwSize - 1); 881 m_syntaxParser.RestorePos(dwSize - 1);
(...skipping 21 matching lines...) Expand all
1085 } 903 }
1086 904
1087 m_docStatus = PDF_DATAAVAIL_LOADALLFILE; 905 m_docStatus = PDF_DATAAVAIL_LOADALLFILE;
1088 return TRUE; 906 return TRUE;
1089 } 907 }
1090 908
1091 pHints->AddSegment(req_pos, dwSize); 909 pHints->AddSegment(req_pos, dwSize);
1092 return FALSE; 910 return FALSE;
1093 } 911 }
1094 912
1095 int32_t CPDF_DataAvail::CheckCrossRefStream(IFX_DownloadHints* pHints, 913 int32_t CPDF_DataAvail::CheckCrossRefStream(
1096 FX_FILESIZE& xref_offset) { 914 IPDF_DataAvail::DownloadHints* pHints,
915 FX_FILESIZE& xref_offset) {
1097 xref_offset = 0; 916 xref_offset = 0;
1098 FX_DWORD req_size = 917 FX_DWORD req_size =
1099 (FX_DWORD)(m_Pos + 512 > m_dwFileLen ? m_dwFileLen - m_Pos : 512); 918 (FX_DWORD)(m_Pos + 512 > m_dwFileLen ? m_dwFileLen - m_Pos : 512);
1100 919
1101 if (m_pFileAvail->IsDataAvail(m_Pos, req_size)) { 920 if (m_pFileAvail->IsDataAvail(m_Pos, req_size)) {
1102 int32_t iSize = (int32_t)(m_Pos + req_size - m_dwCurrentXRefSteam); 921 int32_t iSize = (int32_t)(m_Pos + req_size - m_dwCurrentXRefSteam);
1103 CFX_BinaryBuf buf(iSize); 922 CFX_BinaryBuf buf(iSize);
1104 uint8_t* pBuf = buf.GetBuffer(); 923 uint8_t* pBuf = buf.GetBuffer();
1105 924
1106 m_pFileRead->ReadBlock(pBuf, m_dwCurrentXRefSteam, iSize); 925 m_pFileRead->ReadBlock(pBuf, m_dwCurrentXRefSteam, iSize);
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after
1241 return FALSE; 1060 return FALSE;
1242 1061
1243 m_bufferOffset = read_pos; 1062 m_bufferOffset = read_pos;
1244 m_bufferSize = read_size; 1063 m_bufferSize = read_size;
1245 } 1064 }
1246 ch = m_bufferData[pos - m_bufferOffset]; 1065 ch = m_bufferData[pos - m_bufferOffset];
1247 m_Pos++; 1066 m_Pos++;
1248 return TRUE; 1067 return TRUE;
1249 } 1068 }
1250 1069
1251 FX_BOOL CPDF_DataAvail::CheckCrossRefItem(IFX_DownloadHints* pHints) { 1070 FX_BOOL CPDF_DataAvail::CheckCrossRefItem(
1071 IPDF_DataAvail::DownloadHints* pHints) {
1252 int32_t iSize = 0; 1072 int32_t iSize = 0;
1253 CFX_ByteString token; 1073 CFX_ByteString token;
1254 while (1) { 1074 while (1) {
1255 if (!GetNextToken(token)) { 1075 if (!GetNextToken(token)) {
1256 iSize = (int32_t)(m_Pos + 512 > m_dwFileLen ? m_dwFileLen - m_Pos : 512); 1076 iSize = (int32_t)(m_Pos + 512 > m_dwFileLen ? m_dwFileLen - m_Pos : 512);
1257 pHints->AddSegment(m_Pos, iSize); 1077 pHints->AddSegment(m_Pos, iSize);
1258 return FALSE; 1078 return FALSE;
1259 } 1079 }
1260 1080
1261 if (token == "trailer") { 1081 if (token == "trailer") {
1262 m_dwTrailerOffset = m_Pos; 1082 m_dwTrailerOffset = m_Pos;
1263 m_docStatus = PDF_DATAAVAIL_TRAILER; 1083 m_docStatus = PDF_DATAAVAIL_TRAILER;
1264 return TRUE; 1084 return TRUE;
1265 } 1085 }
1266 } 1086 }
1267 } 1087 }
1268 1088
1269 FX_BOOL CPDF_DataAvail::CheckAllCrossRefStream(IFX_DownloadHints* pHints) { 1089 FX_BOOL CPDF_DataAvail::CheckAllCrossRefStream(
1090 IPDF_DataAvail::DownloadHints* pHints) {
1270 FX_FILESIZE xref_offset = 0; 1091 FX_FILESIZE xref_offset = 0;
1271 1092
1272 int32_t nRet = CheckCrossRefStream(pHints, xref_offset); 1093 int32_t nRet = CheckCrossRefStream(pHints, xref_offset);
1273 if (nRet == 1) { 1094 if (nRet == 1) {
1274 if (!xref_offset) { 1095 if (!xref_offset) {
1275 m_docStatus = PDF_DATAAVAIL_LOADALLCROSSREF; 1096 m_docStatus = PDF_DATAAVAIL_LOADALLCROSSREF;
1276 } else { 1097 } else {
1277 m_dwCurrentXRefSteam = xref_offset; 1098 m_dwCurrentXRefSteam = xref_offset;
1278 m_Pos = xref_offset; 1099 m_Pos = xref_offset;
1279 } 1100 }
1280 return TRUE; 1101 return TRUE;
1281 } 1102 }
1282 1103
1283 if (nRet == -1) 1104 if (nRet == -1)
1284 m_docStatus = PDF_DATAAVAIL_ERROR; 1105 m_docStatus = PDF_DATAAVAIL_ERROR;
1285 return FALSE; 1106 return FALSE;
1286 } 1107 }
1287 1108
1288 FX_BOOL CPDF_DataAvail::CheckCrossRef(IFX_DownloadHints* pHints) { 1109 FX_BOOL CPDF_DataAvail::CheckCrossRef(IPDF_DataAvail::DownloadHints* pHints) {
1289 int32_t iSize = 0; 1110 int32_t iSize = 0;
1290 CFX_ByteString token; 1111 CFX_ByteString token;
1291 if (!GetNextToken(token)) { 1112 if (!GetNextToken(token)) {
1292 iSize = (int32_t)(m_Pos + 512 > m_dwFileLen ? m_dwFileLen - m_Pos : 512); 1113 iSize = (int32_t)(m_Pos + 512 > m_dwFileLen ? m_dwFileLen - m_Pos : 512);
1293 pHints->AddSegment(m_Pos, iSize); 1114 pHints->AddSegment(m_Pos, iSize);
1294 return FALSE; 1115 return FALSE;
1295 } 1116 }
1296 1117
1297 if (token == "xref") { 1118 if (token == "xref") {
1298 while (1) { 1119 while (1) {
(...skipping 11 matching lines...) Expand all
1310 return TRUE; 1131 return TRUE;
1311 } 1132 }
1312 } 1133 }
1313 } else { 1134 } else {
1314 m_docStatus = PDF_DATAAVAIL_LOADALLFILE; 1135 m_docStatus = PDF_DATAAVAIL_LOADALLFILE;
1315 return TRUE; 1136 return TRUE;
1316 } 1137 }
1317 return FALSE; 1138 return FALSE;
1318 } 1139 }
1319 1140
1320 FX_BOOL CPDF_DataAvail::CheckTrailerAppend(IFX_DownloadHints* pHints) { 1141 FX_BOOL CPDF_DataAvail::CheckTrailerAppend(
1142 IPDF_DataAvail::DownloadHints* pHints) {
1321 if (m_Pos < m_dwFileLen) { 1143 if (m_Pos < m_dwFileLen) {
1322 FX_FILESIZE dwAppendPos = m_Pos + m_syntaxParser.SavePos(); 1144 FX_FILESIZE dwAppendPos = m_Pos + m_syntaxParser.SavePos();
1323 int32_t iSize = (int32_t)( 1145 int32_t iSize = (int32_t)(
1324 dwAppendPos + 512 > m_dwFileLen ? m_dwFileLen - dwAppendPos : 512); 1146 dwAppendPos + 512 > m_dwFileLen ? m_dwFileLen - dwAppendPos : 512);
1325 1147
1326 if (!m_pFileAvail->IsDataAvail(dwAppendPos, iSize)) { 1148 if (!m_pFileAvail->IsDataAvail(dwAppendPos, iSize)) {
1327 pHints->AddSegment(dwAppendPos, iSize); 1149 pHints->AddSegment(dwAppendPos, iSize);
1328 return FALSE; 1150 return FALSE;
1329 } 1151 }
1330 } 1152 }
1331 1153
1332 if (m_dwPrevXRefOffset) { 1154 if (m_dwPrevXRefOffset) {
1333 SetStartOffset(m_dwPrevXRefOffset); 1155 SetStartOffset(m_dwPrevXRefOffset);
1334 m_docStatus = PDF_DATAAVAIL_CROSSREF; 1156 m_docStatus = PDF_DATAAVAIL_CROSSREF;
1335 } else { 1157 } else {
1336 m_docStatus = PDF_DATAAVAIL_LOADALLCROSSREF; 1158 m_docStatus = PDF_DATAAVAIL_LOADALLCROSSREF;
1337 } 1159 }
1338 return TRUE; 1160 return TRUE;
1339 } 1161 }
1340 1162
1341 FX_BOOL CPDF_DataAvail::CheckTrailer(IFX_DownloadHints* pHints) { 1163 FX_BOOL CPDF_DataAvail::CheckTrailer(IPDF_DataAvail::DownloadHints* pHints) {
1342 int32_t iTrailerSize = 1164 int32_t iTrailerSize =
1343 (int32_t)(m_Pos + 512 > m_dwFileLen ? m_dwFileLen - m_Pos : 512); 1165 (int32_t)(m_Pos + 512 > m_dwFileLen ? m_dwFileLen - m_Pos : 512);
1344 if (m_pFileAvail->IsDataAvail(m_Pos, iTrailerSize)) { 1166 if (m_pFileAvail->IsDataAvail(m_Pos, iTrailerSize)) {
1345 int32_t iSize = (int32_t)(m_Pos + iTrailerSize - m_dwTrailerOffset); 1167 int32_t iSize = (int32_t)(m_Pos + iTrailerSize - m_dwTrailerOffset);
1346 CFX_BinaryBuf buf(iSize); 1168 CFX_BinaryBuf buf(iSize);
1347 uint8_t* pBuf = buf.GetBuffer(); 1169 uint8_t* pBuf = buf.GetBuffer();
1348 if (!pBuf) { 1170 if (!pBuf) {
1349 m_docStatus = PDF_DATAAVAIL_ERROR; 1171 m_docStatus = PDF_DATAAVAIL_ERROR;
1350 return FALSE; 1172 return FALSE;
1351 } 1173 }
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
1391 return TRUE; 1213 return TRUE;
1392 } 1214 }
1393 m_dwPrevXRefOffset = 0; 1215 m_dwPrevXRefOffset = 0;
1394 m_docStatus = PDF_DATAAVAIL_TRAILER_APPEND; 1216 m_docStatus = PDF_DATAAVAIL_TRAILER_APPEND;
1395 return TRUE; 1217 return TRUE;
1396 } 1218 }
1397 pHints->AddSegment(m_Pos, iTrailerSize); 1219 pHints->AddSegment(m_Pos, iTrailerSize);
1398 return FALSE; 1220 return FALSE;
1399 } 1221 }
1400 1222
1401 FX_BOOL CPDF_DataAvail::CheckPage(int32_t iPage, IFX_DownloadHints* pHints) { 1223 FX_BOOL CPDF_DataAvail::CheckPage(int32_t iPage,
1224 IPDF_DataAvail::DownloadHints* pHints) {
1402 while (TRUE) { 1225 while (TRUE) {
1403 switch (m_docStatus) { 1226 switch (m_docStatus) {
1404 case PDF_DATAAVAIL_PAGETREE: 1227 case PDF_DATAAVAIL_PAGETREE:
1405 if (!LoadDocPages(pHints)) 1228 if (!LoadDocPages(pHints))
1406 return FALSE; 1229 return FALSE;
1407 break; 1230 break;
1408 case PDF_DATAAVAIL_PAGE: 1231 case PDF_DATAAVAIL_PAGE:
1409 if (!LoadDocPage(iPage, pHints)) 1232 if (!LoadDocPage(iPage, pHints))
1410 return FALSE; 1233 return FALSE;
1411 break; 1234 break;
1412 case PDF_DATAAVAIL_ERROR: 1235 case PDF_DATAAVAIL_ERROR:
1413 return LoadAllFile(pHints); 1236 return LoadAllFile(pHints);
1414 default: 1237 default:
1415 m_bPagesTreeLoad = TRUE; 1238 m_bPagesTreeLoad = TRUE;
1416 m_bPagesLoad = TRUE; 1239 m_bPagesLoad = TRUE;
1417 m_bCurPageDictLoadOK = TRUE; 1240 m_bCurPageDictLoadOK = TRUE;
1418 m_docStatus = PDF_DATAAVAIL_PAGE; 1241 m_docStatus = PDF_DATAAVAIL_PAGE;
1419 return TRUE; 1242 return TRUE;
1420 } 1243 }
1421 } 1244 }
1422 } 1245 }
1423 1246
1424 FX_BOOL CPDF_DataAvail::CheckArrayPageNode(FX_DWORD dwPageNo, 1247 FX_BOOL CPDF_DataAvail::CheckArrayPageNode(
1425 CPDF_PageNode* pPageNode, 1248 FX_DWORD dwPageNo,
1426 IFX_DownloadHints* pHints) { 1249 CPDF_DataAvail::PageNode* pPageNode,
1250 IPDF_DataAvail::DownloadHints* pHints) {
1427 FX_BOOL bExist = FALSE; 1251 FX_BOOL bExist = FALSE;
1428 CPDF_Object* pPages = GetObject(dwPageNo, pHints, &bExist); 1252 CPDF_Object* pPages = GetObject(dwPageNo, pHints, &bExist);
1429 if (!bExist) { 1253 if (!bExist) {
1430 m_docStatus = PDF_DATAAVAIL_ERROR; 1254 m_docStatus = PDF_DATAAVAIL_ERROR;
1431 return FALSE; 1255 return FALSE;
1432 } 1256 }
1433 1257
1434 if (!pPages) { 1258 if (!pPages) {
1435 if (m_docStatus == PDF_DATAAVAIL_ERROR) { 1259 if (m_docStatus == PDF_DATAAVAIL_ERROR) {
1436 m_docStatus = PDF_DATAAVAIL_ERROR; 1260 m_docStatus = PDF_DATAAVAIL_ERROR;
1437 return FALSE; 1261 return FALSE;
1438 } 1262 }
1439 return FALSE; 1263 return FALSE;
1440 } 1264 }
1441 1265
1442 CPDF_Array* pArray = pPages->AsArray(); 1266 CPDF_Array* pArray = pPages->AsArray();
1443 if (!pArray) { 1267 if (!pArray) {
1444 pPages->Release(); 1268 pPages->Release();
1445 m_docStatus = PDF_DATAAVAIL_ERROR; 1269 m_docStatus = PDF_DATAAVAIL_ERROR;
1446 return FALSE; 1270 return FALSE;
1447 } 1271 }
1448 1272
1449 pPageNode->m_type = PDF_PAGENODE_PAGES; 1273 pPageNode->m_type = PDF_PAGENODE_PAGES;
1450 for (FX_DWORD i = 0; i < pArray->GetCount(); ++i) { 1274 for (FX_DWORD i = 0; i < pArray->GetCount(); ++i) {
1451 CPDF_Reference* pKid = ToReference(pArray->GetElement(i)); 1275 CPDF_Reference* pKid = ToReference(pArray->GetElement(i));
1452 if (!pKid) 1276 if (!pKid)
1453 continue; 1277 continue;
1454 1278
1455 CPDF_PageNode* pNode = new CPDF_PageNode(); 1279 PageNode* pNode = new PageNode();
1456 pPageNode->m_childNode.Add(pNode); 1280 pPageNode->m_childNode.Add(pNode);
1457 pNode->m_dwPageNo = pKid->GetRefObjNum(); 1281 pNode->m_dwPageNo = pKid->GetRefObjNum();
1458 } 1282 }
1459 pPages->Release(); 1283 pPages->Release();
1460 return TRUE; 1284 return TRUE;
1461 } 1285 }
1462 1286
1463 FX_BOOL CPDF_DataAvail::CheckUnkownPageNode(FX_DWORD dwPageNo, 1287 FX_BOOL CPDF_DataAvail::CheckUnkownPageNode(
1464 CPDF_PageNode* pPageNode, 1288 FX_DWORD dwPageNo,
1465 IFX_DownloadHints* pHints) { 1289 CPDF_DataAvail::PageNode* pPageNode,
1290 IPDF_DataAvail::DownloadHints* pHints) {
1466 FX_BOOL bExist = FALSE; 1291 FX_BOOL bExist = FALSE;
1467 CPDF_Object* pPage = GetObject(dwPageNo, pHints, &bExist); 1292 CPDF_Object* pPage = GetObject(dwPageNo, pHints, &bExist);
1468 if (!bExist) { 1293 if (!bExist) {
1469 m_docStatus = PDF_DATAAVAIL_ERROR; 1294 m_docStatus = PDF_DATAAVAIL_ERROR;
1470 return FALSE; 1295 return FALSE;
1471 } 1296 }
1472 1297
1473 if (!pPage) { 1298 if (!pPage) {
1474 if (m_docStatus == PDF_DATAAVAIL_ERROR) 1299 if (m_docStatus == PDF_DATAAVAIL_ERROR)
1475 m_docStatus = PDF_DATAAVAIL_ERROR; 1300 m_docStatus = PDF_DATAAVAIL_ERROR;
(...skipping 20 matching lines...) Expand all
1496 pPageNode->m_type = PDF_PAGENODE_PAGES; 1321 pPageNode->m_type = PDF_PAGENODE_PAGES;
1497 CPDF_Object* pKids = pDict->GetElement("Kids"); 1322 CPDF_Object* pKids = pDict->GetElement("Kids");
1498 if (!pKids) { 1323 if (!pKids) {
1499 m_docStatus = PDF_DATAAVAIL_PAGE; 1324 m_docStatus = PDF_DATAAVAIL_PAGE;
1500 return TRUE; 1325 return TRUE;
1501 } 1326 }
1502 1327
1503 switch (pKids->GetType()) { 1328 switch (pKids->GetType()) {
1504 case CPDF_Object::REFERENCE: { 1329 case CPDF_Object::REFERENCE: {
1505 CPDF_Reference* pKid = pKids->AsReference(); 1330 CPDF_Reference* pKid = pKids->AsReference();
1506 CPDF_PageNode* pNode = new CPDF_PageNode(); 1331 PageNode* pNode = new PageNode();
1507 pPageNode->m_childNode.Add(pNode); 1332 pPageNode->m_childNode.Add(pNode);
1508 pNode->m_dwPageNo = pKid->GetRefObjNum(); 1333 pNode->m_dwPageNo = pKid->GetRefObjNum();
1509 } break; 1334 } break;
1510 case CPDF_Object::ARRAY: { 1335 case CPDF_Object::ARRAY: {
1511 CPDF_Array* pKidsArray = pKids->AsArray(); 1336 CPDF_Array* pKidsArray = pKids->AsArray();
1512 for (FX_DWORD i = 0; i < pKidsArray->GetCount(); ++i) { 1337 for (FX_DWORD i = 0; i < pKidsArray->GetCount(); ++i) {
1513 CPDF_Reference* pKid = ToReference(pKidsArray->GetElement(i)); 1338 CPDF_Reference* pKid = ToReference(pKidsArray->GetElement(i));
1514 if (!pKid) 1339 if (!pKid)
1515 continue; 1340 continue;
1516 1341
1517 CPDF_PageNode* pNode = new CPDF_PageNode(); 1342 PageNode* pNode = new PageNode();
1518 pPageNode->m_childNode.Add(pNode); 1343 pPageNode->m_childNode.Add(pNode);
1519 pNode->m_dwPageNo = pKid->GetRefObjNum(); 1344 pNode->m_dwPageNo = pKid->GetRefObjNum();
1520 } 1345 }
1521 } break; 1346 } break;
1522 default: 1347 default:
1523 break; 1348 break;
1524 } 1349 }
1525 } else if (type == "Page") { 1350 } else if (type == "Page") {
1526 pPageNode->m_type = PDF_PAGENODE_PAGE; 1351 pPageNode->m_type = PDF_PAGENODE_PAGE;
1527 } else { 1352 } else {
1528 pPage->Release(); 1353 pPage->Release();
1529 m_docStatus = PDF_DATAAVAIL_ERROR; 1354 m_docStatus = PDF_DATAAVAIL_ERROR;
1530 return FALSE; 1355 return FALSE;
1531 } 1356 }
1532 pPage->Release(); 1357 pPage->Release();
1533 return TRUE; 1358 return TRUE;
1534 } 1359 }
1535 1360
1536 FX_BOOL CPDF_DataAvail::CheckPageNode(CPDF_PageNode& pageNodes, 1361 FX_BOOL CPDF_DataAvail::CheckPageNode(CPDF_DataAvail::PageNode& pageNodes,
1537 int32_t iPage, 1362 int32_t iPage,
1538 int32_t& iCount, 1363 int32_t& iCount,
1539 IFX_DownloadHints* pHints, 1364 IPDF_DataAvail::DownloadHints* pHints,
1540 int level) { 1365 int level) {
1541 if (level >= kMaxPageRecursionDepth) 1366 if (level >= kMaxPageRecursionDepth)
1542 return FALSE; 1367 return FALSE;
1543 1368
1544 int32_t iSize = pageNodes.m_childNode.GetSize(); 1369 int32_t iSize = pageNodes.m_childNode.GetSize();
1545 if (iSize <= 0 || iPage >= iSize) { 1370 if (iSize <= 0 || iPage >= iSize) {
1546 m_docStatus = PDF_DATAAVAIL_ERROR; 1371 m_docStatus = PDF_DATAAVAIL_ERROR;
1547 return FALSE; 1372 return FALSE;
1548 } 1373 }
1549 1374
1550 for (int32_t i = 0; i < iSize; ++i) { 1375 for (int32_t i = 0; i < iSize; ++i) {
1551 CPDF_PageNode* pNode = pageNodes.m_childNode.GetAt(i); 1376 PageNode* pNode = pageNodes.m_childNode.GetAt(i);
1552 if (!pNode) 1377 if (!pNode)
1553 continue; 1378 continue;
1554 1379
1555 switch (pNode->m_type) { 1380 switch (pNode->m_type) {
1556 case PDF_PAGENODE_UNKNOWN: 1381 case PDF_PAGENODE_UNKNOWN:
1557 if (!CheckUnkownPageNode(pNode->m_dwPageNo, pNode, pHints)) { 1382 if (!CheckUnkownPageNode(pNode->m_dwPageNo, pNode, pHints)) {
1558 return FALSE; 1383 return FALSE;
1559 } 1384 }
1560 --i; 1385 --i;
1561 break; 1386 break;
(...skipping 14 matching lines...) Expand all
1576 } 1401 }
1577 1402
1578 if (iPage == iCount) { 1403 if (iPage == iCount) {
1579 m_docStatus = PDF_DATAAVAIL_DONE; 1404 m_docStatus = PDF_DATAAVAIL_DONE;
1580 return TRUE; 1405 return TRUE;
1581 } 1406 }
1582 } 1407 }
1583 return TRUE; 1408 return TRUE;
1584 } 1409 }
1585 1410
1586 FX_BOOL CPDF_DataAvail::LoadDocPage(int32_t iPage, IFX_DownloadHints* pHints) { 1411 FX_BOOL CPDF_DataAvail::LoadDocPage(int32_t iPage,
1412 IPDF_DataAvail::DownloadHints* pHints) {
1587 if (m_pDocument->GetPageCount() <= iPage || 1413 if (m_pDocument->GetPageCount() <= iPage ||
1588 m_pDocument->m_PageList.GetAt(iPage)) { 1414 m_pDocument->m_PageList.GetAt(iPage)) {
1589 m_docStatus = PDF_DATAAVAIL_DONE; 1415 m_docStatus = PDF_DATAAVAIL_DONE;
1590 return TRUE; 1416 return TRUE;
1591 } 1417 }
1592 1418
1593 if (m_pageNodes.m_type == PDF_PAGENODE_PAGE) { 1419 if (m_pageNodes.m_type == PDF_PAGENODE_PAGE) {
1594 if (iPage == 0) { 1420 if (iPage == 0) {
1595 m_docStatus = PDF_DATAAVAIL_DONE; 1421 m_docStatus = PDF_DATAAVAIL_DONE;
1596 return TRUE; 1422 return TRUE;
1597 } 1423 }
1598 m_docStatus = PDF_DATAAVAIL_ERROR; 1424 m_docStatus = PDF_DATAAVAIL_ERROR;
1599 return TRUE; 1425 return TRUE;
1600 } 1426 }
1601 int32_t iCount = -1; 1427 int32_t iCount = -1;
1602 return CheckPageNode(m_pageNodes, iPage, iCount, pHints, 0); 1428 return CheckPageNode(m_pageNodes, iPage, iCount, pHints, 0);
1603 } 1429 }
1604 1430
1605 FX_BOOL CPDF_DataAvail::CheckPageCount(IFX_DownloadHints* pHints) { 1431 FX_BOOL CPDF_DataAvail::CheckPageCount(IPDF_DataAvail::DownloadHints* pHints) {
1606 FX_BOOL bExist = FALSE; 1432 FX_BOOL bExist = FALSE;
1607 CPDF_Object* pPages = GetObject(m_PagesObjNum, pHints, &bExist); 1433 CPDF_Object* pPages = GetObject(m_PagesObjNum, pHints, &bExist);
1608 if (!bExist) { 1434 if (!bExist) {
1609 m_docStatus = PDF_DATAAVAIL_ERROR; 1435 m_docStatus = PDF_DATAAVAIL_ERROR;
1610 return FALSE; 1436 return FALSE;
1611 } 1437 }
1612 1438
1613 if (!pPages) 1439 if (!pPages)
1614 return FALSE; 1440 return FALSE;
1615 1441
(...skipping 12 matching lines...) Expand all
1628 int count = pPagesDict->GetIntegerBy("Count"); 1454 int count = pPagesDict->GetIntegerBy("Count");
1629 if (count > 0) { 1455 if (count > 0) {
1630 pPages->Release(); 1456 pPages->Release();
1631 return TRUE; 1457 return TRUE;
1632 } 1458 }
1633 1459
1634 pPages->Release(); 1460 pPages->Release();
1635 return FALSE; 1461 return FALSE;
1636 } 1462 }
1637 1463
1638 FX_BOOL CPDF_DataAvail::LoadDocPages(IFX_DownloadHints* pHints) { 1464 FX_BOOL CPDF_DataAvail::LoadDocPages(IPDF_DataAvail::DownloadHints* pHints) {
1639 if (!CheckUnkownPageNode(m_PagesObjNum, &m_pageNodes, pHints)) 1465 if (!CheckUnkownPageNode(m_PagesObjNum, &m_pageNodes, pHints))
1640 return FALSE; 1466 return FALSE;
1641 1467
1642 if (CheckPageCount(pHints)) { 1468 if (CheckPageCount(pHints)) {
1643 m_docStatus = PDF_DATAAVAIL_PAGE; 1469 m_docStatus = PDF_DATAAVAIL_PAGE;
1644 return TRUE; 1470 return TRUE;
1645 } 1471 }
1646 1472
1647 m_bTotalLoadPageTree = TRUE; 1473 m_bTotalLoadPageTree = TRUE;
1648 return FALSE; 1474 return FALSE;
1649 } 1475 }
1650 1476
1651 FX_BOOL CPDF_DataAvail::LoadPages(IFX_DownloadHints* pHints) { 1477 FX_BOOL CPDF_DataAvail::LoadPages(IPDF_DataAvail::DownloadHints* pHints) {
1652 while (!m_bPagesTreeLoad) { 1478 while (!m_bPagesTreeLoad) {
1653 if (!CheckPageStatus(pHints)) 1479 if (!CheckPageStatus(pHints))
1654 return FALSE; 1480 return FALSE;
1655 } 1481 }
1656 1482
1657 if (m_bPagesLoad) 1483 if (m_bPagesLoad)
1658 return TRUE; 1484 return TRUE;
1659 1485
1660 m_pDocument->LoadPages(); 1486 m_pDocument->LoadPages();
1661 return FALSE; 1487 return FALSE;
1662 } 1488 }
1663 1489
1664 IPDF_DataAvail::DocAvailStatus CPDF_DataAvail::CheckLinearizedData( 1490 IPDF_DataAvail::DocAvailStatus CPDF_DataAvail::CheckLinearizedData(
1665 IFX_DownloadHints* pHints) { 1491 IPDF_DataAvail::DownloadHints* pHints) {
1666 if (m_bLinearedDataOK) 1492 if (m_bLinearedDataOK)
1667 return DataAvailable; 1493 return DataAvailable;
1668 1494
1669 if (!m_bMainXRefLoadTried) { 1495 if (!m_bMainXRefLoadTried) {
1670 FX_SAFE_DWORD data_size = m_dwFileLen; 1496 FX_SAFE_DWORD data_size = m_dwFileLen;
1671 data_size -= m_dwLastXRefOffset; 1497 data_size -= m_dwLastXRefOffset;
1672 if (!data_size.IsValid()) 1498 if (!data_size.IsValid())
1673 return DataError; 1499 return DataError;
1674 1500
1675 if (!m_pFileAvail->IsDataAvail(m_dwLastXRefOffset, 1501 if (!m_pFileAvail->IsDataAvail(m_dwLastXRefOffset,
(...skipping 12 matching lines...) Expand all
1688 return DataNotAvailable; 1514 return DataNotAvailable;
1689 1515
1690 m_bMainXRefLoadedOK = TRUE; 1516 m_bMainXRefLoadedOK = TRUE;
1691 m_bLinearedDataOK = TRUE; 1517 m_bLinearedDataOK = TRUE;
1692 } 1518 }
1693 1519
1694 return m_bLinearedDataOK ? DataAvailable : DataNotAvailable; 1520 return m_bLinearedDataOK ? DataAvailable : DataNotAvailable;
1695 } 1521 }
1696 1522
1697 FX_BOOL CPDF_DataAvail::CheckPageAnnots(int32_t iPage, 1523 FX_BOOL CPDF_DataAvail::CheckPageAnnots(int32_t iPage,
1698 IFX_DownloadHints* pHints) { 1524 IPDF_DataAvail::DownloadHints* pHints) {
1699 if (!m_objs_array.GetSize()) { 1525 if (!m_objs_array.GetSize()) {
1700 m_objs_array.RemoveAll(); 1526 m_objs_array.RemoveAll();
1701 m_ObjectSet.clear(); 1527 m_ObjectSet.clear();
1702 1528
1703 CPDF_Dictionary* pPageDict = m_pDocument->GetPage(iPage); 1529 CPDF_Dictionary* pPageDict = m_pDocument->GetPage(iPage);
1704 if (!pPageDict) 1530 if (!pPageDict)
1705 return TRUE; 1531 return TRUE;
1706 1532
1707 CPDF_Object* pAnnots = pPageDict->GetElement("Annots"); 1533 CPDF_Object* pAnnots = pPageDict->GetElement("Annots");
1708 if (!pAnnots) 1534 if (!pAnnots)
(...skipping 13 matching lines...) Expand all
1722 FX_BOOL bRet = IsObjectsAvail(m_objs_array, FALSE, pHints, new_objs_array); 1548 FX_BOOL bRet = IsObjectsAvail(m_objs_array, FALSE, pHints, new_objs_array);
1723 m_objs_array.RemoveAll(); 1549 m_objs_array.RemoveAll();
1724 if (!bRet) 1550 if (!bRet)
1725 m_objs_array.Append(new_objs_array); 1551 m_objs_array.Append(new_objs_array);
1726 1552
1727 return bRet; 1553 return bRet;
1728 } 1554 }
1729 1555
1730 IPDF_DataAvail::DocAvailStatus CPDF_DataAvail::CheckLinearizedFirstPage( 1556 IPDF_DataAvail::DocAvailStatus CPDF_DataAvail::CheckLinearizedFirstPage(
1731 int32_t iPage, 1557 int32_t iPage,
1732 IFX_DownloadHints* pHints) { 1558 IPDF_DataAvail::DownloadHints* pHints) {
1733 if (!m_bAnnotsLoad) { 1559 if (!m_bAnnotsLoad) {
1734 if (!CheckPageAnnots(iPage, pHints)) 1560 if (!CheckPageAnnots(iPage, pHints))
1735 return DataNotAvailable; 1561 return DataNotAvailable;
1736 m_bAnnotsLoad = TRUE; 1562 m_bAnnotsLoad = TRUE;
1737 } 1563 }
1738 1564
1739 DocAvailStatus nRet = CheckLinearizedData(pHints); 1565 DocAvailStatus nRet = CheckLinearizedData(pHints);
1740 if (nRet == DataAvailable) 1566 if (nRet == DataAvailable)
1741 m_bPageLoadedOK = FALSE; 1567 m_bPageLoadedOK = FALSE;
1742 return nRet; 1568 return nRet;
(...skipping 16 matching lines...) Expand all
1759 if (pRet) { 1585 if (pRet) {
1760 m_pPageResource = pRet; 1586 m_pPageResource = pRet;
1761 return TRUE; 1587 return TRUE;
1762 } 1588 }
1763 1589
1764 return HaveResourceAncestor(pParentDict); 1590 return HaveResourceAncestor(pParentDict);
1765 } 1591 }
1766 1592
1767 IPDF_DataAvail::DocAvailStatus CPDF_DataAvail::IsPageAvail( 1593 IPDF_DataAvail::DocAvailStatus CPDF_DataAvail::IsPageAvail(
1768 int32_t iPage, 1594 int32_t iPage,
1769 IFX_DownloadHints* pHints) { 1595 IPDF_DataAvail::DownloadHints* pHints) {
1770 if (!m_pDocument) 1596 if (!m_pDocument)
1771 return DataError; 1597 return DataError;
1772 1598
1773 if (IsFirstCheck(iPage)) { 1599 if (IsFirstCheck(iPage)) {
1774 m_bCurPageDictLoadOK = FALSE; 1600 m_bCurPageDictLoadOK = FALSE;
1775 m_bPageLoadedOK = FALSE; 1601 m_bPageLoadedOK = FALSE;
1776 m_bAnnotsLoad = FALSE; 1602 m_bAnnotsLoad = FALSE;
1777 m_bNeedDownLoadResource = FALSE; 1603 m_bNeedDownLoadResource = FALSE;
1778 m_objs_array.RemoveAll(); 1604 m_objs_array.RemoveAll();
1779 m_ObjectSet.clear(); 1605 m_ObjectSet.clear();
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after
1885 1711
1886 m_bPageLoadedOK = FALSE; 1712 m_bPageLoadedOK = FALSE;
1887 m_bAnnotsLoad = FALSE; 1713 m_bAnnotsLoad = FALSE;
1888 m_bCurPageDictLoadOK = FALSE; 1714 m_bCurPageDictLoadOK = FALSE;
1889 1715
1890 ResetFirstCheck(iPage); 1716 ResetFirstCheck(iPage);
1891 m_pagesLoadState.insert(iPage); 1717 m_pagesLoadState.insert(iPage);
1892 return DataAvailable; 1718 return DataAvailable;
1893 } 1719 }
1894 1720
1895 FX_BOOL CPDF_DataAvail::CheckResources(IFX_DownloadHints* pHints) { 1721 FX_BOOL CPDF_DataAvail::CheckResources(IPDF_DataAvail::DownloadHints* pHints) {
1896 if (!m_objs_array.GetSize()) { 1722 if (!m_objs_array.GetSize()) {
1897 m_objs_array.RemoveAll(); 1723 m_objs_array.RemoveAll();
1898 CFX_ArrayTemplate<CPDF_Object*> obj_array; 1724 CFX_ArrayTemplate<CPDF_Object*> obj_array;
1899 obj_array.Add(m_pPageResource); 1725 obj_array.Add(m_pPageResource);
1900 1726
1901 FX_BOOL bRet = IsObjectsAvail(obj_array, TRUE, pHints, m_objs_array); 1727 FX_BOOL bRet = IsObjectsAvail(obj_array, TRUE, pHints, m_objs_array);
1902 if (bRet) 1728 if (bRet)
1903 m_objs_array.RemoveAll(); 1729 m_objs_array.RemoveAll();
1904 return bRet; 1730 return bRet;
1905 } 1731 }
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
1954 1780
1955 if (!m_pDocument->InsertIndirectObject(dwObjNum, pPageDict)) 1781 if (!m_pDocument->InsertIndirectObject(dwObjNum, pPageDict))
1956 return nullptr; 1782 return nullptr;
1957 return pPageDict->GetDict(); 1783 return pPageDict->GetDict();
1958 } 1784 }
1959 } 1785 }
1960 return m_pDocument->GetPage(index); 1786 return m_pDocument->GetPage(index);
1961 } 1787 }
1962 1788
1963 IPDF_DataAvail::DocFormStatus CPDF_DataAvail::IsFormAvail( 1789 IPDF_DataAvail::DocFormStatus CPDF_DataAvail::IsFormAvail(
1964 IFX_DownloadHints* pHints) { 1790 IPDF_DataAvail::DownloadHints* pHints) {
1965 if (!m_pDocument) 1791 if (!m_pDocument)
1966 return FormAvailable; 1792 return FormAvailable;
1967 1793
1968 if (!m_bLinearizedFormParamLoad) { 1794 if (!m_bLinearizedFormParamLoad) {
1969 CPDF_Dictionary* pRoot = m_pDocument->GetRoot(); 1795 CPDF_Dictionary* pRoot = m_pDocument->GetRoot();
1970 if (!pRoot) 1796 if (!pRoot)
1971 return FormAvailable; 1797 return FormAvailable;
1972 1798
1973 CPDF_Object* pAcroForm = pRoot->GetElement("AcroForm"); 1799 CPDF_Object* pAcroForm = pRoot->GetElement("AcroForm");
1974 if (!pAcroForm) 1800 if (!pAcroForm)
(...skipping 13 matching lines...) Expand all
1988 CFX_ArrayTemplate<CPDF_Object*> new_objs_array; 1814 CFX_ArrayTemplate<CPDF_Object*> new_objs_array;
1989 FX_BOOL bRet = IsObjectsAvail(m_objs_array, FALSE, pHints, new_objs_array); 1815 FX_BOOL bRet = IsObjectsAvail(m_objs_array, FALSE, pHints, new_objs_array);
1990 m_objs_array.RemoveAll(); 1816 m_objs_array.RemoveAll();
1991 if (!bRet) { 1817 if (!bRet) {
1992 m_objs_array.Append(new_objs_array); 1818 m_objs_array.Append(new_objs_array);
1993 return FormNotAvailable; 1819 return FormNotAvailable;
1994 } 1820 }
1995 return FormAvailable; 1821 return FormAvailable;
1996 } 1822 }
1997 1823
1998 CPDF_PageNode::CPDF_PageNode() : m_type(PDF_PAGENODE_UNKNOWN) {} 1824 CPDF_DataAvail::PageNode::PageNode() : m_type(PDF_PAGENODE_UNKNOWN) {}
1999 1825
2000 CPDF_PageNode::~CPDF_PageNode() { 1826 CPDF_DataAvail::PageNode::~PageNode() {
2001 for (int32_t i = 0; i < m_childNode.GetSize(); ++i) 1827 for (int32_t i = 0; i < m_childNode.GetSize(); ++i)
2002 delete m_childNode[i]; 1828 delete m_childNode[i];
2003 m_childNode.RemoveAll(); 1829 m_childNode.RemoveAll();
2004 } 1830 }
2005
2006 CPDF_HintTables::~CPDF_HintTables() {
2007 m_dwDeltaNObjsArray.RemoveAll();
2008 m_dwNSharedObjsArray.RemoveAll();
2009 m_dwSharedObjNumArray.RemoveAll();
2010 m_dwIdentifierArray.RemoveAll();
2011 }
2012
2013 FX_DWORD CPDF_HintTables::GetItemLength(
2014 int index,
2015 const std::vector<FX_FILESIZE>& szArray) {
2016 if (index < 0 || szArray.size() < 2 ||
2017 static_cast<size_t>(index) > szArray.size() - 2 ||
2018 szArray[index] > szArray[index + 1]) {
2019 return 0;
2020 }
2021 return szArray[index + 1] - szArray[index];
2022 }
2023
2024 FX_BOOL CPDF_HintTables::ReadPageHintTable(CFX_BitStream* hStream) {
2025 if (!hStream || hStream->IsEOF())
2026 return FALSE;
2027
2028 int nStreamOffset = ReadPrimaryHintStreamOffset();
2029 int nStreamLen = ReadPrimaryHintStreamLength();
2030 if (nStreamOffset < 0 || nStreamLen < 1)
2031 return FALSE;
2032
2033 const FX_DWORD kHeaderSize = 288;
2034 if (hStream->BitsRemaining() < kHeaderSize)
2035 return FALSE;
2036
2037 // Item 1: The least number of objects in a page.
2038 FX_DWORD dwObjLeastNum = hStream->GetBits(32);
2039
2040 // Item 2: The location of the first page's page object.
2041 FX_DWORD dwFirstObjLoc = hStream->GetBits(32);
2042 if (dwFirstObjLoc > nStreamOffset) {
2043 FX_SAFE_DWORD safeLoc = pdfium::base::checked_cast<FX_DWORD>(nStreamLen);
2044 safeLoc += dwFirstObjLoc;
2045 if (!safeLoc.IsValid())
2046 return FALSE;
2047 m_szFirstPageObjOffset =
2048 pdfium::base::checked_cast<FX_FILESIZE>(safeLoc.ValueOrDie());
2049 } else {
2050 m_szFirstPageObjOffset =
2051 pdfium::base::checked_cast<FX_FILESIZE>(dwFirstObjLoc);
2052 }
2053
2054 // Item 3: The number of bits needed to represent the difference
2055 // between the greatest and least number of objects in a page.
2056 FX_DWORD dwDeltaObjectsBits = hStream->GetBits(16);
2057
2058 // Item 4: The least length of a page in bytes.
2059 FX_DWORD dwPageLeastLen = hStream->GetBits(32);
2060
2061 // Item 5: The number of bits needed to represent the difference
2062 // between the greatest and least length of a page, in bytes.
2063 FX_DWORD dwDeltaPageLenBits = hStream->GetBits(16);
2064
2065 // Skip Item 6, 7, 8, 9 total 96 bits.
2066 hStream->SkipBits(96);
2067
2068 // Item 10: The number of bits needed to represent the greatest
2069 // number of shared object references.
2070 FX_DWORD dwSharedObjBits = hStream->GetBits(16);
2071
2072 // Item 11: The number of bits needed to represent the numerically
2073 // greatest shared object identifier used by the pages.
2074 FX_DWORD dwSharedIdBits = hStream->GetBits(16);
2075
2076 // Item 12: The number of bits needed to represent the numerator of
2077 // the fractional position for each shared object reference. For each
2078 // shared object referenced from a page, there is an indication of
2079 // where in the page's content stream the object is first referenced.
2080 FX_DWORD dwSharedNumeratorBits = hStream->GetBits(16);
2081
2082 // Item 13: Skip Item 13 which has 16 bits.
2083 hStream->SkipBits(16);
2084
2085 CPDF_Object* pPageNum = m_pLinearizedDict->GetElementValue("N");
2086 int nPages = pPageNum ? pPageNum->GetInteger() : 0;
2087 if (nPages < 1)
2088 return FALSE;
2089
2090 FX_SAFE_DWORD required_bits = dwDeltaObjectsBits;
2091 required_bits *= pdfium::base::checked_cast<FX_DWORD>(nPages);
2092 if (!CanReadFromBitStream(hStream, required_bits))
2093 return FALSE;
2094
2095 for (int i = 0; i < nPages; ++i) {
2096 FX_SAFE_DWORD safeDeltaObj = hStream->GetBits(dwDeltaObjectsBits);
2097 safeDeltaObj += dwObjLeastNum;
2098 if (!safeDeltaObj.IsValid())
2099 return FALSE;
2100 m_dwDeltaNObjsArray.Add(safeDeltaObj.ValueOrDie());
2101 }
2102 hStream->ByteAlign();
2103
2104 required_bits = dwDeltaPageLenBits;
2105 required_bits *= pdfium::base::checked_cast<FX_DWORD>(nPages);
2106 if (!CanReadFromBitStream(hStream, required_bits))
2107 return FALSE;
2108
2109 CFX_DWordArray dwPageLenArray;
2110 for (int i = 0; i < nPages; ++i) {
2111 FX_SAFE_DWORD safePageLen = hStream->GetBits(dwDeltaPageLenBits);
2112 safePageLen += dwPageLeastLen;
2113 if (!safePageLen.IsValid())
2114 return FALSE;
2115 dwPageLenArray.Add(safePageLen.ValueOrDie());
2116 }
2117
2118 CPDF_Object* pOffsetE = m_pLinearizedDict->GetElementValue("E");
2119 int nOffsetE = pOffsetE ? pOffsetE->GetInteger() : -1;
2120 if (nOffsetE < 0)
2121 return FALSE;
2122
2123 CPDF_Object* pFirstPageNum = m_pLinearizedDict->GetElementValue("P");
2124 int nFirstPageNum = pFirstPageNum ? pFirstPageNum->GetInteger() : 0;
2125 for (int i = 0; i < nPages; ++i) {
2126 if (i == nFirstPageNum) {
2127 m_szPageOffsetArray.push_back(m_szFirstPageObjOffset);
2128 } else if (i == nFirstPageNum + 1) {
2129 if (i == 1) {
2130 m_szPageOffsetArray.push_back(nOffsetE);
2131 } else {
2132 m_szPageOffsetArray.push_back(m_szPageOffsetArray[i - 2] +
2133 dwPageLenArray[i - 2]);
2134 }
2135 } else {
2136 if (i == 0) {
2137 m_szPageOffsetArray.push_back(nOffsetE);
2138 } else {
2139 m_szPageOffsetArray.push_back(m_szPageOffsetArray[i - 1] +
2140 dwPageLenArray[i - 1]);
2141 }
2142 }
2143 }
2144
2145 if (nPages > 0) {
2146 m_szPageOffsetArray.push_back(m_szPageOffsetArray[nPages - 1] +
2147 dwPageLenArray[nPages - 1]);
2148 }
2149 hStream->ByteAlign();
2150
2151 // Number of shared objects.
2152 required_bits = dwSharedObjBits;
2153 required_bits *= pdfium::base::checked_cast<FX_DWORD>(nPages);
2154 if (!CanReadFromBitStream(hStream, required_bits))
2155 return FALSE;
2156
2157 for (int i = 0; i < nPages; i++)
2158 m_dwNSharedObjsArray.Add(hStream->GetBits(dwSharedObjBits));
2159 hStream->ByteAlign();
2160
2161 // Array of identifiers, size = nshared_objects.
2162 for (int i = 0; i < nPages; i++) {
2163 required_bits = dwSharedIdBits;
2164 required_bits *= m_dwNSharedObjsArray[i];
2165 if (!CanReadFromBitStream(hStream, required_bits))
2166 return FALSE;
2167
2168 for (int j = 0; j < m_dwNSharedObjsArray[i]; j++)
2169 m_dwIdentifierArray.Add(hStream->GetBits(dwSharedIdBits));
2170 }
2171 hStream->ByteAlign();
2172
2173 for (int i = 0; i < nPages; i++) {
2174 FX_SAFE_DWORD safeSize = m_dwNSharedObjsArray[i];
2175 safeSize *= dwSharedNumeratorBits;
2176 if (!CanReadFromBitStream(hStream, safeSize))
2177 return FALSE;
2178
2179 hStream->SkipBits(safeSize.ValueOrDie());
2180 }
2181 hStream->ByteAlign();
2182
2183 FX_SAFE_DWORD safeTotalPageLen = pdfium::base::checked_cast<FX_DWORD>(nPages);
2184 safeTotalPageLen *= dwDeltaPageLenBits;
2185 if (!CanReadFromBitStream(hStream, safeTotalPageLen))
2186 return FALSE;
2187
2188 hStream->SkipBits(safeTotalPageLen.ValueOrDie());
2189 hStream->ByteAlign();
2190 return TRUE;
2191 }
2192
2193 FX_BOOL CPDF_HintTables::ReadSharedObjHintTable(CFX_BitStream* hStream,
2194 FX_DWORD offset) {
2195 if (!hStream || hStream->IsEOF())
2196 return FALSE;
2197
2198 int nStreamOffset = ReadPrimaryHintStreamOffset();
2199 int nStreamLen = ReadPrimaryHintStreamLength();
2200 if (nStreamOffset < 0 || nStreamLen < 1)
2201 return FALSE;
2202
2203 FX_SAFE_DWORD bit_offset = offset;
2204 bit_offset *= 8;
2205 if (!bit_offset.IsValid() || hStream->GetPos() > bit_offset.ValueOrDie())
2206 return FALSE;
2207 hStream->SkipBits(bit_offset.ValueOrDie() - hStream->GetPos());
2208
2209 const FX_DWORD kHeaderSize = 192;
2210 if (hStream->BitsRemaining() < kHeaderSize)
2211 return FALSE;
2212
2213 // Item 1: The object number of the first object in the shared objects
2214 // section.
2215 FX_DWORD dwFirstSharedObjNum = hStream->GetBits(32);
2216
2217 // Item 2: The location of the first object in the shared objects section.
2218 FX_DWORD dwFirstSharedObjLoc = hStream->GetBits(32);
2219 if (dwFirstSharedObjLoc > nStreamOffset)
2220 dwFirstSharedObjLoc += nStreamLen;
2221
2222 // Item 3: The number of shared object entries for the first page.
2223 m_nFirstPageSharedObjs = hStream->GetBits(32);
2224
2225 // Item 4: The number of shared object entries for the shared objects
2226 // section, including the number of shared object entries for the first page.
2227 FX_DWORD dwSharedObjTotal = hStream->GetBits(32);
2228
2229 // Item 5: The number of bits needed to represent the greatest number of
2230 // objects in a shared object group. Skipped.
2231 hStream->SkipBits(16);
2232
2233 // Item 6: The least length of a shared object group in bytes.
2234 FX_DWORD dwGroupLeastLen = hStream->GetBits(32);
2235
2236 // Item 7: The number of bits needed to represent the difference between the
2237 // greatest and least length of a shared object group, in bytes.
2238 FX_DWORD dwDeltaGroupLen = hStream->GetBits(16);
2239 CPDF_Object* pFirstPageObj = m_pLinearizedDict->GetElementValue("O");
2240 int nFirstPageObjNum = pFirstPageObj ? pFirstPageObj->GetInteger() : -1;
2241 if (nFirstPageObjNum < 0)
2242 return FALSE;
2243
2244 FX_DWORD dwPrevObjLen = 0;
2245 FX_DWORD dwCurObjLen = 0;
2246 FX_SAFE_DWORD required_bits = dwSharedObjTotal;
2247 required_bits *= dwDeltaGroupLen;
2248 if (!CanReadFromBitStream(hStream, required_bits))
2249 return FALSE;
2250
2251 for (int i = 0; i < dwSharedObjTotal; ++i) {
2252 dwPrevObjLen = dwCurObjLen;
2253 FX_SAFE_DWORD safeObjLen = hStream->GetBits(dwDeltaGroupLen);
2254 safeObjLen += dwGroupLeastLen;
2255 if (!safeObjLen.IsValid())
2256 return FALSE;
2257
2258 dwCurObjLen = safeObjLen.ValueOrDie();
2259 if (i < m_nFirstPageSharedObjs) {
2260 m_dwSharedObjNumArray.Add(nFirstPageObjNum + i);
2261 if (i == 0)
2262 m_szSharedObjOffsetArray.push_back(m_szFirstPageObjOffset);
2263 } else {
2264 FX_SAFE_DWORD safeObjNum = dwFirstSharedObjNum;
2265 safeObjNum += i - m_nFirstPageSharedObjs;
2266 if (!safeObjNum.IsValid())
2267 return FALSE;
2268
2269 m_dwSharedObjNumArray.Add(safeObjNum.ValueOrDie());
2270 if (i == m_nFirstPageSharedObjs) {
2271 m_szSharedObjOffsetArray.push_back(
2272 pdfium::base::checked_cast<int32_t>(dwFirstSharedObjLoc));
2273 }
2274 }
2275
2276 if (i != 0 && i != m_nFirstPageSharedObjs) {
2277 FX_SAFE_INT32 safeLoc = pdfium::base::checked_cast<int32_t>(dwPrevObjLen);
2278 safeLoc += m_szSharedObjOffsetArray[i - 1];
2279 if (!safeLoc.IsValid())
2280 return FALSE;
2281
2282 m_szSharedObjOffsetArray.push_back(safeLoc.ValueOrDie());
2283 }
2284 }
2285
2286 if (dwSharedObjTotal > 0) {
2287 FX_SAFE_INT32 safeLoc = pdfium::base::checked_cast<int32_t>(dwCurObjLen);
2288 safeLoc += m_szSharedObjOffsetArray[dwSharedObjTotal - 1];
2289 if (!safeLoc.IsValid())
2290 return FALSE;
2291
2292 m_szSharedObjOffsetArray.push_back(safeLoc.ValueOrDie());
2293 }
2294
2295 hStream->ByteAlign();
2296 if (hStream->BitsRemaining() < dwSharedObjTotal)
2297 return FALSE;
2298
2299 hStream->SkipBits(dwSharedObjTotal);
2300 hStream->ByteAlign();
2301 return TRUE;
2302 }
2303
2304 FX_BOOL CPDF_HintTables::GetPagePos(int index,
2305 FX_FILESIZE& szPageStartPos,
2306 FX_FILESIZE& szPageLength,
2307 FX_DWORD& dwObjNum) {
2308 if (!m_pLinearizedDict)
2309 return FALSE;
2310
2311 szPageStartPos = m_szPageOffsetArray[index];
2312 szPageLength = GetItemLength(index, m_szPageOffsetArray);
2313
2314 CPDF_Object* pFirstPageNum = m_pLinearizedDict->GetElementValue("P");
2315 int nFirstPageNum = pFirstPageNum ? pFirstPageNum->GetInteger() : 0;
2316
2317 CPDF_Object* pFirstPageObjNum = m_pLinearizedDict->GetElementValue("O");
2318 if (!pFirstPageObjNum)
2319 return FALSE;
2320
2321 int nFirstPageObjNum = pFirstPageObjNum->GetInteger();
2322 if (index == nFirstPageNum) {
2323 dwObjNum = nFirstPageObjNum;
2324 return TRUE;
2325 }
2326
2327 // The object number of remaining pages starts from 1.
2328 dwObjNum = 1;
2329 for (int i = 0; i < index; ++i) {
2330 if (i == nFirstPageNum)
2331 continue;
2332 dwObjNum += m_dwDeltaNObjsArray[i];
2333 }
2334 return TRUE;
2335 }
2336
2337 IPDF_DataAvail::DocAvailStatus CPDF_HintTables::CheckPage(
2338 int index,
2339 IFX_DownloadHints* pHints) {
2340 if (!m_pLinearizedDict || !pHints)
2341 return IPDF_DataAvail::DataError;
2342
2343 CPDF_Object* pFirstAvailPage = m_pLinearizedDict->GetElementValue("P");
2344 int nFirstAvailPage = pFirstAvailPage ? pFirstAvailPage->GetInteger() : 0;
2345 if (index == nFirstAvailPage)
2346 return IPDF_DataAvail::DataAvailable;
2347
2348 FX_DWORD dwLength = GetItemLength(index, m_szPageOffsetArray);
2349 // If two pages have the same offset, it should be treated as an error.
2350 if (!dwLength)
2351 return IPDF_DataAvail::DataError;
2352
2353 if (!m_pDataAvail->IsDataAvail(m_szPageOffsetArray[index], dwLength, pHints))
2354 return IPDF_DataAvail::DataNotAvailable;
2355
2356 // Download data of shared objects in the page.
2357 FX_DWORD offset = 0;
2358 for (int i = 0; i < index; ++i)
2359 offset += m_dwNSharedObjsArray[i];
2360
2361 CPDF_Object* pFirstPageObj = m_pLinearizedDict->GetElementValue("O");
2362 int nFirstPageObjNum = pFirstPageObj ? pFirstPageObj->GetInteger() : -1;
2363 if (nFirstPageObjNum < 0)
2364 return IPDF_DataAvail::DataError;
2365
2366 FX_DWORD dwIndex = 0;
2367 FX_DWORD dwObjNum = 0;
2368 for (int j = 0; j < m_dwNSharedObjsArray[index]; ++j) {
2369 dwIndex = m_dwIdentifierArray[offset + j];
2370 if (dwIndex >= m_dwSharedObjNumArray.GetSize())
2371 return IPDF_DataAvail::DataNotAvailable;
2372
2373 dwObjNum = m_dwSharedObjNumArray[dwIndex];
2374 if (dwObjNum >= nFirstPageObjNum &&
2375 dwObjNum < nFirstPageObjNum + m_nFirstPageSharedObjs) {
2376 continue;
2377 }
2378
2379 dwLength = GetItemLength(dwIndex, m_szSharedObjOffsetArray);
2380 // If two objects have the same offset, it should be treated as an error.
2381 if (!dwLength)
2382 return IPDF_DataAvail::DataError;
2383
2384 if (!m_pDataAvail->IsDataAvail(m_szSharedObjOffsetArray[dwIndex], dwLength,
2385 pHints)) {
2386 return IPDF_DataAvail::DataNotAvailable;
2387 }
2388 }
2389 return IPDF_DataAvail::DataAvailable;
2390 }
2391
2392 FX_BOOL CPDF_HintTables::LoadHintStream(CPDF_Stream* pHintStream) {
2393 if (!pHintStream || !m_pLinearizedDict)
2394 return FALSE;
2395
2396 CPDF_Dictionary* pDict = pHintStream->GetDict();
2397 CPDF_Object* pOffset = pDict ? pDict->GetElement("S") : nullptr;
2398 if (!pOffset || !pOffset->IsNumber())
2399 return FALSE;
2400
2401 int shared_hint_table_offset = pOffset->GetInteger();
2402 CPDF_StreamAcc acc;
2403 acc.LoadAllData(pHintStream);
2404
2405 FX_DWORD size = acc.GetSize();
2406 // The header section of page offset hint table is 36 bytes.
2407 // The header section of shared object hint table is 24 bytes.
2408 // Hint table has at least 60 bytes.
2409 const FX_DWORD MIN_STREAM_LEN = 60;
2410 if (size < MIN_STREAM_LEN || shared_hint_table_offset <= 0 ||
2411 size < shared_hint_table_offset) {
2412 return FALSE;
2413 }
2414
2415 CFX_BitStream bs;
2416 bs.Init(acc.GetData(), size);
2417 return ReadPageHintTable(&bs) &&
2418 ReadSharedObjHintTable(&bs, pdfium::base::checked_cast<FX_DWORD>(
2419 shared_hint_table_offset));
2420 }
2421
2422 int CPDF_HintTables::ReadPrimaryHintStreamOffset() const {
2423 if (!m_pLinearizedDict)
2424 return -1;
2425
2426 CPDF_Array* pRange = m_pLinearizedDict->GetArrayBy("H");
2427 if (!pRange)
2428 return -1;
2429
2430 CPDF_Object* pStreamOffset = pRange->GetElementValue(0);
2431 if (!pStreamOffset)
2432 return -1;
2433
2434 return pStreamOffset->GetInteger();
2435 }
2436
2437 int CPDF_HintTables::ReadPrimaryHintStreamLength() const {
2438 if (!m_pLinearizedDict)
2439 return -1;
2440
2441 CPDF_Array* pRange = m_pLinearizedDict->GetArrayBy("H");
2442 if (!pRange)
2443 return -1;
2444
2445 CPDF_Object* pStreamLen = pRange->GetElementValue(1);
2446 if (!pStreamLen)
2447 return -1;
2448
2449 return pStreamLen->GetInteger();
2450 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698