| 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 "core/fpdfapi/edit/editint.h" | 7 #include "core/fpdfapi/edit/editint.h" |
| 8 | 8 |
| 9 #include <vector> | 9 #include <vector> |
| 10 | 10 |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 53 if (pFile->AppendString(" ") < 0) { | 53 if (pFile->AppendString(" ") < 0) { |
| 54 return -1; | 54 return -1; |
| 55 } | 55 } |
| 56 if ((len = pFile->AppendString(pObj->GetString().AsStringC())) < 0) { | 56 if ((len = pFile->AppendString(pObj->GetString().AsStringC())) < 0) { |
| 57 return -1; | 57 return -1; |
| 58 } | 58 } |
| 59 offset += len + 1; | 59 offset += len + 1; |
| 60 break; | 60 break; |
| 61 case CPDF_Object::STRING: { | 61 case CPDF_Object::STRING: { |
| 62 CFX_ByteString str = pObj->GetString(); | 62 CFX_ByteString str = pObj->GetString(); |
| 63 FX_BOOL bHex = pObj->AsString()->IsHex(); | 63 bool bHex = pObj->AsString()->IsHex(); |
| 64 if ((len = pFile->AppendString(PDF_EncodeString(str, bHex).AsStringC())) < | 64 if ((len = pFile->AppendString(PDF_EncodeString(str, bHex).AsStringC())) < |
| 65 0) { | 65 0) { |
| 66 return -1; | 66 return -1; |
| 67 } | 67 } |
| 68 offset += len; | 68 offset += len; |
| 69 break; | 69 break; |
| 70 } | 70 } |
| 71 case CPDF_Object::NAME: { | 71 case CPDF_Object::NAME: { |
| 72 if (pFile->AppendString("/") < 0) { | 72 if (pFile->AppendString("/") < 0) { |
| 73 return -1; | 73 return -1; |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 162 case CPDF_Object::STREAM: { | 162 case CPDF_Object::STREAM: { |
| 163 const CPDF_Stream* p = pObj->AsStream(); | 163 const CPDF_Stream* p = pObj->AsStream(); |
| 164 if (PDF_CreatorAppendObject(p->GetDict(), pFile, offset) < 0) { | 164 if (PDF_CreatorAppendObject(p->GetDict(), pFile, offset) < 0) { |
| 165 return -1; | 165 return -1; |
| 166 } | 166 } |
| 167 if (pFile->AppendString("stream\r\n") < 0) { | 167 if (pFile->AppendString("stream\r\n") < 0) { |
| 168 return -1; | 168 return -1; |
| 169 } | 169 } |
| 170 offset += 8; | 170 offset += 8; |
| 171 CPDF_StreamAcc acc; | 171 CPDF_StreamAcc acc; |
| 172 acc.LoadAllData(p, TRUE); | 172 acc.LoadAllData(p, true); |
| 173 if (pFile->AppendBlock(acc.GetData(), acc.GetSize()) < 0) { | 173 if (pFile->AppendBlock(acc.GetData(), acc.GetSize()) < 0) { |
| 174 return -1; | 174 return -1; |
| 175 } | 175 } |
| 176 offset += acc.GetSize(); | 176 offset += acc.GetSize(); |
| 177 if ((len = pFile->AppendString("\r\nendstream")) < 0) { | 177 if ((len = pFile->AppendString("\r\nendstream")) < 0) { |
| 178 return -1; | 178 return -1; |
| 179 } | 179 } |
| 180 offset += len; | 180 offset += len; |
| 181 break; | 181 break; |
| 182 } | 182 } |
| 183 default: | 183 default: |
| 184 ASSERT(FALSE); | 184 ASSERT(false); |
| 185 break; | 185 break; |
| 186 } | 186 } |
| 187 return 1; | 187 return 1; |
| 188 } | 188 } |
| 189 | 189 |
| 190 int32_t PDF_CreatorWriteTrailer(CPDF_Document* pDocument, | 190 int32_t PDF_CreatorWriteTrailer(CPDF_Document* pDocument, |
| 191 CFX_FileBufferArchive* pFile, | 191 CFX_FileBufferArchive* pFile, |
| 192 CPDF_Array* pIDArray) { | 192 CPDF_Array* pIDArray) { |
| 193 FX_FILESIZE offset = 0; | 193 FX_FILESIZE offset = 0; |
| 194 int32_t len = 0; | 194 int32_t len = 0; |
| (...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 378 return -1; | 378 return -1; |
| 379 if (pFile->AppendByte(FX_GETBYTEOFFSET0(offset)) < 0) | 379 if (pFile->AppendByte(FX_GETBYTEOFFSET0(offset)) < 0) |
| 380 return -1; | 380 return -1; |
| 381 if (pFile->AppendByte(0) < 0) | 381 if (pFile->AppendByte(0) < 0) |
| 382 return -1; | 382 return -1; |
| 383 return 0; | 383 return 0; |
| 384 } | 384 } |
| 385 | 385 |
| 386 class CPDF_FlateEncoder { | 386 class CPDF_FlateEncoder { |
| 387 public: | 387 public: |
| 388 CPDF_FlateEncoder(CPDF_Stream* pStream, FX_BOOL bFlateEncode); | 388 CPDF_FlateEncoder(CPDF_Stream* pStream, bool bFlateEncode); |
| 389 CPDF_FlateEncoder(const uint8_t* pBuffer, | 389 CPDF_FlateEncoder(const uint8_t* pBuffer, |
| 390 uint32_t size, | 390 uint32_t size, |
| 391 bool bFlateEncode, | 391 bool bFlateEncode, |
| 392 bool bXRefStream); | 392 bool bXRefStream); |
| 393 ~CPDF_FlateEncoder(); | 393 ~CPDF_FlateEncoder(); |
| 394 | 394 |
| 395 void CloneDict(); | 395 void CloneDict(); |
| 396 | 396 |
| 397 uint8_t* m_pData; | 397 uint8_t* m_pData; |
| 398 uint32_t m_dwSize; | 398 uint32_t m_dwSize; |
| 399 CPDF_Dictionary* m_pDict; | 399 CPDF_Dictionary* m_pDict; |
| 400 FX_BOOL m_bCloned; | 400 bool m_bCloned; |
| 401 FX_BOOL m_bNewData; | 401 bool m_bNewData; |
| 402 CPDF_StreamAcc m_Acc; | 402 CPDF_StreamAcc m_Acc; |
| 403 }; | 403 }; |
| 404 | 404 |
| 405 void CPDF_FlateEncoder::CloneDict() { | 405 void CPDF_FlateEncoder::CloneDict() { |
| 406 if (!m_bCloned) { | 406 if (!m_bCloned) { |
| 407 m_pDict = ToDictionary(m_pDict->Clone()); | 407 m_pDict = ToDictionary(m_pDict->Clone()); |
| 408 ASSERT(m_pDict); | 408 ASSERT(m_pDict); |
| 409 m_bCloned = TRUE; | 409 m_bCloned = true; |
| 410 } | 410 } |
| 411 } | 411 } |
| 412 | 412 |
| 413 CPDF_FlateEncoder::CPDF_FlateEncoder(CPDF_Stream* pStream, FX_BOOL bFlateEncode) | 413 CPDF_FlateEncoder::CPDF_FlateEncoder(CPDF_Stream* pStream, bool bFlateEncode) |
| 414 : m_pData(nullptr), | 414 : m_pData(nullptr), |
| 415 m_dwSize(0), | 415 m_dwSize(0), |
| 416 m_pDict(nullptr), | 416 m_pDict(nullptr), |
| 417 m_bCloned(FALSE), | 417 m_bCloned(false), |
| 418 m_bNewData(FALSE) { | 418 m_bNewData(false) { |
| 419 m_Acc.LoadAllData(pStream, TRUE); | 419 m_Acc.LoadAllData(pStream, true); |
| 420 if ((pStream && pStream->GetDict() && | 420 if ((pStream && pStream->GetDict() && |
| 421 pStream->GetDict()->KeyExist("Filter")) || | 421 pStream->GetDict()->KeyExist("Filter")) || |
| 422 !bFlateEncode) { | 422 !bFlateEncode) { |
| 423 if (pStream->GetDict()->KeyExist("Filter") && !bFlateEncode) { | 423 if (pStream->GetDict()->KeyExist("Filter") && !bFlateEncode) { |
| 424 CPDF_StreamAcc destAcc; | 424 CPDF_StreamAcc destAcc; |
| 425 destAcc.LoadAllData(pStream); | 425 destAcc.LoadAllData(pStream); |
| 426 m_dwSize = destAcc.GetSize(); | 426 m_dwSize = destAcc.GetSize(); |
| 427 m_pData = (uint8_t*)destAcc.DetachData(); | 427 m_pData = (uint8_t*)destAcc.DetachData(); |
| 428 m_pDict = ToDictionary(pStream->GetDict()->Clone()); | 428 m_pDict = ToDictionary(pStream->GetDict()->Clone()); |
| 429 m_pDict->RemoveFor("Filter"); | 429 m_pDict->RemoveFor("Filter"); |
| 430 m_bNewData = TRUE; | 430 m_bNewData = true; |
| 431 m_bCloned = TRUE; | 431 m_bCloned = true; |
| 432 } else { | 432 } else { |
| 433 m_pData = (uint8_t*)m_Acc.GetData(); | 433 m_pData = (uint8_t*)m_Acc.GetData(); |
| 434 m_dwSize = m_Acc.GetSize(); | 434 m_dwSize = m_Acc.GetSize(); |
| 435 m_pDict = pStream->GetDict(); | 435 m_pDict = pStream->GetDict(); |
| 436 } | 436 } |
| 437 return; | 437 return; |
| 438 } | 438 } |
| 439 | 439 |
| 440 m_bNewData = TRUE; | 440 m_bNewData = true; |
| 441 m_bCloned = TRUE; | 441 m_bCloned = true; |
| 442 // TODO(thestig): Move to Init() and check return value. | 442 // TODO(thestig): Move to Init() and check return value. |
| 443 ::FlateEncode(m_Acc.GetData(), m_Acc.GetSize(), &m_pData, &m_dwSize); | 443 ::FlateEncode(m_Acc.GetData(), m_Acc.GetSize(), &m_pData, &m_dwSize); |
| 444 m_pDict = ToDictionary(pStream->GetDict()->Clone()); | 444 m_pDict = ToDictionary(pStream->GetDict()->Clone()); |
| 445 m_pDict->SetIntegerFor("Length", m_dwSize); | 445 m_pDict->SetIntegerFor("Length", m_dwSize); |
| 446 m_pDict->SetNameFor("Filter", "FlateDecode"); | 446 m_pDict->SetNameFor("Filter", "FlateDecode"); |
| 447 m_pDict->RemoveFor("DecodeParms"); | 447 m_pDict->RemoveFor("DecodeParms"); |
| 448 } | 448 } |
| 449 | 449 |
| 450 CPDF_FlateEncoder::CPDF_FlateEncoder(const uint8_t* pBuffer, | 450 CPDF_FlateEncoder::CPDF_FlateEncoder(const uint8_t* pBuffer, |
| 451 uint32_t size, | 451 uint32_t size, |
| 452 bool bFlateEncode, | 452 bool bFlateEncode, |
| 453 bool bXRefStream) | 453 bool bXRefStream) |
| 454 : m_pData(nullptr), | 454 : m_pData(nullptr), |
| 455 m_dwSize(0), | 455 m_dwSize(0), |
| 456 m_pDict(nullptr), | 456 m_pDict(nullptr), |
| 457 m_bCloned(FALSE), | 457 m_bCloned(false), |
| 458 m_bNewData(FALSE) { | 458 m_bNewData(false) { |
| 459 if (!bFlateEncode) { | 459 if (!bFlateEncode) { |
| 460 m_pData = (uint8_t*)pBuffer; | 460 m_pData = (uint8_t*)pBuffer; |
| 461 m_dwSize = size; | 461 m_dwSize = size; |
| 462 return; | 462 return; |
| 463 } | 463 } |
| 464 m_bNewData = TRUE; | 464 m_bNewData = true; |
| 465 // TODO(thestig): Move to Init() and check return value. | 465 // TODO(thestig): Move to Init() and check return value. |
| 466 if (bXRefStream) | 466 if (bXRefStream) |
| 467 ::PngEncode(pBuffer, size, &m_pData, &m_dwSize); | 467 ::PngEncode(pBuffer, size, &m_pData, &m_dwSize); |
| 468 else | 468 else |
| 469 ::FlateEncode(pBuffer, size, &m_pData, &m_dwSize); | 469 ::FlateEncode(pBuffer, size, &m_pData, &m_dwSize); |
| 470 } | 470 } |
| 471 | 471 |
| 472 CPDF_FlateEncoder::~CPDF_FlateEncoder() { | 472 CPDF_FlateEncoder::~CPDF_FlateEncoder() { |
| 473 if (m_bCloned && m_pDict) | 473 if (m_bCloned && m_pDict) |
| 474 m_pDict->Release(); | 474 m_pDict->Release(); |
| 475 if (m_bNewData) | 475 if (m_bNewData) |
| 476 FX_Free(m_pData); | 476 FX_Free(m_pData); |
| 477 } | 477 } |
| 478 | 478 |
| 479 class CPDF_Encryptor { | 479 class CPDF_Encryptor { |
| 480 public: | 480 public: |
| 481 CPDF_Encryptor(CPDF_CryptoHandler* pHandler, | 481 CPDF_Encryptor(CPDF_CryptoHandler* pHandler, |
| 482 int objnum, | 482 int objnum, |
| 483 uint8_t* src_data, | 483 uint8_t* src_data, |
| 484 uint32_t src_size); | 484 uint32_t src_size); |
| 485 ~CPDF_Encryptor(); | 485 ~CPDF_Encryptor(); |
| 486 | 486 |
| 487 uint8_t* m_pData; | 487 uint8_t* m_pData; |
| 488 uint32_t m_dwSize; | 488 uint32_t m_dwSize; |
| 489 FX_BOOL m_bNewBuf; | 489 bool m_bNewBuf; |
| 490 }; | 490 }; |
| 491 | 491 |
| 492 CPDF_Encryptor::CPDF_Encryptor(CPDF_CryptoHandler* pHandler, | 492 CPDF_Encryptor::CPDF_Encryptor(CPDF_CryptoHandler* pHandler, |
| 493 int objnum, | 493 int objnum, |
| 494 uint8_t* src_data, | 494 uint8_t* src_data, |
| 495 uint32_t src_size) | 495 uint32_t src_size) |
| 496 : m_pData(nullptr), m_dwSize(0), m_bNewBuf(FALSE) { | 496 : m_pData(nullptr), m_dwSize(0), m_bNewBuf(false) { |
| 497 if (src_size == 0) | 497 if (src_size == 0) |
| 498 return; | 498 return; |
| 499 | 499 |
| 500 if (!pHandler) { | 500 if (!pHandler) { |
| 501 m_pData = (uint8_t*)src_data; | 501 m_pData = (uint8_t*)src_data; |
| 502 m_dwSize = src_size; | 502 m_dwSize = src_size; |
| 503 return; | 503 return; |
| 504 } | 504 } |
| 505 m_dwSize = pHandler->EncryptGetSize(objnum, 0, src_data, src_size); | 505 m_dwSize = pHandler->EncryptGetSize(objnum, 0, src_data, src_size); |
| 506 m_pData = FX_Alloc(uint8_t, m_dwSize); | 506 m_pData = FX_Alloc(uint8_t, m_dwSize); |
| 507 pHandler->EncryptContent(objnum, 0, src_data, src_size, m_pData, m_dwSize); | 507 pHandler->EncryptContent(objnum, 0, src_data, src_size, m_pData, m_dwSize); |
| 508 m_bNewBuf = TRUE; | 508 m_bNewBuf = true; |
| 509 } | 509 } |
| 510 | 510 |
| 511 CPDF_Encryptor::~CPDF_Encryptor() { | 511 CPDF_Encryptor::~CPDF_Encryptor() { |
| 512 if (m_bNewBuf) | 512 if (m_bNewBuf) |
| 513 FX_Free(m_pData); | 513 FX_Free(m_pData); |
| 514 } | 514 } |
| 515 | 515 |
| 516 } // namespace | 516 } // namespace |
| 517 | 517 |
| 518 CPDF_ObjectStream::CPDF_ObjectStream() : m_dwObjNum(0), m_index(0) {} | 518 CPDF_ObjectStream::CPDF_ObjectStream() : m_dwObjNum(0), m_index(0) {} |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 604 } | 604 } |
| 605 offset += len; | 605 offset += len; |
| 606 return ObjOffset; | 606 return ObjOffset; |
| 607 } | 607 } |
| 608 | 608 |
| 609 CPDF_XRefStream::CPDF_XRefStream() | 609 CPDF_XRefStream::CPDF_XRefStream() |
| 610 : m_PrevOffset(0), m_dwTempObjNum(0), m_iSeg(0) {} | 610 : m_PrevOffset(0), m_dwTempObjNum(0), m_iSeg(0) {} |
| 611 | 611 |
| 612 CPDF_XRefStream::~CPDF_XRefStream() {} | 612 CPDF_XRefStream::~CPDF_XRefStream() {} |
| 613 | 613 |
| 614 FX_BOOL CPDF_XRefStream::Start() { | 614 bool CPDF_XRefStream::Start() { |
| 615 m_IndexArray.clear(); | 615 m_IndexArray.clear(); |
| 616 m_Buffer.Clear(); | 616 m_Buffer.Clear(); |
| 617 m_iSeg = 0; | 617 m_iSeg = 0; |
| 618 return TRUE; | 618 return true; |
| 619 } | 619 } |
| 620 int32_t CPDF_XRefStream::CompressIndirectObject(uint32_t dwObjNum, | 620 int32_t CPDF_XRefStream::CompressIndirectObject(uint32_t dwObjNum, |
| 621 const CPDF_Object* pObj, | 621 const CPDF_Object* pObj, |
| 622 CPDF_Creator* pCreator) { | 622 CPDF_Creator* pCreator) { |
| 623 if (!pCreator) | 623 if (!pCreator) |
| 624 return 0; | 624 return 0; |
| 625 | 625 |
| 626 m_ObjStream.CompressIndirectObject(dwObjNum, pObj); | 626 m_ObjStream.CompressIndirectObject(dwObjNum, pObj); |
| 627 if (pdfium::CollectionSize<int32_t>(m_ObjStream.m_Items) < | 627 if (pdfium::CollectionSize<int32_t>(m_ObjStream.m_Items) < |
| 628 pCreator->m_ObjectStreamSize && | 628 pCreator->m_ObjectStreamSize && |
| (...skipping 11 matching lines...) Expand all Loading... |
| 640 | 640 |
| 641 m_ObjStream.CompressIndirectObject(dwObjNum, pBuffer, dwSize); | 641 m_ObjStream.CompressIndirectObject(dwObjNum, pBuffer, dwSize); |
| 642 if (pdfium::CollectionSize<int32_t>(m_ObjStream.m_Items) < | 642 if (pdfium::CollectionSize<int32_t>(m_ObjStream.m_Items) < |
| 643 pCreator->m_ObjectStreamSize && | 643 pCreator->m_ObjectStreamSize && |
| 644 m_ObjStream.m_Buffer.GetLength() < PDF_OBJECTSTREAM_MAXLENGTH) { | 644 m_ObjStream.m_Buffer.GetLength() < PDF_OBJECTSTREAM_MAXLENGTH) { |
| 645 return 1; | 645 return 1; |
| 646 } | 646 } |
| 647 return EndObjectStream(pCreator); | 647 return EndObjectStream(pCreator); |
| 648 } | 648 } |
| 649 | 649 |
| 650 int32_t CPDF_XRefStream::EndObjectStream(CPDF_Creator* pCreator, FX_BOOL bEOF) { | 650 int32_t CPDF_XRefStream::EndObjectStream(CPDF_Creator* pCreator, bool bEOF) { |
| 651 FX_FILESIZE objOffset = 0; | 651 FX_FILESIZE objOffset = 0; |
| 652 if (bEOF) { | 652 if (bEOF) { |
| 653 objOffset = m_ObjStream.End(pCreator); | 653 objOffset = m_ObjStream.End(pCreator); |
| 654 if (objOffset < 0) { | 654 if (objOffset < 0) { |
| 655 return -1; | 655 return -1; |
| 656 } | 656 } |
| 657 } | 657 } |
| 658 uint32_t& dwObjStmNum = m_ObjStream.m_dwObjNum; | 658 uint32_t& dwObjStmNum = m_ObjStream.m_dwObjNum; |
| 659 if (!dwObjStmNum) { | 659 if (!dwObjStmNum) { |
| 660 dwObjStmNum = ++pCreator->m_dwLastObjNum; | 660 dwObjStmNum = ++pCreator->m_dwLastObjNum; |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 706 AppendIndex1(m_Buffer, objOffset); | 706 AppendIndex1(m_Buffer, objOffset); |
| 707 m_IndexArray.push_back({dwObjStmNum, 1}); | 707 m_IndexArray.push_back({dwObjStmNum, 1}); |
| 708 iSeg += 1; | 708 iSeg += 1; |
| 709 } | 709 } |
| 710 m_iSeg = iSeg; | 710 m_iSeg = iSeg; |
| 711 if (bEOF) { | 711 if (bEOF) { |
| 712 m_ObjStream.Start(); | 712 m_ObjStream.Start(); |
| 713 } | 713 } |
| 714 return 1; | 714 return 1; |
| 715 } | 715 } |
| 716 FX_BOOL CPDF_XRefStream::GenerateXRefStream(CPDF_Creator* pCreator, | 716 bool CPDF_XRefStream::GenerateXRefStream(CPDF_Creator* pCreator, bool bEOF) { |
| 717 FX_BOOL bEOF) { | |
| 718 FX_FILESIZE offset_tmp = pCreator->m_Offset; | 717 FX_FILESIZE offset_tmp = pCreator->m_Offset; |
| 719 uint32_t objnum = ++pCreator->m_dwLastObjNum; | 718 uint32_t objnum = ++pCreator->m_dwLastObjNum; |
| 720 CFX_FileBufferArchive* pFile = &pCreator->m_File; | 719 CFX_FileBufferArchive* pFile = &pCreator->m_File; |
| 721 FX_BOOL bIncremental = (pCreator->m_dwFlags & FPDFCREATE_INCREMENTAL) != 0; | 720 bool bIncremental = (pCreator->m_dwFlags & FPDFCREATE_INCREMENTAL) != 0; |
| 722 if (bIncremental) { | 721 if (bIncremental) { |
| 723 AddObjectNumberToIndexArray(objnum); | 722 AddObjectNumberToIndexArray(objnum); |
| 724 } else { | 723 } else { |
| 725 for (; m_dwTempObjNum < pCreator->m_dwLastObjNum; m_dwTempObjNum++) { | 724 for (; m_dwTempObjNum < pCreator->m_dwLastObjNum; m_dwTempObjNum++) { |
| 726 FX_FILESIZE* offset = pCreator->m_ObjectOffset.GetPtrAt(m_dwTempObjNum); | 725 FX_FILESIZE* offset = pCreator->m_ObjectOffset.GetPtrAt(m_dwTempObjNum); |
| 727 if (offset) { | 726 if (offset) { |
| 728 AppendIndex1(m_Buffer, *offset); | 727 AppendIndex1(m_Buffer, *offset); |
| 729 } else { | 728 } else { |
| 730 AppendIndex0(m_Buffer, false); | 729 AppendIndex0(m_Buffer, false); |
| 731 } | 730 } |
| 732 } | 731 } |
| 733 } | 732 } |
| 734 AppendIndex1(m_Buffer, offset_tmp); | 733 AppendIndex1(m_Buffer, offset_tmp); |
| 735 FX_FILESIZE& offset = pCreator->m_Offset; | 734 FX_FILESIZE& offset = pCreator->m_Offset; |
| 736 int32_t len = pFile->AppendDWord(objnum); | 735 int32_t len = pFile->AppendDWord(objnum); |
| 737 if (len < 0) { | 736 if (len < 0) { |
| 738 return FALSE; | 737 return false; |
| 739 } | 738 } |
| 740 offset += len; | 739 offset += len; |
| 741 if ((len = pFile->AppendString(" 0 obj\r\n<</Type /XRef/W[1 4 2]/Index[")) < | 740 if ((len = pFile->AppendString(" 0 obj\r\n<</Type /XRef/W[1 4 2]/Index[")) < |
| 742 0) { | 741 0) { |
| 743 return FALSE; | 742 return false; |
| 744 } | 743 } |
| 745 offset += len; | 744 offset += len; |
| 746 if (!bIncremental) { | 745 if (!bIncremental) { |
| 747 if ((len = pFile->AppendDWord(0)) < 0) { | 746 if ((len = pFile->AppendDWord(0)) < 0) { |
| 748 return FALSE; | 747 return false; |
| 749 } | 748 } |
| 750 if ((len = pFile->AppendString(" ")) < 0) { | 749 if ((len = pFile->AppendString(" ")) < 0) { |
| 751 return FALSE; | 750 return false; |
| 752 } | 751 } |
| 753 offset += len + 1; | 752 offset += len + 1; |
| 754 if ((len = pFile->AppendDWord(objnum + 1)) < 0) { | 753 if ((len = pFile->AppendDWord(objnum + 1)) < 0) { |
| 755 return FALSE; | 754 return false; |
| 756 } | 755 } |
| 757 offset += len; | 756 offset += len; |
| 758 } else { | 757 } else { |
| 759 for (const auto& pair : m_IndexArray) { | 758 for (const auto& pair : m_IndexArray) { |
| 760 if ((len = pFile->AppendDWord(pair.objnum)) < 0) { | 759 if ((len = pFile->AppendDWord(pair.objnum)) < 0) { |
| 761 return FALSE; | 760 return false; |
| 762 } | 761 } |
| 763 if (pFile->AppendString(" ") < 0) { | 762 if (pFile->AppendString(" ") < 0) { |
| 764 return FALSE; | 763 return false; |
| 765 } | 764 } |
| 766 offset += len + 1; | 765 offset += len + 1; |
| 767 if ((len = pFile->AppendDWord(pair.count)) < 0) { | 766 if ((len = pFile->AppendDWord(pair.count)) < 0) { |
| 768 return FALSE; | 767 return false; |
| 769 } | 768 } |
| 770 if (pFile->AppendString(" ") < 0) { | 769 if (pFile->AppendString(" ") < 0) { |
| 771 return FALSE; | 770 return false; |
| 772 } | 771 } |
| 773 offset += len + 1; | 772 offset += len + 1; |
| 774 } | 773 } |
| 775 } | 774 } |
| 776 if (pFile->AppendString("]/Size ") < 0) { | 775 if (pFile->AppendString("]/Size ") < 0) { |
| 777 return FALSE; | 776 return false; |
| 778 } | 777 } |
| 779 if ((len = pFile->AppendDWord(objnum + 1)) < 0) { | 778 if ((len = pFile->AppendDWord(objnum + 1)) < 0) { |
| 780 return FALSE; | 779 return false; |
| 781 } | 780 } |
| 782 offset += len + 7; | 781 offset += len + 7; |
| 783 if (m_PrevOffset > 0) { | 782 if (m_PrevOffset > 0) { |
| 784 if (pFile->AppendString("/Prev ") < 0) { | 783 if (pFile->AppendString("/Prev ") < 0) { |
| 785 return FALSE; | 784 return false; |
| 786 } | 785 } |
| 787 FX_CHAR offset_buf[20]; | 786 FX_CHAR offset_buf[20]; |
| 788 FXSYS_memset(offset_buf, 0, sizeof(offset_buf)); | 787 FXSYS_memset(offset_buf, 0, sizeof(offset_buf)); |
| 789 FXSYS_i64toa(m_PrevOffset, offset_buf, 10); | 788 FXSYS_i64toa(m_PrevOffset, offset_buf, 10); |
| 790 int32_t offset_len = (int32_t)FXSYS_strlen(offset_buf); | 789 int32_t offset_len = (int32_t)FXSYS_strlen(offset_buf); |
| 791 if (pFile->AppendBlock(offset_buf, offset_len) < 0) { | 790 if (pFile->AppendBlock(offset_buf, offset_len) < 0) { |
| 792 return FALSE; | 791 return false; |
| 793 } | 792 } |
| 794 offset += offset_len + 6; | 793 offset += offset_len + 6; |
| 795 } | 794 } |
| 796 CPDF_FlateEncoder encoder(m_Buffer.GetBuffer(), m_Buffer.GetLength(), TRUE, | 795 CPDF_FlateEncoder encoder(m_Buffer.GetBuffer(), m_Buffer.GetLength(), true, |
| 797 TRUE); | 796 true); |
| 798 if (pFile->AppendString("/Filter /FlateDecode") < 0) | 797 if (pFile->AppendString("/Filter /FlateDecode") < 0) |
| 799 return FALSE; | 798 return false; |
| 800 | 799 |
| 801 offset += 20; | 800 offset += 20; |
| 802 if ((len = pFile->AppendString("/DecodeParms<</Columns 7/Predictor 12>>")) < | 801 if ((len = pFile->AppendString("/DecodeParms<</Columns 7/Predictor 12>>")) < |
| 803 0) { | 802 0) { |
| 804 return FALSE; | 803 return false; |
| 805 } | 804 } |
| 806 | 805 |
| 807 offset += len; | 806 offset += len; |
| 808 if (pFile->AppendString("/Length ") < 0) | 807 if (pFile->AppendString("/Length ") < 0) |
| 809 return FALSE; | 808 return false; |
| 810 | 809 |
| 811 if ((len = pFile->AppendDWord(encoder.m_dwSize)) < 0) | 810 if ((len = pFile->AppendDWord(encoder.m_dwSize)) < 0) |
| 812 return FALSE; | 811 return false; |
| 813 | 812 |
| 814 offset += len + 8; | 813 offset += len + 8; |
| 815 if (bEOF) { | 814 if (bEOF) { |
| 816 if ((len = PDF_CreatorWriteTrailer(pCreator->m_pDocument, pFile, | 815 if ((len = PDF_CreatorWriteTrailer(pCreator->m_pDocument, pFile, |
| 817 pCreator->m_pIDArray.get())) < 0) { | 816 pCreator->m_pIDArray.get())) < 0) { |
| 818 return FALSE; | 817 return false; |
| 819 } | 818 } |
| 820 offset += len; | 819 offset += len; |
| 821 if (pCreator->m_pEncryptDict) { | 820 if (pCreator->m_pEncryptDict) { |
| 822 uint32_t dwEncryptObjNum = pCreator->m_pEncryptDict->GetObjNum(); | 821 uint32_t dwEncryptObjNum = pCreator->m_pEncryptDict->GetObjNum(); |
| 823 if (dwEncryptObjNum == 0) { | 822 if (dwEncryptObjNum == 0) { |
| 824 dwEncryptObjNum = pCreator->m_dwEncryptObjNum; | 823 dwEncryptObjNum = pCreator->m_dwEncryptObjNum; |
| 825 } | 824 } |
| 826 if ((len = PDF_CreatorWriteEncrypt(pCreator->m_pEncryptDict, | 825 if ((len = PDF_CreatorWriteEncrypt(pCreator->m_pEncryptDict, |
| 827 dwEncryptObjNum, pFile)) < 0) { | 826 dwEncryptObjNum, pFile)) < 0) { |
| 828 return FALSE; | 827 return false; |
| 829 } | 828 } |
| 830 offset += len; | 829 offset += len; |
| 831 } | 830 } |
| 832 } | 831 } |
| 833 if ((len = pFile->AppendString(">>stream\r\n")) < 0) { | 832 if ((len = pFile->AppendString(">>stream\r\n")) < 0) { |
| 834 return FALSE; | 833 return false; |
| 835 } | 834 } |
| 836 offset += len; | 835 offset += len; |
| 837 if (pFile->AppendBlock(encoder.m_pData, encoder.m_dwSize) < 0) { | 836 if (pFile->AppendBlock(encoder.m_pData, encoder.m_dwSize) < 0) { |
| 838 return FALSE; | 837 return false; |
| 839 } | 838 } |
| 840 if ((len = pFile->AppendString("\r\nendstream\r\nendobj\r\n")) < 0) { | 839 if ((len = pFile->AppendString("\r\nendstream\r\nendobj\r\n")) < 0) { |
| 841 return FALSE; | 840 return false; |
| 842 } | 841 } |
| 843 offset += encoder.m_dwSize + len; | 842 offset += encoder.m_dwSize + len; |
| 844 m_PrevOffset = offset_tmp; | 843 m_PrevOffset = offset_tmp; |
| 845 return TRUE; | 844 return true; |
| 846 } | 845 } |
| 847 FX_BOOL CPDF_XRefStream::End(CPDF_Creator* pCreator, FX_BOOL bEOF) { | 846 bool CPDF_XRefStream::End(CPDF_Creator* pCreator, bool bEOF) { |
| 848 if (EndObjectStream(pCreator, bEOF) < 0) { | 847 if (EndObjectStream(pCreator, bEOF) < 0) { |
| 849 return FALSE; | 848 return false; |
| 850 } | 849 } |
| 851 return GenerateXRefStream(pCreator, bEOF); | 850 return GenerateXRefStream(pCreator, bEOF); |
| 852 } | 851 } |
| 853 FX_BOOL CPDF_XRefStream::EndXRefStream(CPDF_Creator* pCreator) { | 852 bool CPDF_XRefStream::EndXRefStream(CPDF_Creator* pCreator) { |
| 854 if (!(pCreator->m_dwFlags & FPDFCREATE_INCREMENTAL)) { | 853 if (!(pCreator->m_dwFlags & FPDFCREATE_INCREMENTAL)) { |
| 855 AppendIndex0(m_Buffer, true); | 854 AppendIndex0(m_Buffer, true); |
| 856 for (uint32_t i = 1; i < pCreator->m_dwLastObjNum + 1; i++) { | 855 for (uint32_t i = 1; i < pCreator->m_dwLastObjNum + 1; i++) { |
| 857 FX_FILESIZE* offset = pCreator->m_ObjectOffset.GetPtrAt(i); | 856 FX_FILESIZE* offset = pCreator->m_ObjectOffset.GetPtrAt(i); |
| 858 if (offset) { | 857 if (offset) { |
| 859 AppendIndex1(m_Buffer, *offset); | 858 AppendIndex1(m_Buffer, *offset); |
| 860 } else { | 859 } else { |
| 861 AppendIndex0(m_Buffer, false); | 860 AppendIndex0(m_Buffer, false); |
| 862 } | 861 } |
| 863 } | 862 } |
| 864 } else { | 863 } else { |
| 865 for (const auto& pair : m_IndexArray) { | 864 for (const auto& pair : m_IndexArray) { |
| 866 for (uint32_t j = pair.objnum; j < pair.objnum + pair.count; ++j) | 865 for (uint32_t j = pair.objnum; j < pair.objnum + pair.count; ++j) |
| 867 AppendIndex1(m_Buffer, pCreator->m_ObjectOffset[j]); | 866 AppendIndex1(m_Buffer, pCreator->m_ObjectOffset[j]); |
| 868 } | 867 } |
| 869 } | 868 } |
| 870 return GenerateXRefStream(pCreator, FALSE); | 869 return GenerateXRefStream(pCreator, false); |
| 871 } | 870 } |
| 872 void CPDF_XRefStream::AddObjectNumberToIndexArray(uint32_t objnum) { | 871 void CPDF_XRefStream::AddObjectNumberToIndexArray(uint32_t objnum) { |
| 873 if (m_IndexArray.empty()) { | 872 if (m_IndexArray.empty()) { |
| 874 m_IndexArray.push_back({objnum, 1}); | 873 m_IndexArray.push_back({objnum, 1}); |
| 875 return; | 874 return; |
| 876 } | 875 } |
| 877 uint32_t next_objnum = m_IndexArray.back().objnum + m_IndexArray.back().count; | 876 uint32_t next_objnum = m_IndexArray.back().objnum + m_IndexArray.back().count; |
| 878 if (objnum == next_objnum) | 877 if (objnum == next_objnum) |
| 879 m_IndexArray.back().count += 1; | 878 m_IndexArray.back().count += 1; |
| 880 else | 879 else |
| 881 m_IndexArray.push_back({objnum, 1}); | 880 m_IndexArray.push_back({objnum, 1}); |
| 882 } | 881 } |
| 883 | 882 |
| 884 CPDF_Creator::CPDF_Creator(CPDF_Document* pDoc) | 883 CPDF_Creator::CPDF_Creator(CPDF_Document* pDoc) |
| 885 : m_pDocument(pDoc), | 884 : m_pDocument(pDoc), |
| 886 m_pParser(pDoc->GetParser()), | 885 m_pParser(pDoc->GetParser()), |
| 887 m_bSecurityChanged(FALSE), | 886 m_bSecurityChanged(false), |
| 888 m_pEncryptDict(m_pParser ? m_pParser->GetEncryptDict() : nullptr), | 887 m_pEncryptDict(m_pParser ? m_pParser->GetEncryptDict() : nullptr), |
| 889 m_dwEncryptObjNum(0), | 888 m_dwEncryptObjNum(0), |
| 890 m_bEncryptCloned(FALSE), | 889 m_bEncryptCloned(false), |
| 891 m_pCryptoHandler(m_pParser ? m_pParser->GetCryptoHandler() : nullptr), | 890 m_pCryptoHandler(m_pParser ? m_pParser->GetCryptoHandler() : nullptr), |
| 892 m_bLocalCryptoHandler(FALSE), | 891 m_bLocalCryptoHandler(false), |
| 893 m_pMetadata(nullptr), | 892 m_pMetadata(nullptr), |
| 894 m_ObjectStreamSize(200), | 893 m_ObjectStreamSize(200), |
| 895 m_dwLastObjNum(m_pDocument->GetLastObjNum()), | 894 m_dwLastObjNum(m_pDocument->GetLastObjNum()), |
| 896 m_Offset(0), | 895 m_Offset(0), |
| 897 m_iStage(-1), | 896 m_iStage(-1), |
| 898 m_dwFlags(0), | 897 m_dwFlags(0), |
| 899 m_Pos(nullptr), | 898 m_Pos(nullptr), |
| 900 m_XrefStart(0), | 899 m_XrefStart(0), |
| 901 m_pIDArray(nullptr), | 900 m_pIDArray(nullptr), |
| 902 m_FileVersion(0) {} | 901 m_FileVersion(0) {} |
| (...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1046 } | 1045 } |
| 1047 int32_t CPDF_Creator::WriteIndirectObj(const CPDF_Object* pObj) { | 1046 int32_t CPDF_Creator::WriteIndirectObj(const CPDF_Object* pObj) { |
| 1048 int32_t iRet = WriteIndirectObjectToStream(pObj); | 1047 int32_t iRet = WriteIndirectObjectToStream(pObj); |
| 1049 if (iRet < 1) { | 1048 if (iRet < 1) { |
| 1050 return iRet; | 1049 return iRet; |
| 1051 } | 1050 } |
| 1052 return WriteIndirectObj(pObj->GetObjNum(), pObj); | 1051 return WriteIndirectObj(pObj->GetObjNum(), pObj); |
| 1053 } | 1052 } |
| 1054 int32_t CPDF_Creator::WriteDirectObj(uint32_t objnum, | 1053 int32_t CPDF_Creator::WriteDirectObj(uint32_t objnum, |
| 1055 const CPDF_Object* pObj, | 1054 const CPDF_Object* pObj, |
| 1056 FX_BOOL bEncrypt) { | 1055 bool bEncrypt) { |
| 1057 int32_t len = 0; | 1056 int32_t len = 0; |
| 1058 if (!pObj) { | 1057 if (!pObj) { |
| 1059 if (m_File.AppendString(" null") < 0) { | 1058 if (m_File.AppendString(" null") < 0) { |
| 1060 return -1; | 1059 return -1; |
| 1061 } | 1060 } |
| 1062 m_Offset += 5; | 1061 m_Offset += 5; |
| 1063 return 1; | 1062 return 1; |
| 1064 } | 1063 } |
| 1065 switch (pObj->GetType()) { | 1064 switch (pObj->GetType()) { |
| 1066 case CPDF_Object::NULLOBJ: | 1065 case CPDF_Object::NULLOBJ: |
| 1067 if (m_File.AppendString(" null") < 0) { | 1066 if (m_File.AppendString(" null") < 0) { |
| 1068 return -1; | 1067 return -1; |
| 1069 } | 1068 } |
| 1070 m_Offset += 5; | 1069 m_Offset += 5; |
| 1071 break; | 1070 break; |
| 1072 case CPDF_Object::BOOLEAN: | 1071 case CPDF_Object::BOOLEAN: |
| 1073 case CPDF_Object::NUMBER: | 1072 case CPDF_Object::NUMBER: |
| 1074 if (m_File.AppendString(" ") < 0) { | 1073 if (m_File.AppendString(" ") < 0) { |
| 1075 return -1; | 1074 return -1; |
| 1076 } | 1075 } |
| 1077 if ((len = m_File.AppendString(pObj->GetString().AsStringC())) < 0) { | 1076 if ((len = m_File.AppendString(pObj->GetString().AsStringC())) < 0) { |
| 1078 return -1; | 1077 return -1; |
| 1079 } | 1078 } |
| 1080 m_Offset += len + 1; | 1079 m_Offset += len + 1; |
| 1081 break; | 1080 break; |
| 1082 case CPDF_Object::STRING: { | 1081 case CPDF_Object::STRING: { |
| 1083 CFX_ByteString str = pObj->GetString(); | 1082 CFX_ByteString str = pObj->GetString(); |
| 1084 FX_BOOL bHex = pObj->AsString()->IsHex(); | 1083 bool bHex = pObj->AsString()->IsHex(); |
| 1085 if (!m_pCryptoHandler || !bEncrypt) { | 1084 if (!m_pCryptoHandler || !bEncrypt) { |
| 1086 CFX_ByteString content = PDF_EncodeString(str, bHex); | 1085 CFX_ByteString content = PDF_EncodeString(str, bHex); |
| 1087 if ((len = m_File.AppendString(content.AsStringC())) < 0) { | 1086 if ((len = m_File.AppendString(content.AsStringC())) < 0) { |
| 1088 return -1; | 1087 return -1; |
| 1089 } | 1088 } |
| 1090 m_Offset += len; | 1089 m_Offset += len; |
| 1091 break; | 1090 break; |
| 1092 } | 1091 } |
| 1093 CPDF_Encryptor encryptor(m_pCryptoHandler, objnum, (uint8_t*)str.c_str(), | 1092 CPDF_Encryptor encryptor(m_pCryptoHandler, objnum, (uint8_t*)str.c_str(), |
| 1094 str.GetLength()); | 1093 str.GetLength()); |
| 1095 CFX_ByteString content = PDF_EncodeString( | 1094 CFX_ByteString content = PDF_EncodeString( |
| 1096 CFX_ByteString((const FX_CHAR*)encryptor.m_pData, encryptor.m_dwSize), | 1095 CFX_ByteString((const FX_CHAR*)encryptor.m_pData, encryptor.m_dwSize), |
| 1097 bHex); | 1096 bHex); |
| 1098 if ((len = m_File.AppendString(content.AsStringC())) < 0) { | 1097 if ((len = m_File.AppendString(content.AsStringC())) < 0) { |
| 1099 return -1; | 1098 return -1; |
| 1100 } | 1099 } |
| 1101 m_Offset += len; | 1100 m_Offset += len; |
| 1102 break; | 1101 break; |
| 1103 } | 1102 } |
| 1104 case CPDF_Object::STREAM: { | 1103 case CPDF_Object::STREAM: { |
| 1105 CPDF_FlateEncoder encoder(const_cast<CPDF_Stream*>(pObj->AsStream()), | 1104 CPDF_FlateEncoder encoder(const_cast<CPDF_Stream*>(pObj->AsStream()), |
| 1106 TRUE); | 1105 true); |
| 1107 CPDF_Encryptor encryptor(m_pCryptoHandler, objnum, encoder.m_pData, | 1106 CPDF_Encryptor encryptor(m_pCryptoHandler, objnum, encoder.m_pData, |
| 1108 encoder.m_dwSize); | 1107 encoder.m_dwSize); |
| 1109 if ((uint32_t)encoder.m_pDict->GetIntegerFor("Length") != | 1108 if ((uint32_t)encoder.m_pDict->GetIntegerFor("Length") != |
| 1110 encryptor.m_dwSize) { | 1109 encryptor.m_dwSize) { |
| 1111 encoder.CloneDict(); | 1110 encoder.CloneDict(); |
| 1112 encoder.m_pDict->SetIntegerFor("Length", encryptor.m_dwSize); | 1111 encoder.m_pDict->SetIntegerFor("Length", encryptor.m_dwSize); |
| 1113 } | 1112 } |
| 1114 if (WriteDirectObj(objnum, encoder.m_pDict) < 0) { | 1113 if (WriteDirectObj(objnum, encoder.m_pDict) < 0) { |
| 1115 return -1; | 1114 return -1; |
| 1116 } | 1115 } |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1183 case CPDF_Object::DICTIONARY: { | 1182 case CPDF_Object::DICTIONARY: { |
| 1184 if (!m_pCryptoHandler || pObj == m_pEncryptDict) | 1183 if (!m_pCryptoHandler || pObj == m_pEncryptDict) |
| 1185 return PDF_CreatorAppendObject(pObj, &m_File, m_Offset); | 1184 return PDF_CreatorAppendObject(pObj, &m_File, m_Offset); |
| 1186 if (m_File.AppendString("<<") < 0) | 1185 if (m_File.AppendString("<<") < 0) |
| 1187 return -1; | 1186 return -1; |
| 1188 | 1187 |
| 1189 m_Offset += 2; | 1188 m_Offset += 2; |
| 1190 const CPDF_Dictionary* p = pObj->AsDictionary(); | 1189 const CPDF_Dictionary* p = pObj->AsDictionary(); |
| 1191 bool bSignDict = p->IsSignatureDict(); | 1190 bool bSignDict = p->IsSignatureDict(); |
| 1192 for (const auto& it : *p) { | 1191 for (const auto& it : *p) { |
| 1193 FX_BOOL bSignValue = FALSE; | 1192 bool bSignValue = false; |
| 1194 const CFX_ByteString& key = it.first; | 1193 const CFX_ByteString& key = it.first; |
| 1195 CPDF_Object* pValue = it.second; | 1194 CPDF_Object* pValue = it.second; |
| 1196 if (m_File.AppendString("/") < 0) { | 1195 if (m_File.AppendString("/") < 0) { |
| 1197 return -1; | 1196 return -1; |
| 1198 } | 1197 } |
| 1199 if ((len = m_File.AppendString(PDF_NameEncode(key).AsStringC())) < 0) { | 1198 if ((len = m_File.AppendString(PDF_NameEncode(key).AsStringC())) < 0) { |
| 1200 return -1; | 1199 return -1; |
| 1201 } | 1200 } |
| 1202 m_Offset += len + 1; | 1201 m_Offset += len + 1; |
| 1203 if (bSignDict && key == "Contents") { | 1202 if (bSignDict && key == "Contents") { |
| 1204 bSignValue = TRUE; | 1203 bSignValue = true; |
| 1205 } | 1204 } |
| 1206 if (!pValue->IsInline()) { | 1205 if (!pValue->IsInline()) { |
| 1207 if (m_File.AppendString(" ") < 0) { | 1206 if (m_File.AppendString(" ") < 0) { |
| 1208 return -1; | 1207 return -1; |
| 1209 } | 1208 } |
| 1210 if ((len = m_File.AppendDWord(pValue->GetObjNum())) < 0) { | 1209 if ((len = m_File.AppendDWord(pValue->GetObjNum())) < 0) { |
| 1211 return -1; | 1210 return -1; |
| 1212 } | 1211 } |
| 1213 if (m_File.AppendString(" 0 R ") < 0) { | 1212 if (m_File.AppendString(" 0 R ") < 0) { |
| 1214 return -1; | 1213 return -1; |
| (...skipping 12 matching lines...) Expand all Loading... |
| 1227 break; | 1226 break; |
| 1228 } | 1227 } |
| 1229 } | 1228 } |
| 1230 return 1; | 1229 return 1; |
| 1231 } | 1230 } |
| 1232 int32_t CPDF_Creator::WriteOldIndirectObject(uint32_t objnum) { | 1231 int32_t CPDF_Creator::WriteOldIndirectObject(uint32_t objnum) { |
| 1233 if (m_pParser->IsObjectFreeOrNull(objnum)) | 1232 if (m_pParser->IsObjectFreeOrNull(objnum)) |
| 1234 return 0; | 1233 return 0; |
| 1235 | 1234 |
| 1236 m_ObjectOffset[objnum] = m_Offset; | 1235 m_ObjectOffset[objnum] = m_Offset; |
| 1237 FX_BOOL bExistInMap = !!m_pDocument->GetIndirectObject(objnum); | 1236 bool bExistInMap = !!m_pDocument->GetIndirectObject(objnum); |
| 1238 const uint8_t object_type = m_pParser->GetObjectType(objnum); | 1237 const uint8_t object_type = m_pParser->GetObjectType(objnum); |
| 1239 bool bObjStm = (object_type == 2) && m_pEncryptDict && !m_pXRefStream; | 1238 bool bObjStm = (object_type == 2) && m_pEncryptDict && !m_pXRefStream; |
| 1240 if (m_pParser->IsVersionUpdated() || m_bSecurityChanged || bExistInMap || | 1239 if (m_pParser->IsVersionUpdated() || m_bSecurityChanged || bExistInMap || |
| 1241 bObjStm) { | 1240 bObjStm) { |
| 1242 CPDF_Object* pObj = m_pDocument->GetOrParseIndirectObject(objnum); | 1241 CPDF_Object* pObj = m_pDocument->GetOrParseIndirectObject(objnum); |
| 1243 if (!pObj) { | 1242 if (!pObj) { |
| 1244 m_ObjectOffset[objnum] = 0; | 1243 m_ObjectOffset[objnum] = 0; |
| 1245 return 0; | 1244 return 0; |
| 1246 } | 1245 } |
| 1247 if (WriteIndirectObj(pObj)) { | 1246 if (WriteIndirectObj(pObj)) { |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1308 if (!iRet) | 1307 if (!iRet) |
| 1309 continue; | 1308 continue; |
| 1310 | 1309 |
| 1311 if (pPause && pPause->NeedToPauseNow()) { | 1310 if (pPause && pPause->NeedToPauseNow()) { |
| 1312 m_Pos = (void*)(uintptr_t)(objnum + 1); | 1311 m_Pos = (void*)(uintptr_t)(objnum + 1); |
| 1313 return 1; | 1312 return 1; |
| 1314 } | 1313 } |
| 1315 } | 1314 } |
| 1316 return 0; | 1315 return 0; |
| 1317 } | 1316 } |
| 1318 int32_t CPDF_Creator::WriteNewObjs(FX_BOOL bIncremental, IFX_Pause* pPause) { | 1317 int32_t CPDF_Creator::WriteNewObjs(bool bIncremental, IFX_Pause* pPause) { |
| 1319 int32_t iCount = m_NewObjNumArray.GetSize(); | 1318 int32_t iCount = m_NewObjNumArray.GetSize(); |
| 1320 int32_t index = (int32_t)(uintptr_t)m_Pos; | 1319 int32_t index = (int32_t)(uintptr_t)m_Pos; |
| 1321 while (index < iCount) { | 1320 while (index < iCount) { |
| 1322 uint32_t objnum = m_NewObjNumArray.ElementAt(index); | 1321 uint32_t objnum = m_NewObjNumArray.ElementAt(index); |
| 1323 CPDF_Object* pObj = m_pDocument->GetIndirectObject(objnum); | 1322 CPDF_Object* pObj = m_pDocument->GetIndirectObject(objnum); |
| 1324 if (!pObj) { | 1323 if (!pObj) { |
| 1325 ++index; | 1324 ++index; |
| 1326 continue; | 1325 continue; |
| 1327 } | 1326 } |
| 1328 m_ObjectOffset[objnum] = m_Offset; | 1327 m_ObjectOffset[objnum] = m_Offset; |
| (...skipping 25 matching lines...) Expand all Loading... |
| 1354 j = dwStart; | 1353 j = dwStart; |
| 1355 while (j <= dwEnd && !m_pParser->IsObjectFreeOrNull(j)) | 1354 while (j <= dwEnd && !m_pParser->IsObjectFreeOrNull(j)) |
| 1356 j++; | 1355 j++; |
| 1357 | 1356 |
| 1358 m_ObjectOffset.Add(dwStart, j - dwStart); | 1357 m_ObjectOffset.Add(dwStart, j - dwStart); |
| 1359 dwStart = j; | 1358 dwStart = j; |
| 1360 } | 1359 } |
| 1361 } | 1360 } |
| 1362 | 1361 |
| 1363 void CPDF_Creator::InitNewObjNumOffsets() { | 1362 void CPDF_Creator::InitNewObjNumOffsets() { |
| 1364 FX_BOOL bIncremental = (m_dwFlags & FPDFCREATE_INCREMENTAL) != 0; | 1363 bool bIncremental = (m_dwFlags & FPDFCREATE_INCREMENTAL) != 0; |
| 1365 FX_BOOL bNoOriginal = (m_dwFlags & FPDFCREATE_NO_ORIGINAL) != 0; | 1364 bool bNoOriginal = (m_dwFlags & FPDFCREATE_NO_ORIGINAL) != 0; |
| 1366 for (const auto& pair : *m_pDocument) { | 1365 for (const auto& pair : *m_pDocument) { |
| 1367 const uint32_t objnum = pair.first; | 1366 const uint32_t objnum = pair.first; |
| 1368 const CPDF_Object* pObj = pair.second.get(); | 1367 const CPDF_Object* pObj = pair.second.get(); |
| 1369 if (bIncremental || pObj->GetObjNum() == CPDF_Object::kInvalidObjNum) | 1368 if (bIncremental || pObj->GetObjNum() == CPDF_Object::kInvalidObjNum) |
| 1370 continue; | 1369 continue; |
| 1371 if (m_pParser && m_pParser->IsValidObjectNumber(objnum) && | 1370 if (m_pParser && m_pParser->IsValidObjectNumber(objnum) && |
| 1372 m_pParser->GetObjectType(objnum)) { | 1371 m_pParser->GetObjectType(objnum)) { |
| 1373 continue; | 1372 continue; |
| 1374 } | 1373 } |
| 1375 AppendNewObjNum(objnum); | 1374 AppendNewObjNum(objnum); |
| 1376 } | 1375 } |
| 1377 | 1376 |
| 1378 int32_t iCount = m_NewObjNumArray.GetSize(); | 1377 int32_t iCount = m_NewObjNumArray.GetSize(); |
| 1379 if (iCount == 0) | 1378 if (iCount == 0) |
| 1380 return; | 1379 return; |
| 1381 | 1380 |
| 1382 int32_t i = 0; | 1381 int32_t i = 0; |
| 1383 uint32_t dwStartObjNum = 0; | 1382 uint32_t dwStartObjNum = 0; |
| 1384 FX_BOOL bCrossRefValid = m_pParser && m_pParser->GetLastXRefOffset() > 0; | 1383 bool bCrossRefValid = m_pParser && m_pParser->GetLastXRefOffset() > 0; |
| 1385 while (i < iCount) { | 1384 while (i < iCount) { |
| 1386 dwStartObjNum = m_NewObjNumArray.ElementAt(i); | 1385 dwStartObjNum = m_NewObjNumArray.ElementAt(i); |
| 1387 if ((bIncremental && (bNoOriginal || bCrossRefValid)) || | 1386 if ((bIncremental && (bNoOriginal || bCrossRefValid)) || |
| 1388 !m_ObjectOffset.GetPtrAt(dwStartObjNum)) { | 1387 !m_ObjectOffset.GetPtrAt(dwStartObjNum)) { |
| 1389 break; | 1388 break; |
| 1390 } | 1389 } |
| 1391 i++; | 1390 i++; |
| 1392 } | 1391 } |
| 1393 if (i >= iCount) | 1392 if (i >= iCount) |
| 1394 return; | 1393 return; |
| (...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1578 m_iStage = 80; | 1577 m_iStage = 80; |
| 1579 } | 1578 } |
| 1580 return m_iStage; | 1579 return m_iStage; |
| 1581 } | 1580 } |
| 1582 int32_t CPDF_Creator::WriteDoc_Stage3(IFX_Pause* pPause) { | 1581 int32_t CPDF_Creator::WriteDoc_Stage3(IFX_Pause* pPause) { |
| 1583 ASSERT(m_iStage >= 80 || m_iStage < 90); | 1582 ASSERT(m_iStage >= 80 || m_iStage < 90); |
| 1584 uint32_t dwLastObjNum = m_dwLastObjNum; | 1583 uint32_t dwLastObjNum = m_dwLastObjNum; |
| 1585 if (m_iStage == 80) { | 1584 if (m_iStage == 80) { |
| 1586 m_XrefStart = m_Offset; | 1585 m_XrefStart = m_Offset; |
| 1587 if (m_dwFlags & FPDFCREATE_OBJECTSTREAM) { | 1586 if (m_dwFlags & FPDFCREATE_OBJECTSTREAM) { |
| 1588 m_pXRefStream->End(this, TRUE); | 1587 m_pXRefStream->End(this, true); |
| 1589 m_XrefStart = m_pXRefStream->m_PrevOffset; | 1588 m_XrefStart = m_pXRefStream->m_PrevOffset; |
| 1590 m_iStage = 90; | 1589 m_iStage = 90; |
| 1591 } else if ((m_dwFlags & FPDFCREATE_INCREMENTAL) == 0 || | 1590 } else if ((m_dwFlags & FPDFCREATE_INCREMENTAL) == 0 || |
| 1592 !m_pParser->IsXRefStream()) { | 1591 !m_pParser->IsXRefStream()) { |
| 1593 if ((m_dwFlags & FPDFCREATE_INCREMENTAL) == 0 || | 1592 if ((m_dwFlags & FPDFCREATE_INCREMENTAL) == 0 || |
| 1594 m_pParser->GetLastXRefOffset() == 0) { | 1593 m_pParser->GetLastXRefOffset() == 0) { |
| 1595 CFX_ByteString str; | 1594 CFX_ByteString str; |
| 1596 str = m_ObjectOffset.GetPtrAt(1) | 1595 str = m_ObjectOffset.GetPtrAt(1) |
| 1597 ? "xref\r\n" | 1596 ? "xref\r\n" |
| 1598 : "xref\r\n0 1\r\n0000000000 65535 f\r\n"; | 1597 : "xref\r\n0 1\r\n0000000000 65535 f\r\n"; |
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1689 } | 1688 } |
| 1690 } | 1689 } |
| 1691 m_iStage = 90; | 1690 m_iStage = 90; |
| 1692 } | 1691 } |
| 1693 return m_iStage; | 1692 return m_iStage; |
| 1694 } | 1693 } |
| 1695 | 1694 |
| 1696 int32_t CPDF_Creator::WriteDoc_Stage4(IFX_Pause* pPause) { | 1695 int32_t CPDF_Creator::WriteDoc_Stage4(IFX_Pause* pPause) { |
| 1697 ASSERT(m_iStage >= 90); | 1696 ASSERT(m_iStage >= 90); |
| 1698 if ((m_dwFlags & FPDFCREATE_OBJECTSTREAM) == 0) { | 1697 if ((m_dwFlags & FPDFCREATE_OBJECTSTREAM) == 0) { |
| 1699 FX_BOOL bXRefStream = | 1698 bool bXRefStream = |
| 1700 (m_dwFlags & FPDFCREATE_INCREMENTAL) != 0 && m_pParser->IsXRefStream(); | 1699 (m_dwFlags & FPDFCREATE_INCREMENTAL) != 0 && m_pParser->IsXRefStream(); |
| 1701 if (!bXRefStream) { | 1700 if (!bXRefStream) { |
| 1702 if (m_File.AppendString("trailer\r\n<<") < 0) { | 1701 if (m_File.AppendString("trailer\r\n<<") < 0) { |
| 1703 return -1; | 1702 return -1; |
| 1704 } | 1703 } |
| 1705 } else { | 1704 } else { |
| 1706 if (m_File.AppendDWord(m_pDocument->GetLastObjNum() + 1) < 0) { | 1705 if (m_File.AppendDWord(m_pDocument->GetLastObjNum() + 1) < 0) { |
| 1707 return -1; | 1706 return -1; |
| 1708 } | 1707 } |
| 1709 if (m_File.AppendString(" 0 obj <<") < 0) { | 1708 if (m_File.AppendString(" 0 obj <<") < 0) { |
| (...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1918 m_Offset = 0; | 1917 m_Offset = 0; |
| 1919 m_dwLastObjNum = m_pDocument->GetLastObjNum(); | 1918 m_dwLastObjNum = m_pDocument->GetLastObjNum(); |
| 1920 m_ObjectOffset.Clear(); | 1919 m_ObjectOffset.Clear(); |
| 1921 m_NewObjNumArray.RemoveAll(); | 1920 m_NewObjNumArray.RemoveAll(); |
| 1922 InitID(); | 1921 InitID(); |
| 1923 if (flags & FPDFCREATE_PROGRESSIVE) | 1922 if (flags & FPDFCREATE_PROGRESSIVE) |
| 1924 return true; | 1923 return true; |
| 1925 return Continue(nullptr) > -1; | 1924 return Continue(nullptr) > -1; |
| 1926 } | 1925 } |
| 1927 | 1926 |
| 1928 void CPDF_Creator::InitID(FX_BOOL bDefault) { | 1927 void CPDF_Creator::InitID(bool bDefault) { |
| 1929 CPDF_Array* pOldIDArray = m_pParser ? m_pParser->GetIDArray() : nullptr; | 1928 CPDF_Array* pOldIDArray = m_pParser ? m_pParser->GetIDArray() : nullptr; |
| 1930 FX_BOOL bNewId = !m_pIDArray; | 1929 bool bNewId = !m_pIDArray; |
| 1931 if (bNewId) { | 1930 if (bNewId) { |
| 1932 m_pIDArray.reset(new CPDF_Array); | 1931 m_pIDArray.reset(new CPDF_Array); |
| 1933 CPDF_Object* pID1 = pOldIDArray ? pOldIDArray->GetObjectAt(0) : nullptr; | 1932 CPDF_Object* pID1 = pOldIDArray ? pOldIDArray->GetObjectAt(0) : nullptr; |
| 1934 if (pID1) { | 1933 if (pID1) { |
| 1935 m_pIDArray->Add(pID1->Clone()); | 1934 m_pIDArray->Add(pID1->Clone()); |
| 1936 } else { | 1935 } else { |
| 1937 std::vector<uint8_t> buffer = | 1936 std::vector<uint8_t> buffer = |
| 1938 PDF_GenerateFileID((uint32_t)(uintptr_t)this, m_dwLastObjNum); | 1937 PDF_GenerateFileID((uint32_t)(uintptr_t)this, m_dwLastObjNum); |
| 1939 CFX_ByteString bsBuffer(buffer.data(), buffer.size()); | 1938 CFX_ByteString bsBuffer(buffer.data(), buffer.size()); |
| 1940 m_pIDArray->Add(new CPDF_String(bsBuffer, TRUE)); | 1939 m_pIDArray->Add(new CPDF_String(bsBuffer, true)); |
| 1941 } | 1940 } |
| 1942 } | 1941 } |
| 1943 if (!bDefault) { | 1942 if (!bDefault) { |
| 1944 return; | 1943 return; |
| 1945 } | 1944 } |
| 1946 if (pOldIDArray) { | 1945 if (pOldIDArray) { |
| 1947 CPDF_Object* pID2 = pOldIDArray->GetObjectAt(1); | 1946 CPDF_Object* pID2 = pOldIDArray->GetObjectAt(1); |
| 1948 if ((m_dwFlags & FPDFCREATE_INCREMENTAL) && m_pEncryptDict && pID2) { | 1947 if ((m_dwFlags & FPDFCREATE_INCREMENTAL) && m_pEncryptDict && pID2) { |
| 1949 m_pIDArray->Add(pID2->Clone()); | 1948 m_pIDArray->Add(pID2->Clone()); |
| 1950 return; | 1949 return; |
| 1951 } | 1950 } |
| 1952 std::vector<uint8_t> buffer = | 1951 std::vector<uint8_t> buffer = |
| 1953 PDF_GenerateFileID((uint32_t)(uintptr_t)this, m_dwLastObjNum); | 1952 PDF_GenerateFileID((uint32_t)(uintptr_t)this, m_dwLastObjNum); |
| 1954 CFX_ByteString bsBuffer(buffer.data(), buffer.size()); | 1953 CFX_ByteString bsBuffer(buffer.data(), buffer.size()); |
| 1955 m_pIDArray->Add(new CPDF_String(bsBuffer, TRUE)); | 1954 m_pIDArray->Add(new CPDF_String(bsBuffer, true)); |
| 1956 return; | 1955 return; |
| 1957 } | 1956 } |
| 1958 m_pIDArray->Add(m_pIDArray->GetObjectAt(0)->Clone()); | 1957 m_pIDArray->Add(m_pIDArray->GetObjectAt(0)->Clone()); |
| 1959 if (m_pEncryptDict && !pOldIDArray && m_pParser && bNewId) { | 1958 if (m_pEncryptDict && !pOldIDArray && m_pParser && bNewId) { |
| 1960 if (m_pEncryptDict->GetStringFor("Filter") == "Standard") { | 1959 if (m_pEncryptDict->GetStringFor("Filter") == "Standard") { |
| 1961 CFX_ByteString user_pass = m_pParser->GetPassword(); | 1960 CFX_ByteString user_pass = m_pParser->GetPassword(); |
| 1962 uint32_t flag = PDF_ENCRYPT_CONTENT; | 1961 uint32_t flag = PDF_ENCRYPT_CONTENT; |
| 1963 | 1962 |
| 1964 CPDF_SecurityHandler handler; | 1963 CPDF_SecurityHandler handler; |
| 1965 handler.OnCreate(m_pEncryptDict, m_pIDArray.get(), user_pass.raw_str(), | 1964 handler.OnCreate(m_pEncryptDict, m_pIDArray.get(), user_pass.raw_str(), |
| 1966 user_pass.GetLength(), flag); | 1965 user_pass.GetLength(), flag); |
| 1967 if (m_bLocalCryptoHandler) | 1966 if (m_bLocalCryptoHandler) |
| 1968 delete m_pCryptoHandler; | 1967 delete m_pCryptoHandler; |
| 1969 m_pCryptoHandler = new CPDF_CryptoHandler; | 1968 m_pCryptoHandler = new CPDF_CryptoHandler; |
| 1970 m_pCryptoHandler->Init(m_pEncryptDict, &handler); | 1969 m_pCryptoHandler->Init(m_pEncryptDict, &handler); |
| 1971 m_bLocalCryptoHandler = TRUE; | 1970 m_bLocalCryptoHandler = true; |
| 1972 m_bSecurityChanged = TRUE; | 1971 m_bSecurityChanged = true; |
| 1973 } | 1972 } |
| 1974 } | 1973 } |
| 1975 } | 1974 } |
| 1976 int32_t CPDF_Creator::Continue(IFX_Pause* pPause) { | 1975 int32_t CPDF_Creator::Continue(IFX_Pause* pPause) { |
| 1977 if (m_iStage < 0) { | 1976 if (m_iStage < 0) { |
| 1978 return m_iStage; | 1977 return m_iStage; |
| 1979 } | 1978 } |
| 1980 int32_t iRet = 0; | 1979 int32_t iRet = 0; |
| 1981 while (m_iStage < 100) { | 1980 while (m_iStage < 100) { |
| 1982 if (m_iStage < 20) { | 1981 if (m_iStage < 20) { |
| 1983 iRet = WriteDoc_Stage1(pPause); | 1982 iRet = WriteDoc_Stage1(pPause); |
| 1984 } else if (m_iStage < 30) { | 1983 } else if (m_iStage < 30) { |
| 1985 iRet = WriteDoc_Stage2(pPause); | 1984 iRet = WriteDoc_Stage2(pPause); |
| 1986 } else if (m_iStage < 90) { | 1985 } else if (m_iStage < 90) { |
| 1987 iRet = WriteDoc_Stage3(pPause); | 1986 iRet = WriteDoc_Stage3(pPause); |
| 1988 } else { | 1987 } else { |
| 1989 iRet = WriteDoc_Stage4(pPause); | 1988 iRet = WriteDoc_Stage4(pPause); |
| 1990 } | 1989 } |
| 1991 if (iRet < m_iStage) { | 1990 if (iRet < m_iStage) { |
| 1992 break; | 1991 break; |
| 1993 } | 1992 } |
| 1994 } | 1993 } |
| 1995 if (iRet < 1 || m_iStage == 100) { | 1994 if (iRet < 1 || m_iStage == 100) { |
| 1996 m_iStage = -1; | 1995 m_iStage = -1; |
| 1997 Clear(); | 1996 Clear(); |
| 1998 return iRet > 99 ? 0 : (iRet < 1 ? -1 : iRet); | 1997 return iRet > 99 ? 0 : (iRet < 1 ? -1 : iRet); |
| 1999 } | 1998 } |
| 2000 return m_iStage; | 1999 return m_iStage; |
| 2001 } | 2000 } |
| 2002 FX_BOOL CPDF_Creator::SetFileVersion(int32_t fileVersion) { | 2001 bool CPDF_Creator::SetFileVersion(int32_t fileVersion) { |
| 2003 if (fileVersion < 10 || fileVersion > 17) { | 2002 if (fileVersion < 10 || fileVersion > 17) { |
| 2004 return FALSE; | 2003 return false; |
| 2005 } | 2004 } |
| 2006 m_FileVersion = fileVersion; | 2005 m_FileVersion = fileVersion; |
| 2007 return TRUE; | 2006 return true; |
| 2008 } | 2007 } |
| 2009 void CPDF_Creator::RemoveSecurity() { | 2008 void CPDF_Creator::RemoveSecurity() { |
| 2010 ResetStandardSecurity(); | 2009 ResetStandardSecurity(); |
| 2011 m_bSecurityChanged = TRUE; | 2010 m_bSecurityChanged = true; |
| 2012 m_pEncryptDict = nullptr; | 2011 m_pEncryptDict = nullptr; |
| 2013 m_pCryptoHandler = nullptr; | 2012 m_pCryptoHandler = nullptr; |
| 2014 } | 2013 } |
| 2015 void CPDF_Creator::ResetStandardSecurity() { | 2014 void CPDF_Creator::ResetStandardSecurity() { |
| 2016 if (!m_bLocalCryptoHandler) | 2015 if (!m_bLocalCryptoHandler) |
| 2017 return; | 2016 return; |
| 2018 | 2017 |
| 2019 delete m_pCryptoHandler; | 2018 delete m_pCryptoHandler; |
| 2020 m_pCryptoHandler = nullptr; | 2019 m_pCryptoHandler = nullptr; |
| 2021 m_bLocalCryptoHandler = FALSE; | 2020 m_bLocalCryptoHandler = false; |
| 2022 } | 2021 } |
| OLD | NEW |