OLD | NEW |
1 // Copyright 2016 PDFium Authors. All rights reserved. | 1 // Copyright 2016 PDFium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
6 | 6 |
7 #include "core/fpdfapi/parser/cpdf_data_avail.h" | 7 #include "core/fpdfapi/parser/cpdf_data_avail.h" |
8 | 8 |
9 #include <algorithm> | 9 #include <algorithm> |
10 #include <memory> | 10 #include <memory> |
(...skipping 435 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
446 | 446 |
447 bool CPDF_DataAvail::IsFirstCheck(uint32_t dwPage) { | 447 bool CPDF_DataAvail::IsFirstCheck(uint32_t dwPage) { |
448 return m_pageMapCheckState.insert(dwPage).second; | 448 return m_pageMapCheckState.insert(dwPage).second; |
449 } | 449 } |
450 | 450 |
451 void CPDF_DataAvail::ResetFirstCheck(uint32_t dwPage) { | 451 void CPDF_DataAvail::ResetFirstCheck(uint32_t dwPage) { |
452 m_pageMapCheckState.erase(dwPage); | 452 m_pageMapCheckState.erase(dwPage); |
453 } | 453 } |
454 | 454 |
455 bool CPDF_DataAvail::CheckPage(DownloadHints* pHints) { | 455 bool CPDF_DataAvail::CheckPage(DownloadHints* pHints) { |
456 uint32_t iPageObjs = m_PageObjList.GetSize(); | 456 std::vector<uint32_t> UnavailObjList; |
457 CFX_ArrayTemplate<uint32_t> UnavailObjList; | 457 for (uint32_t dwPageObjNum : m_PageObjList) { |
458 for (uint32_t i = 0; i < iPageObjs; ++i) { | 458 bool bExists = false; |
459 uint32_t dwPageObjNum = m_PageObjList.GetAt(i); | |
460 bool bExist = false; | |
461 std::unique_ptr<CPDF_Object> pObj = | 459 std::unique_ptr<CPDF_Object> pObj = |
462 GetObject(dwPageObjNum, pHints, &bExist); | 460 GetObject(dwPageObjNum, pHints, &bExists); |
463 if (!pObj) { | 461 if (!pObj) { |
464 if (bExist) | 462 if (bExists) |
465 UnavailObjList.Add(dwPageObjNum); | 463 UnavailObjList.push_back(dwPageObjNum); |
466 continue; | 464 continue; |
467 } | 465 } |
468 | |
469 CPDF_Array* pArray = ToArray(pObj.get()); | 466 CPDF_Array* pArray = ToArray(pObj.get()); |
470 if (pArray) { | 467 if (pArray) { |
471 for (const auto& pArrayObj : *pArray) { | 468 for (const auto& pArrayObj : *pArray) { |
472 if (CPDF_Reference* pRef = ToReference(pArrayObj.get())) | 469 if (CPDF_Reference* pRef = ToReference(pArrayObj.get())) |
473 UnavailObjList.Add(pRef->GetRefObjNum()); | 470 UnavailObjList.push_back(pRef->GetRefObjNum()); |
474 } | 471 } |
475 } | 472 } |
476 if (!pObj->IsDictionary()) | 473 if (!pObj->IsDictionary()) |
477 continue; | 474 continue; |
478 | 475 |
479 CFX_ByteString type = pObj->GetDict()->GetStringFor("Type"); | 476 CFX_ByteString type = pObj->GetDict()->GetStringFor("Type"); |
480 if (type == "Pages") { | 477 if (type == "Pages") { |
481 m_PagesArray.push_back(std::move(pObj)); | 478 m_PagesArray.push_back(std::move(pObj)); |
482 continue; | 479 continue; |
483 } | 480 } |
484 } | 481 } |
485 | 482 m_PageObjList.clear(); |
486 m_PageObjList.RemoveAll(); | 483 if (!UnavailObjList.empty()) { |
487 if (UnavailObjList.GetSize()) { | 484 m_PageObjList = std::move(UnavailObjList); |
488 m_PageObjList.Append(UnavailObjList); | |
489 return false; | 485 return false; |
490 } | 486 } |
491 | 487 size_t iPages = m_PagesArray.size(); |
492 uint32_t iPages = m_PagesArray.size(); | 488 for (size_t i = 0; i < iPages; ++i) { |
493 for (uint32_t i = 0; i < iPages; i++) { | |
494 std::unique_ptr<CPDF_Object> pPages = std::move(m_PagesArray[i]); | 489 std::unique_ptr<CPDF_Object> pPages = std::move(m_PagesArray[i]); |
495 if (pPages && !GetPageKids(m_pCurrentParser, pPages.get())) { | 490 if (pPages && !GetPageKids(m_pCurrentParser, pPages.get())) { |
496 m_PagesArray.clear(); | 491 m_PagesArray.clear(); |
497 m_docStatus = PDF_DATAAVAIL_ERROR; | 492 m_docStatus = PDF_DATAAVAIL_ERROR; |
498 return false; | 493 return false; |
499 } | 494 } |
500 } | 495 } |
501 m_PagesArray.clear(); | 496 m_PagesArray.clear(); |
502 if (!m_PageObjList.GetSize()) | 497 if (m_PageObjList.empty()) |
503 m_docStatus = PDF_DATAAVAIL_DONE; | 498 m_docStatus = PDF_DATAAVAIL_DONE; |
504 | 499 |
505 return true; | 500 return true; |
506 } | 501 } |
507 | 502 |
508 bool CPDF_DataAvail::GetPageKids(CPDF_Parser* pParser, CPDF_Object* pPages) { | 503 bool CPDF_DataAvail::GetPageKids(CPDF_Parser* pParser, CPDF_Object* pPages) { |
509 if (!pParser) { | 504 if (!pParser) { |
510 m_docStatus = PDF_DATAAVAIL_ERROR; | 505 m_docStatus = PDF_DATAAVAIL_ERROR; |
511 return false; | 506 return false; |
512 } | 507 } |
513 | 508 |
514 CPDF_Dictionary* pDict = pPages->GetDict(); | 509 CPDF_Dictionary* pDict = pPages->GetDict(); |
515 CPDF_Object* pKids = pDict ? pDict->GetObjectFor("Kids") : nullptr; | 510 CPDF_Object* pKids = pDict ? pDict->GetObjectFor("Kids") : nullptr; |
516 if (!pKids) | 511 if (!pKids) |
517 return true; | 512 return true; |
518 | 513 |
519 switch (pKids->GetType()) { | 514 switch (pKids->GetType()) { |
520 case CPDF_Object::REFERENCE: | 515 case CPDF_Object::REFERENCE: |
521 m_PageObjList.Add(pKids->AsReference()->GetRefObjNum()); | 516 m_PageObjList.push_back(pKids->AsReference()->GetRefObjNum()); |
522 break; | 517 break; |
523 case CPDF_Object::ARRAY: { | 518 case CPDF_Object::ARRAY: { |
524 CPDF_Array* pKidsArray = pKids->AsArray(); | 519 CPDF_Array* pKidsArray = pKids->AsArray(); |
525 for (size_t i = 0; i < pKidsArray->GetCount(); ++i) { | 520 for (size_t i = 0; i < pKidsArray->GetCount(); ++i) { |
526 if (CPDF_Reference* pRef = ToReference(pKidsArray->GetObjectAt(i))) | 521 if (CPDF_Reference* pRef = ToReference(pKidsArray->GetObjectAt(i))) |
527 m_PageObjList.Add(pRef->GetRefObjNum()); | 522 m_PageObjList.push_back(pRef->GetRefObjNum()); |
528 } | 523 } |
529 } break; | 524 } break; |
530 default: | 525 default: |
531 m_docStatus = PDF_DATAAVAIL_ERROR; | 526 m_docStatus = PDF_DATAAVAIL_ERROR; |
532 return false; | 527 return false; |
533 } | 528 } |
534 return true; | 529 return true; |
535 } | 530 } |
536 | 531 |
537 bool CPDF_DataAvail::CheckPages(DownloadHints* pHints) { | 532 bool CPDF_DataAvail::CheckPages(DownloadHints* pHints) { |
538 bool bExist = false; | 533 bool bExists = false; |
539 std::unique_ptr<CPDF_Object> pPages = | 534 std::unique_ptr<CPDF_Object> pPages = |
540 GetObject(m_PagesObjNum, pHints, &bExist); | 535 GetObject(m_PagesObjNum, pHints, &bExists); |
541 if (!bExist) { | 536 if (!bExists) { |
542 m_docStatus = PDF_DATAAVAIL_LOADALLFILE; | 537 m_docStatus = PDF_DATAAVAIL_LOADALLFILE; |
543 return true; | 538 return true; |
544 } | 539 } |
545 | 540 |
546 if (!pPages) { | 541 if (!pPages) { |
547 if (m_docStatus == PDF_DATAAVAIL_ERROR) { | 542 if (m_docStatus == PDF_DATAAVAIL_ERROR) { |
548 m_docStatus = PDF_DATAAVAIL_LOADALLFILE; | 543 m_docStatus = PDF_DATAAVAIL_LOADALLFILE; |
549 return true; | 544 return true; |
550 } | 545 } |
551 return false; | 546 return false; |
(...skipping 562 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1114 m_bCurPageDictLoadOK = true; | 1109 m_bCurPageDictLoadOK = true; |
1115 m_docStatus = PDF_DATAAVAIL_PAGE; | 1110 m_docStatus = PDF_DATAAVAIL_PAGE; |
1116 return true; | 1111 return true; |
1117 } | 1112 } |
1118 } | 1113 } |
1119 } | 1114 } |
1120 | 1115 |
1121 bool CPDF_DataAvail::CheckArrayPageNode(uint32_t dwPageNo, | 1116 bool CPDF_DataAvail::CheckArrayPageNode(uint32_t dwPageNo, |
1122 PageNode* pPageNode, | 1117 PageNode* pPageNode, |
1123 DownloadHints* pHints) { | 1118 DownloadHints* pHints) { |
1124 bool bExist = false; | 1119 bool bExists = false; |
1125 std::unique_ptr<CPDF_Object> pPages = GetObject(dwPageNo, pHints, &bExist); | 1120 std::unique_ptr<CPDF_Object> pPages = GetObject(dwPageNo, pHints, &bExists); |
1126 if (!bExist) { | 1121 if (!bExists) { |
1127 m_docStatus = PDF_DATAAVAIL_ERROR; | 1122 m_docStatus = PDF_DATAAVAIL_ERROR; |
1128 return false; | 1123 return false; |
1129 } | 1124 } |
1130 | 1125 |
1131 if (!pPages) { | 1126 if (!pPages) { |
1132 if (m_docStatus == PDF_DATAAVAIL_ERROR) { | 1127 if (m_docStatus == PDF_DATAAVAIL_ERROR) { |
1133 m_docStatus = PDF_DATAAVAIL_ERROR; | 1128 m_docStatus = PDF_DATAAVAIL_ERROR; |
1134 return false; | 1129 return false; |
1135 } | 1130 } |
1136 return false; | 1131 return false; |
(...skipping 14 matching lines...) Expand all Loading... |
1151 auto pNode = pdfium::MakeUnique<PageNode>(); | 1146 auto pNode = pdfium::MakeUnique<PageNode>(); |
1152 pNode->m_dwPageNo = pKid->GetRefObjNum(); | 1147 pNode->m_dwPageNo = pKid->GetRefObjNum(); |
1153 pPageNode->m_ChildNodes.push_back(std::move(pNode)); | 1148 pPageNode->m_ChildNodes.push_back(std::move(pNode)); |
1154 } | 1149 } |
1155 return true; | 1150 return true; |
1156 } | 1151 } |
1157 | 1152 |
1158 bool CPDF_DataAvail::CheckUnknownPageNode(uint32_t dwPageNo, | 1153 bool CPDF_DataAvail::CheckUnknownPageNode(uint32_t dwPageNo, |
1159 PageNode* pPageNode, | 1154 PageNode* pPageNode, |
1160 DownloadHints* pHints) { | 1155 DownloadHints* pHints) { |
1161 bool bExist = false; | 1156 bool bExists = false; |
1162 std::unique_ptr<CPDF_Object> pPage = GetObject(dwPageNo, pHints, &bExist); | 1157 std::unique_ptr<CPDF_Object> pPage = GetObject(dwPageNo, pHints, &bExists); |
1163 if (!bExist) { | 1158 if (!bExists) { |
1164 m_docStatus = PDF_DATAAVAIL_ERROR; | 1159 m_docStatus = PDF_DATAAVAIL_ERROR; |
1165 return false; | 1160 return false; |
1166 } | 1161 } |
1167 | 1162 |
1168 if (!pPage) { | 1163 if (!pPage) { |
1169 if (m_docStatus == PDF_DATAAVAIL_ERROR) | 1164 if (m_docStatus == PDF_DATAAVAIL_ERROR) |
1170 m_docStatus = PDF_DATAAVAIL_ERROR; | 1165 m_docStatus = PDF_DATAAVAIL_ERROR; |
1171 return false; | 1166 return false; |
1172 } | 1167 } |
1173 | 1168 |
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1285 } | 1280 } |
1286 if (m_PageNode.m_type == PDF_PAGENODE_PAGE) { | 1281 if (m_PageNode.m_type == PDF_PAGENODE_PAGE) { |
1287 m_docStatus = iPage == 0 ? PDF_DATAAVAIL_DONE : PDF_DATAAVAIL_ERROR; | 1282 m_docStatus = iPage == 0 ? PDF_DATAAVAIL_DONE : PDF_DATAAVAIL_ERROR; |
1288 return true; | 1283 return true; |
1289 } | 1284 } |
1290 int32_t iCount = -1; | 1285 int32_t iCount = -1; |
1291 return CheckPageNode(m_PageNode, iPage, iCount, pHints, 0); | 1286 return CheckPageNode(m_PageNode, iPage, iCount, pHints, 0); |
1292 } | 1287 } |
1293 | 1288 |
1294 bool CPDF_DataAvail::CheckPageCount(DownloadHints* pHints) { | 1289 bool CPDF_DataAvail::CheckPageCount(DownloadHints* pHints) { |
1295 bool bExist = false; | 1290 bool bExists = false; |
1296 std::unique_ptr<CPDF_Object> pPages = | 1291 std::unique_ptr<CPDF_Object> pPages = |
1297 GetObject(m_PagesObjNum, pHints, &bExist); | 1292 GetObject(m_PagesObjNum, pHints, &bExists); |
1298 if (!bExist) { | 1293 if (!bExists) { |
1299 m_docStatus = PDF_DATAAVAIL_ERROR; | 1294 m_docStatus = PDF_DATAAVAIL_ERROR; |
1300 return false; | 1295 return false; |
1301 } | 1296 } |
1302 | |
1303 if (!pPages) | 1297 if (!pPages) |
1304 return false; | 1298 return false; |
1305 | 1299 |
1306 CPDF_Dictionary* pPagesDict = pPages->GetDict(); | 1300 CPDF_Dictionary* pPagesDict = pPages->GetDict(); |
1307 if (!pPagesDict) { | 1301 if (!pPagesDict) { |
1308 m_docStatus = PDF_DATAAVAIL_ERROR; | 1302 m_docStatus = PDF_DATAAVAIL_ERROR; |
1309 return false; | 1303 return false; |
1310 } | 1304 } |
1311 | |
1312 if (!pPagesDict->KeyExist("Kids")) | 1305 if (!pPagesDict->KeyExist("Kids")) |
1313 return true; | 1306 return true; |
1314 | 1307 |
1315 return pPagesDict->GetIntegerFor("Count") > 0; | 1308 return pPagesDict->GetIntegerFor("Count") > 0; |
1316 } | 1309 } |
1317 | 1310 |
1318 bool CPDF_DataAvail::LoadDocPages(DownloadHints* pHints) { | 1311 bool CPDF_DataAvail::LoadDocPages(DownloadHints* pHints) { |
1319 if (!CheckUnknownPageNode(m_PagesObjNum, &m_PageNode, pHints)) | 1312 if (!CheckUnknownPageNode(m_PagesObjNum, &m_PageNode, pHints)) |
1320 return false; | 1313 return false; |
1321 | 1314 |
(...skipping 372 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1694 return false; | 1687 return false; |
1695 std::vector<CPDF_Object*> obj_array; | 1688 std::vector<CPDF_Object*> obj_array; |
1696 obj_array.push_back(pAcroForm); | 1689 obj_array.push_back(pAcroForm); |
1697 std::vector<CPDF_Object*> dummy; | 1690 std::vector<CPDF_Object*> dummy; |
1698 return AreObjectsAvailable(obj_array, true, nullptr, dummy); | 1691 return AreObjectsAvailable(obj_array, true, nullptr, dummy); |
1699 } | 1692 } |
1700 | 1693 |
1701 CPDF_DataAvail::PageNode::PageNode() : m_type(PDF_PAGENODE_UNKNOWN) {} | 1694 CPDF_DataAvail::PageNode::PageNode() : m_type(PDF_PAGENODE_UNKNOWN) {} |
1702 | 1695 |
1703 CPDF_DataAvail::PageNode::~PageNode() {} | 1696 CPDF_DataAvail::PageNode::~PageNode() {} |
OLD | NEW |