| 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/fpdf_edit/editint.h" | 7 #include "core/fpdfapi/fpdf_edit/editint.h" |
| 8 | 8 |
| 9 #include <vector> | 9 #include <vector> |
| 10 | 10 |
| (...skipping 881 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 892 m_dwFlags(0), | 892 m_dwFlags(0), |
| 893 m_Pos(nullptr), | 893 m_Pos(nullptr), |
| 894 m_XrefStart(0), | 894 m_XrefStart(0), |
| 895 m_pIDArray(nullptr), | 895 m_pIDArray(nullptr), |
| 896 m_FileVersion(0) {} | 896 m_FileVersion(0) {} |
| 897 | 897 |
| 898 CPDF_Creator::~CPDF_Creator() { | 898 CPDF_Creator::~CPDF_Creator() { |
| 899 ResetStandardSecurity(); | 899 ResetStandardSecurity(); |
| 900 if (m_bEncryptCloned && m_pEncryptDict) { | 900 if (m_bEncryptCloned && m_pEncryptDict) { |
| 901 m_pEncryptDict->Release(); | 901 m_pEncryptDict->Release(); |
| 902 m_pEncryptDict = NULL; | 902 m_pEncryptDict = nullptr; |
| 903 } | 903 } |
| 904 Clear(); | 904 Clear(); |
| 905 } | 905 } |
| 906 | 906 |
| 907 int32_t CPDF_Creator::WriteIndirectObjectToStream(const CPDF_Object* pObj) { | 907 int32_t CPDF_Creator::WriteIndirectObjectToStream(const CPDF_Object* pObj) { |
| 908 if (!m_pXRefStream) | 908 if (!m_pXRefStream) |
| 909 return 1; | 909 return 1; |
| 910 | 910 |
| 911 uint32_t objnum = pObj->GetObjNum(); | 911 uint32_t objnum = pObj->GetObjNum(); |
| 912 if (m_pParser && m_pParser->GetObjectGenNum(objnum) > 0) | 912 if (m_pParser && m_pParser->GetObjectGenNum(objnum) > 0) |
| (...skipping 521 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1434 int32_t CPDF_Creator::WriteDoc_Stage1(IFX_Pause* pPause) { | 1434 int32_t CPDF_Creator::WriteDoc_Stage1(IFX_Pause* pPause) { |
| 1435 ASSERT(m_iStage > -1 || m_iStage < 20); | 1435 ASSERT(m_iStage > -1 || m_iStage < 20); |
| 1436 if (m_iStage == 0) { | 1436 if (m_iStage == 0) { |
| 1437 if (!m_pParser) { | 1437 if (!m_pParser) { |
| 1438 m_dwFlags &= ~FPDFCREATE_INCREMENTAL; | 1438 m_dwFlags &= ~FPDFCREATE_INCREMENTAL; |
| 1439 } | 1439 } |
| 1440 if (m_bSecurityChanged && (m_dwFlags & FPDFCREATE_NO_ORIGINAL) == 0) { | 1440 if (m_bSecurityChanged && (m_dwFlags & FPDFCREATE_NO_ORIGINAL) == 0) { |
| 1441 m_dwFlags &= ~FPDFCREATE_INCREMENTAL; | 1441 m_dwFlags &= ~FPDFCREATE_INCREMENTAL; |
| 1442 } | 1442 } |
| 1443 CPDF_Dictionary* pDict = m_pDocument->GetRoot(); | 1443 CPDF_Dictionary* pDict = m_pDocument->GetRoot(); |
| 1444 m_pMetadata = pDict ? pDict->GetDirectObjectBy("Metadata") : NULL; | 1444 m_pMetadata = pDict ? pDict->GetDirectObjectBy("Metadata") : nullptr; |
| 1445 if (m_dwFlags & FPDFCREATE_OBJECTSTREAM) { | 1445 if (m_dwFlags & FPDFCREATE_OBJECTSTREAM) { |
| 1446 m_pXRefStream.reset(new CPDF_XRefStream); | 1446 m_pXRefStream.reset(new CPDF_XRefStream); |
| 1447 m_pXRefStream->Start(); | 1447 m_pXRefStream->Start(); |
| 1448 if ((m_dwFlags & FPDFCREATE_INCREMENTAL) != 0 && m_pParser) { | 1448 if ((m_dwFlags & FPDFCREATE_INCREMENTAL) != 0 && m_pParser) { |
| 1449 FX_FILESIZE prev = m_pParser->GetLastXRefOffset(); | 1449 FX_FILESIZE prev = m_pParser->GetLastXRefOffset(); |
| 1450 m_pXRefStream->m_PrevOffset = prev; | 1450 m_pXRefStream->m_PrevOffset = prev; |
| 1451 } | 1451 } |
| 1452 } | 1452 } |
| 1453 m_iStage = 10; | 1453 m_iStage = 10; |
| 1454 } | 1454 } |
| (...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1549 } | 1549 } |
| 1550 if (m_iStage == 26) { | 1550 if (m_iStage == 26) { |
| 1551 int32_t iRet = | 1551 int32_t iRet = |
| 1552 WriteNewObjs((m_dwFlags & FPDFCREATE_INCREMENTAL) != 0, pPause); | 1552 WriteNewObjs((m_dwFlags & FPDFCREATE_INCREMENTAL) != 0, pPause); |
| 1553 if (iRet) { | 1553 if (iRet) { |
| 1554 return iRet; | 1554 return iRet; |
| 1555 } | 1555 } |
| 1556 m_iStage = 27; | 1556 m_iStage = 27; |
| 1557 } | 1557 } |
| 1558 if (m_iStage == 27) { | 1558 if (m_iStage == 27) { |
| 1559 if (NULL != m_pEncryptDict && 0 == m_pEncryptDict->GetObjNum()) { | 1559 if (m_pEncryptDict && 0 == m_pEncryptDict->GetObjNum()) { |
| 1560 m_dwLastObjNum += 1; | 1560 m_dwLastObjNum += 1; |
| 1561 FX_FILESIZE saveOffset = m_Offset; | 1561 FX_FILESIZE saveOffset = m_Offset; |
| 1562 if (WriteIndirectObj(m_dwLastObjNum, m_pEncryptDict) < 0) { | 1562 if (WriteIndirectObj(m_dwLastObjNum, m_pEncryptDict) < 0) { |
| 1563 return -1; | 1563 return -1; |
| 1564 } | 1564 } |
| 1565 m_ObjectOffset.Add(m_dwLastObjNum, 1); | 1565 m_ObjectOffset.Add(m_dwLastObjNum, 1); |
| 1566 m_ObjectOffset[m_dwLastObjNum] = saveOffset; | 1566 m_ObjectOffset[m_dwLastObjNum] = saveOffset; |
| 1567 m_dwEncryptObjNum = m_dwLastObjNum; | 1567 m_dwEncryptObjNum = m_dwLastObjNum; |
| 1568 if (m_dwFlags & FPDFCREATE_INCREMENTAL) { | 1568 if (m_dwFlags & FPDFCREATE_INCREMENTAL) { |
| 1569 m_NewObjNumArray.Add(m_dwLastObjNum); | 1569 m_NewObjNumArray.Add(m_dwLastObjNum); |
| (...skipping 322 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1892 } | 1892 } |
| 1893 m_File.Flush(); | 1893 m_File.Flush(); |
| 1894 return m_iStage = 100; | 1894 return m_iStage = 100; |
| 1895 } | 1895 } |
| 1896 void CPDF_Creator::Clear() { | 1896 void CPDF_Creator::Clear() { |
| 1897 m_pXRefStream.reset(); | 1897 m_pXRefStream.reset(); |
| 1898 m_File.Clear(); | 1898 m_File.Clear(); |
| 1899 m_NewObjNumArray.RemoveAll(); | 1899 m_NewObjNumArray.RemoveAll(); |
| 1900 if (m_pIDArray) { | 1900 if (m_pIDArray) { |
| 1901 m_pIDArray->Release(); | 1901 m_pIDArray->Release(); |
| 1902 m_pIDArray = NULL; | 1902 m_pIDArray = nullptr; |
| 1903 } | 1903 } |
| 1904 } | 1904 } |
| 1905 | 1905 |
| 1906 bool CPDF_Creator::Create(IFX_StreamWrite* pFile, uint32_t flags) { | 1906 bool CPDF_Creator::Create(IFX_StreamWrite* pFile, uint32_t flags) { |
| 1907 m_File.AttachFile(pFile); | 1907 m_File.AttachFile(pFile); |
| 1908 return Create(flags); | 1908 return Create(flags); |
| 1909 } | 1909 } |
| 1910 | 1910 |
| 1911 bool CPDF_Creator::Create(uint32_t flags) { | 1911 bool CPDF_Creator::Create(uint32_t flags) { |
| 1912 m_dwFlags = flags; | 1912 m_dwFlags = flags; |
| 1913 m_iStage = 0; | 1913 m_iStage = 0; |
| 1914 m_Offset = 0; | 1914 m_Offset = 0; |
| 1915 m_dwLastObjNum = m_pDocument->GetLastObjNum(); | 1915 m_dwLastObjNum = m_pDocument->GetLastObjNum(); |
| 1916 m_ObjectOffset.Clear(); | 1916 m_ObjectOffset.Clear(); |
| 1917 m_NewObjNumArray.RemoveAll(); | 1917 m_NewObjNumArray.RemoveAll(); |
| 1918 InitID(); | 1918 InitID(); |
| 1919 if (flags & FPDFCREATE_PROGRESSIVE) { | 1919 if (flags & FPDFCREATE_PROGRESSIVE) { |
| 1920 return true; | 1920 return true; |
| 1921 } | 1921 } |
| 1922 return Continue(NULL) > -1; | 1922 return Continue(nullptr) > -1; |
| 1923 } | 1923 } |
| 1924 void CPDF_Creator::InitID(FX_BOOL bDefault) { | 1924 void CPDF_Creator::InitID(FX_BOOL bDefault) { |
| 1925 CPDF_Array* pOldIDArray = m_pParser ? m_pParser->GetIDArray() : NULL; | 1925 CPDF_Array* pOldIDArray = m_pParser ? m_pParser->GetIDArray() : nullptr; |
| 1926 FX_BOOL bNewId = !m_pIDArray; | 1926 FX_BOOL bNewId = !m_pIDArray; |
| 1927 if (!m_pIDArray) { | 1927 if (!m_pIDArray) { |
| 1928 m_pIDArray = new CPDF_Array; | 1928 m_pIDArray = new CPDF_Array; |
| 1929 CPDF_Object* pID1 = pOldIDArray ? pOldIDArray->GetObjectAt(0) : NULL; | 1929 CPDF_Object* pID1 = pOldIDArray ? pOldIDArray->GetObjectAt(0) : nullptr; |
| 1930 if (pID1) { | 1930 if (pID1) { |
| 1931 m_pIDArray->Add(pID1->Clone()); | 1931 m_pIDArray->Add(pID1->Clone()); |
| 1932 } else { | 1932 } else { |
| 1933 std::vector<uint8_t> buffer = | 1933 std::vector<uint8_t> buffer = |
| 1934 PDF_GenerateFileID((uint32_t)(uintptr_t) this, m_dwLastObjNum); | 1934 PDF_GenerateFileID((uint32_t)(uintptr_t) this, m_dwLastObjNum); |
| 1935 CFX_ByteString bsBuffer(buffer.data(), buffer.size()); | 1935 CFX_ByteString bsBuffer(buffer.data(), buffer.size()); |
| 1936 m_pIDArray->Add(new CPDF_String(bsBuffer, TRUE), m_pDocument); | 1936 m_pIDArray->Add(new CPDF_String(bsBuffer, TRUE), m_pDocument); |
| 1937 } | 1937 } |
| 1938 } | 1938 } |
| 1939 if (!bDefault) { | 1939 if (!bDefault) { |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2009 m_pCryptoHandler = nullptr; | 2009 m_pCryptoHandler = nullptr; |
| 2010 } | 2010 } |
| 2011 void CPDF_Creator::ResetStandardSecurity() { | 2011 void CPDF_Creator::ResetStandardSecurity() { |
| 2012 if (!m_bLocalCryptoHandler) | 2012 if (!m_bLocalCryptoHandler) |
| 2013 return; | 2013 return; |
| 2014 | 2014 |
| 2015 delete m_pCryptoHandler; | 2015 delete m_pCryptoHandler; |
| 2016 m_pCryptoHandler = nullptr; | 2016 m_pCryptoHandler = nullptr; |
| 2017 m_bLocalCryptoHandler = FALSE; | 2017 m_bLocalCryptoHandler = FALSE; |
| 2018 } | 2018 } |
| OLD | NEW |