| OLD | NEW |
| 1 // Copyright 2014 PDFium Authors. All rights reserved. | 1 // Copyright 2014 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 <utility> | 7 #include <utility> |
| 8 #include <vector> | 8 #include <vector> |
| 9 | 9 |
| 10 #include "../../../include/fpdfapi/fpdf_module.h" | 10 #include "../../../include/fpdfapi/fpdf_module.h" |
| 11 #include "../../../include/fpdfapi/fpdf_page.h" | 11 #include "../../../include/fpdfapi/fpdf_page.h" |
| 12 #include "../../../include/fpdfapi/fpdf_parser.h" | 12 #include "../../../include/fpdfapi/fpdf_parser.h" |
| 13 #include "../../../include/fxcrt/fx_safe_types.h" | 13 #include "../../../include/fxcrt/fx_safe_types.h" |
| 14 #include "../fpdf_page/pageint.h" | 14 #include "../fpdf_page/pageint.h" |
| 15 | 15 |
| 16 FX_BOOL IsSignatureDict(const CPDF_Dictionary* pDict) | 16 FX_BOOL IsSignatureDict(const CPDF_Dictionary* pDict) |
| 17 { | 17 { |
| 18 CPDF_Object* pType = pDict->GetElementValue(FX_BSTRC("Type")); | 18 CPDF_Object* pType = pDict->GetElementValue(FX_BSTRC("Type")); |
| 19 if (!pType) { | 19 if (!pType) { |
| 20 pType = pDict->GetElementValue(FX_BSTRC("FT")); | 20 pType = pDict->GetElementValue(FX_BSTRC("FT")); |
| 21 if (!pType) { | 21 if (!pType) { |
| 22 return FALSE; | 22 return FALSE; |
| 23 } | 23 } |
| 24 } | 24 } |
| 25 if (pType->GetString() == FX_BSTRC("Sig")) { | 25 if (pType->GetString() == FX_BSTRC("Sig")) { |
| 26 return TRUE; | 26 return TRUE; |
| 27 } | 27 } |
| 28 return FALSE; | 28 return FALSE; |
| 29 } | 29 } |
| 30 static FX_INT32 _CompareDWord(const void* p1, const void* p2) | 30 static int32_t _CompareDWord(const void* p1, const void* p2) |
| 31 { | 31 { |
| 32 return (*(FX_DWORD*)p1) - (*(FX_DWORD*)p2); | 32 return (*(FX_DWORD*)p1) - (*(FX_DWORD*)p2); |
| 33 } | 33 } |
| 34 static int _CompareFileSize(const void* p1, const void* p2) | 34 static int _CompareFileSize(const void* p1, const void* p2) |
| 35 { | 35 { |
| 36 FX_FILESIZE ret = (*(FX_FILESIZE*)p1) - (*(FX_FILESIZE*)p2); | 36 FX_FILESIZE ret = (*(FX_FILESIZE*)p1) - (*(FX_FILESIZE*)p2); |
| 37 if (ret > 0) { | 37 if (ret > 0) { |
| 38 return 1; | 38 return 1; |
| 39 } | 39 } |
| 40 if (ret < 0) { | 40 if (ret < 0) { |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 91 FX_LPVOID objnum; | 91 FX_LPVOID objnum; |
| 92 CPDF_StreamAcc* pStream; | 92 CPDF_StreamAcc* pStream; |
| 93 m_ObjectStreamMap.GetNextAssoc(pos, objnum, (void*&)pStream); | 93 m_ObjectStreamMap.GetNextAssoc(pos, objnum, (void*&)pStream); |
| 94 delete pStream; | 94 delete pStream; |
| 95 } | 95 } |
| 96 m_ObjectStreamMap.RemoveAll(); | 96 m_ObjectStreamMap.RemoveAll(); |
| 97 m_SortedOffset.RemoveAll(); | 97 m_SortedOffset.RemoveAll(); |
| 98 m_CrossRef.RemoveAll(); | 98 m_CrossRef.RemoveAll(); |
| 99 m_V5Type.RemoveAll(); | 99 m_V5Type.RemoveAll(); |
| 100 m_ObjVersion.RemoveAll(); | 100 m_ObjVersion.RemoveAll(); |
| 101 FX_INT32 iLen = m_Trailers.GetSize(); | 101 int32_t iLen = m_Trailers.GetSize(); |
| 102 for (FX_INT32 i = 0; i < iLen; ++i) { | 102 for (int32_t i = 0; i < iLen; ++i) { |
| 103 if (CPDF_Dictionary* trailer = m_Trailers.GetAt(i)) | 103 if (CPDF_Dictionary* trailer = m_Trailers.GetAt(i)) |
| 104 trailer->Release(); | 104 trailer->Release(); |
| 105 } | 105 } |
| 106 m_Trailers.RemoveAll(); | 106 m_Trailers.RemoveAll(); |
| 107 if (m_pLinearized) { | 107 if (m_pLinearized) { |
| 108 m_pLinearized->Release(); | 108 m_pLinearized->Release(); |
| 109 m_pLinearized = NULL; | 109 m_pLinearized = NULL; |
| 110 } | 110 } |
| 111 } | 111 } |
| 112 static FX_INT32 GetHeaderOffset(IFX_FileRead* pFile) | 112 static int32_t GetHeaderOffset(IFX_FileRead* pFile) |
| 113 { | 113 { |
| 114 FX_DWORD tag = FXDWORD_FROM_LSBFIRST(0x46445025); | 114 FX_DWORD tag = FXDWORD_FROM_LSBFIRST(0x46445025); |
| 115 FX_BYTE buf[4]; | 115 uint8_t buf[4]; |
| 116 FX_INT32 offset = 0; | 116 int32_t offset = 0; |
| 117 while (1) { | 117 while (1) { |
| 118 if (!pFile->ReadBlock(buf, offset, 4)) { | 118 if (!pFile->ReadBlock(buf, offset, 4)) { |
| 119 return -1; | 119 return -1; |
| 120 } | 120 } |
| 121 if (*(FX_DWORD*)buf == tag) { | 121 if (*(FX_DWORD*)buf == tag) { |
| 122 return offset; | 122 return offset; |
| 123 } | 123 } |
| 124 offset ++; | 124 offset ++; |
| 125 if (offset > 1024) { | 125 if (offset > 1024) { |
| 126 return -1; | 126 return -1; |
| (...skipping 18 matching lines...) Expand all Loading... |
| 145 return StartParse(pFileAccess, bReParse); | 145 return StartParse(pFileAccess, bReParse); |
| 146 } | 146 } |
| 147 CPDF_SecurityHandler* FPDF_CreateStandardSecurityHandler(); | 147 CPDF_SecurityHandler* FPDF_CreateStandardSecurityHandler(); |
| 148 CPDF_SecurityHandler* FPDF_CreatePubKeyHandler(void*); | 148 CPDF_SecurityHandler* FPDF_CreatePubKeyHandler(void*); |
| 149 FX_DWORD CPDF_Parser::StartParse(IFX_FileRead* pFileAccess, FX_BOOL bReParse, FX
_BOOL bOwnFileRead) | 149 FX_DWORD CPDF_Parser::StartParse(IFX_FileRead* pFileAccess, FX_BOOL bReParse, FX
_BOOL bOwnFileRead) |
| 150 { | 150 { |
| 151 CloseParser(bReParse); | 151 CloseParser(bReParse); |
| 152 m_bXRefStream = FALSE; | 152 m_bXRefStream = FALSE; |
| 153 m_LastXRefOffset = 0; | 153 m_LastXRefOffset = 0; |
| 154 m_bOwnFileRead = bOwnFileRead; | 154 m_bOwnFileRead = bOwnFileRead; |
| 155 FX_INT32 offset = GetHeaderOffset(pFileAccess); | 155 int32_t offset = GetHeaderOffset(pFileAccess); |
| 156 if (offset == -1) { | 156 if (offset == -1) { |
| 157 if (bOwnFileRead && pFileAccess) { | 157 if (bOwnFileRead && pFileAccess) { |
| 158 pFileAccess->Release(); | 158 pFileAccess->Release(); |
| 159 } | 159 } |
| 160 return PDFPARSE_ERROR_FORMAT; | 160 return PDFPARSE_ERROR_FORMAT; |
| 161 } | 161 } |
| 162 m_Syntax.InitParser(pFileAccess, offset); | 162 m_Syntax.InitParser(pFileAccess, offset); |
| 163 FX_BYTE ch; | 163 uint8_t ch; |
| 164 if (!m_Syntax.GetCharAt(5, ch)) { | 164 if (!m_Syntax.GetCharAt(5, ch)) { |
| 165 return PDFPARSE_ERROR_FORMAT; | 165 return PDFPARSE_ERROR_FORMAT; |
| 166 } | 166 } |
| 167 if (ch >= '0' && ch <= '9') { | 167 if (ch >= '0' && ch <= '9') { |
| 168 m_FileVersion = (ch - '0') * 10; | 168 m_FileVersion = (ch - '0') * 10; |
| 169 } | 169 } |
| 170 if (!m_Syntax.GetCharAt(7, ch)) { | 170 if (!m_Syntax.GetCharAt(7, ch)) { |
| 171 return PDFPARSE_ERROR_FORMAT; | 171 return PDFPARSE_ERROR_FORMAT; |
| 172 } | 172 } |
| 173 if (ch >= '0' && ch <= '9') { | 173 if (ch >= '0' && ch <= '9') { |
| (...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 324 } | 324 } |
| 325 FX_FILESIZE CPDF_Parser::GetObjectOffset(FX_DWORD objnum) | 325 FX_FILESIZE CPDF_Parser::GetObjectOffset(FX_DWORD objnum) |
| 326 { | 326 { |
| 327 if (objnum >= (FX_DWORD)m_CrossRef.GetSize()) { | 327 if (objnum >= (FX_DWORD)m_CrossRef.GetSize()) { |
| 328 return 0; | 328 return 0; |
| 329 } | 329 } |
| 330 if (m_V5Type[objnum] == 1) { | 330 if (m_V5Type[objnum] == 1) { |
| 331 return m_CrossRef[objnum]; | 331 return m_CrossRef[objnum]; |
| 332 } | 332 } |
| 333 if (m_V5Type[objnum] == 2) { | 333 if (m_V5Type[objnum] == 2) { |
| 334 return m_CrossRef[(FX_INT32)m_CrossRef[objnum]]; | 334 return m_CrossRef[(int32_t)m_CrossRef[objnum]]; |
| 335 } | 335 } |
| 336 return 0; | 336 return 0; |
| 337 } | 337 } |
| 338 static FX_INT32 GetDirectInteger(CPDF_Dictionary* pDict, FX_BSTR key) | 338 static int32_t GetDirectInteger(CPDF_Dictionary* pDict, FX_BSTR key) |
| 339 { | 339 { |
| 340 CPDF_Object* pObj = pDict->GetElement(key); | 340 CPDF_Object* pObj = pDict->GetElement(key); |
| 341 if (pObj == NULL) { | 341 if (pObj == NULL) { |
| 342 return 0; | 342 return 0; |
| 343 } | 343 } |
| 344 if (pObj->GetType() == PDFOBJ_NUMBER) { | 344 if (pObj->GetType() == PDFOBJ_NUMBER) { |
| 345 return ((CPDF_Number*)pObj)->GetInteger(); | 345 return ((CPDF_Number*)pObj)->GetInteger(); |
| 346 } | 346 } |
| 347 return 0; | 347 return 0; |
| 348 } | 348 } |
| 349 static FX_BOOL CheckDirectType(CPDF_Dictionary* pDict, FX_BSTR key, FX_INT32 iTy
pe) | 349 static FX_BOOL CheckDirectType(CPDF_Dictionary* pDict, FX_BSTR key, int32_t iTyp
e) |
| 350 { | 350 { |
| 351 CPDF_Object* pObj = pDict->GetElement(key); | 351 CPDF_Object* pObj = pDict->GetElement(key); |
| 352 if (!pObj) { | 352 if (!pObj) { |
| 353 return TRUE; | 353 return TRUE; |
| 354 } | 354 } |
| 355 return pObj->GetType() == iType; | 355 return pObj->GetType() == iType; |
| 356 } | 356 } |
| 357 FX_BOOL CPDF_Parser::LoadAllCrossRefV4(FX_FILESIZE xrefpos) | 357 FX_BOOL CPDF_Parser::LoadAllCrossRefV4(FX_FILESIZE xrefpos) |
| 358 { | 358 { |
| 359 if (!LoadCrossRefV4(xrefpos, 0, TRUE, FALSE)) { | 359 if (!LoadCrossRefV4(xrefpos, 0, TRUE, FALSE)) { |
| 360 return FALSE; | 360 return FALSE; |
| 361 } | 361 } |
| 362 m_pTrailer = LoadTrailerV4(); | 362 m_pTrailer = LoadTrailerV4(); |
| 363 if (m_pTrailer == NULL) { | 363 if (m_pTrailer == NULL) { |
| 364 return FALSE; | 364 return FALSE; |
| 365 } | 365 } |
| 366 FX_INT32 xrefsize = GetDirectInteger(m_pTrailer, FX_BSTRC("Size")); | 366 int32_t xrefsize = GetDirectInteger(m_pTrailer, FX_BSTRC("Size")); |
| 367 if (xrefsize <= 0 || xrefsize > (1 << 20)) { | 367 if (xrefsize <= 0 || xrefsize > (1 << 20)) { |
| 368 return FALSE; | 368 return FALSE; |
| 369 } | 369 } |
| 370 m_CrossRef.SetSize(xrefsize); | 370 m_CrossRef.SetSize(xrefsize); |
| 371 m_V5Type.SetSize(xrefsize); | 371 m_V5Type.SetSize(xrefsize); |
| 372 CFX_FileSizeArray CrossRefList, XRefStreamList; | 372 CFX_FileSizeArray CrossRefList, XRefStreamList; |
| 373 CrossRefList.Add(xrefpos); | 373 CrossRefList.Add(xrefpos); |
| 374 XRefStreamList.Add(GetDirectInteger(m_pTrailer, FX_BSTRC("XRefStm"))); | 374 XRefStreamList.Add(GetDirectInteger(m_pTrailer, FX_BSTRC("XRefStm"))); |
| 375 if (!CheckDirectType(m_pTrailer, FX_BSTRC("Prev"), PDFOBJ_NUMBER)) { | 375 if (!CheckDirectType(m_pTrailer, FX_BSTRC("Prev"), PDFOBJ_NUMBER)) { |
| 376 return FALSE; | 376 return FALSE; |
| (...skipping 16 matching lines...) Expand all Loading... |
| 393 } | 393 } |
| 394 newxrefpos = GetDirectInteger(pDict, FX_BSTRC("Prev")); | 394 newxrefpos = GetDirectInteger(pDict, FX_BSTRC("Prev")); |
| 395 if (newxrefpos == xrefpos) { | 395 if (newxrefpos == xrefpos) { |
| 396 pDict->Release(); | 396 pDict->Release(); |
| 397 return FALSE; | 397 return FALSE; |
| 398 } | 398 } |
| 399 xrefpos = newxrefpos; | 399 xrefpos = newxrefpos; |
| 400 XRefStreamList.InsertAt(0, pDict->GetInteger(FX_BSTRC("XRefStm"))); | 400 XRefStreamList.InsertAt(0, pDict->GetInteger(FX_BSTRC("XRefStm"))); |
| 401 m_Trailers.Add(pDict); | 401 m_Trailers.Add(pDict); |
| 402 } | 402 } |
| 403 for (FX_INT32 i = 0; i < CrossRefList.GetSize(); i ++) | 403 for (int32_t i = 0; i < CrossRefList.GetSize(); i ++) |
| 404 if (!LoadCrossRefV4(CrossRefList[i], XRefStreamList[i], FALSE, i == 0))
{ | 404 if (!LoadCrossRefV4(CrossRefList[i], XRefStreamList[i], FALSE, i == 0))
{ |
| 405 return FALSE; | 405 return FALSE; |
| 406 } | 406 } |
| 407 return TRUE; | 407 return TRUE; |
| 408 } | 408 } |
| 409 FX_BOOL CPDF_Parser::LoadLinearizedAllCrossRefV4(FX_FILESIZE xrefpos, FX_DWORD d
wObjCount) | 409 FX_BOOL CPDF_Parser::LoadLinearizedAllCrossRefV4(FX_FILESIZE xrefpos, FX_DWORD d
wObjCount) |
| 410 { | 410 { |
| 411 if (!LoadLinearizedCrossRefV4(xrefpos, dwObjCount)) { | 411 if (!LoadLinearizedCrossRefV4(xrefpos, dwObjCount)) { |
| 412 return FALSE; | 412 return FALSE; |
| 413 } | 413 } |
| 414 m_pTrailer = LoadTrailerV4(); | 414 m_pTrailer = LoadTrailerV4(); |
| 415 if (m_pTrailer == NULL) { | 415 if (m_pTrailer == NULL) { |
| 416 return FALSE; | 416 return FALSE; |
| 417 } | 417 } |
| 418 FX_INT32 xrefsize = GetDirectInteger(m_pTrailer, FX_BSTRC("Size")); | 418 int32_t xrefsize = GetDirectInteger(m_pTrailer, FX_BSTRC("Size")); |
| 419 if (xrefsize == 0) { | 419 if (xrefsize == 0) { |
| 420 return FALSE; | 420 return FALSE; |
| 421 } | 421 } |
| 422 CFX_FileSizeArray CrossRefList, XRefStreamList; | 422 CFX_FileSizeArray CrossRefList, XRefStreamList; |
| 423 CrossRefList.Add(xrefpos); | 423 CrossRefList.Add(xrefpos); |
| 424 XRefStreamList.Add(GetDirectInteger(m_pTrailer, FX_BSTRC("XRefStm"))); | 424 XRefStreamList.Add(GetDirectInteger(m_pTrailer, FX_BSTRC("XRefStm"))); |
| 425 xrefpos = GetDirectInteger(m_pTrailer, FX_BSTRC("Prev")); | 425 xrefpos = GetDirectInteger(m_pTrailer, FX_BSTRC("Prev")); |
| 426 while (xrefpos) { | 426 while (xrefpos) { |
| 427 CrossRefList.InsertAt(0, xrefpos); | 427 CrossRefList.InsertAt(0, xrefpos); |
| 428 LoadCrossRefV4(xrefpos, 0, TRUE, FALSE); | 428 LoadCrossRefV4(xrefpos, 0, TRUE, FALSE); |
| 429 CPDF_Dictionary* pDict = LoadTrailerV4(); | 429 CPDF_Dictionary* pDict = LoadTrailerV4(); |
| 430 if (pDict == NULL) { | 430 if (pDict == NULL) { |
| 431 return FALSE; | 431 return FALSE; |
| 432 } | 432 } |
| 433 xrefpos = GetDirectInteger(pDict, FX_BSTRC("Prev")); | 433 xrefpos = GetDirectInteger(pDict, FX_BSTRC("Prev")); |
| 434 XRefStreamList.InsertAt(0, pDict->GetInteger(FX_BSTRC("XRefStm"))); | 434 XRefStreamList.InsertAt(0, pDict->GetInteger(FX_BSTRC("XRefStm"))); |
| 435 m_Trailers.Add(pDict); | 435 m_Trailers.Add(pDict); |
| 436 } | 436 } |
| 437 for (FX_INT32 i = 1; i < CrossRefList.GetSize(); i ++) | 437 for (int32_t i = 1; i < CrossRefList.GetSize(); i ++) |
| 438 if (!LoadCrossRefV4(CrossRefList[i], XRefStreamList[i], FALSE, i == 0))
{ | 438 if (!LoadCrossRefV4(CrossRefList[i], XRefStreamList[i], FALSE, i == 0))
{ |
| 439 return FALSE; | 439 return FALSE; |
| 440 } | 440 } |
| 441 return TRUE; | 441 return TRUE; |
| 442 } | 442 } |
| 443 FX_BOOL CPDF_Parser::LoadLinearizedCrossRefV4(FX_FILESIZE pos, FX_DWORD dwObjCou
nt) | 443 FX_BOOL CPDF_Parser::LoadLinearizedCrossRefV4(FX_FILESIZE pos, FX_DWORD dwObjCou
nt) |
| 444 { | 444 { |
| 445 FX_FILESIZE dwStartPos = pos - m_Syntax.m_HeaderOffset; | 445 FX_FILESIZE dwStartPos = pos - m_Syntax.m_HeaderOffset; |
| 446 m_Syntax.RestorePos(dwStartPos); | 446 m_Syntax.RestorePos(dwStartPos); |
| 447 FX_LPVOID pResult = FXSYS_bsearch(&pos, m_SortedOffset.GetData(), m_SortedOf
fset.GetSize(), sizeof(FX_FILESIZE), _CompareFileSize); | 447 FX_LPVOID pResult = FXSYS_bsearch(&pos, m_SortedOffset.GetData(), m_SortedOf
fset.GetSize(), sizeof(FX_FILESIZE), _CompareFileSize); |
| 448 if (pResult == NULL) { | 448 if (pResult == NULL) { |
| 449 m_SortedOffset.Add(pos); | 449 m_SortedOffset.Add(pos); |
| 450 } | 450 } |
| 451 FX_DWORD start_objnum = 0; | 451 FX_DWORD start_objnum = 0; |
| 452 FX_DWORD count = dwObjCount; | 452 FX_DWORD count = dwObjCount; |
| 453 FX_FILESIZE SavedPos = m_Syntax.SavePos(); | 453 FX_FILESIZE SavedPos = m_Syntax.SavePos(); |
| 454 FX_INT32 recordsize = 20; | 454 int32_t recordsize = 20; |
| 455 char* pBuf = FX_Alloc(char, 1024 * recordsize + 1); | 455 char* pBuf = FX_Alloc(char, 1024 * recordsize + 1); |
| 456 pBuf[1024 * recordsize] = '\0'; | 456 pBuf[1024 * recordsize] = '\0'; |
| 457 FX_INT32 nBlocks = count / 1024 + 1; | 457 int32_t nBlocks = count / 1024 + 1; |
| 458 for (FX_INT32 block = 0; block < nBlocks; block ++) { | 458 for (int32_t block = 0; block < nBlocks; block ++) { |
| 459 FX_INT32 block_size = block == nBlocks - 1 ? count % 1024 : 1024; | 459 int32_t block_size = block == nBlocks - 1 ? count % 1024 : 1024; |
| 460 FX_DWORD dwReadSize = block_size * recordsize; | 460 FX_DWORD dwReadSize = block_size * recordsize; |
| 461 if ((FX_FILESIZE)(dwStartPos + dwReadSize) > m_Syntax.m_FileLen) { | 461 if ((FX_FILESIZE)(dwStartPos + dwReadSize) > m_Syntax.m_FileLen) { |
| 462 FX_Free(pBuf); | 462 FX_Free(pBuf); |
| 463 return FALSE; | 463 return FALSE; |
| 464 } | 464 } |
| 465 if (!m_Syntax.ReadBlock((FX_LPBYTE)pBuf, dwReadSize)) { | 465 if (!m_Syntax.ReadBlock((FX_LPBYTE)pBuf, dwReadSize)) { |
| 466 FX_Free(pBuf); | 466 FX_Free(pBuf); |
| 467 return FALSE; | 467 return FALSE; |
| 468 } | 468 } |
| 469 for (FX_INT32 i = 0; i < block_size; i ++) { | 469 for (int32_t i = 0; i < block_size; i ++) { |
| 470 FX_DWORD objnum = start_objnum + block * 1024 + i; | 470 FX_DWORD objnum = start_objnum + block * 1024 + i; |
| 471 char* pEntry = pBuf + i * recordsize; | 471 char* pEntry = pBuf + i * recordsize; |
| 472 if (pEntry[17] == 'f') { | 472 if (pEntry[17] == 'f') { |
| 473 m_CrossRef.SetAtGrow(objnum, 0); | 473 m_CrossRef.SetAtGrow(objnum, 0); |
| 474 m_V5Type.SetAtGrow(objnum, 0); | 474 m_V5Type.SetAtGrow(objnum, 0); |
| 475 } else { | 475 } else { |
| 476 FX_INT32 offset = FXSYS_atoi(pEntry); | 476 int32_t offset = FXSYS_atoi(pEntry); |
| 477 if (offset == 0) { | 477 if (offset == 0) { |
| 478 for (FX_INT32 c = 0; c < 10; c ++) { | 478 for (int32_t c = 0; c < 10; c ++) { |
| 479 if (pEntry[c] < '0' || pEntry[c] > '9') { | 479 if (pEntry[c] < '0' || pEntry[c] > '9') { |
| 480 FX_Free(pBuf); | 480 FX_Free(pBuf); |
| 481 return FALSE; | 481 return FALSE; |
| 482 } | 482 } |
| 483 } | 483 } |
| 484 } | 484 } |
| 485 m_CrossRef.SetAtGrow(objnum, offset); | 485 m_CrossRef.SetAtGrow(objnum, offset); |
| 486 FX_INT32 version = FXSYS_atoi(pEntry + 11); | 486 int32_t version = FXSYS_atoi(pEntry + 11); |
| 487 if (version >= 1) { | 487 if (version >= 1) { |
| 488 m_bVersionUpdated = TRUE; | 488 m_bVersionUpdated = TRUE; |
| 489 } | 489 } |
| 490 m_ObjVersion.SetAtGrow(objnum, version); | 490 m_ObjVersion.SetAtGrow(objnum, version); |
| 491 if (m_CrossRef[objnum] < m_Syntax.m_FileLen) { | 491 if (m_CrossRef[objnum] < m_Syntax.m_FileLen) { |
| 492 FX_LPVOID pResult = FXSYS_bsearch(&m_CrossRef[objnum], m_Sor
tedOffset.GetData(), m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), _CompareFile
Size); | 492 FX_LPVOID pResult = FXSYS_bsearch(&m_CrossRef[objnum], m_Sor
tedOffset.GetData(), m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), _CompareFile
Size); |
| 493 if (pResult == NULL) { | 493 if (pResult == NULL) { |
| 494 m_SortedOffset.Add(m_CrossRef[objnum]); | 494 m_SortedOffset.Add(m_CrossRef[objnum]); |
| 495 } | 495 } |
| 496 } | 496 } |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 530 break; | 530 break; |
| 531 } | 531 } |
| 532 FX_DWORD start_objnum = FXSYS_atoi(word); | 532 FX_DWORD start_objnum = FXSYS_atoi(word); |
| 533 if (start_objnum >= (1 << 20)) { | 533 if (start_objnum >= (1 << 20)) { |
| 534 return FALSE; | 534 return FALSE; |
| 535 } | 535 } |
| 536 FX_DWORD count = m_Syntax.GetDirectNum(); | 536 FX_DWORD count = m_Syntax.GetDirectNum(); |
| 537 m_Syntax.ToNextWord(); | 537 m_Syntax.ToNextWord(); |
| 538 SavedPos = m_Syntax.SavePos(); | 538 SavedPos = m_Syntax.SavePos(); |
| 539 FX_BOOL bFirstItem = FALSE; | 539 FX_BOOL bFirstItem = FALSE; |
| 540 FX_INT32 recordsize = 20; | 540 int32_t recordsize = 20; |
| 541 if (bFirst) { | 541 if (bFirst) { |
| 542 bFirstItem = TRUE; | 542 bFirstItem = TRUE; |
| 543 } | 543 } |
| 544 m_dwXrefStartObjNum = start_objnum; | 544 m_dwXrefStartObjNum = start_objnum; |
| 545 if (!bSkip) { | 545 if (!bSkip) { |
| 546 char* pBuf = FX_Alloc(char, 1024 * recordsize + 1); | 546 char* pBuf = FX_Alloc(char, 1024 * recordsize + 1); |
| 547 pBuf[1024 * recordsize] = '\0'; | 547 pBuf[1024 * recordsize] = '\0'; |
| 548 FX_INT32 nBlocks = count / 1024 + 1; | 548 int32_t nBlocks = count / 1024 + 1; |
| 549 FX_BOOL bFirstBlock = TRUE; | 549 FX_BOOL bFirstBlock = TRUE; |
| 550 for (FX_INT32 block = 0; block < nBlocks; block ++) { | 550 for (int32_t block = 0; block < nBlocks; block ++) { |
| 551 FX_INT32 block_size = block == nBlocks - 1 ? count % 1024 : 1024
; | 551 int32_t block_size = block == nBlocks - 1 ? count % 1024 : 1024; |
| 552 m_Syntax.ReadBlock((FX_LPBYTE)pBuf, block_size * recordsize); | 552 m_Syntax.ReadBlock((FX_LPBYTE)pBuf, block_size * recordsize); |
| 553 for (FX_INT32 i = 0; i < block_size; i ++) { | 553 for (int32_t i = 0; i < block_size; i ++) { |
| 554 FX_DWORD objnum = start_objnum + block * 1024 + i; | 554 FX_DWORD objnum = start_objnum + block * 1024 + i; |
| 555 char* pEntry = pBuf + i * recordsize; | 555 char* pEntry = pBuf + i * recordsize; |
| 556 if (pEntry[17] == 'f') { | 556 if (pEntry[17] == 'f') { |
| 557 if (bFirstItem) { | 557 if (bFirstItem) { |
| 558 objnum = 0; | 558 objnum = 0; |
| 559 bFirstItem = FALSE; | 559 bFirstItem = FALSE; |
| 560 } | 560 } |
| 561 if (bFirstBlock) { | 561 if (bFirstBlock) { |
| 562 FX_FILESIZE offset = (FX_FILESIZE)FXSYS_atoi64(pEntr
y); | 562 FX_FILESIZE offset = (FX_FILESIZE)FXSYS_atoi64(pEntr
y); |
| 563 FX_INT32 version = FXSYS_atoi(pEntry + 11); | 563 int32_t version = FXSYS_atoi(pEntry + 11); |
| 564 if (offset == 0 && version == 65535 && start_objnum
!= 0) { | 564 if (offset == 0 && version == 65535 && start_objnum
!= 0) { |
| 565 start_objnum--; | 565 start_objnum--; |
| 566 objnum = 0; | 566 objnum = 0; |
| 567 } | 567 } |
| 568 } | 568 } |
| 569 m_CrossRef.SetAtGrow(objnum, 0); | 569 m_CrossRef.SetAtGrow(objnum, 0); |
| 570 m_V5Type.SetAtGrow(objnum, 0); | 570 m_V5Type.SetAtGrow(objnum, 0); |
| 571 } else { | 571 } else { |
| 572 FX_FILESIZE offset = (FX_FILESIZE)FXSYS_atoi64(pEntry); | 572 FX_FILESIZE offset = (FX_FILESIZE)FXSYS_atoi64(pEntry); |
| 573 if (offset == 0) { | 573 if (offset == 0) { |
| 574 for (FX_INT32 c = 0; c < 10; c ++) { | 574 for (int32_t c = 0; c < 10; c ++) { |
| 575 if (pEntry[c] < '0' || pEntry[c] > '9') { | 575 if (pEntry[c] < '0' || pEntry[c] > '9') { |
| 576 FX_Free(pBuf); | 576 FX_Free(pBuf); |
| 577 return FALSE; | 577 return FALSE; |
| 578 } | 578 } |
| 579 } | 579 } |
| 580 } | 580 } |
| 581 m_CrossRef.SetAtGrow(objnum, offset); | 581 m_CrossRef.SetAtGrow(objnum, offset); |
| 582 FX_INT32 version = FXSYS_atoi(pEntry + 11); | 582 int32_t version = FXSYS_atoi(pEntry + 11); |
| 583 if (version >= 1) { | 583 if (version >= 1) { |
| 584 m_bVersionUpdated = TRUE; | 584 m_bVersionUpdated = TRUE; |
| 585 } | 585 } |
| 586 m_ObjVersion.SetAtGrow(objnum, version); | 586 m_ObjVersion.SetAtGrow(objnum, version); |
| 587 if (m_CrossRef[objnum] < m_Syntax.m_FileLen) { | 587 if (m_CrossRef[objnum] < m_Syntax.m_FileLen) { |
| 588 FX_LPVOID pResult = FXSYS_bsearch(&m_CrossRef[objnum
], m_SortedOffset.GetData(), m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), _Com
pareFileSize); | 588 FX_LPVOID pResult = FXSYS_bsearch(&m_CrossRef[objnum
], m_SortedOffset.GetData(), m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), _Com
pareFileSize); |
| 589 if (pResult == NULL) { | 589 if (pResult == NULL) { |
| 590 m_SortedOffset.Add(m_CrossRef[objnum]); | 590 m_SortedOffset.Add(m_CrossRef[objnum]); |
| 591 } | 591 } |
| 592 } | 592 } |
| (...skipping 30 matching lines...) Expand all Loading... |
| 623 FX_BOOL CPDF_Parser::RebuildCrossRef() | 623 FX_BOOL CPDF_Parser::RebuildCrossRef() |
| 624 { | 624 { |
| 625 m_CrossRef.RemoveAll(); | 625 m_CrossRef.RemoveAll(); |
| 626 m_V5Type.RemoveAll(); | 626 m_V5Type.RemoveAll(); |
| 627 m_SortedOffset.RemoveAll(); | 627 m_SortedOffset.RemoveAll(); |
| 628 m_ObjVersion.RemoveAll(); | 628 m_ObjVersion.RemoveAll(); |
| 629 if (m_pTrailer) { | 629 if (m_pTrailer) { |
| 630 m_pTrailer->Release(); | 630 m_pTrailer->Release(); |
| 631 m_pTrailer = NULL; | 631 m_pTrailer = NULL; |
| 632 } | 632 } |
| 633 FX_INT32 status = 0; | 633 int32_t status = 0; |
| 634 FX_INT32 inside_index = 0; | 634 int32_t inside_index = 0; |
| 635 FX_DWORD objnum = 0, gennum = 0; | 635 FX_DWORD objnum = 0, gennum = 0; |
| 636 FX_INT32 depth = 0; | 636 int32_t depth = 0; |
| 637 FX_LPBYTE buffer = FX_Alloc(FX_BYTE, 4096); | 637 FX_LPBYTE buffer = FX_Alloc(uint8_t, 4096); |
| 638 FX_FILESIZE pos = m_Syntax.m_HeaderOffset; | 638 FX_FILESIZE pos = m_Syntax.m_HeaderOffset; |
| 639 FX_FILESIZE start_pos = 0, start_pos1 = 0; | 639 FX_FILESIZE start_pos = 0, start_pos1 = 0; |
| 640 FX_FILESIZE last_obj = -1, last_xref = -1, last_trailer = -1; | 640 FX_FILESIZE last_obj = -1, last_xref = -1, last_trailer = -1; |
| 641 while (pos < m_Syntax.m_FileLen) { | 641 while (pos < m_Syntax.m_FileLen) { |
| 642 FX_BOOL bOverFlow = FALSE; | 642 FX_BOOL bOverFlow = FALSE; |
| 643 FX_DWORD size = (FX_DWORD)(m_Syntax.m_FileLen - pos); | 643 FX_DWORD size = (FX_DWORD)(m_Syntax.m_FileLen - pos); |
| 644 if (size > 4096) { | 644 if (size > 4096) { |
| 645 size = 4096; | 645 size = 4096; |
| 646 } | 646 } |
| 647 if (!m_Syntax.m_pFileAccess->ReadBlock(buffer, pos, size)) { | 647 if (!m_Syntax.m_pFileAccess->ReadBlock(buffer, pos, size)) { |
| 648 break; | 648 break; |
| 649 } | 649 } |
| 650 for (FX_DWORD i = 0; i < size; i ++) { | 650 for (FX_DWORD i = 0; i < size; i ++) { |
| 651 FX_BYTE byte = buffer[i]; | 651 uint8_t byte = buffer[i]; |
| 652 switch (status) { | 652 switch (status) { |
| 653 case 0: | 653 case 0: |
| 654 if (PDF_CharType[byte] == 'W') { | 654 if (PDF_CharType[byte] == 'W') { |
| 655 status = 1; | 655 status = 1; |
| 656 } | 656 } |
| 657 if (byte <= '9' && byte >= '0') { | 657 if (byte <= '9' && byte >= '0') { |
| 658 --i; | 658 --i; |
| 659 status = 1; | 659 status = 1; |
| 660 } | 660 } |
| 661 if (byte == '%') { | 661 if (byte == '%') { |
| (...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 815 } else { | 815 } else { |
| 816 offset += 3; | 816 offset += 3; |
| 817 } | 817 } |
| 818 FX_FILESIZE nLen = obj_end - obj_pos - offset; | 818 FX_FILESIZE nLen = obj_end - obj_pos - offset; |
| 819 if ((FX_DWORD)nLen > size - i) { | 819 if ((FX_DWORD)nLen > size - i) { |
| 820 pos = obj_end + m_Syntax.m_HeaderOffset; | 820 pos = obj_end + m_Syntax.m_HeaderOffset; |
| 821 bOverFlow = TRUE; | 821 bOverFlow = TRUE; |
| 822 } else { | 822 } else { |
| 823 i += (FX_DWORD)nLen; | 823 i += (FX_DWORD)nLen; |
| 824 } | 824 } |
| 825 if (m_CrossRef.GetSize() > (FX_INT32)objnum && m
_CrossRef[objnum]) { | 825 if (m_CrossRef.GetSize() > (int32_t)objnum && m_
CrossRef[objnum]) { |
| 826 if (pObject) { | 826 if (pObject) { |
| 827 FX_DWORD oldgen = m_ObjVersion.GetAt(obj
num); | 827 FX_DWORD oldgen = m_ObjVersion.GetAt(obj
num); |
| 828 m_CrossRef[objnum] = obj_pos; | 828 m_CrossRef[objnum] = obj_pos; |
| 829 m_ObjVersion.SetAt(objnum, (FX_SHORT)gen
num); | 829 m_ObjVersion.SetAt(objnum, (int16_t)genn
um); |
| 830 if (oldgen != gennum) { | 830 if (oldgen != gennum) { |
| 831 m_bVersionUpdated = TRUE; | 831 m_bVersionUpdated = TRUE; |
| 832 } | 832 } |
| 833 } | 833 } |
| 834 } else { | 834 } else { |
| 835 m_CrossRef.SetAtGrow(objnum, obj_pos); | 835 m_CrossRef.SetAtGrow(objnum, obj_pos); |
| 836 m_V5Type.SetAtGrow(objnum, 1); | 836 m_V5Type.SetAtGrow(objnum, 1); |
| 837 m_ObjVersion.SetAtGrow(objnum, (FX_SHORT)gen
num); | 837 m_ObjVersion.SetAtGrow(objnum, (int16_t)genn
um); |
| 838 } | 838 } |
| 839 if (pObject) { | 839 if (pObject) { |
| 840 pObject->Release(); | 840 pObject->Release(); |
| 841 } | 841 } |
| 842 } | 842 } |
| 843 --i; | 843 --i; |
| 844 status = 0; | 844 status = 0; |
| 845 break; | 845 break; |
| 846 } | 846 } |
| 847 break; | 847 break; |
| (...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 983 last_trailer = m_Syntax.m_FileLen; | 983 last_trailer = m_Syntax.m_FileLen; |
| 984 } | 984 } |
| 985 FX_FILESIZE offset = last_trailer - m_Syntax.m_HeaderOffset; | 985 FX_FILESIZE offset = last_trailer - m_Syntax.m_HeaderOffset; |
| 986 FX_LPVOID pResult = FXSYS_bsearch(&offset, m_SortedOffset.GetData(), m_Sorte
dOffset.GetSize(), sizeof(FX_FILESIZE), _CompareFileSize); | 986 FX_LPVOID pResult = FXSYS_bsearch(&offset, m_SortedOffset.GetData(), m_Sorte
dOffset.GetSize(), sizeof(FX_FILESIZE), _CompareFileSize); |
| 987 if (pResult == NULL) { | 987 if (pResult == NULL) { |
| 988 m_SortedOffset.Add(offset); | 988 m_SortedOffset.Add(offset); |
| 989 } | 989 } |
| 990 FX_Free(buffer); | 990 FX_Free(buffer); |
| 991 return TRUE; | 991 return TRUE; |
| 992 } | 992 } |
| 993 static FX_DWORD _GetVarInt(FX_LPCBYTE p, FX_INT32 n) | 993 static FX_DWORD _GetVarInt(FX_LPCBYTE p, int32_t n) |
| 994 { | 994 { |
| 995 FX_DWORD result = 0; | 995 FX_DWORD result = 0; |
| 996 for (FX_INT32 i = 0; i < n; i ++) { | 996 for (int32_t i = 0; i < n; i ++) { |
| 997 result = result * 256 + p[i]; | 997 result = result * 256 + p[i]; |
| 998 } | 998 } |
| 999 return result; | 999 return result; |
| 1000 } | 1000 } |
| 1001 FX_BOOL CPDF_Parser::LoadCrossRefV5(FX_FILESIZE pos, FX_FILESIZE& prev, FX_BOOL
bMainXRef) | 1001 FX_BOOL CPDF_Parser::LoadCrossRefV5(FX_FILESIZE pos, FX_FILESIZE& prev, FX_BOOL
bMainXRef) |
| 1002 { | 1002 { |
| 1003 CPDF_Stream* pStream = (CPDF_Stream*)ParseIndirectObjectAt(m_pDocument, pos,
0, NULL); | 1003 CPDF_Stream* pStream = (CPDF_Stream*)ParseIndirectObjectAt(m_pDocument, pos,
0, NULL); |
| 1004 if (!pStream) { | 1004 if (!pStream) { |
| 1005 return FALSE; | 1005 return FALSE; |
| 1006 } | 1006 } |
| 1007 if (m_pDocument) { | 1007 if (m_pDocument) { |
| 1008 CPDF_Dictionary * pDict = m_pDocument->GetRoot(); | 1008 CPDF_Dictionary * pDict = m_pDocument->GetRoot(); |
| 1009 if (!pDict || pDict->GetObjNum() != pStream->m_ObjNum) { | 1009 if (!pDict || pDict->GetObjNum() != pStream->m_ObjNum) { |
| 1010 m_pDocument->InsertIndirectObject(pStream->m_ObjNum, pStream); | 1010 m_pDocument->InsertIndirectObject(pStream->m_ObjNum, pStream); |
| 1011 } else { | 1011 } else { |
| 1012 if (pStream->GetType() == PDFOBJ_STREAM) { | 1012 if (pStream->GetType() == PDFOBJ_STREAM) { |
| 1013 pStream->Release(); | 1013 pStream->Release(); |
| 1014 } | 1014 } |
| 1015 return FALSE; | 1015 return FALSE; |
| 1016 } | 1016 } |
| 1017 } | 1017 } |
| 1018 if (pStream->GetType() != PDFOBJ_STREAM) { | 1018 if (pStream->GetType() != PDFOBJ_STREAM) { |
| 1019 return FALSE; | 1019 return FALSE; |
| 1020 } | 1020 } |
| 1021 prev = pStream->GetDict()->GetInteger(FX_BSTRC("Prev")); | 1021 prev = pStream->GetDict()->GetInteger(FX_BSTRC("Prev")); |
| 1022 FX_INT32 size = pStream->GetDict()->GetInteger(FX_BSTRC("Size")); | 1022 int32_t size = pStream->GetDict()->GetInteger(FX_BSTRC("Size")); |
| 1023 if (size < 0) { | 1023 if (size < 0) { |
| 1024 pStream->Release(); | 1024 pStream->Release(); |
| 1025 return FALSE; | 1025 return FALSE; |
| 1026 } | 1026 } |
| 1027 if (bMainXRef) { | 1027 if (bMainXRef) { |
| 1028 m_pTrailer = (CPDF_Dictionary*)pStream->GetDict()->Clone(); | 1028 m_pTrailer = (CPDF_Dictionary*)pStream->GetDict()->Clone(); |
| 1029 m_CrossRef.SetSize(size); | 1029 m_CrossRef.SetSize(size); |
| 1030 if (m_V5Type.SetSize(size)) { | 1030 if (m_V5Type.SetSize(size)) { |
| 1031 FXSYS_memset32(m_V5Type.GetData(), 0, size); | 1031 FXSYS_memset32(m_V5Type.GetData(), 0, size); |
| 1032 } | 1032 } |
| 1033 } else { | 1033 } else { |
| 1034 m_Trailers.Add((CPDF_Dictionary*)pStream->GetDict()->Clone()); | 1034 m_Trailers.Add((CPDF_Dictionary*)pStream->GetDict()->Clone()); |
| 1035 } | 1035 } |
| 1036 std::vector<std::pair<FX_INT32, FX_INT32> > arrIndex; | 1036 std::vector<std::pair<int32_t, int32_t> > arrIndex; |
| 1037 CPDF_Array* pArray = pStream->GetDict()->GetArray(FX_BSTRC("Index")); | 1037 CPDF_Array* pArray = pStream->GetDict()->GetArray(FX_BSTRC("Index")); |
| 1038 if (pArray) { | 1038 if (pArray) { |
| 1039 FX_DWORD nPairSize = pArray->GetCount() / 2; | 1039 FX_DWORD nPairSize = pArray->GetCount() / 2; |
| 1040 for (FX_DWORD i = 0; i < nPairSize; i++) { | 1040 for (FX_DWORD i = 0; i < nPairSize; i++) { |
| 1041 CPDF_Object* pStartNumObj = pArray->GetElement(i * 2); | 1041 CPDF_Object* pStartNumObj = pArray->GetElement(i * 2); |
| 1042 CPDF_Object* pCountObj = pArray->GetElement(i * 2 + 1); | 1042 CPDF_Object* pCountObj = pArray->GetElement(i * 2 + 1); |
| 1043 if (pStartNumObj && pStartNumObj->GetType() == PDFOBJ_NUMBER | 1043 if (pStartNumObj && pStartNumObj->GetType() == PDFOBJ_NUMBER |
| 1044 && pCountObj && pCountObj->GetType() == PDFOBJ_NUMBER) { | 1044 && pCountObj && pCountObj->GetType() == PDFOBJ_NUMBER) { |
| 1045 int nStartNum = pStartNumObj->GetInteger(); | 1045 int nStartNum = pStartNumObj->GetInteger(); |
| 1046 int nCount = pCountObj->GetInteger(); | 1046 int nCount = pCountObj->GetInteger(); |
| (...skipping 21 matching lines...) Expand all Loading... |
| 1068 pStream->Release(); | 1068 pStream->Release(); |
| 1069 return FALSE; | 1069 return FALSE; |
| 1070 } | 1070 } |
| 1071 FX_DWORD totalWidth = dwAccWidth.ValueOrDie(); | 1071 FX_DWORD totalWidth = dwAccWidth.ValueOrDie(); |
| 1072 CPDF_StreamAcc acc; | 1072 CPDF_StreamAcc acc; |
| 1073 acc.LoadAllData(pStream); | 1073 acc.LoadAllData(pStream); |
| 1074 FX_LPCBYTE pData = acc.GetData(); | 1074 FX_LPCBYTE pData = acc.GetData(); |
| 1075 FX_DWORD dwTotalSize = acc.GetSize(); | 1075 FX_DWORD dwTotalSize = acc.GetSize(); |
| 1076 FX_DWORD segindex = 0; | 1076 FX_DWORD segindex = 0; |
| 1077 for (FX_DWORD i = 0; i < arrIndex.size(); i ++) { | 1077 for (FX_DWORD i = 0; i < arrIndex.size(); i ++) { |
| 1078 FX_INT32 startnum = arrIndex[i].first; | 1078 int32_t startnum = arrIndex[i].first; |
| 1079 if (startnum < 0) { | 1079 if (startnum < 0) { |
| 1080 continue; | 1080 continue; |
| 1081 } | 1081 } |
| 1082 m_dwXrefStartObjNum = pdfium::base::checked_cast<FX_DWORD, FX_INT32> (st
artnum); | 1082 m_dwXrefStartObjNum = pdfium::base::checked_cast<FX_DWORD, int32_t> (sta
rtnum); |
| 1083 FX_DWORD count = pdfium::base::checked_cast<FX_DWORD, FX_INT32> (arrInde
x[i].second); | 1083 FX_DWORD count = pdfium::base::checked_cast<FX_DWORD, int32_t> (arrIndex
[i].second); |
| 1084 FX_SAFE_DWORD dwCaculatedSize = segindex; | 1084 FX_SAFE_DWORD dwCaculatedSize = segindex; |
| 1085 dwCaculatedSize += count; | 1085 dwCaculatedSize += count; |
| 1086 dwCaculatedSize *= totalWidth; | 1086 dwCaculatedSize *= totalWidth; |
| 1087 if (!dwCaculatedSize.IsValid() || dwCaculatedSize.ValueOrDie() > dwTotal
Size) { | 1087 if (!dwCaculatedSize.IsValid() || dwCaculatedSize.ValueOrDie() > dwTotal
Size) { |
| 1088 continue; | 1088 continue; |
| 1089 } | 1089 } |
| 1090 FX_LPCBYTE segstart = pData + segindex * totalWidth; | 1090 FX_LPCBYTE segstart = pData + segindex * totalWidth; |
| 1091 FX_SAFE_DWORD dwMaxObjNum = startnum; | 1091 FX_SAFE_DWORD dwMaxObjNum = startnum; |
| 1092 dwMaxObjNum += count; | 1092 dwMaxObjNum += count; |
| 1093 FX_DWORD dwV5Size = pdfium::base::checked_cast<FX_DWORD, FX_INT32> (m_V5
Type.GetSize()); | 1093 FX_DWORD dwV5Size = pdfium::base::checked_cast<FX_DWORD, int32_t> (m_V5T
ype.GetSize()); |
| 1094 if (!dwMaxObjNum.IsValid() || dwMaxObjNum.ValueOrDie() > dwV5Size) { | 1094 if (!dwMaxObjNum.IsValid() || dwMaxObjNum.ValueOrDie() > dwV5Size) { |
| 1095 continue; | 1095 continue; |
| 1096 } | 1096 } |
| 1097 for (FX_DWORD j = 0; j < count; j ++) { | 1097 for (FX_DWORD j = 0; j < count; j ++) { |
| 1098 FX_INT32 type = 1; | 1098 int32_t type = 1; |
| 1099 FX_LPCBYTE entrystart = segstart + j * totalWidth; | 1099 FX_LPCBYTE entrystart = segstart + j * totalWidth; |
| 1100 if (WidthArray[0]) { | 1100 if (WidthArray[0]) { |
| 1101 type = _GetVarInt(entrystart, WidthArray[0]); | 1101 type = _GetVarInt(entrystart, WidthArray[0]); |
| 1102 } | 1102 } |
| 1103 if (m_V5Type[startnum + j] == 255) { | 1103 if (m_V5Type[startnum + j] == 255) { |
| 1104 FX_FILESIZE offset = _GetVarInt(entrystart + WidthArray[0], Widt
hArray[1]); | 1104 FX_FILESIZE offset = _GetVarInt(entrystart + WidthArray[0], Widt
hArray[1]); |
| 1105 m_CrossRef[startnum + j] = offset; | 1105 m_CrossRef[startnum + j] = offset; |
| 1106 FX_LPVOID pResult = FXSYS_bsearch(&offset, m_SortedOffset.GetDat
a(), m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), _CompareFileSize); | 1106 FX_LPVOID pResult = FXSYS_bsearch(&offset, m_SortedOffset.GetDat
a(), m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), _CompareFileSize); |
| 1107 if (pResult == NULL) { | 1107 if (pResult == NULL) { |
| 1108 m_SortedOffset.Add(offset); | 1108 m_SortedOffset.Add(offset); |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1205 if (pos <= 0) { | 1205 if (pos <= 0) { |
| 1206 return NULL; | 1206 return NULL; |
| 1207 } | 1207 } |
| 1208 return ParseIndirectObjectAt(pObjList, pos, objnum, pContext); | 1208 return ParseIndirectObjectAt(pObjList, pos, objnum, pContext); |
| 1209 } | 1209 } |
| 1210 if (m_V5Type[objnum] == 2) { | 1210 if (m_V5Type[objnum] == 2) { |
| 1211 CPDF_StreamAcc* pObjStream = GetObjectStream((FX_DWORD)m_CrossRef[objnum
]); | 1211 CPDF_StreamAcc* pObjStream = GetObjectStream((FX_DWORD)m_CrossRef[objnum
]); |
| 1212 if (pObjStream == NULL) { | 1212 if (pObjStream == NULL) { |
| 1213 return NULL; | 1213 return NULL; |
| 1214 } | 1214 } |
| 1215 FX_INT32 n = pObjStream->GetDict()->GetInteger(FX_BSTRC("N")); | 1215 int32_t n = pObjStream->GetDict()->GetInteger(FX_BSTRC("N")); |
| 1216 FX_INT32 offset = pObjStream->GetDict()->GetInteger(FX_BSTRC("First")); | 1216 int32_t offset = pObjStream->GetDict()->GetInteger(FX_BSTRC("First")); |
| 1217 CPDF_SyntaxParser syntax; | 1217 CPDF_SyntaxParser syntax; |
| 1218 CFX_SmartPointer<IFX_FileStream> file(FX_CreateMemoryStream((FX_LPBYTE)p
ObjStream->GetData(), (size_t)pObjStream->GetSize(), FALSE)); | 1218 CFX_SmartPointer<IFX_FileStream> file(FX_CreateMemoryStream((FX_LPBYTE)p
ObjStream->GetData(), (size_t)pObjStream->GetSize(), FALSE)); |
| 1219 syntax.InitParser(file.Get(), 0); | 1219 syntax.InitParser(file.Get(), 0); |
| 1220 CPDF_Object* pRet = NULL; | 1220 CPDF_Object* pRet = NULL; |
| 1221 while (n) { | 1221 while (n) { |
| 1222 FX_DWORD thisnum = syntax.GetDirectNum(); | 1222 FX_DWORD thisnum = syntax.GetDirectNum(); |
| 1223 FX_DWORD thisoff = syntax.GetDirectNum(); | 1223 FX_DWORD thisoff = syntax.GetDirectNum(); |
| 1224 if (thisnum == objnum) { | 1224 if (thisnum == objnum) { |
| 1225 syntax.RestorePos(offset + thisoff); | 1225 syntax.RestorePos(offset + thisoff); |
| 1226 pRet = syntax.GetObject(pObjList, 0, 0, pContext); | 1226 pRet = syntax.GetObject(pObjList, 0, 0, pContext); |
| 1227 break; | 1227 break; |
| 1228 } | 1228 } |
| 1229 n --; | 1229 n --; |
| 1230 } | 1230 } |
| 1231 return pRet; | 1231 return pRet; |
| 1232 } | 1232 } |
| 1233 return NULL; | 1233 return NULL; |
| 1234 } | 1234 } |
| 1235 CPDF_StreamAcc* CPDF_Parser::GetObjectStream(FX_DWORD objnum) | 1235 CPDF_StreamAcc* CPDF_Parser::GetObjectStream(FX_DWORD objnum) |
| 1236 { | 1236 { |
| 1237 CPDF_StreamAcc* pStreamAcc = NULL; | 1237 CPDF_StreamAcc* pStreamAcc = NULL; |
| 1238 if (m_ObjectStreamMap.Lookup((void*)(FX_UINTPTR)objnum, (void*&)pStreamAcc))
{ | 1238 if (m_ObjectStreamMap.Lookup((void*)(uintptr_t)objnum, (void*&)pStreamAcc))
{ |
| 1239 return pStreamAcc; | 1239 return pStreamAcc; |
| 1240 } | 1240 } |
| 1241 const CPDF_Stream* pStream = m_pDocument ? (CPDF_Stream*)m_pDocument->GetInd
irectObject(objnum) : NULL; | 1241 const CPDF_Stream* pStream = m_pDocument ? (CPDF_Stream*)m_pDocument->GetInd
irectObject(objnum) : NULL; |
| 1242 if (pStream == NULL || pStream->GetType() != PDFOBJ_STREAM) { | 1242 if (pStream == NULL || pStream->GetType() != PDFOBJ_STREAM) { |
| 1243 return NULL; | 1243 return NULL; |
| 1244 } | 1244 } |
| 1245 pStreamAcc = new CPDF_StreamAcc; | 1245 pStreamAcc = new CPDF_StreamAcc; |
| 1246 pStreamAcc->LoadAllData(pStream); | 1246 pStreamAcc->LoadAllData(pStream); |
| 1247 m_ObjectStreamMap.SetAt((void*)(FX_UINTPTR)objnum, pStreamAcc); | 1247 m_ObjectStreamMap.SetAt((void*)(uintptr_t)objnum, pStreamAcc); |
| 1248 return pStreamAcc; | 1248 return pStreamAcc; |
| 1249 } | 1249 } |
| 1250 FX_FILESIZE CPDF_Parser::GetObjectSize(FX_DWORD objnum) | 1250 FX_FILESIZE CPDF_Parser::GetObjectSize(FX_DWORD objnum) |
| 1251 { | 1251 { |
| 1252 if (objnum >= (FX_DWORD)m_CrossRef.GetSize()) { | 1252 if (objnum >= (FX_DWORD)m_CrossRef.GetSize()) { |
| 1253 return 0; | 1253 return 0; |
| 1254 } | 1254 } |
| 1255 if (m_V5Type[objnum] == 2) { | 1255 if (m_V5Type[objnum] == 2) { |
| 1256 objnum = (FX_DWORD)m_CrossRef[objnum]; | 1256 objnum = (FX_DWORD)m_CrossRef[objnum]; |
| 1257 } | 1257 } |
| (...skipping 18 matching lines...) Expand all Loading... |
| 1276 pBuffer = NULL; | 1276 pBuffer = NULL; |
| 1277 size = 0; | 1277 size = 0; |
| 1278 if (objnum >= (FX_DWORD)m_CrossRef.GetSize()) { | 1278 if (objnum >= (FX_DWORD)m_CrossRef.GetSize()) { |
| 1279 return; | 1279 return; |
| 1280 } | 1280 } |
| 1281 if (m_V5Type[objnum] == 2) { | 1281 if (m_V5Type[objnum] == 2) { |
| 1282 CPDF_StreamAcc* pObjStream = GetObjectStream((FX_DWORD)m_CrossRef[objnum
]); | 1282 CPDF_StreamAcc* pObjStream = GetObjectStream((FX_DWORD)m_CrossRef[objnum
]); |
| 1283 if (pObjStream == NULL) { | 1283 if (pObjStream == NULL) { |
| 1284 return; | 1284 return; |
| 1285 } | 1285 } |
| 1286 FX_INT32 n = pObjStream->GetDict()->GetInteger(FX_BSTRC("N")); | 1286 int32_t n = pObjStream->GetDict()->GetInteger(FX_BSTRC("N")); |
| 1287 FX_INT32 offset = pObjStream->GetDict()->GetInteger(FX_BSTRC("First")); | 1287 int32_t offset = pObjStream->GetDict()->GetInteger(FX_BSTRC("First")); |
| 1288 CPDF_SyntaxParser syntax; | 1288 CPDF_SyntaxParser syntax; |
| 1289 FX_LPCBYTE pData = pObjStream->GetData(); | 1289 FX_LPCBYTE pData = pObjStream->GetData(); |
| 1290 FX_DWORD totalsize = pObjStream->GetSize(); | 1290 FX_DWORD totalsize = pObjStream->GetSize(); |
| 1291 CFX_SmartPointer<IFX_FileStream> file(FX_CreateMemoryStream((FX_LPBYTE)p
Data, (size_t)totalsize, FALSE)); | 1291 CFX_SmartPointer<IFX_FileStream> file(FX_CreateMemoryStream((FX_LPBYTE)p
Data, (size_t)totalsize, FALSE)); |
| 1292 syntax.InitParser(file.Get(), 0); | 1292 syntax.InitParser(file.Get(), 0); |
| 1293 while (n) { | 1293 while (n) { |
| 1294 FX_DWORD thisnum = syntax.GetDirectNum(); | 1294 FX_DWORD thisnum = syntax.GetDirectNum(); |
| 1295 FX_DWORD thisoff = syntax.GetDirectNum(); | 1295 FX_DWORD thisoff = syntax.GetDirectNum(); |
| 1296 if (thisnum == objnum) { | 1296 if (thisnum == objnum) { |
| 1297 if (n == 1) { | 1297 if (n == 1) { |
| 1298 size = totalsize - (thisoff + offset); | 1298 size = totalsize - (thisoff + offset); |
| 1299 } else { | 1299 } else { |
| 1300 syntax.GetDirectNum(); // Skip nextnum. | 1300 syntax.GetDirectNum(); // Skip nextnum. |
| 1301 FX_DWORD nextoff = syntax.GetDirectNum(); | 1301 FX_DWORD nextoff = syntax.GetDirectNum(); |
| 1302 size = nextoff - thisoff; | 1302 size = nextoff - thisoff; |
| 1303 } | 1303 } |
| 1304 pBuffer = FX_Alloc(FX_BYTE, size); | 1304 pBuffer = FX_Alloc(uint8_t, size); |
| 1305 FXSYS_memcpy32(pBuffer, pData + thisoff + offset, size); | 1305 FXSYS_memcpy32(pBuffer, pData + thisoff + offset, size); |
| 1306 return; | 1306 return; |
| 1307 } | 1307 } |
| 1308 n --; | 1308 n --; |
| 1309 } | 1309 } |
| 1310 return; | 1310 return; |
| 1311 } | 1311 } |
| 1312 if (m_V5Type[objnum] == 1) { | 1312 if (m_V5Type[objnum] == 1) { |
| 1313 FX_FILESIZE pos = m_CrossRef[objnum]; | 1313 FX_FILESIZE pos = m_CrossRef[objnum]; |
| 1314 if (pos == 0) { | 1314 if (pos == 0) { |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1361 if (m_Syntax.GetKeyword() == FX_BSTRC("endobj")) { | 1361 if (m_Syntax.GetKeyword() == FX_BSTRC("endobj")) { |
| 1362 break; | 1362 break; |
| 1363 } | 1363 } |
| 1364 if (m_Syntax.SavePos() == m_Syntax.m_FileLen) { | 1364 if (m_Syntax.SavePos() == m_Syntax.m_FileLen) { |
| 1365 break; | 1365 break; |
| 1366 } | 1366 } |
| 1367 } | 1367 } |
| 1368 nextoff = m_Syntax.SavePos(); | 1368 nextoff = m_Syntax.SavePos(); |
| 1369 } | 1369 } |
| 1370 size = (FX_DWORD)(nextoff - pos); | 1370 size = (FX_DWORD)(nextoff - pos); |
| 1371 pBuffer = FX_Alloc(FX_BYTE, size); | 1371 pBuffer = FX_Alloc(uint8_t, size); |
| 1372 m_Syntax.RestorePos(pos); | 1372 m_Syntax.RestorePos(pos); |
| 1373 m_Syntax.ReadBlock(pBuffer, size); | 1373 m_Syntax.ReadBlock(pBuffer, size); |
| 1374 m_Syntax.RestorePos(SavedPos); | 1374 m_Syntax.RestorePos(SavedPos); |
| 1375 } | 1375 } |
| 1376 } | 1376 } |
| 1377 CPDF_Object* CPDF_Parser::ParseIndirectObjectAt(CPDF_IndirectObjects* pObjList,
FX_FILESIZE pos, FX_DWORD objnum, | 1377 CPDF_Object* CPDF_Parser::ParseIndirectObjectAt(CPDF_IndirectObjects* pObjList,
FX_FILESIZE pos, FX_DWORD objnum, |
| 1378 PARSE_CONTEXT* pContext) | 1378 PARSE_CONTEXT* pContext) |
| 1379 { | 1379 { |
| 1380 FX_FILESIZE SavedPos = m_Syntax.SavePos(); | 1380 FX_FILESIZE SavedPos = m_Syntax.SavePos(); |
| 1381 m_Syntax.RestorePos(pos); | 1381 m_Syntax.RestorePos(pos); |
| (...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1546 m_pLinearized->Release(); | 1546 m_pLinearized->Release(); |
| 1547 m_pLinearized = NULL; | 1547 m_pLinearized = NULL; |
| 1548 return FALSE; | 1548 return FALSE; |
| 1549 } | 1549 } |
| 1550 FX_DWORD CPDF_Parser::StartAsynParse(IFX_FileRead* pFileAccess, FX_BOOL bReParse
, FX_BOOL bOwnFileRead) | 1550 FX_DWORD CPDF_Parser::StartAsynParse(IFX_FileRead* pFileAccess, FX_BOOL bReParse
, FX_BOOL bOwnFileRead) |
| 1551 { | 1551 { |
| 1552 CloseParser(bReParse); | 1552 CloseParser(bReParse); |
| 1553 m_bXRefStream = FALSE; | 1553 m_bXRefStream = FALSE; |
| 1554 m_LastXRefOffset = 0; | 1554 m_LastXRefOffset = 0; |
| 1555 m_bOwnFileRead = bOwnFileRead; | 1555 m_bOwnFileRead = bOwnFileRead; |
| 1556 FX_INT32 offset = GetHeaderOffset(pFileAccess); | 1556 int32_t offset = GetHeaderOffset(pFileAccess); |
| 1557 if (offset == -1) { | 1557 if (offset == -1) { |
| 1558 return PDFPARSE_ERROR_FORMAT; | 1558 return PDFPARSE_ERROR_FORMAT; |
| 1559 } | 1559 } |
| 1560 if (!IsLinearizedFile(pFileAccess, offset)) { | 1560 if (!IsLinearizedFile(pFileAccess, offset)) { |
| 1561 m_Syntax.m_pFileAccess = NULL; | 1561 m_Syntax.m_pFileAccess = NULL; |
| 1562 return StartParse(pFileAccess, bReParse, bOwnFileRead); | 1562 return StartParse(pFileAccess, bReParse, bOwnFileRead); |
| 1563 } | 1563 } |
| 1564 if (!bReParse) { | 1564 if (!bReParse) { |
| 1565 m_pDocument = new CPDF_Document(this); | 1565 m_pDocument = new CPDF_Document(this); |
| 1566 } | 1566 } |
| 1567 FX_FILESIZE dwFirstXRefOffset = m_Syntax.SavePos(); | 1567 FX_FILESIZE dwFirstXRefOffset = m_Syntax.SavePos(); |
| 1568 FX_BOOL bXRefRebuilt = FALSE; | 1568 FX_BOOL bXRefRebuilt = FALSE; |
| 1569 FX_BOOL bLoadV4 = FALSE; | 1569 FX_BOOL bLoadV4 = FALSE; |
| 1570 if (!(bLoadV4 = LoadCrossRefV4(dwFirstXRefOffset, 0, FALSE, FALSE)) && !Load
CrossRefV5(dwFirstXRefOffset, dwFirstXRefOffset, TRUE)) { | 1570 if (!(bLoadV4 = LoadCrossRefV4(dwFirstXRefOffset, 0, FALSE, FALSE)) && !Load
CrossRefV5(dwFirstXRefOffset, dwFirstXRefOffset, TRUE)) { |
| 1571 if (!RebuildCrossRef()) { | 1571 if (!RebuildCrossRef()) { |
| 1572 return PDFPARSE_ERROR_FORMAT; | 1572 return PDFPARSE_ERROR_FORMAT; |
| 1573 } | 1573 } |
| 1574 bXRefRebuilt = TRUE; | 1574 bXRefRebuilt = TRUE; |
| 1575 m_LastXRefOffset = 0; | 1575 m_LastXRefOffset = 0; |
| 1576 } | 1576 } |
| 1577 if (bLoadV4) { | 1577 if (bLoadV4) { |
| 1578 m_pTrailer = LoadTrailerV4(); | 1578 m_pTrailer = LoadTrailerV4(); |
| 1579 if (m_pTrailer == NULL) { | 1579 if (m_pTrailer == NULL) { |
| 1580 return FALSE; | 1580 return FALSE; |
| 1581 } | 1581 } |
| 1582 FX_INT32 xrefsize = GetDirectInteger(m_pTrailer, FX_BSTRC("Size")); | 1582 int32_t xrefsize = GetDirectInteger(m_pTrailer, FX_BSTRC("Size")); |
| 1583 if (xrefsize > 0) { | 1583 if (xrefsize > 0) { |
| 1584 m_CrossRef.SetSize(xrefsize); | 1584 m_CrossRef.SetSize(xrefsize); |
| 1585 m_V5Type.SetSize(xrefsize); | 1585 m_V5Type.SetSize(xrefsize); |
| 1586 } | 1586 } |
| 1587 } | 1587 } |
| 1588 FX_DWORD dwRet = SetEncryptHandler(); | 1588 FX_DWORD dwRet = SetEncryptHandler(); |
| 1589 if (dwRet != PDFPARSE_ERROR_SUCCESS) { | 1589 if (dwRet != PDFPARSE_ERROR_SUCCESS) { |
| 1590 return dwRet; | 1590 return dwRet; |
| 1591 } | 1591 } |
| 1592 m_pDocument->LoadAsynDoc(m_pLinearized->GetDict()); | 1592 m_pDocument->LoadAsynDoc(m_pLinearized->GetDict()); |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1644 } | 1644 } |
| 1645 FX_DWORD CPDF_Parser::LoadLinearizedMainXRefTable() | 1645 FX_DWORD CPDF_Parser::LoadLinearizedMainXRefTable() |
| 1646 { | 1646 { |
| 1647 FX_DWORD dwSaveMetadataObjnum = m_Syntax.m_MetadataObjnum; | 1647 FX_DWORD dwSaveMetadataObjnum = m_Syntax.m_MetadataObjnum; |
| 1648 m_Syntax.m_MetadataObjnum = 0; | 1648 m_Syntax.m_MetadataObjnum = 0; |
| 1649 if (m_pTrailer) { | 1649 if (m_pTrailer) { |
| 1650 m_pTrailer->Release(); | 1650 m_pTrailer->Release(); |
| 1651 m_pTrailer = NULL; | 1651 m_pTrailer = NULL; |
| 1652 } | 1652 } |
| 1653 m_Syntax.RestorePos(m_LastXRefOffset - m_Syntax.m_HeaderOffset); | 1653 m_Syntax.RestorePos(m_LastXRefOffset - m_Syntax.m_HeaderOffset); |
| 1654 FX_BYTE ch = 0; | 1654 uint8_t ch = 0; |
| 1655 FX_DWORD dwCount = 0; | 1655 FX_DWORD dwCount = 0; |
| 1656 m_Syntax.GetNextChar(ch); | 1656 m_Syntax.GetNextChar(ch); |
| 1657 FX_INT32 type = PDF_CharType[ch]; | 1657 int32_t type = PDF_CharType[ch]; |
| 1658 while (type == 'W') { | 1658 while (type == 'W') { |
| 1659 ++dwCount; | 1659 ++dwCount; |
| 1660 if (m_Syntax.m_FileLen >= (FX_FILESIZE)(m_Syntax.SavePos() + m_Syntax.m_
HeaderOffset)) { | 1660 if (m_Syntax.m_FileLen >= (FX_FILESIZE)(m_Syntax.SavePos() + m_Syntax.m_
HeaderOffset)) { |
| 1661 break; | 1661 break; |
| 1662 } | 1662 } |
| 1663 m_Syntax.GetNextChar(ch); | 1663 m_Syntax.GetNextChar(ch); |
| 1664 type = PDF_CharType[ch]; | 1664 type = PDF_CharType[ch]; |
| 1665 } | 1665 } |
| 1666 m_LastXRefOffset += dwCount; | 1666 m_LastXRefOffset += dwCount; |
| 1667 FX_POSITION pos = m_ObjectStreamMap.GetStartPosition(); | 1667 FX_POSITION pos = m_ObjectStreamMap.GetStartPosition(); |
| (...skipping 27 matching lines...) Expand all Loading... |
| 1695 m_MetadataObjnum = 0; | 1695 m_MetadataObjnum = 0; |
| 1696 m_dwWordPos = 0; | 1696 m_dwWordPos = 0; |
| 1697 m_bFileStream = FALSE; | 1697 m_bFileStream = FALSE; |
| 1698 } | 1698 } |
| 1699 CPDF_SyntaxParser::~CPDF_SyntaxParser() | 1699 CPDF_SyntaxParser::~CPDF_SyntaxParser() |
| 1700 { | 1700 { |
| 1701 if (m_pFileBuf) { | 1701 if (m_pFileBuf) { |
| 1702 FX_Free(m_pFileBuf); | 1702 FX_Free(m_pFileBuf); |
| 1703 } | 1703 } |
| 1704 } | 1704 } |
| 1705 FX_BOOL CPDF_SyntaxParser::GetCharAt(FX_FILESIZE pos, FX_BYTE& ch) | 1705 FX_BOOL CPDF_SyntaxParser::GetCharAt(FX_FILESIZE pos, uint8_t& ch) |
| 1706 { | 1706 { |
| 1707 FX_FILESIZE save_pos = m_Pos; | 1707 FX_FILESIZE save_pos = m_Pos; |
| 1708 m_Pos = pos; | 1708 m_Pos = pos; |
| 1709 FX_BOOL ret = GetNextChar(ch); | 1709 FX_BOOL ret = GetNextChar(ch); |
| 1710 m_Pos = save_pos; | 1710 m_Pos = save_pos; |
| 1711 return ret; | 1711 return ret; |
| 1712 } | 1712 } |
| 1713 FX_BOOL CPDF_SyntaxParser::GetNextChar(FX_BYTE& ch) | 1713 FX_BOOL CPDF_SyntaxParser::GetNextChar(uint8_t& ch) |
| 1714 { | 1714 { |
| 1715 FX_FILESIZE pos = m_Pos + m_HeaderOffset; | 1715 FX_FILESIZE pos = m_Pos + m_HeaderOffset; |
| 1716 if (pos >= m_FileLen) { | 1716 if (pos >= m_FileLen) { |
| 1717 return FALSE; | 1717 return FALSE; |
| 1718 } | 1718 } |
| 1719 if (m_BufOffset >= pos || (FX_FILESIZE)(m_BufOffset + m_BufSize) <= pos) { | 1719 if (m_BufOffset >= pos || (FX_FILESIZE)(m_BufOffset + m_BufSize) <= pos) { |
| 1720 FX_FILESIZE read_pos = pos; | 1720 FX_FILESIZE read_pos = pos; |
| 1721 FX_DWORD read_size = m_BufSize; | 1721 FX_DWORD read_size = m_BufSize; |
| 1722 if ((FX_FILESIZE)read_size > m_FileLen) { | 1722 if ((FX_FILESIZE)read_size > m_FileLen) { |
| 1723 read_size = (FX_DWORD)m_FileLen; | 1723 read_size = (FX_DWORD)m_FileLen; |
| 1724 } | 1724 } |
| 1725 if ((FX_FILESIZE)(read_pos + read_size) > m_FileLen) { | 1725 if ((FX_FILESIZE)(read_pos + read_size) > m_FileLen) { |
| 1726 if (m_FileLen < (FX_FILESIZE)read_size) { | 1726 if (m_FileLen < (FX_FILESIZE)read_size) { |
| 1727 read_pos = 0; | 1727 read_pos = 0; |
| 1728 read_size = (FX_DWORD)m_FileLen; | 1728 read_size = (FX_DWORD)m_FileLen; |
| 1729 } else { | 1729 } else { |
| 1730 read_pos = m_FileLen - read_size; | 1730 read_pos = m_FileLen - read_size; |
| 1731 } | 1731 } |
| 1732 } | 1732 } |
| 1733 if (!m_pFileAccess->ReadBlock(m_pFileBuf, read_pos, read_size)) { | 1733 if (!m_pFileAccess->ReadBlock(m_pFileBuf, read_pos, read_size)) { |
| 1734 return FALSE; | 1734 return FALSE; |
| 1735 } | 1735 } |
| 1736 m_BufOffset = read_pos; | 1736 m_BufOffset = read_pos; |
| 1737 } | 1737 } |
| 1738 ch = m_pFileBuf[pos - m_BufOffset]; | 1738 ch = m_pFileBuf[pos - m_BufOffset]; |
| 1739 m_Pos ++; | 1739 m_Pos ++; |
| 1740 return TRUE; | 1740 return TRUE; |
| 1741 } | 1741 } |
| 1742 FX_BOOL CPDF_SyntaxParser::GetCharAtBackward(FX_FILESIZE pos, FX_BYTE& ch) | 1742 FX_BOOL CPDF_SyntaxParser::GetCharAtBackward(FX_FILESIZE pos, uint8_t& ch) |
| 1743 { | 1743 { |
| 1744 pos += m_HeaderOffset; | 1744 pos += m_HeaderOffset; |
| 1745 if (pos >= m_FileLen) { | 1745 if (pos >= m_FileLen) { |
| 1746 return FALSE; | 1746 return FALSE; |
| 1747 } | 1747 } |
| 1748 if (m_BufOffset >= pos || (FX_FILESIZE)(m_BufOffset + m_BufSize) <= pos) { | 1748 if (m_BufOffset >= pos || (FX_FILESIZE)(m_BufOffset + m_BufSize) <= pos) { |
| 1749 FX_FILESIZE read_pos; | 1749 FX_FILESIZE read_pos; |
| 1750 if (pos < (FX_FILESIZE)m_BufSize) { | 1750 if (pos < (FX_FILESIZE)m_BufSize) { |
| 1751 read_pos = 0; | 1751 read_pos = 0; |
| 1752 } else { | 1752 } else { |
| (...skipping 22 matching lines...) Expand all Loading... |
| 1775 return FALSE; | 1775 return FALSE; |
| 1776 } | 1776 } |
| 1777 m_Pos += size; | 1777 m_Pos += size; |
| 1778 return TRUE; | 1778 return TRUE; |
| 1779 } | 1779 } |
| 1780 #define MAX_WORD_BUFFER 256 | 1780 #define MAX_WORD_BUFFER 256 |
| 1781 void CPDF_SyntaxParser::GetNextWord() | 1781 void CPDF_SyntaxParser::GetNextWord() |
| 1782 { | 1782 { |
| 1783 m_WordSize = 0; | 1783 m_WordSize = 0; |
| 1784 m_bIsNumber = TRUE; | 1784 m_bIsNumber = TRUE; |
| 1785 FX_BYTE ch; | 1785 uint8_t ch; |
| 1786 if (!GetNextChar(ch)) { | 1786 if (!GetNextChar(ch)) { |
| 1787 return; | 1787 return; |
| 1788 } | 1788 } |
| 1789 FX_BYTE type = PDF_CharType[ch]; | 1789 uint8_t type = PDF_CharType[ch]; |
| 1790 while (1) { | 1790 while (1) { |
| 1791 while (type == 'W') { | 1791 while (type == 'W') { |
| 1792 if (!GetNextChar(ch)) { | 1792 if (!GetNextChar(ch)) { |
| 1793 return; | 1793 return; |
| 1794 } | 1794 } |
| 1795 type = PDF_CharType[ch]; | 1795 type = PDF_CharType[ch]; |
| 1796 } | 1796 } |
| 1797 if (ch != '%') { | 1797 if (ch != '%') { |
| 1798 break; | 1798 break; |
| 1799 } | 1799 } |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1857 } | 1857 } |
| 1858 type = PDF_CharType[ch]; | 1858 type = PDF_CharType[ch]; |
| 1859 if (type == 'D' || type == 'W') { | 1859 if (type == 'D' || type == 'W') { |
| 1860 m_Pos --; | 1860 m_Pos --; |
| 1861 break; | 1861 break; |
| 1862 } | 1862 } |
| 1863 } | 1863 } |
| 1864 } | 1864 } |
| 1865 CFX_ByteString CPDF_SyntaxParser::ReadString() | 1865 CFX_ByteString CPDF_SyntaxParser::ReadString() |
| 1866 { | 1866 { |
| 1867 FX_BYTE ch; | 1867 uint8_t ch; |
| 1868 if (!GetNextChar(ch)) { | 1868 if (!GetNextChar(ch)) { |
| 1869 return CFX_ByteString(); | 1869 return CFX_ByteString(); |
| 1870 } | 1870 } |
| 1871 CFX_ByteTextBuf buf; | 1871 CFX_ByteTextBuf buf; |
| 1872 FX_INT32 parlevel = 0; | 1872 int32_t parlevel = 0; |
| 1873 FX_INT32 status = 0, iEscCode = 0; | 1873 int32_t status = 0, iEscCode = 0; |
| 1874 while (1) { | 1874 while (1) { |
| 1875 switch (status) { | 1875 switch (status) { |
| 1876 case 0: | 1876 case 0: |
| 1877 if (ch == ')') { | 1877 if (ch == ')') { |
| 1878 if (parlevel == 0) { | 1878 if (parlevel == 0) { |
| 1879 return buf.GetByteString(); | 1879 return buf.GetByteString(); |
| 1880 } | 1880 } |
| 1881 parlevel --; | 1881 parlevel --; |
| 1882 buf.AppendChar(')'); | 1882 buf.AppendChar(')'); |
| 1883 } else if (ch == '(') { | 1883 } else if (ch == '(') { |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1944 } | 1944 } |
| 1945 if (!GetNextChar(ch)) { | 1945 if (!GetNextChar(ch)) { |
| 1946 break; | 1946 break; |
| 1947 } | 1947 } |
| 1948 } | 1948 } |
| 1949 GetNextChar(ch); | 1949 GetNextChar(ch); |
| 1950 return buf.GetByteString(); | 1950 return buf.GetByteString(); |
| 1951 } | 1951 } |
| 1952 CFX_ByteString CPDF_SyntaxParser::ReadHexString() | 1952 CFX_ByteString CPDF_SyntaxParser::ReadHexString() |
| 1953 { | 1953 { |
| 1954 FX_BYTE ch; | 1954 uint8_t ch; |
| 1955 if (!GetNextChar(ch)) { | 1955 if (!GetNextChar(ch)) { |
| 1956 return CFX_ByteString(); | 1956 return CFX_ByteString(); |
| 1957 } | 1957 } |
| 1958 CFX_BinaryBuf buf; | 1958 CFX_BinaryBuf buf; |
| 1959 FX_BOOL bFirst = TRUE; | 1959 FX_BOOL bFirst = TRUE; |
| 1960 FX_BYTE code = 0; | 1960 uint8_t code = 0; |
| 1961 while (1) { | 1961 while (1) { |
| 1962 if (ch == '>') { | 1962 if (ch == '>') { |
| 1963 break; | 1963 break; |
| 1964 } | 1964 } |
| 1965 if (ch >= '0' && ch <= '9') { | 1965 if (ch >= '0' && ch <= '9') { |
| 1966 if (bFirst) { | 1966 if (bFirst) { |
| 1967 code = (ch - '0') * 16; | 1967 code = (ch - '0') * 16; |
| 1968 } else { | 1968 } else { |
| 1969 code += ch - '0'; | 1969 code += ch - '0'; |
| 1970 buf.AppendByte((FX_BYTE)code); | 1970 buf.AppendByte((uint8_t)code); |
| 1971 } | 1971 } |
| 1972 bFirst = !bFirst; | 1972 bFirst = !bFirst; |
| 1973 } else if (ch >= 'A' && ch <= 'F') { | 1973 } else if (ch >= 'A' && ch <= 'F') { |
| 1974 if (bFirst) { | 1974 if (bFirst) { |
| 1975 code = (ch - 'A' + 10) * 16; | 1975 code = (ch - 'A' + 10) * 16; |
| 1976 } else { | 1976 } else { |
| 1977 code += ch - 'A' + 10; | 1977 code += ch - 'A' + 10; |
| 1978 buf.AppendByte((FX_BYTE)code); | 1978 buf.AppendByte((uint8_t)code); |
| 1979 } | 1979 } |
| 1980 bFirst = !bFirst; | 1980 bFirst = !bFirst; |
| 1981 } else if (ch >= 'a' && ch <= 'f') { | 1981 } else if (ch >= 'a' && ch <= 'f') { |
| 1982 if (bFirst) { | 1982 if (bFirst) { |
| 1983 code = (ch - 'a' + 10) * 16; | 1983 code = (ch - 'a' + 10) * 16; |
| 1984 } else { | 1984 } else { |
| 1985 code += ch - 'a' + 10; | 1985 code += ch - 'a' + 10; |
| 1986 buf.AppendByte((FX_BYTE)code); | 1986 buf.AppendByte((uint8_t)code); |
| 1987 } | 1987 } |
| 1988 bFirst = !bFirst; | 1988 bFirst = !bFirst; |
| 1989 } | 1989 } |
| 1990 if (!GetNextChar(ch)) { | 1990 if (!GetNextChar(ch)) { |
| 1991 break; | 1991 break; |
| 1992 } | 1992 } |
| 1993 } | 1993 } |
| 1994 if (!bFirst) { | 1994 if (!bFirst) { |
| 1995 buf.AppendByte((FX_BYTE)code); | 1995 buf.AppendByte((uint8_t)code); |
| 1996 } | 1996 } |
| 1997 return buf.GetByteString(); | 1997 return buf.GetByteString(); |
| 1998 } | 1998 } |
| 1999 void CPDF_SyntaxParser::ToNextLine() | 1999 void CPDF_SyntaxParser::ToNextLine() |
| 2000 { | 2000 { |
| 2001 FX_BYTE ch; | 2001 uint8_t ch; |
| 2002 while (1) { | 2002 while (1) { |
| 2003 if (!GetNextChar(ch)) { | 2003 if (!GetNextChar(ch)) { |
| 2004 return; | 2004 return; |
| 2005 } | 2005 } |
| 2006 if (ch == '\n') { | 2006 if (ch == '\n') { |
| 2007 return; | 2007 return; |
| 2008 } | 2008 } |
| 2009 if (ch == '\r') { | 2009 if (ch == '\r') { |
| 2010 GetNextChar(ch); | 2010 GetNextChar(ch); |
| 2011 if (ch == '\n') { | 2011 if (ch == '\n') { |
| 2012 return; | 2012 return; |
| 2013 } else { | 2013 } else { |
| 2014 m_Pos --; | 2014 m_Pos --; |
| 2015 return; | 2015 return; |
| 2016 } | 2016 } |
| 2017 } | 2017 } |
| 2018 } | 2018 } |
| 2019 } | 2019 } |
| 2020 void CPDF_SyntaxParser::ToNextWord() | 2020 void CPDF_SyntaxParser::ToNextWord() |
| 2021 { | 2021 { |
| 2022 FX_BYTE ch; | 2022 uint8_t ch; |
| 2023 if (!GetNextChar(ch)) { | 2023 if (!GetNextChar(ch)) { |
| 2024 return; | 2024 return; |
| 2025 } | 2025 } |
| 2026 FX_BYTE type = PDF_CharType[ch]; | 2026 uint8_t type = PDF_CharType[ch]; |
| 2027 while (1) { | 2027 while (1) { |
| 2028 while (type == 'W') { | 2028 while (type == 'W') { |
| 2029 m_dwWordPos = m_Pos; | 2029 m_dwWordPos = m_Pos; |
| 2030 if (!GetNextChar(ch)) { | 2030 if (!GetNextChar(ch)) { |
| 2031 return; | 2031 return; |
| 2032 } | 2032 } |
| 2033 type = PDF_CharType[ch]; | 2033 type = PDF_CharType[ch]; |
| 2034 } | 2034 } |
| 2035 if (ch != '%') { | 2035 if (ch != '%') { |
| 2036 break; | 2036 break; |
| (...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2161 return pRet; | 2161 return pRet; |
| 2162 } | 2162 } |
| 2163 if (word == FX_BSTRC("<<")) { | 2163 if (word == FX_BSTRC("<<")) { |
| 2164 if (bTypeOnly) { | 2164 if (bTypeOnly) { |
| 2165 return (CPDF_Object*)PDFOBJ_DICTIONARY; | 2165 return (CPDF_Object*)PDFOBJ_DICTIONARY; |
| 2166 } | 2166 } |
| 2167 if (pContext) { | 2167 if (pContext) { |
| 2168 pContext->m_DictStart = SavedPos; | 2168 pContext->m_DictStart = SavedPos; |
| 2169 } | 2169 } |
| 2170 CPDF_Dictionary* pDict = CPDF_Dictionary::Create(); | 2170 CPDF_Dictionary* pDict = CPDF_Dictionary::Create(); |
| 2171 FX_INT32 nKeys = 0; | 2171 int32_t nKeys = 0; |
| 2172 FX_FILESIZE dwSignValuePos = 0; | 2172 FX_FILESIZE dwSignValuePos = 0; |
| 2173 while (1) { | 2173 while (1) { |
| 2174 FX_BOOL bIsNumber; | 2174 FX_BOOL bIsNumber; |
| 2175 CFX_ByteString key = GetNextWord(bIsNumber); | 2175 CFX_ByteString key = GetNextWord(bIsNumber); |
| 2176 if (key.IsEmpty()) { | 2176 if (key.IsEmpty()) { |
| 2177 if (pDict) | 2177 if (pDict) |
| 2178 pDict->Release(); | 2178 pDict->Release(); |
| 2179 return NULL; | 2179 return NULL; |
| 2180 } | 2180 } |
| 2181 FX_FILESIZE SavedPos = m_Pos - key.GetLength(); | 2181 FX_FILESIZE SavedPos = m_Pos - key.GetLength(); |
| (...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2370 } | 2370 } |
| 2371 if (key[0] != '/') { | 2371 if (key[0] != '/') { |
| 2372 continue; | 2372 continue; |
| 2373 } | 2373 } |
| 2374 key = PDF_NameDecode(key); | 2374 key = PDF_NameDecode(key); |
| 2375 CPDF_Object* pObj = GetObject(pObjList, objnum, gennum); | 2375 CPDF_Object* pObj = GetObject(pObjList, objnum, gennum); |
| 2376 if (pObj == NULL) { | 2376 if (pObj == NULL) { |
| 2377 if (pDict) { | 2377 if (pDict) { |
| 2378 pDict->Release(); | 2378 pDict->Release(); |
| 2379 } | 2379 } |
| 2380 FX_BYTE ch; | 2380 uint8_t ch; |
| 2381 while (1) { | 2381 while (1) { |
| 2382 if (!GetNextChar(ch)) { | 2382 if (!GetNextChar(ch)) { |
| 2383 break; | 2383 break; |
| 2384 } | 2384 } |
| 2385 if (ch == 0x0A || ch == 0x0D) { | 2385 if (ch == 0x0A || ch == 0x0D) { |
| 2386 break; | 2386 break; |
| 2387 } | 2387 } |
| 2388 } | 2388 } |
| 2389 return NULL; | 2389 return NULL; |
| 2390 } | 2390 } |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2454 FX_FILESIZE offset = FindTag(FX_BSTRC("endstream"), 0); | 2454 FX_FILESIZE offset = FindTag(FX_BSTRC("endstream"), 0); |
| 2455 if (offset >= 0) { | 2455 if (offset >= 0) { |
| 2456 FX_FILESIZE curPos = m_Pos; | 2456 FX_FILESIZE curPos = m_Pos; |
| 2457 m_Pos = StreamStartPos; | 2457 m_Pos = StreamStartPos; |
| 2458 FX_FILESIZE endobjOffset = FindTag(FX_BSTRC("endobj"), 0); | 2458 FX_FILESIZE endobjOffset = FindTag(FX_BSTRC("endobj"), 0); |
| 2459 if (endobjOffset < offset && endobjOffset >= 0) { | 2459 if (endobjOffset < offset && endobjOffset >= 0) { |
| 2460 offset = endobjOffset; | 2460 offset = endobjOffset; |
| 2461 } else { | 2461 } else { |
| 2462 m_Pos = curPos; | 2462 m_Pos = curPos; |
| 2463 } | 2463 } |
| 2464 FX_BYTE byte1, byte2; | 2464 uint8_t byte1, byte2; |
| 2465 GetCharAt(StreamStartPos + offset - 1, byte1); | 2465 GetCharAt(StreamStartPos + offset - 1, byte1); |
| 2466 GetCharAt(StreamStartPos + offset - 2, byte2); | 2466 GetCharAt(StreamStartPos + offset - 2, byte2); |
| 2467 if (byte1 == 0x0a && byte2 == 0x0d) { | 2467 if (byte1 == 0x0a && byte2 == 0x0d) { |
| 2468 len -= 2; | 2468 len -= 2; |
| 2469 } else if (byte1 == 0x0a || byte1 == 0x0d) { | 2469 } else if (byte1 == 0x0a || byte1 == 0x0d) { |
| 2470 len --; | 2470 len --; |
| 2471 } | 2471 } |
| 2472 len = (FX_DWORD)offset; | 2472 len = (FX_DWORD)offset; |
| 2473 pDict->SetAtInteger(FX_BSTRC("Length"), len); | 2473 pDict->SetAtInteger(FX_BSTRC("Length"), len); |
| 2474 } else { | 2474 } else { |
| 2475 m_Pos = StreamStartPos; | 2475 m_Pos = StreamStartPos; |
| 2476 if (FindTag(FX_BSTRC("endobj"), 0) < 0) { | 2476 if (FindTag(FX_BSTRC("endobj"), 0) < 0) { |
| 2477 return NULL; | 2477 return NULL; |
| 2478 } | 2478 } |
| 2479 } | 2479 } |
| 2480 } | 2480 } |
| 2481 m_Pos = StreamStartPos; | 2481 m_Pos = StreamStartPos; |
| 2482 } | 2482 } |
| 2483 CPDF_Stream* pStream; | 2483 CPDF_Stream* pStream; |
| 2484 FX_LPBYTE pData = FX_Alloc(FX_BYTE, len); | 2484 FX_LPBYTE pData = FX_Alloc(uint8_t, len); |
| 2485 ReadBlock(pData, len); | 2485 ReadBlock(pData, len); |
| 2486 if (pCryptoHandler) { | 2486 if (pCryptoHandler) { |
| 2487 CFX_BinaryBuf dest_buf; | 2487 CFX_BinaryBuf dest_buf; |
| 2488 dest_buf.EstimateSize(pCryptoHandler->DecryptGetSize(len)); | 2488 dest_buf.EstimateSize(pCryptoHandler->DecryptGetSize(len)); |
| 2489 FX_LPVOID context = pCryptoHandler->DecryptStart(objnum, gennum); | 2489 FX_LPVOID context = pCryptoHandler->DecryptStart(objnum, gennum); |
| 2490 pCryptoHandler->DecryptStream(context, pData, len, dest_buf); | 2490 pCryptoHandler->DecryptStream(context, pData, len, dest_buf); |
| 2491 pCryptoHandler->DecryptFinish(context, dest_buf); | 2491 pCryptoHandler->DecryptFinish(context, dest_buf); |
| 2492 FX_Free(pData); | 2492 FX_Free(pData); |
| 2493 pData = dest_buf.GetBuffer(); | 2493 pData = dest_buf.GetBuffer(); |
| 2494 len = dest_buf.GetSize(); | 2494 len = dest_buf.GetSize(); |
| 2495 dest_buf.DetachBuffer(); | 2495 dest_buf.DetachBuffer(); |
| 2496 } | 2496 } |
| 2497 pStream = new CPDF_Stream(pData, len, pDict); | 2497 pStream = new CPDF_Stream(pData, len, pDict); |
| 2498 if (pContext) { | 2498 if (pContext) { |
| 2499 pContext->m_DataEnd = pContext->m_DataStart + len; | 2499 pContext->m_DataEnd = pContext->m_DataStart + len; |
| 2500 } | 2500 } |
| 2501 StreamStartPos = m_Pos; | 2501 StreamStartPos = m_Pos; |
| 2502 GetNextWord(); | 2502 GetNextWord(); |
| 2503 if (m_WordSize == 6 && 0 == FXSYS_memcmp32(m_WordBuffer, "endobj", 6)) { | 2503 if (m_WordSize == 6 && 0 == FXSYS_memcmp32(m_WordBuffer, "endobj", 6)) { |
| 2504 m_Pos = StreamStartPos; | 2504 m_Pos = StreamStartPos; |
| 2505 } | 2505 } |
| 2506 return pStream; | 2506 return pStream; |
| 2507 } | 2507 } |
| 2508 void CPDF_SyntaxParser::InitParser(IFX_FileRead* pFileAccess, FX_DWORD HeaderOff
set) | 2508 void CPDF_SyntaxParser::InitParser(IFX_FileRead* pFileAccess, FX_DWORD HeaderOff
set) |
| 2509 { | 2509 { |
| 2510 if (m_pFileBuf) { | 2510 if (m_pFileBuf) { |
| 2511 FX_Free(m_pFileBuf); | 2511 FX_Free(m_pFileBuf); |
| 2512 m_pFileBuf = NULL; | 2512 m_pFileBuf = NULL; |
| 2513 } | 2513 } |
| 2514 m_pFileBuf = FX_Alloc(FX_BYTE, m_BufSize); | 2514 m_pFileBuf = FX_Alloc(uint8_t, m_BufSize); |
| 2515 m_HeaderOffset = HeaderOffset; | 2515 m_HeaderOffset = HeaderOffset; |
| 2516 m_FileLen = pFileAccess->GetSize(); | 2516 m_FileLen = pFileAccess->GetSize(); |
| 2517 m_Pos = 0; | 2517 m_Pos = 0; |
| 2518 m_pFileAccess = pFileAccess; | 2518 m_pFileAccess = pFileAccess; |
| 2519 m_BufOffset = 0; | 2519 m_BufOffset = 0; |
| 2520 pFileAccess->ReadBlock(m_pFileBuf, 0, (size_t)((FX_FILESIZE)m_BufSize > m_Fi
leLen ? m_FileLen : m_BufSize)); | 2520 pFileAccess->ReadBlock(m_pFileBuf, 0, (size_t)((FX_FILESIZE)m_BufSize > m_Fi
leLen ? m_FileLen : m_BufSize)); |
| 2521 } | 2521 } |
| 2522 FX_INT32 CPDF_SyntaxParser::GetDirectNum() | 2522 int32_t CPDF_SyntaxParser::GetDirectNum() |
| 2523 { | 2523 { |
| 2524 GetNextWord(); | 2524 GetNextWord(); |
| 2525 if (!m_bIsNumber) { | 2525 if (!m_bIsNumber) { |
| 2526 return 0; | 2526 return 0; |
| 2527 } | 2527 } |
| 2528 m_WordBuffer[m_WordSize] = 0; | 2528 m_WordBuffer[m_WordSize] = 0; |
| 2529 return FXSYS_atoi((FX_LPCSTR)m_WordBuffer); | 2529 return FXSYS_atoi((FX_LPCSTR)m_WordBuffer); |
| 2530 } | 2530 } |
| 2531 FX_BOOL CPDF_SyntaxParser::IsWholeWord(FX_FILESIZE startpos, FX_FILESIZE limit,
FX_LPCBYTE tag, FX_DWORD taglen) | 2531 FX_BOOL CPDF_SyntaxParser::IsWholeWord(FX_FILESIZE startpos, FX_FILESIZE limit,
FX_LPCBYTE tag, FX_DWORD taglen) |
| 2532 { | 2532 { |
| 2533 FX_BYTE type = PDF_CharType[tag[0]]; | 2533 uint8_t type = PDF_CharType[tag[0]]; |
| 2534 FX_BOOL bCheckLeft = type != 'D' && type != 'W'; | 2534 FX_BOOL bCheckLeft = type != 'D' && type != 'W'; |
| 2535 type = PDF_CharType[tag[taglen - 1]]; | 2535 type = PDF_CharType[tag[taglen - 1]]; |
| 2536 FX_BOOL bCheckRight = type != 'D' && type != 'W'; | 2536 FX_BOOL bCheckRight = type != 'D' && type != 'W'; |
| 2537 FX_BYTE ch; | 2537 uint8_t ch; |
| 2538 if (bCheckRight && startpos + (FX_INT32)taglen <= limit && GetCharAt(startpo
s + (FX_INT32)taglen, ch)) { | 2538 if (bCheckRight && startpos + (int32_t)taglen <= limit && GetCharAt(startpos
+ (int32_t)taglen, ch)) { |
| 2539 FX_BYTE type = PDF_CharType[ch]; | 2539 uint8_t type = PDF_CharType[ch]; |
| 2540 if (type == 'N' || type == 'R') { | 2540 if (type == 'N' || type == 'R') { |
| 2541 return FALSE; | 2541 return FALSE; |
| 2542 } | 2542 } |
| 2543 } | 2543 } |
| 2544 if (bCheckLeft && startpos > 0 && GetCharAt(startpos - 1, ch)) { | 2544 if (bCheckLeft && startpos > 0 && GetCharAt(startpos - 1, ch)) { |
| 2545 FX_BYTE type = PDF_CharType[ch]; | 2545 uint8_t type = PDF_CharType[ch]; |
| 2546 if (type == 'N' || type == 'R') { | 2546 if (type == 'N' || type == 'R') { |
| 2547 return FALSE; | 2547 return FALSE; |
| 2548 } | 2548 } |
| 2549 } | 2549 } |
| 2550 return TRUE; | 2550 return TRUE; |
| 2551 } | 2551 } |
| 2552 FX_BOOL CPDF_SyntaxParser::SearchWord(FX_BSTR tag, FX_BOOL bWholeWord, FX_BOOL b
Forward, FX_FILESIZE limit) | 2552 FX_BOOL CPDF_SyntaxParser::SearchWord(FX_BSTR tag, FX_BOOL bWholeWord, FX_BOOL b
Forward, FX_FILESIZE limit) |
| 2553 { | 2553 { |
| 2554 FX_INT32 taglen = tag.GetLength(); | 2554 int32_t taglen = tag.GetLength(); |
| 2555 if (taglen == 0) { | 2555 if (taglen == 0) { |
| 2556 return FALSE; | 2556 return FALSE; |
| 2557 } | 2557 } |
| 2558 FX_FILESIZE pos = m_Pos; | 2558 FX_FILESIZE pos = m_Pos; |
| 2559 FX_INT32 offset = 0; | 2559 int32_t offset = 0; |
| 2560 if (!bForward) { | 2560 if (!bForward) { |
| 2561 offset = taglen - 1; | 2561 offset = taglen - 1; |
| 2562 } | 2562 } |
| 2563 FX_LPCBYTE tag_data = tag.GetPtr(); | 2563 FX_LPCBYTE tag_data = tag.GetPtr(); |
| 2564 FX_BYTE byte; | 2564 uint8_t byte; |
| 2565 while (1) { | 2565 while (1) { |
| 2566 if (bForward) { | 2566 if (bForward) { |
| 2567 if (limit) { | 2567 if (limit) { |
| 2568 if (pos >= m_Pos + limit) { | 2568 if (pos >= m_Pos + limit) { |
| 2569 return FALSE; | 2569 return FALSE; |
| 2570 } | 2570 } |
| 2571 } | 2571 } |
| 2572 if (!GetCharAt(pos, byte)) { | 2572 if (!GetCharAt(pos, byte)) { |
| 2573 return FALSE; | 2573 return FALSE; |
| 2574 } | 2574 } |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2613 return FALSE; | 2613 return FALSE; |
| 2614 } | 2614 } |
| 2615 } | 2615 } |
| 2616 return FALSE; | 2616 return FALSE; |
| 2617 } | 2617 } |
| 2618 struct _SearchTagRecord { | 2618 struct _SearchTagRecord { |
| 2619 FX_LPCBYTE m_pTag; | 2619 FX_LPCBYTE m_pTag; |
| 2620 FX_DWORD m_Len; | 2620 FX_DWORD m_Len; |
| 2621 FX_DWORD m_Offset; | 2621 FX_DWORD m_Offset; |
| 2622 }; | 2622 }; |
| 2623 FX_INT32 CPDF_SyntaxParser::SearchMultiWord(FX_BSTR tags, FX_BOOL bWholeWord, FX
_FILESIZE limit) | 2623 int32_t CPDF_SyntaxParser::SearchMultiWord(FX_BSTR tags, FX_BOOL bWholeWord, FX_
FILESIZE limit) |
| 2624 { | 2624 { |
| 2625 FX_INT32 ntags = 1, i; | 2625 int32_t ntags = 1, i; |
| 2626 for (i = 0; i < tags.GetLength(); i ++) | 2626 for (i = 0; i < tags.GetLength(); i ++) |
| 2627 if (tags[i] == 0) { | 2627 if (tags[i] == 0) { |
| 2628 ntags ++; | 2628 ntags ++; |
| 2629 } | 2629 } |
| 2630 _SearchTagRecord* pPatterns = FX_Alloc(_SearchTagRecord, ntags); | 2630 _SearchTagRecord* pPatterns = FX_Alloc(_SearchTagRecord, ntags); |
| 2631 FX_DWORD start = 0, itag = 0, max_len = 0; | 2631 FX_DWORD start = 0, itag = 0, max_len = 0; |
| 2632 for (i = 0; i <= tags.GetLength(); i ++) { | 2632 for (i = 0; i <= tags.GetLength(); i ++) { |
| 2633 if (tags[i] == 0) { | 2633 if (tags[i] == 0) { |
| 2634 FX_DWORD len = i - start; | 2634 FX_DWORD len = i - start; |
| 2635 if (len > max_len) { | 2635 if (len > max_len) { |
| 2636 max_len = len; | 2636 max_len = len; |
| 2637 } | 2637 } |
| 2638 pPatterns[itag].m_pTag = tags.GetPtr() + start; | 2638 pPatterns[itag].m_pTag = tags.GetPtr() + start; |
| 2639 pPatterns[itag].m_Len = len; | 2639 pPatterns[itag].m_Len = len; |
| 2640 pPatterns[itag].m_Offset = 0; | 2640 pPatterns[itag].m_Offset = 0; |
| 2641 start = i + 1; | 2641 start = i + 1; |
| 2642 itag ++; | 2642 itag ++; |
| 2643 } | 2643 } |
| 2644 } | 2644 } |
| 2645 FX_FILESIZE pos = m_Pos; | 2645 FX_FILESIZE pos = m_Pos; |
| 2646 FX_BYTE byte; | 2646 uint8_t byte; |
| 2647 GetCharAt(pos++, byte); | 2647 GetCharAt(pos++, byte); |
| 2648 FX_INT32 found = -1; | 2648 int32_t found = -1; |
| 2649 while (1) { | 2649 while (1) { |
| 2650 for (i = 0; i < ntags; i ++) { | 2650 for (i = 0; i < ntags; i ++) { |
| 2651 if (pPatterns[i].m_pTag[pPatterns[i].m_Offset] == byte) { | 2651 if (pPatterns[i].m_pTag[pPatterns[i].m_Offset] == byte) { |
| 2652 pPatterns[i].m_Offset ++; | 2652 pPatterns[i].m_Offset ++; |
| 2653 if (pPatterns[i].m_Offset == pPatterns[i].m_Len) { | 2653 if (pPatterns[i].m_Offset == pPatterns[i].m_Len) { |
| 2654 if (!bWholeWord || IsWholeWord(pos - pPatterns[i].m_Len, lim
it, pPatterns[i].m_pTag, pPatterns[i].m_Len)) { | 2654 if (!bWholeWord || IsWholeWord(pos - pPatterns[i].m_Len, lim
it, pPatterns[i].m_pTag, pPatterns[i].m_Len)) { |
| 2655 found = i; | 2655 found = i; |
| 2656 goto end; | 2656 goto end; |
| 2657 } else { | 2657 } else { |
| 2658 if (pPatterns[i].m_pTag[0] == byte) { | 2658 if (pPatterns[i].m_pTag[0] == byte) { |
| (...skipping 18 matching lines...) Expand all Loading... |
| 2677 goto end; | 2677 goto end; |
| 2678 } | 2678 } |
| 2679 pos ++; | 2679 pos ++; |
| 2680 } | 2680 } |
| 2681 end: | 2681 end: |
| 2682 FX_Free(pPatterns); | 2682 FX_Free(pPatterns); |
| 2683 return found; | 2683 return found; |
| 2684 } | 2684 } |
| 2685 FX_FILESIZE CPDF_SyntaxParser::FindTag(FX_BSTR tag, FX_FILESIZE limit) | 2685 FX_FILESIZE CPDF_SyntaxParser::FindTag(FX_BSTR tag, FX_FILESIZE limit) |
| 2686 { | 2686 { |
| 2687 FX_INT32 taglen = tag.GetLength(); | 2687 int32_t taglen = tag.GetLength(); |
| 2688 FX_INT32 match = 0; | 2688 int32_t match = 0; |
| 2689 limit += m_Pos; | 2689 limit += m_Pos; |
| 2690 FX_FILESIZE startpos = m_Pos; | 2690 FX_FILESIZE startpos = m_Pos; |
| 2691 while (1) { | 2691 while (1) { |
| 2692 FX_BYTE ch; | 2692 uint8_t ch; |
| 2693 if (!GetNextChar(ch)) { | 2693 if (!GetNextChar(ch)) { |
| 2694 return -1; | 2694 return -1; |
| 2695 } | 2695 } |
| 2696 if (ch == tag[match]) { | 2696 if (ch == tag[match]) { |
| 2697 match ++; | 2697 match ++; |
| 2698 if (match == taglen) { | 2698 if (match == taglen) { |
| 2699 return m_Pos - startpos - taglen; | 2699 return m_Pos - startpos - taglen; |
| 2700 } | 2700 } |
| 2701 } else { | 2701 } else { |
| 2702 match = ch == tag[0] ? 1 : 0; | 2702 match = ch == tag[0] ? 1 : 0; |
| 2703 } | 2703 } |
| 2704 if (limit && m_Pos == limit) { | 2704 if (limit && m_Pos == limit) { |
| 2705 return -1; | 2705 return -1; |
| 2706 } | 2706 } |
| 2707 } | 2707 } |
| 2708 return -1; | 2708 return -1; |
| 2709 } | 2709 } |
| 2710 void CPDF_SyntaxParser::GetBinary(FX_BYTE* buffer, FX_DWORD size) | 2710 void CPDF_SyntaxParser::GetBinary(uint8_t* buffer, FX_DWORD size) |
| 2711 { | 2711 { |
| 2712 FX_DWORD offset = 0; | 2712 FX_DWORD offset = 0; |
| 2713 FX_BYTE ch; | 2713 uint8_t ch; |
| 2714 while (1) { | 2714 while (1) { |
| 2715 if (!GetNextChar(ch)) { | 2715 if (!GetNextChar(ch)) { |
| 2716 return; | 2716 return; |
| 2717 } | 2717 } |
| 2718 buffer[offset++] = ch; | 2718 buffer[offset++] = ch; |
| 2719 if (offset == size) { | 2719 if (offset == size) { |
| 2720 break; | 2720 break; |
| 2721 } | 2721 } |
| 2722 } | 2722 } |
| 2723 } | 2723 } |
| 2724 | 2724 |
| 2725 class CPDF_DataAvail final : public IPDF_DataAvail | 2725 class CPDF_DataAvail final : public IPDF_DataAvail |
| 2726 { | 2726 { |
| 2727 public: | 2727 public: |
| 2728 CPDF_DataAvail(IFX_FileAvail* pFileAvail, IFX_FileRead* pFileRead); | 2728 CPDF_DataAvail(IFX_FileAvail* pFileAvail, IFX_FileRead* pFileRead); |
| 2729 ~CPDF_DataAvail(); | 2729 ~CPDF_DataAvail(); |
| 2730 | 2730 |
| 2731 virtual FX_BOOL IsDocAvail(IFX_DownloadHints* pHints) o
verride; | 2731 virtual FX_BOOL IsDocAvail(IFX_DownloadHints* pHints) o
verride; |
| 2732 | 2732 |
| 2733 virtual void SetDocument(CPDF_Document* pDoc) overri
de; | 2733 virtual void SetDocument(CPDF_Document* pDoc) overri
de; |
| 2734 | 2734 |
| 2735 virtual FX_BOOL IsPageAvail(int iPage, IFX_DownloadHints
* pHints) override; | 2735 virtual FX_BOOL IsPageAvail(int iPage, IFX_DownloadHints
* pHints) override; |
| 2736 | 2736 |
| 2737 virtual FX_INT32 IsFormAvail(IFX_DownloadHints *pHints)
override; | 2737 virtual int32_t IsFormAvail(IFX_DownloadHints *pHints)
override; |
| 2738 | 2738 |
| 2739 virtual FX_INT32 IsLinearizedPDF() override; | 2739 virtual int32_t IsLinearizedPDF() override; |
| 2740 | 2740 |
| 2741 virtual FX_BOOL IsLinearized() override | 2741 virtual FX_BOOL IsLinearized() override |
| 2742 { | 2742 { |
| 2743 return m_bLinearized; | 2743 return m_bLinearized; |
| 2744 } | 2744 } |
| 2745 | 2745 |
| 2746 virtual void GetLinearizedMainXRefInfo(FX_FILESIZE *p
Pos, FX_DWORD *pSize) override; | 2746 virtual void GetLinearizedMainXRefInfo(FX_FILESIZE *p
Pos, FX_DWORD *pSize) override; |
| 2747 | 2747 |
| 2748 protected: | 2748 protected: |
| 2749 static const int kMaxDataAvailRecursionDepth = 64; | 2749 static const int kMaxDataAvailRecursionDepth = 64; |
| (...skipping 13 matching lines...) Expand all Loading... |
| 2763 FX_BOOL CheckPages(IFX_DownloadHints* pHints); | 2763 FX_BOOL CheckPages(IFX_DownloadHints* pHints); |
| 2764 FX_BOOL CheckPage(IFX_DownloadHints* pHints); | 2764 FX_BOOL CheckPage(IFX_DownloadHints* pHints); |
| 2765 FX_BOOL CheckResources(IFX_DownloadHints* pHints
); | 2765 FX_BOOL CheckResources(IFX_DownloadHints* pHints
); |
| 2766 FX_BOOL CheckAnnots(IFX_DownloadHints* pHints); | 2766 FX_BOOL CheckAnnots(IFX_DownloadHints* pHints); |
| 2767 FX_BOOL CheckAcroForm(IFX_DownloadHints* pHints)
; | 2767 FX_BOOL CheckAcroForm(IFX_DownloadHints* pHints)
; |
| 2768 FX_BOOL CheckAcroFormSubObject(IFX_DownloadHints
* pHints); | 2768 FX_BOOL CheckAcroFormSubObject(IFX_DownloadHints
* pHints); |
| 2769 FX_BOOL CheckTrailerAppend(IFX_DownloadHints* pH
ints); | 2769 FX_BOOL CheckTrailerAppend(IFX_DownloadHints* pH
ints); |
| 2770 FX_BOOL CheckPageStatus(IFX_DownloadHints* pHint
s); | 2770 FX_BOOL CheckPageStatus(IFX_DownloadHints* pHint
s); |
| 2771 FX_BOOL CheckAllCrossRefStream(IFX_DownloadHints
*pHints); | 2771 FX_BOOL CheckAllCrossRefStream(IFX_DownloadHints
*pHints); |
| 2772 | 2772 |
| 2773 FX_INT32 CheckCrossRefStream(IFX_DownloadHints *p
Hints, FX_FILESIZE &xref_offset); | 2773 int32_t CheckCrossRefStream(IFX_DownloadHints *pH
ints, FX_FILESIZE &xref_offset); |
| 2774 FX_BOOL IsLinearizedFile(FX_LPBYTE pData, FX_DWO
RD dwLen); | 2774 FX_BOOL IsLinearizedFile(FX_LPBYTE pData, FX_DWO
RD dwLen); |
| 2775 void SetStartOffset(FX_FILESIZE dwOffset); | 2775 void SetStartOffset(FX_FILESIZE dwOffset); |
| 2776 FX_BOOL GetNextToken(CFX_ByteString &token); | 2776 FX_BOOL GetNextToken(CFX_ByteString &token); |
| 2777 FX_BOOL GetNextChar(FX_BYTE &ch); | 2777 FX_BOOL GetNextChar(uint8_t &ch); |
| 2778 CPDF_Object * ParseIndirectObjectAt(FX_FILESIZE pos, F
X_DWORD objnum); | 2778 CPDF_Object * ParseIndirectObjectAt(FX_FILESIZE pos, F
X_DWORD objnum); |
| 2779 CPDF_Object * GetObject(FX_DWORD objnum, IFX_DownloadH
ints* pHints, FX_BOOL *pExistInFile); | 2779 CPDF_Object * GetObject(FX_DWORD objnum, IFX_DownloadH
ints* pHints, FX_BOOL *pExistInFile); |
| 2780 FX_BOOL GetPageKids(CPDF_Parser *pParser, CPDF_O
bject *pPages); | 2780 FX_BOOL GetPageKids(CPDF_Parser *pParser, CPDF_O
bject *pPages); |
| 2781 FX_BOOL PreparePageItem(); | 2781 FX_BOOL PreparePageItem(); |
| 2782 FX_BOOL LoadPages(IFX_DownloadHints* pHints); | 2782 FX_BOOL LoadPages(IFX_DownloadHints* pHints); |
| 2783 FX_BOOL LoadAllXref(IFX_DownloadHints* pHints); | 2783 FX_BOOL LoadAllXref(IFX_DownloadHints* pHints); |
| 2784 FX_BOOL LoadAllFile(IFX_DownloadHints* pHints); | 2784 FX_BOOL LoadAllFile(IFX_DownloadHints* pHints); |
| 2785 FX_BOOL CheckLinearizedData(IFX_DownloadHints* p
Hints); | 2785 FX_BOOL CheckLinearizedData(IFX_DownloadHints* p
Hints); |
| 2786 FX_BOOL CheckFileResources(IFX_DownloadHints* pH
ints); | 2786 FX_BOOL CheckFileResources(IFX_DownloadHints* pH
ints); |
| 2787 FX_BOOL CheckPageAnnots(int iPage, IFX_DownloadH
ints* pHints); | 2787 FX_BOOL CheckPageAnnots(int iPage, IFX_DownloadH
ints* pHints); |
| 2788 | 2788 |
| 2789 FX_BOOL CheckLinearizedFirstPage(int iPage, IFX_
DownloadHints* pHints); | 2789 FX_BOOL CheckLinearizedFirstPage(int iPage, IFX_
DownloadHints* pHints); |
| 2790 FX_BOOL HaveResourceAncestor(CPDF_Dictionary *pD
ict); | 2790 FX_BOOL HaveResourceAncestor(CPDF_Dictionary *pD
ict); |
| 2791 FX_BOOL CheckPage(FX_INT32 iPage, IFX_DownloadHi
nts* pHints); | 2791 FX_BOOL CheckPage(int32_t iPage, IFX_DownloadHin
ts* pHints); |
| 2792 FX_BOOL LoadDocPages(IFX_DownloadHints* pHints); | 2792 FX_BOOL LoadDocPages(IFX_DownloadHints* pHints); |
| 2793 FX_BOOL LoadDocPage(FX_INT32 iPage, IFX_Download
Hints* pHints); | 2793 FX_BOOL LoadDocPage(int32_t iPage, IFX_DownloadH
ints* pHints); |
| 2794 FX_BOOL CheckPageNode(CPDF_PageNode &pageNodes,
FX_INT32 iPage, FX_INT32 &iCount, IFX_DownloadHints* pHints); | 2794 FX_BOOL CheckPageNode(CPDF_PageNode &pageNodes,
int32_t iPage, int32_t &iCount, IFX_DownloadHints* pHints); |
| 2795 FX_BOOL CheckUnkownPageNode(FX_DWORD dwPageNo, C
PDF_PageNode *pPageNode, IFX_DownloadHints* pHints); | 2795 FX_BOOL CheckUnkownPageNode(FX_DWORD dwPageNo, C
PDF_PageNode *pPageNode, IFX_DownloadHints* pHints); |
| 2796 FX_BOOL CheckArrayPageNode(FX_DWORD dwPageNo, CP
DF_PageNode *pPageNode, IFX_DownloadHints* pHints); | 2796 FX_BOOL CheckArrayPageNode(FX_DWORD dwPageNo, CP
DF_PageNode *pPageNode, IFX_DownloadHints* pHints); |
| 2797 FX_BOOL CheckPageCount(IFX_DownloadHints* pHints
); | 2797 FX_BOOL CheckPageCount(IFX_DownloadHints* pHints
); |
| 2798 FX_BOOL IsFirstCheck(int iPage); | 2798 FX_BOOL IsFirstCheck(int iPage); |
| 2799 void ResetFirstCheck(int iPage); | 2799 void ResetFirstCheck(int iPage); |
| 2800 | 2800 |
| 2801 CPDF_Parser m_parser; | 2801 CPDF_Parser m_parser; |
| 2802 | 2802 |
| 2803 CPDF_SyntaxParser m_syntaxParser; | 2803 CPDF_SyntaxParser m_syntaxParser; |
| 2804 | 2804 |
| (...skipping 30 matching lines...) Expand all Loading... |
| 2835 CFX_PtrArray m_objs_array; | 2835 CFX_PtrArray m_objs_array; |
| 2836 | 2836 |
| 2837 FX_FILESIZE m_Pos; | 2837 FX_FILESIZE m_Pos; |
| 2838 | 2838 |
| 2839 FX_FILESIZE m_bufferOffset; | 2839 FX_FILESIZE m_bufferOffset; |
| 2840 | 2840 |
| 2841 FX_DWORD m_bufferSize; | 2841 FX_DWORD m_bufferSize; |
| 2842 | 2842 |
| 2843 CFX_ByteString m_WordBuf; | 2843 CFX_ByteString m_WordBuf; |
| 2844 | 2844 |
| 2845 FX_BYTE m_WordBuffer[257]; | 2845 uint8_t m_WordBuffer[257]; |
| 2846 | 2846 |
| 2847 FX_DWORD m_WordSize; | 2847 FX_DWORD m_WordSize; |
| 2848 | 2848 |
| 2849 FX_BYTE m_bufferData[512]; | 2849 uint8_t m_bufferData[512]; |
| 2850 | 2850 |
| 2851 CFX_FileSizeArray m_CrossOffset; | 2851 CFX_FileSizeArray m_CrossOffset; |
| 2852 | 2852 |
| 2853 CFX_DWordArray m_XRefStreamList; | 2853 CFX_DWordArray m_XRefStreamList; |
| 2854 | 2854 |
| 2855 CFX_DWordArray m_PageObjList; | 2855 CFX_DWordArray m_PageObjList; |
| 2856 | 2856 |
| 2857 FX_DWORD m_PagesObjNum; | 2857 FX_DWORD m_PagesObjNum; |
| 2858 | 2858 |
| 2859 FX_BOOL m_bLinearized; | 2859 FX_BOOL m_bLinearized; |
| (...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2987 } | 2987 } |
| 2988 if (m_pTrailer) { | 2988 if (m_pTrailer) { |
| 2989 m_pTrailer->Release(); | 2989 m_pTrailer->Release(); |
| 2990 } | 2990 } |
| 2991 if (m_pageMapCheckState) { | 2991 if (m_pageMapCheckState) { |
| 2992 delete m_pageMapCheckState; | 2992 delete m_pageMapCheckState; |
| 2993 } | 2993 } |
| 2994 if (m_pagesLoadState) { | 2994 if (m_pagesLoadState) { |
| 2995 delete m_pagesLoadState; | 2995 delete m_pagesLoadState; |
| 2996 } | 2996 } |
| 2997 FX_INT32 i = 0; | 2997 int32_t i = 0; |
| 2998 FX_INT32 iSize = m_arrayAcroforms.GetSize(); | 2998 int32_t iSize = m_arrayAcroforms.GetSize(); |
| 2999 for (i = 0; i < iSize; ++i) { | 2999 for (i = 0; i < iSize; ++i) { |
| 3000 ((CPDF_Object *)m_arrayAcroforms.GetAt(i))->Release(); | 3000 ((CPDF_Object *)m_arrayAcroforms.GetAt(i))->Release(); |
| 3001 } | 3001 } |
| 3002 } | 3002 } |
| 3003 void CPDF_DataAvail::SetDocument(CPDF_Document* pDoc) | 3003 void CPDF_DataAvail::SetDocument(CPDF_Document* pDoc) |
| 3004 { | 3004 { |
| 3005 m_pDocument = pDoc; | 3005 m_pDocument = pDoc; |
| 3006 } | 3006 } |
| 3007 FX_DWORD CPDF_DataAvail::GetObjectSize(FX_DWORD objnum, FX_FILESIZE& offset) | 3007 FX_DWORD CPDF_DataAvail::GetObjectSize(FX_DWORD objnum, FX_FILESIZE& offset) |
| 3008 { | 3008 { |
| (...skipping 23 matching lines...) Expand all Loading... |
| 3032 } | 3032 } |
| 3033 return 0; | 3033 return 0; |
| 3034 } | 3034 } |
| 3035 FX_BOOL CPDF_DataAvail::IsObjectsAvail(CFX_PtrArray& obj_array, FX_BOOL bParsePa
ge, IFX_DownloadHints* pHints, CFX_PtrArray &ret_array) | 3035 FX_BOOL CPDF_DataAvail::IsObjectsAvail(CFX_PtrArray& obj_array, FX_BOOL bParsePa
ge, IFX_DownloadHints* pHints, CFX_PtrArray &ret_array) |
| 3036 { | 3036 { |
| 3037 if (!obj_array.GetSize()) { | 3037 if (!obj_array.GetSize()) { |
| 3038 return TRUE; | 3038 return TRUE; |
| 3039 } | 3039 } |
| 3040 FX_DWORD count = 0; | 3040 FX_DWORD count = 0; |
| 3041 CFX_PtrArray new_obj_array; | 3041 CFX_PtrArray new_obj_array; |
| 3042 FX_INT32 i = 0; | 3042 int32_t i = 0; |
| 3043 for (i = 0; i < obj_array.GetSize(); i++) { | 3043 for (i = 0; i < obj_array.GetSize(); i++) { |
| 3044 CPDF_Object *pObj = (CPDF_Object *)obj_array[i]; | 3044 CPDF_Object *pObj = (CPDF_Object *)obj_array[i]; |
| 3045 if (!pObj) { | 3045 if (!pObj) { |
| 3046 continue; | 3046 continue; |
| 3047 } | 3047 } |
| 3048 FX_INT32 type = pObj->GetType(); | 3048 int32_t type = pObj->GetType(); |
| 3049 switch (type) { | 3049 switch (type) { |
| 3050 case PDFOBJ_ARRAY: { | 3050 case PDFOBJ_ARRAY: { |
| 3051 CPDF_Array *pArray = pObj->GetArray(); | 3051 CPDF_Array *pArray = pObj->GetArray(); |
| 3052 for (FX_DWORD k = 0; k < pArray->GetCount(); k++) { | 3052 for (FX_DWORD k = 0; k < pArray->GetCount(); k++) { |
| 3053 new_obj_array.Add(pArray->GetElement(k)); | 3053 new_obj_array.Add(pArray->GetElement(k)); |
| 3054 } | 3054 } |
| 3055 } | 3055 } |
| 3056 break; | 3056 break; |
| 3057 case PDFOBJ_STREAM: | 3057 case PDFOBJ_STREAM: |
| 3058 pObj = pObj->GetDict(); | 3058 pObj = pObj->GetDict(); |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3104 CPDF_Object *pReferred = m_pDocument->GetIndirectObject(
pRef->GetRefObjNum(), NULL); | 3104 CPDF_Object *pReferred = m_pDocument->GetIndirectObject(
pRef->GetRefObjNum(), NULL); |
| 3105 if (pReferred) { | 3105 if (pReferred) { |
| 3106 new_obj_array.Add(pReferred); | 3106 new_obj_array.Add(pReferred); |
| 3107 } | 3107 } |
| 3108 } | 3108 } |
| 3109 } | 3109 } |
| 3110 break; | 3110 break; |
| 3111 } | 3111 } |
| 3112 } | 3112 } |
| 3113 if (count > 0) { | 3113 if (count > 0) { |
| 3114 FX_INT32 iSize = new_obj_array.GetSize(); | 3114 int32_t iSize = new_obj_array.GetSize(); |
| 3115 for (i = 0; i < iSize; ++i) { | 3115 for (i = 0; i < iSize; ++i) { |
| 3116 CPDF_Object *pObj = (CPDF_Object *)new_obj_array[i]; | 3116 CPDF_Object *pObj = (CPDF_Object *)new_obj_array[i]; |
| 3117 FX_INT32 type = pObj->GetType(); | 3117 int32_t type = pObj->GetType(); |
| 3118 if (type == PDFOBJ_REFERENCE) { | 3118 if (type == PDFOBJ_REFERENCE) { |
| 3119 CPDF_Reference *pRef = (CPDF_Reference *)pObj; | 3119 CPDF_Reference *pRef = (CPDF_Reference *)pObj; |
| 3120 FX_DWORD dwNum = pRef->GetRefObjNum(); | 3120 FX_DWORD dwNum = pRef->GetRefObjNum(); |
| 3121 if (!m_objnum_array.Find(dwNum)) { | 3121 if (!m_objnum_array.Find(dwNum)) { |
| 3122 ret_array.Add(pObj); | 3122 ret_array.Add(pObj); |
| 3123 } | 3123 } |
| 3124 } else { | 3124 } else { |
| 3125 ret_array.Add(pObj); | 3125 ret_array.Add(pObj); |
| 3126 } | 3126 } |
| 3127 } | 3127 } |
| (...skipping 27 matching lines...) Expand all Loading... |
| 3155 obj_array.Append(m_arrayAcroforms); | 3155 obj_array.Append(m_arrayAcroforms); |
| 3156 FX_BOOL bRet = IsObjectsAvail(obj_array, FALSE, pHints, m_objs_array); | 3156 FX_BOOL bRet = IsObjectsAvail(obj_array, FALSE, pHints, m_objs_array); |
| 3157 if (bRet) { | 3157 if (bRet) { |
| 3158 m_objs_array.RemoveAll(); | 3158 m_objs_array.RemoveAll(); |
| 3159 } | 3159 } |
| 3160 return bRet; | 3160 return bRet; |
| 3161 } else { | 3161 } else { |
| 3162 CFX_PtrArray new_objs_array; | 3162 CFX_PtrArray new_objs_array; |
| 3163 FX_BOOL bRet = IsObjectsAvail(m_objs_array, FALSE, pHints, new_objs_arra
y); | 3163 FX_BOOL bRet = IsObjectsAvail(m_objs_array, FALSE, pHints, new_objs_arra
y); |
| 3164 if (bRet) { | 3164 if (bRet) { |
| 3165 FX_INT32 iSize = m_arrayAcroforms.GetSize(); | 3165 int32_t iSize = m_arrayAcroforms.GetSize(); |
| 3166 for (FX_INT32 i = 0; i < iSize; ++i) { | 3166 for (int32_t i = 0; i < iSize; ++i) { |
| 3167 ((CPDF_Object *)m_arrayAcroforms.GetAt(i))->Release(); | 3167 ((CPDF_Object *)m_arrayAcroforms.GetAt(i))->Release(); |
| 3168 } | 3168 } |
| 3169 m_arrayAcroforms.RemoveAll(); | 3169 m_arrayAcroforms.RemoveAll(); |
| 3170 } else { | 3170 } else { |
| 3171 m_objs_array.RemoveAll(); | 3171 m_objs_array.RemoveAll(); |
| 3172 m_objs_array.Append(new_objs_array); | 3172 m_objs_array.Append(new_objs_array); |
| 3173 } | 3173 } |
| 3174 return bRet; | 3174 return bRet; |
| 3175 } | 3175 } |
| 3176 } | 3176 } |
| (...skipping 291 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3468 CPDF_Object *pObj = GetObject(dwPageObjNum, pHints, &bExist); | 3468 CPDF_Object *pObj = GetObject(dwPageObjNum, pHints, &bExist); |
| 3469 if (!pObj) { | 3469 if (!pObj) { |
| 3470 if (bExist) { | 3470 if (bExist) { |
| 3471 UnavailObjList.Add(dwPageObjNum); | 3471 UnavailObjList.Add(dwPageObjNum); |
| 3472 } | 3472 } |
| 3473 continue; | 3473 continue; |
| 3474 } | 3474 } |
| 3475 if (pObj->GetType() == PDFOBJ_ARRAY) { | 3475 if (pObj->GetType() == PDFOBJ_ARRAY) { |
| 3476 CPDF_Array *pArray = pObj->GetArray(); | 3476 CPDF_Array *pArray = pObj->GetArray(); |
| 3477 if (pArray) { | 3477 if (pArray) { |
| 3478 FX_INT32 iSize = pArray->GetCount(); | 3478 int32_t iSize = pArray->GetCount(); |
| 3479 CPDF_Object *pItem = NULL; | 3479 CPDF_Object *pItem = NULL; |
| 3480 for (FX_INT32 j = 0; j < iSize; ++j) { | 3480 for (int32_t j = 0; j < iSize; ++j) { |
| 3481 pItem = pArray->GetElement(j); | 3481 pItem = pArray->GetElement(j); |
| 3482 if (pItem && pItem->GetType() == PDFOBJ_REFERENCE) { | 3482 if (pItem && pItem->GetType() == PDFOBJ_REFERENCE) { |
| 3483 UnavailObjList.Add(((CPDF_Reference *)pItem)->GetRefObjN
um()); | 3483 UnavailObjList.Add(((CPDF_Reference *)pItem)->GetRefObjN
um()); |
| 3484 } | 3484 } |
| 3485 } | 3485 } |
| 3486 } | 3486 } |
| 3487 } | 3487 } |
| 3488 if (pObj->GetType() != PDFOBJ_DICTIONARY) { | 3488 if (pObj->GetType() != PDFOBJ_DICTIONARY) { |
| 3489 pObj->Release(); | 3489 pObj->Release(); |
| 3490 continue; | 3490 continue; |
| (...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3582 m_docStatus = PDF_DATAAVAIL_PAGE; | 3582 m_docStatus = PDF_DATAAVAIL_PAGE; |
| 3583 return TRUE; | 3583 return TRUE; |
| 3584 } | 3584 } |
| 3585 FX_BOOL CPDF_DataAvail::CheckHeader(IFX_DownloadHints* pHints) | 3585 FX_BOOL CPDF_DataAvail::CheckHeader(IFX_DownloadHints* pHints) |
| 3586 { | 3586 { |
| 3587 FX_DWORD req_size = 1024; | 3587 FX_DWORD req_size = 1024; |
| 3588 if ((FX_FILESIZE)req_size > m_dwFileLen) { | 3588 if ((FX_FILESIZE)req_size > m_dwFileLen) { |
| 3589 req_size = (FX_DWORD)m_dwFileLen; | 3589 req_size = (FX_DWORD)m_dwFileLen; |
| 3590 } | 3590 } |
| 3591 if (m_pFileAvail->IsDataAvail(0, req_size)) { | 3591 if (m_pFileAvail->IsDataAvail(0, req_size)) { |
| 3592 FX_BYTE buffer[1024]; | 3592 uint8_t buffer[1024]; |
| 3593 m_pFileRead->ReadBlock(buffer, 0, req_size); | 3593 m_pFileRead->ReadBlock(buffer, 0, req_size); |
| 3594 if (IsLinearizedFile(buffer, req_size)) { | 3594 if (IsLinearizedFile(buffer, req_size)) { |
| 3595 m_docStatus = PDF_DATAAVAIL_FIRSTPAGE; | 3595 m_docStatus = PDF_DATAAVAIL_FIRSTPAGE; |
| 3596 } else { | 3596 } else { |
| 3597 if (m_docStatus == PDF_DATAAVAIL_ERROR) { | 3597 if (m_docStatus == PDF_DATAAVAIL_ERROR) { |
| 3598 return FALSE; | 3598 return FALSE; |
| 3599 } | 3599 } |
| 3600 m_docStatus = PDF_DATAAVAIL_END; | 3600 m_docStatus = PDF_DATAAVAIL_END; |
| 3601 } | 3601 } |
| 3602 return TRUE; | 3602 return TRUE; |
| (...skipping 19 matching lines...) Expand all Loading... |
| 3622 m_docStatus = PDF_DATAAVAIL_ERROR; | 3622 m_docStatus = PDF_DATAAVAIL_ERROR; |
| 3623 return FALSE; | 3623 return FALSE; |
| 3624 } | 3624 } |
| 3625 FX_BOOL bNeedDownLoad = FALSE; | 3625 FX_BOOL bNeedDownLoad = FALSE; |
| 3626 if (pEndOffSet->GetType() == PDFOBJ_NUMBER) { | 3626 if (pEndOffSet->GetType() == PDFOBJ_NUMBER) { |
| 3627 FX_DWORD dwEnd = pEndOffSet->GetInteger(); | 3627 FX_DWORD dwEnd = pEndOffSet->GetInteger(); |
| 3628 dwEnd += 512; | 3628 dwEnd += 512; |
| 3629 if ((FX_FILESIZE)dwEnd > m_dwFileLen) { | 3629 if ((FX_FILESIZE)dwEnd > m_dwFileLen) { |
| 3630 dwEnd = (FX_DWORD)m_dwFileLen; | 3630 dwEnd = (FX_DWORD)m_dwFileLen; |
| 3631 } | 3631 } |
| 3632 FX_INT32 iStartPos = (FX_INT32)(m_dwFileLen > 1024 ? 1024 : m_dwFileLen)
; | 3632 int32_t iStartPos = (int32_t)(m_dwFileLen > 1024 ? 1024 : m_dwFileLen); |
| 3633 FX_INT32 iSize = dwEnd > 1024 ? dwEnd - 1024 : 0; | 3633 int32_t iSize = dwEnd > 1024 ? dwEnd - 1024 : 0; |
| 3634 if (!m_pFileAvail->IsDataAvail(iStartPos, iSize)) { | 3634 if (!m_pFileAvail->IsDataAvail(iStartPos, iSize)) { |
| 3635 pHints->AddSegment(iStartPos, iSize); | 3635 pHints->AddSegment(iStartPos, iSize); |
| 3636 bNeedDownLoad = TRUE; | 3636 bNeedDownLoad = TRUE; |
| 3637 } | 3637 } |
| 3638 } | 3638 } |
| 3639 m_dwLastXRefOffset = 0; | 3639 m_dwLastXRefOffset = 0; |
| 3640 FX_FILESIZE dwFileLen = 0; | 3640 FX_FILESIZE dwFileLen = 0; |
| 3641 if (pXRefOffset->GetType() == PDFOBJ_NUMBER) { | 3641 if (pXRefOffset->GetType() == PDFOBJ_NUMBER) { |
| 3642 m_dwLastXRefOffset = pXRefOffset->GetInteger(); | 3642 m_dwLastXRefOffset = pXRefOffset->GetInteger(); |
| 3643 } | 3643 } |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3683 } | 3683 } |
| 3684 FX_DWORD gennum = FXSYS_atoi(word); | 3684 FX_DWORD gennum = FXSYS_atoi(word); |
| 3685 if (m_syntaxParser.GetKeyword() != FX_BSTRC("obj")) { | 3685 if (m_syntaxParser.GetKeyword() != FX_BSTRC("obj")) { |
| 3686 m_syntaxParser.RestorePos(SavedPos); | 3686 m_syntaxParser.RestorePos(SavedPos); |
| 3687 return NULL; | 3687 return NULL; |
| 3688 } | 3688 } |
| 3689 CPDF_Object* pObj = m_syntaxParser.GetObject(NULL, objnum, gennum, 0); | 3689 CPDF_Object* pObj = m_syntaxParser.GetObject(NULL, objnum, gennum, 0); |
| 3690 m_syntaxParser.RestorePos(SavedPos); | 3690 m_syntaxParser.RestorePos(SavedPos); |
| 3691 return pObj; | 3691 return pObj; |
| 3692 } | 3692 } |
| 3693 FX_INT32 CPDF_DataAvail::IsLinearizedPDF() | 3693 int32_t CPDF_DataAvail::IsLinearizedPDF() |
| 3694 { | 3694 { |
| 3695 FX_DWORD req_size = 1024; | 3695 FX_DWORD req_size = 1024; |
| 3696 if (!m_pFileAvail->IsDataAvail(0, req_size)) { | 3696 if (!m_pFileAvail->IsDataAvail(0, req_size)) { |
| 3697 return PDF_UNKNOW_LINEARIZED; | 3697 return PDF_UNKNOW_LINEARIZED; |
| 3698 } | 3698 } |
| 3699 if (!m_pFileRead) { | 3699 if (!m_pFileRead) { |
| 3700 return PDF_NOT_LINEARIZED; | 3700 return PDF_NOT_LINEARIZED; |
| 3701 } | 3701 } |
| 3702 FX_FILESIZE dwSize = m_pFileRead->GetSize(); | 3702 FX_FILESIZE dwSize = m_pFileRead->GetSize(); |
| 3703 if (dwSize < (FX_FILESIZE)req_size) { | 3703 if (dwSize < (FX_FILESIZE)req_size) { |
| 3704 return PDF_UNKNOW_LINEARIZED; | 3704 return PDF_UNKNOW_LINEARIZED; |
| 3705 } | 3705 } |
| 3706 FX_BYTE buffer[1024]; | 3706 uint8_t buffer[1024]; |
| 3707 m_pFileRead->ReadBlock(buffer, 0, req_size); | 3707 m_pFileRead->ReadBlock(buffer, 0, req_size); |
| 3708 if (IsLinearizedFile(buffer, req_size)) { | 3708 if (IsLinearizedFile(buffer, req_size)) { |
| 3709 return PDF_IS_LINEARIZED; | 3709 return PDF_IS_LINEARIZED; |
| 3710 } | 3710 } |
| 3711 return PDF_NOT_LINEARIZED; | 3711 return PDF_NOT_LINEARIZED; |
| 3712 } | 3712 } |
| 3713 FX_BOOL CPDF_DataAvail::IsLinearizedFile(FX_LPBYTE pData, FX_DWORD dwLen) | 3713 FX_BOOL CPDF_DataAvail::IsLinearizedFile(FX_LPBYTE pData, FX_DWORD dwLen) |
| 3714 { | 3714 { |
| 3715 CFX_SmartPointer<IFX_FileStream> file(FX_CreateMemoryStream(pData, (size_t)d
wLen, FALSE)); | 3715 CFX_SmartPointer<IFX_FileStream> file(FX_CreateMemoryStream(pData, (size_t)d
wLen, FALSE)); |
| 3716 FX_INT32 offset = GetHeaderOffset(file.Get()); | 3716 int32_t offset = GetHeaderOffset(file.Get()); |
| 3717 if (offset == -1) { | 3717 if (offset == -1) { |
| 3718 m_docStatus = PDF_DATAAVAIL_ERROR; | 3718 m_docStatus = PDF_DATAAVAIL_ERROR; |
| 3719 return FALSE; | 3719 return FALSE; |
| 3720 } | 3720 } |
| 3721 m_dwHeaderOffset = offset; | 3721 m_dwHeaderOffset = offset; |
| 3722 m_syntaxParser.InitParser(file.Get(), offset); | 3722 m_syntaxParser.InitParser(file.Get(), offset); |
| 3723 m_syntaxParser.RestorePos(m_syntaxParser.m_HeaderOffset + 9); | 3723 m_syntaxParser.RestorePos(m_syntaxParser.m_HeaderOffset + 9); |
| 3724 FX_BOOL bNumber = FALSE; | 3724 FX_BOOL bNumber = FALSE; |
| 3725 CFX_ByteString wordObjNum = m_syntaxParser.GetNextWord(bNumber); | 3725 CFX_ByteString wordObjNum = m_syntaxParser.GetNextWord(bNumber); |
| 3726 if (!bNumber) { | 3726 if (!bNumber) { |
| (...skipping 23 matching lines...) Expand all Loading... |
| 3750 } | 3750 } |
| 3751 return TRUE; | 3751 return TRUE; |
| 3752 } | 3752 } |
| 3753 return FALSE; | 3753 return FALSE; |
| 3754 } | 3754 } |
| 3755 FX_BOOL CPDF_DataAvail::CheckEnd(IFX_DownloadHints* pHints) | 3755 FX_BOOL CPDF_DataAvail::CheckEnd(IFX_DownloadHints* pHints) |
| 3756 { | 3756 { |
| 3757 FX_DWORD req_pos = (FX_DWORD)(m_dwFileLen > 1024 ? m_dwFileLen - 1024 : 0); | 3757 FX_DWORD req_pos = (FX_DWORD)(m_dwFileLen > 1024 ? m_dwFileLen - 1024 : 0); |
| 3758 FX_DWORD dwSize = (FX_DWORD)(m_dwFileLen - req_pos); | 3758 FX_DWORD dwSize = (FX_DWORD)(m_dwFileLen - req_pos); |
| 3759 if (m_pFileAvail->IsDataAvail(req_pos, dwSize)) { | 3759 if (m_pFileAvail->IsDataAvail(req_pos, dwSize)) { |
| 3760 FX_BYTE buffer[1024]; | 3760 uint8_t buffer[1024]; |
| 3761 m_pFileRead->ReadBlock(buffer, req_pos, dwSize); | 3761 m_pFileRead->ReadBlock(buffer, req_pos, dwSize); |
| 3762 CFX_SmartPointer<IFX_FileStream> file(FX_CreateMemoryStream(buffer, (siz
e_t)dwSize, FALSE)); | 3762 CFX_SmartPointer<IFX_FileStream> file(FX_CreateMemoryStream(buffer, (siz
e_t)dwSize, FALSE)); |
| 3763 m_syntaxParser.InitParser(file.Get(), 0); | 3763 m_syntaxParser.InitParser(file.Get(), 0); |
| 3764 m_syntaxParser.RestorePos(dwSize - 1); | 3764 m_syntaxParser.RestorePos(dwSize - 1); |
| 3765 if (m_syntaxParser.SearchWord(FX_BSTRC("startxref"), TRUE, FALSE, dwSize
)) { | 3765 if (m_syntaxParser.SearchWord(FX_BSTRC("startxref"), TRUE, FALSE, dwSize
)) { |
| 3766 FX_BOOL bNumber; | 3766 FX_BOOL bNumber; |
| 3767 m_syntaxParser.GetNextWord(bNumber); | 3767 m_syntaxParser.GetNextWord(bNumber); |
| 3768 CFX_ByteString xrefpos_str = m_syntaxParser.GetNextWord(bNumber); | 3768 CFX_ByteString xrefpos_str = m_syntaxParser.GetNextWord(bNumber); |
| 3769 if (!bNumber) { | 3769 if (!bNumber) { |
| 3770 m_docStatus = PDF_DATAAVAIL_ERROR; | 3770 m_docStatus = PDF_DATAAVAIL_ERROR; |
| 3771 return FALSE; | 3771 return FALSE; |
| 3772 } | 3772 } |
| 3773 m_dwXRefOffset = (FX_FILESIZE)FXSYS_atoi64(xrefpos_str); | 3773 m_dwXRefOffset = (FX_FILESIZE)FXSYS_atoi64(xrefpos_str); |
| 3774 if (!m_dwXRefOffset || m_dwXRefOffset > m_dwFileLen) { | 3774 if (!m_dwXRefOffset || m_dwXRefOffset > m_dwFileLen) { |
| 3775 m_docStatus = PDF_DATAAVAIL_LOADALLFILE; | 3775 m_docStatus = PDF_DATAAVAIL_LOADALLFILE; |
| 3776 return TRUE; | 3776 return TRUE; |
| 3777 } | 3777 } |
| 3778 m_dwLastXRefOffset = m_dwXRefOffset; | 3778 m_dwLastXRefOffset = m_dwXRefOffset; |
| 3779 SetStartOffset(m_dwXRefOffset); | 3779 SetStartOffset(m_dwXRefOffset); |
| 3780 m_docStatus = PDF_DATAAVAIL_CROSSREF; | 3780 m_docStatus = PDF_DATAAVAIL_CROSSREF; |
| 3781 return TRUE; | 3781 return TRUE; |
| 3782 } else { | 3782 } else { |
| 3783 m_docStatus = PDF_DATAAVAIL_LOADALLFILE; | 3783 m_docStatus = PDF_DATAAVAIL_LOADALLFILE; |
| 3784 return TRUE; | 3784 return TRUE; |
| 3785 } | 3785 } |
| 3786 } | 3786 } |
| 3787 pHints->AddSegment(req_pos, dwSize); | 3787 pHints->AddSegment(req_pos, dwSize); |
| 3788 return FALSE; | 3788 return FALSE; |
| 3789 } | 3789 } |
| 3790 FX_INT32 CPDF_DataAvail::CheckCrossRefStream(IFX_DownloadHints* pHints, FX_FILES
IZE &xref_offset) | 3790 int32_t CPDF_DataAvail::CheckCrossRefStream(IFX_DownloadHints* pHints, FX_FILESI
ZE &xref_offset) |
| 3791 { | 3791 { |
| 3792 xref_offset = 0; | 3792 xref_offset = 0; |
| 3793 FX_DWORD req_size = (FX_DWORD)(m_Pos + 512 > m_dwFileLen ? m_dwFileLen - m_P
os : 512); | 3793 FX_DWORD req_size = (FX_DWORD)(m_Pos + 512 > m_dwFileLen ? m_dwFileLen - m_P
os : 512); |
| 3794 if (m_pFileAvail->IsDataAvail(m_Pos, req_size)) { | 3794 if (m_pFileAvail->IsDataAvail(m_Pos, req_size)) { |
| 3795 FX_INT32 iSize = (FX_INT32)(m_Pos + req_size - m_dwCurrentXRefSteam); | 3795 int32_t iSize = (int32_t)(m_Pos + req_size - m_dwCurrentXRefSteam); |
| 3796 CFX_BinaryBuf buf(iSize); | 3796 CFX_BinaryBuf buf(iSize); |
| 3797 FX_LPBYTE pBuf = buf.GetBuffer(); | 3797 FX_LPBYTE pBuf = buf.GetBuffer(); |
| 3798 m_pFileRead->ReadBlock(pBuf, m_dwCurrentXRefSteam, iSize); | 3798 m_pFileRead->ReadBlock(pBuf, m_dwCurrentXRefSteam, iSize); |
| 3799 CFX_SmartPointer<IFX_FileStream> file(FX_CreateMemoryStream(pBuf, (size_
t)iSize, FALSE)); | 3799 CFX_SmartPointer<IFX_FileStream> file(FX_CreateMemoryStream(pBuf, (size_
t)iSize, FALSE)); |
| 3800 m_parser.m_Syntax.InitParser(file.Get(), 0); | 3800 m_parser.m_Syntax.InitParser(file.Get(), 0); |
| 3801 FX_BOOL bNumber = FALSE; | 3801 FX_BOOL bNumber = FALSE; |
| 3802 CFX_ByteString objnum = m_parser.m_Syntax.GetNextWord(bNumber); | 3802 CFX_ByteString objnum = m_parser.m_Syntax.GetNextWord(bNumber); |
| 3803 if (!bNumber) { | 3803 if (!bNumber) { |
| 3804 return -1; | 3804 return -1; |
| 3805 } | 3805 } |
| (...skipping 23 matching lines...) Expand all Loading... |
| 3829 return 0; | 3829 return 0; |
| 3830 } | 3830 } |
| 3831 inline void CPDF_DataAvail::SetStartOffset(FX_FILESIZE dwOffset) | 3831 inline void CPDF_DataAvail::SetStartOffset(FX_FILESIZE dwOffset) |
| 3832 { | 3832 { |
| 3833 m_Pos = dwOffset; | 3833 m_Pos = dwOffset; |
| 3834 } | 3834 } |
| 3835 #define MAX_WORD_BUFFER 256 | 3835 #define MAX_WORD_BUFFER 256 |
| 3836 FX_BOOL CPDF_DataAvail::GetNextToken(CFX_ByteString &token) | 3836 FX_BOOL CPDF_DataAvail::GetNextToken(CFX_ByteString &token) |
| 3837 { | 3837 { |
| 3838 m_WordSize = 0; | 3838 m_WordSize = 0; |
| 3839 FX_BYTE ch; | 3839 uint8_t ch; |
| 3840 if (!GetNextChar(ch)) { | 3840 if (!GetNextChar(ch)) { |
| 3841 return FALSE; | 3841 return FALSE; |
| 3842 } | 3842 } |
| 3843 FX_BYTE type = PDF_CharType[ch]; | 3843 uint8_t type = PDF_CharType[ch]; |
| 3844 while (1) { | 3844 while (1) { |
| 3845 while (type == 'W') { | 3845 while (type == 'W') { |
| 3846 if (!GetNextChar(ch)) { | 3846 if (!GetNextChar(ch)) { |
| 3847 return FALSE; | 3847 return FALSE; |
| 3848 } | 3848 } |
| 3849 type = PDF_CharType[ch]; | 3849 type = PDF_CharType[ch]; |
| 3850 } | 3850 } |
| 3851 if (ch != '%') { | 3851 if (ch != '%') { |
| 3852 break; | 3852 break; |
| 3853 } | 3853 } |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3912 type = PDF_CharType[ch]; | 3912 type = PDF_CharType[ch]; |
| 3913 if (type == 'D' || type == 'W') { | 3913 if (type == 'D' || type == 'W') { |
| 3914 m_Pos --; | 3914 m_Pos --; |
| 3915 break; | 3915 break; |
| 3916 } | 3916 } |
| 3917 } | 3917 } |
| 3918 CFX_ByteString ret(m_WordBuffer, m_WordSize); | 3918 CFX_ByteString ret(m_WordBuffer, m_WordSize); |
| 3919 token = ret; | 3919 token = ret; |
| 3920 return TRUE; | 3920 return TRUE; |
| 3921 } | 3921 } |
| 3922 FX_BOOL CPDF_DataAvail::GetNextChar(FX_BYTE &ch) | 3922 FX_BOOL CPDF_DataAvail::GetNextChar(uint8_t &ch) |
| 3923 { | 3923 { |
| 3924 FX_FILESIZE pos = m_Pos; | 3924 FX_FILESIZE pos = m_Pos; |
| 3925 if (pos >= m_dwFileLen) { | 3925 if (pos >= m_dwFileLen) { |
| 3926 return FALSE; | 3926 return FALSE; |
| 3927 } | 3927 } |
| 3928 if (m_bufferOffset >= pos || (FX_FILESIZE)(m_bufferOffset + m_bufferSize) <=
pos) { | 3928 if (m_bufferOffset >= pos || (FX_FILESIZE)(m_bufferOffset + m_bufferSize) <=
pos) { |
| 3929 FX_FILESIZE read_pos = pos; | 3929 FX_FILESIZE read_pos = pos; |
| 3930 FX_DWORD read_size = 512; | 3930 FX_DWORD read_size = 512; |
| 3931 if ((FX_FILESIZE)read_size > m_dwFileLen) { | 3931 if ((FX_FILESIZE)read_size > m_dwFileLen) { |
| 3932 read_size = (FX_DWORD)m_dwFileLen; | 3932 read_size = (FX_DWORD)m_dwFileLen; |
| 3933 } | 3933 } |
| 3934 if ((FX_FILESIZE)(read_pos + read_size) > m_dwFileLen) { | 3934 if ((FX_FILESIZE)(read_pos + read_size) > m_dwFileLen) { |
| 3935 read_pos = m_dwFileLen - read_size; | 3935 read_pos = m_dwFileLen - read_size; |
| 3936 } | 3936 } |
| 3937 if (!m_pFileRead->ReadBlock(m_bufferData, read_pos, read_size)) { | 3937 if (!m_pFileRead->ReadBlock(m_bufferData, read_pos, read_size)) { |
| 3938 return FALSE; | 3938 return FALSE; |
| 3939 } | 3939 } |
| 3940 m_bufferOffset = read_pos; | 3940 m_bufferOffset = read_pos; |
| 3941 m_bufferSize = read_size; | 3941 m_bufferSize = read_size; |
| 3942 } | 3942 } |
| 3943 ch = m_bufferData[pos - m_bufferOffset]; | 3943 ch = m_bufferData[pos - m_bufferOffset]; |
| 3944 m_Pos ++; | 3944 m_Pos ++; |
| 3945 return TRUE; | 3945 return TRUE; |
| 3946 } | 3946 } |
| 3947 FX_BOOL CPDF_DataAvail::CheckCrossRefItem(IFX_DownloadHints *pHints) | 3947 FX_BOOL CPDF_DataAvail::CheckCrossRefItem(IFX_DownloadHints *pHints) |
| 3948 { | 3948 { |
| 3949 FX_INT32 iSize = 0; | 3949 int32_t iSize = 0; |
| 3950 CFX_ByteString token; | 3950 CFX_ByteString token; |
| 3951 while (1) { | 3951 while (1) { |
| 3952 if (!GetNextToken(token)) { | 3952 if (!GetNextToken(token)) { |
| 3953 iSize = (FX_INT32)(m_Pos + 512 > m_dwFileLen ? m_dwFileLen - m_Pos :
512); | 3953 iSize = (int32_t)(m_Pos + 512 > m_dwFileLen ? m_dwFileLen - m_Pos :
512); |
| 3954 pHints->AddSegment(m_Pos, iSize); | 3954 pHints->AddSegment(m_Pos, iSize); |
| 3955 return FALSE; | 3955 return FALSE; |
| 3956 } | 3956 } |
| 3957 if (token == "trailer") { | 3957 if (token == "trailer") { |
| 3958 m_dwTrailerOffset = m_Pos; | 3958 m_dwTrailerOffset = m_Pos; |
| 3959 m_docStatus = PDF_DATAAVAIL_TRAILER; | 3959 m_docStatus = PDF_DATAAVAIL_TRAILER; |
| 3960 return TRUE; | 3960 return TRUE; |
| 3961 } | 3961 } |
| 3962 } | 3962 } |
| 3963 } | 3963 } |
| 3964 FX_BOOL CPDF_DataAvail::CheckAllCrossRefStream(IFX_DownloadHints *pHints) | 3964 FX_BOOL CPDF_DataAvail::CheckAllCrossRefStream(IFX_DownloadHints *pHints) |
| 3965 { | 3965 { |
| 3966 FX_FILESIZE xref_offset = 0; | 3966 FX_FILESIZE xref_offset = 0; |
| 3967 FX_INT32 nRet = CheckCrossRefStream(pHints, xref_offset); | 3967 int32_t nRet = CheckCrossRefStream(pHints, xref_offset); |
| 3968 if (nRet == 1) { | 3968 if (nRet == 1) { |
| 3969 if (!xref_offset) { | 3969 if (!xref_offset) { |
| 3970 m_docStatus = PDF_DATAAVAIL_LOADALLCRSOSSREF; | 3970 m_docStatus = PDF_DATAAVAIL_LOADALLCRSOSSREF; |
| 3971 } else { | 3971 } else { |
| 3972 m_dwCurrentXRefSteam = xref_offset; | 3972 m_dwCurrentXRefSteam = xref_offset; |
| 3973 m_Pos = xref_offset; | 3973 m_Pos = xref_offset; |
| 3974 } | 3974 } |
| 3975 return TRUE; | 3975 return TRUE; |
| 3976 } else if (nRet == -1) { | 3976 } else if (nRet == -1) { |
| 3977 m_docStatus = PDF_DATAAVAIL_ERROR; | 3977 m_docStatus = PDF_DATAAVAIL_ERROR; |
| 3978 } | 3978 } |
| 3979 return FALSE; | 3979 return FALSE; |
| 3980 } | 3980 } |
| 3981 FX_BOOL CPDF_DataAvail::CheckCrossRef(IFX_DownloadHints* pHints) | 3981 FX_BOOL CPDF_DataAvail::CheckCrossRef(IFX_DownloadHints* pHints) |
| 3982 { | 3982 { |
| 3983 FX_INT32 iSize = 0; | 3983 int32_t iSize = 0; |
| 3984 CFX_ByteString token; | 3984 CFX_ByteString token; |
| 3985 if (!GetNextToken(token)) { | 3985 if (!GetNextToken(token)) { |
| 3986 iSize = (FX_INT32)(m_Pos + 512 > m_dwFileLen ? m_dwFileLen - m_Pos : 512
); | 3986 iSize = (int32_t)(m_Pos + 512 > m_dwFileLen ? m_dwFileLen - m_Pos : 512)
; |
| 3987 pHints->AddSegment(m_Pos, iSize); | 3987 pHints->AddSegment(m_Pos, iSize); |
| 3988 return FALSE; | 3988 return FALSE; |
| 3989 } | 3989 } |
| 3990 if (token == "xref") { | 3990 if (token == "xref") { |
| 3991 m_CrossOffset.InsertAt(0, m_dwXRefOffset); | 3991 m_CrossOffset.InsertAt(0, m_dwXRefOffset); |
| 3992 while (1) { | 3992 while (1) { |
| 3993 if (!GetNextToken(token)) { | 3993 if (!GetNextToken(token)) { |
| 3994 iSize = (FX_INT32)(m_Pos + 512 > m_dwFileLen ? m_dwFileLen - m_P
os : 512); | 3994 iSize = (int32_t)(m_Pos + 512 > m_dwFileLen ? m_dwFileLen - m_Po
s : 512); |
| 3995 pHints->AddSegment(m_Pos, iSize); | 3995 pHints->AddSegment(m_Pos, iSize); |
| 3996 m_docStatus = PDF_DATAAVAIL_CROSSREF_ITEM; | 3996 m_docStatus = PDF_DATAAVAIL_CROSSREF_ITEM; |
| 3997 return FALSE; | 3997 return FALSE; |
| 3998 } | 3998 } |
| 3999 if (token == "trailer") { | 3999 if (token == "trailer") { |
| 4000 m_dwTrailerOffset = m_Pos; | 4000 m_dwTrailerOffset = m_Pos; |
| 4001 m_docStatus = PDF_DATAAVAIL_TRAILER; | 4001 m_docStatus = PDF_DATAAVAIL_TRAILER; |
| 4002 return TRUE; | 4002 return TRUE; |
| 4003 } | 4003 } |
| 4004 } | 4004 } |
| 4005 } else { | 4005 } else { |
| 4006 m_docStatus = PDF_DATAAVAIL_LOADALLFILE; | 4006 m_docStatus = PDF_DATAAVAIL_LOADALLFILE; |
| 4007 return TRUE; | 4007 return TRUE; |
| 4008 } | 4008 } |
| 4009 return FALSE; | 4009 return FALSE; |
| 4010 } | 4010 } |
| 4011 FX_BOOL CPDF_DataAvail::CheckTrailerAppend(IFX_DownloadHints* pHints) | 4011 FX_BOOL CPDF_DataAvail::CheckTrailerAppend(IFX_DownloadHints* pHints) |
| 4012 { | 4012 { |
| 4013 if (m_Pos < m_dwFileLen) { | 4013 if (m_Pos < m_dwFileLen) { |
| 4014 FX_FILESIZE dwAppendPos = m_Pos + m_syntaxParser.SavePos(); | 4014 FX_FILESIZE dwAppendPos = m_Pos + m_syntaxParser.SavePos(); |
| 4015 FX_INT32 iSize = (FX_INT32)(dwAppendPos + 512 > m_dwFileLen ? m_dwFileLe
n - dwAppendPos : 512); | 4015 int32_t iSize = (int32_t)(dwAppendPos + 512 > m_dwFileLen ? m_dwFileLen
- dwAppendPos : 512); |
| 4016 if (!m_pFileAvail->IsDataAvail(dwAppendPos, iSize)) { | 4016 if (!m_pFileAvail->IsDataAvail(dwAppendPos, iSize)) { |
| 4017 pHints->AddSegment(dwAppendPos, iSize); | 4017 pHints->AddSegment(dwAppendPos, iSize); |
| 4018 return FALSE; | 4018 return FALSE; |
| 4019 } | 4019 } |
| 4020 } | 4020 } |
| 4021 if (m_dwPrevXRefOffset) { | 4021 if (m_dwPrevXRefOffset) { |
| 4022 SetStartOffset(m_dwPrevXRefOffset); | 4022 SetStartOffset(m_dwPrevXRefOffset); |
| 4023 m_docStatus = PDF_DATAAVAIL_CROSSREF; | 4023 m_docStatus = PDF_DATAAVAIL_CROSSREF; |
| 4024 } else { | 4024 } else { |
| 4025 m_docStatus = PDF_DATAAVAIL_LOADALLCRSOSSREF; | 4025 m_docStatus = PDF_DATAAVAIL_LOADALLCRSOSSREF; |
| 4026 } | 4026 } |
| 4027 return TRUE; | 4027 return TRUE; |
| 4028 } | 4028 } |
| 4029 FX_BOOL CPDF_DataAvail::CheckTrailer(IFX_DownloadHints* pHints) | 4029 FX_BOOL CPDF_DataAvail::CheckTrailer(IFX_DownloadHints* pHints) |
| 4030 { | 4030 { |
| 4031 FX_INT32 iTrailerSize = (FX_INT32)(m_Pos + 512 > m_dwFileLen ? m_dwFileLen -
m_Pos : 512); | 4031 int32_t iTrailerSize = (int32_t)(m_Pos + 512 > m_dwFileLen ? m_dwFileLen - m
_Pos : 512); |
| 4032 if (m_pFileAvail->IsDataAvail(m_Pos, iTrailerSize)) { | 4032 if (m_pFileAvail->IsDataAvail(m_Pos, iTrailerSize)) { |
| 4033 FX_INT32 iSize = (FX_INT32)(m_Pos + iTrailerSize - m_dwTrailerOffset); | 4033 int32_t iSize = (int32_t)(m_Pos + iTrailerSize - m_dwTrailerOffset); |
| 4034 CFX_BinaryBuf buf(iSize); | 4034 CFX_BinaryBuf buf(iSize); |
| 4035 FX_LPBYTE pBuf = buf.GetBuffer(); | 4035 FX_LPBYTE pBuf = buf.GetBuffer(); |
| 4036 if (!pBuf) { | 4036 if (!pBuf) { |
| 4037 m_docStatus = PDF_DATAAVAIL_ERROR; | 4037 m_docStatus = PDF_DATAAVAIL_ERROR; |
| 4038 return FALSE; | 4038 return FALSE; |
| 4039 } | 4039 } |
| 4040 if (!m_pFileRead->ReadBlock(pBuf, m_dwTrailerOffset, iSize)) { | 4040 if (!m_pFileRead->ReadBlock(pBuf, m_dwTrailerOffset, iSize)) { |
| 4041 return FALSE; | 4041 return FALSE; |
| 4042 } | 4042 } |
| 4043 CFX_SmartPointer<IFX_FileStream> file(FX_CreateMemoryStream(pBuf, (size_
t)iSize, FALSE)); | 4043 CFX_SmartPointer<IFX_FileStream> file(FX_CreateMemoryStream(pBuf, (size_
t)iSize, FALSE)); |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4079 } else { | 4079 } else { |
| 4080 m_dwPrevXRefOffset = 0; | 4080 m_dwPrevXRefOffset = 0; |
| 4081 m_docStatus = PDF_DATAAVAIL_TRAILER_APPEND; | 4081 m_docStatus = PDF_DATAAVAIL_TRAILER_APPEND; |
| 4082 pTrailer->Release(); | 4082 pTrailer->Release(); |
| 4083 } | 4083 } |
| 4084 return TRUE; | 4084 return TRUE; |
| 4085 } | 4085 } |
| 4086 pHints->AddSegment(m_Pos, iTrailerSize); | 4086 pHints->AddSegment(m_Pos, iTrailerSize); |
| 4087 return FALSE; | 4087 return FALSE; |
| 4088 } | 4088 } |
| 4089 FX_BOOL CPDF_DataAvail::CheckPage(FX_INT32 iPage, IFX_DownloadHints* pHints) | 4089 FX_BOOL CPDF_DataAvail::CheckPage(int32_t iPage, IFX_DownloadHints* pHints) |
| 4090 { | 4090 { |
| 4091 while (TRUE) { | 4091 while (TRUE) { |
| 4092 switch (m_docStatus) { | 4092 switch (m_docStatus) { |
| 4093 case PDF_DATAAVAIL_PAGETREE: | 4093 case PDF_DATAAVAIL_PAGETREE: |
| 4094 if (!LoadDocPages(pHints)) { | 4094 if (!LoadDocPages(pHints)) { |
| 4095 return FALSE; | 4095 return FALSE; |
| 4096 } | 4096 } |
| 4097 break; | 4097 break; |
| 4098 case PDF_DATAAVAIL_PAGE: | 4098 case PDF_DATAAVAIL_PAGE: |
| 4099 if (!LoadDocPage(iPage, pHints)) { | 4099 if (!LoadDocPage(iPage, pHints)) { |
| (...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4208 } else if (type == FX_BSTRC("Page")) { | 4208 } else if (type == FX_BSTRC("Page")) { |
| 4209 pPageNode->m_type = PDF_PAGENODE_PAGE; | 4209 pPageNode->m_type = PDF_PAGENODE_PAGE; |
| 4210 } else { | 4210 } else { |
| 4211 pPage->Release(); | 4211 pPage->Release(); |
| 4212 m_docStatus = PDF_DATAAVAIL_ERROR; | 4212 m_docStatus = PDF_DATAAVAIL_ERROR; |
| 4213 return FALSE; | 4213 return FALSE; |
| 4214 } | 4214 } |
| 4215 pPage->Release(); | 4215 pPage->Release(); |
| 4216 return TRUE; | 4216 return TRUE; |
| 4217 } | 4217 } |
| 4218 FX_BOOL CPDF_DataAvail::CheckPageNode(CPDF_PageNode &pageNodes, FX_INT32 iPage,
FX_INT32 &iCount, IFX_DownloadHints* pHints) | 4218 FX_BOOL CPDF_DataAvail::CheckPageNode(CPDF_PageNode &pageNodes, int32_t iPage, i
nt32_t &iCount, IFX_DownloadHints* pHints) |
| 4219 { | 4219 { |
| 4220 FX_INT32 iSize = pageNodes.m_childNode.GetSize(); | 4220 int32_t iSize = pageNodes.m_childNode.GetSize(); |
| 4221 if (iSize <= 0 || iPage >= iSize) { | 4221 if (iSize <= 0 || iPage >= iSize) { |
| 4222 m_docStatus = PDF_DATAAVAIL_ERROR; | 4222 m_docStatus = PDF_DATAAVAIL_ERROR; |
| 4223 return FALSE; | 4223 return FALSE; |
| 4224 } | 4224 } |
| 4225 for (FX_INT32 i = 0; i < iSize; ++i) { | 4225 for (int32_t i = 0; i < iSize; ++i) { |
| 4226 CPDF_PageNode *pNode = (CPDF_PageNode*)pageNodes.m_childNode.GetAt(i); | 4226 CPDF_PageNode *pNode = (CPDF_PageNode*)pageNodes.m_childNode.GetAt(i); |
| 4227 if (!pNode) { | 4227 if (!pNode) { |
| 4228 continue; | 4228 continue; |
| 4229 } | 4229 } |
| 4230 switch (pNode->m_type) { | 4230 switch (pNode->m_type) { |
| 4231 case PDF_PAGENODE_UNKOWN: | 4231 case PDF_PAGENODE_UNKOWN: |
| 4232 if (!CheckUnkownPageNode(pNode->m_dwPageNo, pNode, pHints)) { | 4232 if (!CheckUnkownPageNode(pNode->m_dwPageNo, pNode, pHints)) { |
| 4233 return FALSE; | 4233 return FALSE; |
| 4234 } | 4234 } |
| 4235 --i; | 4235 --i; |
| (...skipping 16 matching lines...) Expand all Loading... |
| 4252 --i; | 4252 --i; |
| 4253 break; | 4253 break; |
| 4254 } | 4254 } |
| 4255 if (iPage == iCount) { | 4255 if (iPage == iCount) { |
| 4256 m_docStatus = PDF_DATAAVAIL_DONE; | 4256 m_docStatus = PDF_DATAAVAIL_DONE; |
| 4257 return TRUE; | 4257 return TRUE; |
| 4258 } | 4258 } |
| 4259 } | 4259 } |
| 4260 return TRUE; | 4260 return TRUE; |
| 4261 } | 4261 } |
| 4262 FX_BOOL CPDF_DataAvail::LoadDocPage(FX_INT32 iPage, IFX_DownloadHints* pHints) | 4262 FX_BOOL CPDF_DataAvail::LoadDocPage(int32_t iPage, IFX_DownloadHints* pHints) |
| 4263 { | 4263 { |
| 4264 if (m_pDocument->GetPageCount() <= iPage || m_pDocument->m_PageList.GetAt(iP
age)) { | 4264 if (m_pDocument->GetPageCount() <= iPage || m_pDocument->m_PageList.GetAt(iP
age)) { |
| 4265 m_docStatus = PDF_DATAAVAIL_DONE; | 4265 m_docStatus = PDF_DATAAVAIL_DONE; |
| 4266 return TRUE; | 4266 return TRUE; |
| 4267 } | 4267 } |
| 4268 if (m_pageNodes.m_type == PDF_PAGENODE_PAGE) { | 4268 if (m_pageNodes.m_type == PDF_PAGENODE_PAGE) { |
| 4269 if (iPage == 0) { | 4269 if (iPage == 0) { |
| 4270 m_docStatus = PDF_DATAAVAIL_DONE; | 4270 m_docStatus = PDF_DATAAVAIL_DONE; |
| 4271 return TRUE; | 4271 return TRUE; |
| 4272 } | 4272 } |
| 4273 m_docStatus = PDF_DATAAVAIL_ERROR; | 4273 m_docStatus = PDF_DATAAVAIL_ERROR; |
| 4274 return TRUE; | 4274 return TRUE; |
| 4275 } | 4275 } |
| 4276 FX_INT32 iCount = -1; | 4276 int32_t iCount = -1; |
| 4277 return CheckPageNode(m_pageNodes, iPage, iCount, pHints); | 4277 return CheckPageNode(m_pageNodes, iPage, iCount, pHints); |
| 4278 } | 4278 } |
| 4279 FX_BOOL CPDF_DataAvail::CheckPageCount(IFX_DownloadHints* pHints) | 4279 FX_BOOL CPDF_DataAvail::CheckPageCount(IFX_DownloadHints* pHints) |
| 4280 { | 4280 { |
| 4281 FX_BOOL bExist = FALSE; | 4281 FX_BOOL bExist = FALSE; |
| 4282 CPDF_Object *pPages = GetObject(m_PagesObjNum, pHints, &bExist); | 4282 CPDF_Object *pPages = GetObject(m_PagesObjNum, pHints, &bExist); |
| 4283 if (!bExist) { | 4283 if (!bExist) { |
| 4284 m_docStatus = PDF_DATAAVAIL_ERROR; | 4284 m_docStatus = PDF_DATAAVAIL_ERROR; |
| 4285 return FALSE; | 4285 return FALSE; |
| 4286 } | 4286 } |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4354 } | 4354 } |
| 4355 if (!PreparePageItem()) { | 4355 if (!PreparePageItem()) { |
| 4356 return FALSE; | 4356 return FALSE; |
| 4357 } | 4357 } |
| 4358 m_bMainXRefLoadedOK = TRUE; | 4358 m_bMainXRefLoadedOK = TRUE; |
| 4359 m_bLinearedDataOK = TRUE; | 4359 m_bLinearedDataOK = TRUE; |
| 4360 } | 4360 } |
| 4361 | 4361 |
| 4362 return m_bLinearedDataOK; | 4362 return m_bLinearedDataOK; |
| 4363 } | 4363 } |
| 4364 FX_BOOL CPDF_DataAvail::CheckPageAnnots(FX_INT32 iPage, IFX_DownloadHints* pHint
s) | 4364 FX_BOOL CPDF_DataAvail::CheckPageAnnots(int32_t iPage, IFX_DownloadHints* pHints
) |
| 4365 { | 4365 { |
| 4366 if (!m_objs_array.GetSize()) { | 4366 if (!m_objs_array.GetSize()) { |
| 4367 m_objs_array.RemoveAll(); | 4367 m_objs_array.RemoveAll(); |
| 4368 m_objnum_array.RemoveAll(); | 4368 m_objnum_array.RemoveAll(); |
| 4369 CPDF_Dictionary *pPageDict = m_pDocument->GetPage(iPage); | 4369 CPDF_Dictionary *pPageDict = m_pDocument->GetPage(iPage); |
| 4370 if (!pPageDict) { | 4370 if (!pPageDict) { |
| 4371 return TRUE; | 4371 return TRUE; |
| 4372 } | 4372 } |
| 4373 CPDF_Object *pAnnots = pPageDict->GetElement(FX_BSTRC("Annots")); | 4373 CPDF_Object *pAnnots = pPageDict->GetElement(FX_BSTRC("Annots")); |
| 4374 if (!pAnnots) { | 4374 if (!pAnnots) { |
| 4375 return TRUE; | 4375 return TRUE; |
| 4376 } | 4376 } |
| 4377 CFX_PtrArray obj_array; | 4377 CFX_PtrArray obj_array; |
| 4378 obj_array.Add(pAnnots); | 4378 obj_array.Add(pAnnots); |
| 4379 FX_BOOL bRet = IsObjectsAvail(obj_array, FALSE, pHints, m_objs_array); | 4379 FX_BOOL bRet = IsObjectsAvail(obj_array, FALSE, pHints, m_objs_array); |
| 4380 if (bRet) { | 4380 if (bRet) { |
| 4381 m_objs_array.RemoveAll(); | 4381 m_objs_array.RemoveAll(); |
| 4382 } | 4382 } |
| 4383 return bRet; | 4383 return bRet; |
| 4384 } else { | 4384 } else { |
| 4385 CFX_PtrArray new_objs_array; | 4385 CFX_PtrArray new_objs_array; |
| 4386 FX_BOOL bRet = IsObjectsAvail(m_objs_array, FALSE, pHints, new_objs_arra
y); | 4386 FX_BOOL bRet = IsObjectsAvail(m_objs_array, FALSE, pHints, new_objs_arra
y); |
| 4387 m_objs_array.RemoveAll(); | 4387 m_objs_array.RemoveAll(); |
| 4388 if (!bRet) { | 4388 if (!bRet) { |
| 4389 m_objs_array.Append(new_objs_array); | 4389 m_objs_array.Append(new_objs_array); |
| 4390 } | 4390 } |
| 4391 return bRet; | 4391 return bRet; |
| 4392 } | 4392 } |
| 4393 } | 4393 } |
| 4394 FX_BOOL CPDF_DataAvail::CheckLinearizedFirstPage(FX_INT32 iPage, IFX_DownloadHin
ts* pHints) | 4394 FX_BOOL CPDF_DataAvail::CheckLinearizedFirstPage(int32_t iPage, IFX_DownloadHint
s* pHints) |
| 4395 { | 4395 { |
| 4396 if (!m_bAnnotsLoad) { | 4396 if (!m_bAnnotsLoad) { |
| 4397 if (!CheckPageAnnots(iPage, pHints)) { | 4397 if (!CheckPageAnnots(iPage, pHints)) { |
| 4398 return FALSE; | 4398 return FALSE; |
| 4399 } | 4399 } |
| 4400 m_bAnnotsLoad = TRUE; | 4400 m_bAnnotsLoad = TRUE; |
| 4401 } | 4401 } |
| 4402 if (m_bAnnotsLoad) | 4402 if (m_bAnnotsLoad) |
| 4403 if (!CheckLinearizedData(pHints)) { | 4403 if (!CheckLinearizedData(pHints)) { |
| 4404 return FALSE; | 4404 return FALSE; |
| (...skipping 15 matching lines...) Expand all Loading... |
| 4420 if (!pParentDict) { | 4420 if (!pParentDict) { |
| 4421 return FALSE; | 4421 return FALSE; |
| 4422 } | 4422 } |
| 4423 CPDF_Object *pRet = pParentDict->GetElement("Resources"); | 4423 CPDF_Object *pRet = pParentDict->GetElement("Resources"); |
| 4424 if (pRet) { | 4424 if (pRet) { |
| 4425 m_pPageResource = pRet; | 4425 m_pPageResource = pRet; |
| 4426 return TRUE; | 4426 return TRUE; |
| 4427 } | 4427 } |
| 4428 return HaveResourceAncestor(pParentDict); | 4428 return HaveResourceAncestor(pParentDict); |
| 4429 } | 4429 } |
| 4430 FX_BOOL CPDF_DataAvail::IsPageAvail(FX_INT32 iPage, IFX_DownloadHints* pHints) | 4430 FX_BOOL CPDF_DataAvail::IsPageAvail(int32_t iPage, IFX_DownloadHints* pHints) |
| 4431 { | 4431 { |
| 4432 if (!m_pDocument) { | 4432 if (!m_pDocument) { |
| 4433 return FALSE; | 4433 return FALSE; |
| 4434 } | 4434 } |
| 4435 if (IsFirstCheck(iPage)) { | 4435 if (IsFirstCheck(iPage)) { |
| 4436 m_bCurPageDictLoadOK = FALSE; | 4436 m_bCurPageDictLoadOK = FALSE; |
| 4437 m_bPageLoadedOK = FALSE; | 4437 m_bPageLoadedOK = FALSE; |
| 4438 m_bAnnotsLoad = FALSE; | 4438 m_bAnnotsLoad = FALSE; |
| 4439 m_bNeedDownLoadResource = FALSE; | 4439 m_bNeedDownLoadResource = FALSE; |
| 4440 m_objs_array.RemoveAll(); | 4440 m_objs_array.RemoveAll(); |
| (...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4569 } | 4569 } |
| 4570 void CPDF_DataAvail::GetLinearizedMainXRefInfo(FX_FILESIZE *pPos, FX_DWORD *pSiz
e) | 4570 void CPDF_DataAvail::GetLinearizedMainXRefInfo(FX_FILESIZE *pPos, FX_DWORD *pSiz
e) |
| 4571 { | 4571 { |
| 4572 if (pPos) { | 4572 if (pPos) { |
| 4573 *pPos = m_dwLastXRefOffset; | 4573 *pPos = m_dwLastXRefOffset; |
| 4574 } | 4574 } |
| 4575 if (pSize) { | 4575 if (pSize) { |
| 4576 *pSize = (FX_DWORD)(m_dwFileLen - m_dwLastXRefOffset); | 4576 *pSize = (FX_DWORD)(m_dwFileLen - m_dwLastXRefOffset); |
| 4577 } | 4577 } |
| 4578 } | 4578 } |
| 4579 FX_INT32 CPDF_DataAvail::IsFormAvail(IFX_DownloadHints *pHints) | 4579 int32_t CPDF_DataAvail::IsFormAvail(IFX_DownloadHints *pHints) |
| 4580 { | 4580 { |
| 4581 if (!m_pDocument) { | 4581 if (!m_pDocument) { |
| 4582 return PDFFORM_AVAIL; | 4582 return PDFFORM_AVAIL; |
| 4583 } | 4583 } |
| 4584 if (!m_bLinearizedFormParamLoad) { | 4584 if (!m_bLinearizedFormParamLoad) { |
| 4585 CPDF_Dictionary *pRoot = m_pDocument->GetRoot(); | 4585 CPDF_Dictionary *pRoot = m_pDocument->GetRoot(); |
| 4586 if (!pRoot) { | 4586 if (!pRoot) { |
| 4587 return PDFFORM_AVAIL; | 4587 return PDFFORM_AVAIL; |
| 4588 } | 4588 } |
| 4589 CPDF_Object *pAcroForm = pRoot->GetElement(FX_BSTRC("AcroForm")); | 4589 CPDF_Object *pAcroForm = pRoot->GetElement(FX_BSTRC("AcroForm")); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 4602 FX_BOOL bRet = IsObjectsAvail(m_objs_array, FALSE, pHints, new_objs_array); | 4602 FX_BOOL bRet = IsObjectsAvail(m_objs_array, FALSE, pHints, new_objs_array); |
| 4603 m_objs_array.RemoveAll(); | 4603 m_objs_array.RemoveAll(); |
| 4604 if (!bRet) { | 4604 if (!bRet) { |
| 4605 m_objs_array.Append(new_objs_array); | 4605 m_objs_array.Append(new_objs_array); |
| 4606 return PDFFORM_NOTAVAIL; | 4606 return PDFFORM_NOTAVAIL; |
| 4607 } | 4607 } |
| 4608 return PDFFORM_AVAIL; | 4608 return PDFFORM_AVAIL; |
| 4609 } | 4609 } |
| 4610 void CPDF_SortObjNumArray::AddObjNum(FX_DWORD dwObjNum) | 4610 void CPDF_SortObjNumArray::AddObjNum(FX_DWORD dwObjNum) |
| 4611 { | 4611 { |
| 4612 FX_INT32 iNext = 0; | 4612 int32_t iNext = 0; |
| 4613 if (BinarySearch(dwObjNum, iNext)) { | 4613 if (BinarySearch(dwObjNum, iNext)) { |
| 4614 return; | 4614 return; |
| 4615 } | 4615 } |
| 4616 m_number_array.InsertAt(iNext, dwObjNum); | 4616 m_number_array.InsertAt(iNext, dwObjNum); |
| 4617 } | 4617 } |
| 4618 FX_BOOL CPDF_SortObjNumArray::Find(FX_DWORD dwObjNum) | 4618 FX_BOOL CPDF_SortObjNumArray::Find(FX_DWORD dwObjNum) |
| 4619 { | 4619 { |
| 4620 FX_INT32 iNext = 0; | 4620 int32_t iNext = 0; |
| 4621 return BinarySearch(dwObjNum, iNext); | 4621 return BinarySearch(dwObjNum, iNext); |
| 4622 } | 4622 } |
| 4623 FX_BOOL CPDF_SortObjNumArray::BinarySearch(FX_DWORD value, FX_INT32 &iNext) | 4623 FX_BOOL CPDF_SortObjNumArray::BinarySearch(FX_DWORD value, int32_t &iNext) |
| 4624 { | 4624 { |
| 4625 FX_INT32 iLen = m_number_array.GetSize(); | 4625 int32_t iLen = m_number_array.GetSize(); |
| 4626 FX_INT32 iLow = 0; | 4626 int32_t iLow = 0; |
| 4627 FX_INT32 iHigh = iLen - 1; | 4627 int32_t iHigh = iLen - 1; |
| 4628 FX_INT32 iMid = 0; | 4628 int32_t iMid = 0; |
| 4629 while (iLow <= iHigh) { | 4629 while (iLow <= iHigh) { |
| 4630 iMid = (iLow + iHigh) / 2; | 4630 iMid = (iLow + iHigh) / 2; |
| 4631 if (m_number_array.GetAt(iMid) == value) { | 4631 if (m_number_array.GetAt(iMid) == value) { |
| 4632 iNext = iMid; | 4632 iNext = iMid; |
| 4633 return TRUE; | 4633 return TRUE; |
| 4634 } else if (m_number_array.GetAt(iMid) > value) { | 4634 } else if (m_number_array.GetAt(iMid) > value) { |
| 4635 iHigh = iMid - 1; | 4635 iHigh = iMid - 1; |
| 4636 } else if (m_number_array.GetAt(iMid) < value) { | 4636 } else if (m_number_array.GetAt(iMid) < value) { |
| 4637 iLow = iMid + 1; | 4637 iLow = iMid + 1; |
| 4638 } | 4638 } |
| 4639 } | 4639 } |
| 4640 iNext = iLow; | 4640 iNext = iLow; |
| 4641 return FALSE; | 4641 return FALSE; |
| 4642 } | 4642 } |
| 4643 CPDF_PageNode::~CPDF_PageNode() | 4643 CPDF_PageNode::~CPDF_PageNode() |
| 4644 { | 4644 { |
| 4645 FX_INT32 iSize = m_childNode.GetSize(); | 4645 int32_t iSize = m_childNode.GetSize(); |
| 4646 for (FX_INT32 i = 0; i < iSize; ++i) { | 4646 for (int32_t i = 0; i < iSize; ++i) { |
| 4647 CPDF_PageNode *pNode = (CPDF_PageNode*)m_childNode[i]; | 4647 CPDF_PageNode *pNode = (CPDF_PageNode*)m_childNode[i]; |
| 4648 if (pNode) { | 4648 if (pNode) { |
| 4649 delete pNode; | 4649 delete pNode; |
| 4650 } | 4650 } |
| 4651 } | 4651 } |
| 4652 m_childNode.RemoveAll(); | 4652 m_childNode.RemoveAll(); |
| 4653 } | 4653 } |
| OLD | NEW |