Chromium Code Reviews| Index: core/fpdfapi/fpdf_edit/fpdf_edit_create.cpp |
| diff --git a/core/fpdfapi/fpdf_edit/fpdf_edit_create.cpp b/core/fpdfapi/fpdf_edit/fpdf_edit_create.cpp |
| index 2c4dc32fde0b91bc1b8e02185bc971d2cf048ee0..8a8edf06aa652f0d2d85f44765979c8b9ae3f938 100644 |
| --- a/core/fpdfapi/fpdf_edit/fpdf_edit_create.cpp |
| +++ b/core/fpdfapi/fpdf_edit/fpdf_edit_create.cpp |
| @@ -189,8 +189,7 @@ int32_t PDF_CreatorAppendObject(const CPDF_Object* pObj, |
| int32_t PDF_CreatorWriteTrailer(CPDF_Document* pDocument, |
| CFX_FileBufferArchive* pFile, |
| - CPDF_Array* pIDArray, |
| - FX_BOOL bCompress) { |
| + CPDF_Array* pIDArray) { |
| FX_FILESIZE offset = 0; |
| int32_t len = 0; |
| ASSERT(pDocument && pFile); |
|
Tom Sepez
2016/05/13 20:05:11
nit: pDocument de-ref'd below, move pFile assert a
Lei Zhang
2016/05/14 01:06:33
pFile also gets deref'd before being passed to any
|
| @@ -205,9 +204,9 @@ int32_t PDF_CreatorWriteTrailer(CPDF_Document* pDocument, |
| key == "XRefStm" || key == "Type" || key == "ID") { |
| continue; |
| } |
| - if (bCompress && key == "DecodeParms") { |
| + if (key == "DecodeParms") |
| continue; |
| - } |
| + |
| if (pFile->AppendString(("/")) < 0) { |
|
Tom Sepez
2016/05/13 20:05:11
nit: OK, we can leave all these extra {} for anoth
Lei Zhang
2016/05/14 01:06:33
There's too many in this file. Another day.
|
| return -1; |
| } |
| @@ -577,47 +576,26 @@ FX_FILESIZE CPDF_ObjectStream::End(CPDF_Creator* pCreator) { |
| } |
| offset += len + 15; |
| - if (!pCreator->m_bCompress && !pCreator->m_pCryptoHandler) { |
| - if ((len = pFile->AppendDWord( |
| - (uint32_t)(tempBuffer.GetLength() + m_Buffer.GetLength()))) < 0) { |
| - return -1; |
| - } |
| - offset += len; |
| - if ((len = pFile->AppendString(">>stream\r\n")) < 0) { |
| - return -1; |
| - } |
| - if (pFile->AppendBlock(tempBuffer.GetBuffer(), tempBuffer.GetLength()) < |
| - 0) { |
| - return -1; |
| - } |
| - if (pFile->AppendBlock(m_Buffer.GetBuffer(), m_Buffer.GetLength()) < 0) { |
| - return -1; |
| - } |
| - offset += len + tempBuffer.GetLength() + m_Buffer.GetLength(); |
| - } else { |
| - tempBuffer << m_Buffer; |
| - CPDF_FlateEncoder encoder(tempBuffer.GetBuffer(), tempBuffer.GetLength(), |
| - pCreator->m_bCompress); |
| - CPDF_Encryptor encryptor(pCreator->m_pCryptoHandler, m_dwObjNum, |
| - encoder.m_pData, encoder.m_dwSize); |
| - if ((len = pFile->AppendDWord(encryptor.m_dwSize)) < 0) { |
| - return -1; |
| - } |
| - offset += len; |
| - if (pCreator->m_bCompress) { |
| - if (pFile->AppendString("/Filter /FlateDecode") < 0) { |
| - return -1; |
| - } |
| - offset += 20; |
| - } |
| - if ((len = pFile->AppendString(">>stream\r\n")) < 0) { |
| - return -1; |
| - } |
| - if (pFile->AppendBlock(encryptor.m_pData, encryptor.m_dwSize) < 0) { |
| - return -1; |
| - } |
| - offset += len + encryptor.m_dwSize; |
| + tempBuffer << m_Buffer; |
| + CPDF_FlateEncoder encoder(tempBuffer.GetBuffer(), tempBuffer.GetLength(), |
| + TRUE); |
| + CPDF_Encryptor encryptor(pCreator->m_pCryptoHandler, m_dwObjNum, |
| + encoder.m_pData, encoder.m_dwSize); |
| + if ((len = pFile->AppendDWord(encryptor.m_dwSize)) < 0) { |
| + return -1; |
| } |
| + offset += len; |
| + if (pFile->AppendString("/Filter /FlateDecode") < 0) { |
| + return -1; |
| + } |
| + offset += 20; |
| + if ((len = pFile->AppendString(">>stream\r\n")) < 0) { |
| + return -1; |
| + } |
| + if (pFile->AppendBlock(encryptor.m_pData, encryptor.m_dwSize) < 0) { |
| + return -1; |
| + } |
| + offset += len + encryptor.m_dwSize; |
| if ((len = pFile->AppendString("\r\nendstream\r\nendobj\r\n")) < 0) { |
| return -1; |
| } |
| @@ -809,20 +787,18 @@ FX_BOOL CPDF_XRefStream::GenerateXRefStream(CPDF_Creator* pCreator, |
| offset += len + 6; |
| } |
| FX_BOOL bPredictor = TRUE; |
| - CPDF_FlateEncoder encoder(m_Buffer.GetBuffer(), m_Buffer.GetLength(), |
| - pCreator->m_bCompress, bPredictor); |
| - if (pCreator->m_bCompress) { |
| - if (pFile->AppendString("/Filter /FlateDecode") < 0) { |
| + CPDF_FlateEncoder encoder(m_Buffer.GetBuffer(), m_Buffer.GetLength(), TRUE, |
| + bPredictor); |
| + if (pFile->AppendString("/Filter /FlateDecode") < 0) { |
| + return FALSE; |
| + } |
| + offset += 20; |
| + if (bPredictor) { |
| + if ((len = pFile->AppendString("/DecodeParms<</Columns 7/Predictor 12>>")) < |
| + 0) { |
| return FALSE; |
| } |
| - offset += 20; |
| - if (bPredictor) { |
| - if ((len = pFile->AppendString( |
| - "/DecodeParms<</Columns 7/Predictor 12>>")) < 0) { |
| - return FALSE; |
| - } |
| - offset += len; |
| - } |
| + offset += len; |
| } |
| if (pFile->AppendString("/Length ") < 0) { |
| return FALSE; |
| @@ -833,15 +809,14 @@ FX_BOOL CPDF_XRefStream::GenerateXRefStream(CPDF_Creator* pCreator, |
| offset += len + 8; |
| if (bEOF) { |
| if ((len = PDF_CreatorWriteTrailer(pCreator->m_pDocument, pFile, |
| - pCreator->m_pIDArray, |
| - pCreator->m_bCompress)) < 0) { |
| + pCreator->m_pIDArray)) < 0) { |
| return FALSE; |
| } |
| offset += len; |
| if (pCreator->m_pEncryptDict) { |
| uint32_t dwEncryptObjNum = pCreator->m_pEncryptDict->GetObjNum(); |
| if (dwEncryptObjNum == 0) { |
| - dwEncryptObjNum = pCreator->m_dwEnryptObjNum; |
| + dwEncryptObjNum = pCreator->m_dwEncryptObjNum; |
| } |
| if ((len = PDF_CreatorWriteEncrypt(pCreator->m_pEncryptDict, |
| dwEncryptObjNum, pFile)) < 0) { |
| @@ -900,34 +875,25 @@ void CPDF_XRefStream::AddObjectNumberToIndexArray(uint32_t objnum) { |
| else |
| m_IndexArray.push_back({objnum, 1}); |
| } |
| -CPDF_Creator::CPDF_Creator(CPDF_Document* pDoc) { |
| - m_pDocument = pDoc; |
| - m_pParser = (CPDF_Parser*)pDoc->m_pParser; |
| - m_bCompress = TRUE; |
| - if (m_pParser) { |
| - m_pEncryptDict = m_pParser->GetEncryptDict(); |
| - m_pCryptoHandler = m_pParser->GetCryptoHandler(); |
| - } else { |
| - m_pEncryptDict = nullptr; |
| - m_pCryptoHandler = nullptr; |
| - } |
| - m_bSecurityChanged = FALSE; |
| - m_pMetadata = nullptr; |
| - m_bEncryptCloned = FALSE; |
| - m_bEncryptMetadata = FALSE; |
| - m_Offset = 0; |
| - m_iStage = -1; |
| - m_dwFlags = 0; |
| - m_Pos = nullptr; |
| - m_XrefStart = 0; |
| - m_pXRefStream = nullptr; |
| - m_ObjectStreamSize = 200; |
| - m_dwLastObjNum = m_pDocument->GetLastObjNum(); |
| - m_pIDArray = nullptr; |
| - m_FileVersion = 0; |
| - m_dwEnryptObjNum = 0; |
| - m_bLocalCryptoHandler = FALSE; |
| -} |
| + |
| +CPDF_Creator::CPDF_Creator(CPDF_Document* pDoc) |
| + : m_pDocument(pDoc), |
| + m_pParser(pDoc->GetParser()), |
| + m_bSecurityChanged(FALSE), |
| + m_pEncryptDict(m_pParser ? m_pParser->GetEncryptDict() : nullptr), |
| + m_dwEncryptObjNum(0), |
| + m_pCryptoHandler(m_pParser ? m_pParser->GetCryptoHandler() : nullptr), |
| + m_pMetadata(nullptr), |
| + m_ObjectStreamSize(200), |
| + m_dwLastObjNum(m_pDocument->GetLastObjNum()), |
| + m_Offset(0), |
| + m_iStage(-1), |
| + m_dwFlags(0), |
| + m_Pos(nullptr), |
| + m_XrefStart(0), |
| + m_pIDArray(nullptr), |
| + m_FileVersion(0) {} |
| + |
| CPDF_Creator::~CPDF_Creator() { |
| ResetStandardSecurity(); |
| if (m_bEncryptCloned && m_pEncryptDict) { |
| @@ -967,7 +933,7 @@ int32_t CPDF_Creator::WriteIndirectObjectToStream(const CPDF_Object* pObj) { |
| m_pXRefStream->AddObjectNumberToIndexArray(objnum); |
| if (m_pXRefStream->CompressIndirectObject(objnum, pObj, this) < 0) |
| return -1; |
| - if (!IsXRefNeedEnd(m_pXRefStream, m_dwFlags)) |
| + if (!IsXRefNeedEnd(m_pXRefStream.get(), m_dwFlags)) |
| return 0; |
| if (!m_pXRefStream->End(this)) |
| return -1; |
| @@ -987,7 +953,7 @@ int32_t CPDF_Creator::WriteIndirectObjectToStream(uint32_t objnum, |
| if (iRet < 1) { |
| return iRet; |
| } |
| - if (!IsXRefNeedEnd(m_pXRefStream, m_dwFlags)) { |
| + if (!IsXRefNeedEnd(m_pXRefStream.get(), m_dwFlags)) { |
| return 0; |
| } |
| if (!m_pXRefStream->End(this)) { |
| @@ -1003,7 +969,7 @@ int32_t CPDF_Creator::AppendObjectNumberToXRef(uint32_t objnum) { |
| return 1; |
| } |
| m_pXRefStream->AddObjectNumberToIndexArray(objnum); |
| - if (!IsXRefNeedEnd(m_pXRefStream, m_dwFlags)) { |
| + if (!IsXRefNeedEnd(m_pXRefStream.get(), m_dwFlags)) { |
| return 0; |
| } |
| if (!m_pXRefStream->End(this)) { |
| @@ -1018,7 +984,7 @@ int32_t CPDF_Creator::WriteStream(const CPDF_Object* pStream, |
| uint32_t objnum, |
| CPDF_CryptoHandler* pCrypto) { |
| CPDF_FlateEncoder encoder(const_cast<CPDF_Stream*>(pStream->AsStream()), |
| - pStream == m_pMetadata ? FALSE : m_bCompress); |
| + pStream != m_pMetadata); |
| CPDF_Encryptor encryptor(pCrypto, objnum, encoder.m_pData, encoder.m_dwSize); |
| if ((uint32_t)encoder.m_pDict->GetIntegerBy("Length") != encryptor.m_dwSize) { |
| encoder.CloneDict(); |
| @@ -1054,9 +1020,8 @@ int32_t CPDF_Creator::WriteIndirectObj(uint32_t objnum, |
| m_Offset += len; |
| if (pObj->IsStream()) { |
| - CPDF_CryptoHandler* pHandler = (pObj == m_pMetadata && !m_bEncryptMetadata) |
| - ? nullptr |
| - : m_pCryptoHandler; |
| + CPDF_CryptoHandler* pHandler = |
| + (pObj != m_pMetadata) ? m_pCryptoHandler : nullptr; |
|
Tom Sepez
2016/05/13 20:05:11
nit: overparenthesized.
Lei Zhang
2016/05/14 01:06:33
Done.
|
| if (WriteStream(pObj, objnum, pHandler) < 0) |
| return -1; |
| } else { |
| @@ -1130,7 +1095,7 @@ int32_t CPDF_Creator::WriteDirectObj(uint32_t objnum, |
| } |
| case CPDF_Object::STREAM: { |
| CPDF_FlateEncoder encoder(const_cast<CPDF_Stream*>(pObj->AsStream()), |
| - m_bCompress); |
| + TRUE); |
| CPDF_Encryptor encryptor(m_pCryptoHandler, objnum, encoder.m_pData, |
| encoder.m_dwSize); |
| if ((uint32_t)encoder.m_pDict->GetIntegerBy("Length") != |
| @@ -1478,7 +1443,7 @@ int32_t CPDF_Creator::WriteDoc_Stage1(IFX_Pause* pPause) { |
| CPDF_Dictionary* pDict = m_pDocument->GetRoot(); |
| m_pMetadata = pDict ? pDict->GetDirectObjectBy("Metadata") : NULL; |
| if (m_dwFlags & FPDFCREATE_OBJECTSTREAM) { |
| - m_pXRefStream = new CPDF_XRefStream; |
| + m_pXRefStream.reset(new CPDF_XRefStream); |
| m_pXRefStream->Start(); |
| if ((m_dwFlags & FPDFCREATE_INCREMENTAL) != 0 && m_pParser) { |
| FX_FILESIZE prev = m_pParser->GetLastXRefOffset(); |
| @@ -1599,7 +1564,7 @@ int32_t CPDF_Creator::WriteDoc_Stage2(IFX_Pause* pPause) { |
| } |
| m_ObjectOffset.Add(m_dwLastObjNum, 1); |
| m_ObjectOffset[m_dwLastObjNum] = saveOffset; |
| - m_dwEnryptObjNum = m_dwLastObjNum; |
| + m_dwEncryptObjNum = m_dwLastObjNum; |
| if (m_dwFlags & FPDFCREATE_INCREMENTAL) { |
| m_NewObjNumArray.Add(m_dwLastObjNum); |
| } |
| @@ -1929,8 +1894,7 @@ int32_t CPDF_Creator::WriteDoc_Stage4(IFX_Pause* pPause) { |
| return m_iStage = 100; |
| } |
| void CPDF_Creator::Clear() { |
| - delete m_pXRefStream; |
| - m_pXRefStream = NULL; |
| + m_pXRefStream.reset(); |
| m_File.Clear(); |
| m_NewObjNumArray.RemoveAll(); |
| if (m_pIDArray) { |