| 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 "editint.h" | 7 #include "editint.h" |
| 8 | 8 |
| 9 #include "core/include/fxcrt/fx_ext.h" | 9 #include "core/include/fxcrt/fx_ext.h" |
| 10 #include "core/include/fpdfapi/fpdf_serial.h" | 10 #include "core/include/fpdfapi/fpdf_serial.h" |
| (...skipping 1301 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1312 m_Offset += size; | 1312 m_Offset += size; |
| 1313 if (AppendObjectNumberToXRef(objnum) < 0) { | 1313 if (AppendObjectNumberToXRef(objnum) < 0) { |
| 1314 return -1; | 1314 return -1; |
| 1315 } | 1315 } |
| 1316 } | 1316 } |
| 1317 FX_Free(pBuffer); | 1317 FX_Free(pBuffer); |
| 1318 } | 1318 } |
| 1319 return 1; | 1319 return 1; |
| 1320 } | 1320 } |
| 1321 int32_t CPDF_Creator::WriteOldObjs(IFX_Pause* pPause) { | 1321 int32_t CPDF_Creator::WriteOldObjs(IFX_Pause* pPause) { |
| 1322 FX_DWORD nOldSize = m_pParser->m_CrossRef.GetSize(); | 1322 FX_DWORD nLastObjNum = m_pParser->GetLastObjNum(); |
| 1323 if (!m_pParser->IsValidObjectNumber(nLastObjNum)) |
| 1324 return 0; |
| 1325 |
| 1323 FX_DWORD objnum = (FX_DWORD)(uintptr_t)m_Pos; | 1326 FX_DWORD objnum = (FX_DWORD)(uintptr_t)m_Pos; |
| 1324 for (; objnum < nOldSize; objnum++) { | 1327 for (; objnum <= nLastObjNum; ++objnum) { |
| 1325 int32_t iRet = WriteOldIndirectObject(objnum); | 1328 int32_t iRet = WriteOldIndirectObject(objnum); |
| 1326 if (!iRet) { | 1329 if (iRet < 0) |
| 1330 return iRet; |
| 1331 |
| 1332 if (!iRet) |
| 1327 continue; | 1333 continue; |
| 1328 } | 1334 |
| 1329 if (iRet < 0) { | |
| 1330 return iRet; | |
| 1331 } | |
| 1332 m_ObjectSize[objnum] = (FX_DWORD)(m_Offset - m_ObjectOffset[objnum]); | 1335 m_ObjectSize[objnum] = (FX_DWORD)(m_Offset - m_ObjectOffset[objnum]); |
| 1333 if (pPause && pPause->NeedToPauseNow()) { | 1336 if (pPause && pPause->NeedToPauseNow()) { |
| 1334 m_Pos = (void*)(uintptr_t)(objnum + 1); | 1337 m_Pos = (void*)(uintptr_t)(objnum + 1); |
| 1335 return 1; | 1338 return 1; |
| 1336 } | 1339 } |
| 1337 } | 1340 } |
| 1338 return 0; | 1341 return 0; |
| 1339 } | 1342 } |
| 1340 int32_t CPDF_Creator::WriteNewObjs(FX_BOOL bIncremental, IFX_Pause* pPause) { | 1343 int32_t CPDF_Creator::WriteNewObjs(FX_BOOL bIncremental, IFX_Pause* pPause) { |
| 1341 int32_t iCount = m_NewObjNumArray.GetSize(); | 1344 int32_t iCount = m_NewObjNumArray.GetSize(); |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1382 j++; | 1385 j++; |
| 1383 } | 1386 } |
| 1384 m_ObjectOffset.Add(dwStart, j - dwStart); | 1387 m_ObjectOffset.Add(dwStart, j - dwStart); |
| 1385 m_ObjectSize.Add(dwStart, j - dwStart); | 1388 m_ObjectSize.Add(dwStart, j - dwStart); |
| 1386 dwStart = j; | 1389 dwStart = j; |
| 1387 } | 1390 } |
| 1388 } | 1391 } |
| 1389 void CPDF_Creator::InitNewObjNumOffsets() { | 1392 void CPDF_Creator::InitNewObjNumOffsets() { |
| 1390 FX_BOOL bIncremental = (m_dwFlags & FPDFCREATE_INCREMENTAL) != 0; | 1393 FX_BOOL bIncremental = (m_dwFlags & FPDFCREATE_INCREMENTAL) != 0; |
| 1391 FX_BOOL bNoOriginal = (m_dwFlags & FPDFCREATE_NO_ORIGINAL) != 0; | 1394 FX_BOOL bNoOriginal = (m_dwFlags & FPDFCREATE_NO_ORIGINAL) != 0; |
| 1392 FX_DWORD nOldSize = m_pParser ? m_pParser->m_CrossRef.GetSize() : 0; | |
| 1393 FX_POSITION pos = m_pDocument->m_IndirectObjs.GetStartPosition(); | 1395 FX_POSITION pos = m_pDocument->m_IndirectObjs.GetStartPosition(); |
| 1394 while (pos) { | 1396 while (pos) { |
| 1395 size_t key = 0; | 1397 size_t key = 0; |
| 1396 CPDF_Object* pObj; | 1398 CPDF_Object* pObj; |
| 1397 m_pDocument->m_IndirectObjs.GetNextAssoc(pos, (void*&)key, (void*&)pObj); | 1399 m_pDocument->m_IndirectObjs.GetNextAssoc(pos, (void*&)key, (void*&)pObj); |
| 1398 FX_DWORD objnum = (FX_DWORD)key; | 1400 FX_DWORD objnum = (FX_DWORD)key; |
| 1399 if (pObj->GetObjNum() == -1) { | 1401 if (pObj->GetObjNum() == -1) { |
| 1400 continue; | 1402 continue; |
| 1401 } | 1403 } |
| 1402 if (bIncremental) { | 1404 if (bIncremental) { |
| 1403 if (!pObj->IsModified()) { | 1405 if (!pObj->IsModified()) { |
| 1404 continue; | 1406 continue; |
| 1405 } | 1407 } |
| 1406 } else { | 1408 } else if (m_pParser->IsValidObjectNumber(objnum) && |
| 1407 if (objnum < nOldSize && m_pParser->m_V5Type[objnum] != 0) { | 1409 m_pParser->m_V5Type[objnum]) { |
| 1408 continue; | 1410 continue; |
| 1409 } | |
| 1410 } | 1411 } |
| 1411 AppendNewObjNum(objnum); | 1412 AppendNewObjNum(objnum); |
| 1412 } | 1413 } |
| 1413 int32_t iCount = m_NewObjNumArray.GetSize(); | 1414 int32_t iCount = m_NewObjNumArray.GetSize(); |
| 1414 if (iCount == 0) { | 1415 if (iCount == 0) { |
| 1415 return; | 1416 return; |
| 1416 } | 1417 } |
| 1417 int32_t i = 0; | 1418 int32_t i = 0; |
| 1418 FX_DWORD dwStartObjNum = 0; | 1419 FX_DWORD dwStartObjNum = 0; |
| 1419 FX_BOOL bCrossRefValid = m_pParser && m_pParser->GetLastXRefOffset() > 0; | 1420 FX_BOOL bCrossRefValid = m_pParser && m_pParser->GetLastXRefOffset() > 0; |
| 1420 while (i < iCount) { | 1421 while (i < iCount) { |
| 1421 dwStartObjNum = m_NewObjNumArray.ElementAt(i); | 1422 dwStartObjNum = m_NewObjNumArray.ElementAt(i); |
| 1422 if ((bIncremental && (bNoOriginal || bCrossRefValid)) || | 1423 if ((bIncremental && (bNoOriginal || bCrossRefValid)) || |
| 1423 !m_ObjectOffset.GetPtrAt(dwStartObjNum)) { | 1424 !m_ObjectOffset.GetPtrAt(dwStartObjNum)) { |
| 1424 break; | 1425 break; |
| 1425 } | 1426 } |
| 1426 i++; | 1427 i++; |
| 1427 } | 1428 } |
| 1428 if (i >= iCount) { | 1429 if (i >= iCount) { |
| 1429 return; | 1430 return; |
| 1430 } | 1431 } |
| 1431 FX_DWORD dwLastObjNum = dwStartObjNum; | 1432 FX_DWORD dwLastObjNum = dwStartObjNum; |
| 1432 i++; | 1433 i++; |
| 1433 FX_BOOL bNewStart = FALSE; | 1434 FX_BOOL bNewStart = FALSE; |
| 1434 for (; i < iCount; i++) { | 1435 for (; i < iCount; i++) { |
| 1435 FX_DWORD dwCurObjNum = m_NewObjNumArray.ElementAt(i); | 1436 FX_DWORD dwCurObjNum = m_NewObjNumArray.ElementAt(i); |
| 1436 FX_BOOL bExist = | 1437 bool bExist = m_pParser->IsValidObjectNumber(dwCurObjNum) && |
| 1437 (dwCurObjNum < nOldSize && m_ObjectOffset.GetPtrAt(dwCurObjNum)); | 1438 m_ObjectOffset.GetPtrAt(dwCurObjNum); |
| 1438 if (bExist || dwCurObjNum - dwLastObjNum > 1) { | 1439 if (bExist || dwCurObjNum - dwLastObjNum > 1) { |
| 1439 if (!bNewStart) { | 1440 if (!bNewStart) { |
| 1440 m_ObjectOffset.Add(dwStartObjNum, dwLastObjNum - dwStartObjNum + 1); | 1441 m_ObjectOffset.Add(dwStartObjNum, dwLastObjNum - dwStartObjNum + 1); |
| 1441 m_ObjectSize.Add(dwStartObjNum, dwLastObjNum - dwStartObjNum + 1); | 1442 m_ObjectSize.Add(dwStartObjNum, dwLastObjNum - dwStartObjNum + 1); |
| 1442 } | 1443 } |
| 1443 dwStartObjNum = dwCurObjNum; | 1444 dwStartObjNum = dwCurObjNum; |
| 1444 } | 1445 } |
| 1445 if (bNewStart) { | 1446 if (bNewStart) { |
| 1446 dwStartObjNum = dwCurObjNum; | 1447 dwStartObjNum = dwCurObjNum; |
| 1447 } | 1448 } |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1548 if ((m_dwFlags & FPDFCREATE_NO_ORIGINAL) == 0 && | 1549 if ((m_dwFlags & FPDFCREATE_NO_ORIGINAL) == 0 && |
| 1549 m_pParser->GetLastXRefOffset() == 0) { | 1550 m_pParser->GetLastXRefOffset() == 0) { |
| 1550 InitOldObjNumOffsets(); | 1551 InitOldObjNumOffsets(); |
| 1551 FX_DWORD dwEnd = m_pParser->GetLastObjNum(); | 1552 FX_DWORD dwEnd = m_pParser->GetLastObjNum(); |
| 1552 FX_BOOL bObjStm = (m_dwFlags & FPDFCREATE_OBJECTSTREAM) != 0; | 1553 FX_BOOL bObjStm = (m_dwFlags & FPDFCREATE_OBJECTSTREAM) != 0; |
| 1553 for (FX_DWORD objnum = 0; objnum <= dwEnd; objnum++) { | 1554 for (FX_DWORD objnum = 0; objnum <= dwEnd; objnum++) { |
| 1554 if (m_pParser->m_V5Type[objnum] == 0 || | 1555 if (m_pParser->m_V5Type[objnum] == 0 || |
| 1555 m_pParser->m_V5Type[objnum] == 255) { | 1556 m_pParser->m_V5Type[objnum] == 255) { |
| 1556 continue; | 1557 continue; |
| 1557 } | 1558 } |
| 1558 m_ObjectOffset[objnum] = m_pParser->m_CrossRef[objnum]; | 1559 m_ObjectOffset[objnum] = m_pParser->m_ObjectInfo[objnum].pos; |
| 1559 if (bObjStm) { | 1560 if (bObjStm) { |
| 1560 m_pXRefStream->AddObjectNumberToIndexArray(objnum); | 1561 m_pXRefStream->AddObjectNumberToIndexArray(objnum); |
| 1561 } | 1562 } |
| 1562 } | 1563 } |
| 1563 if (bObjStm) { | 1564 if (bObjStm) { |
| 1564 m_pXRefStream->EndXRefStream(this); | 1565 m_pXRefStream->EndXRefStream(this); |
| 1565 m_pXRefStream->Start(); | 1566 m_pXRefStream->Start(); |
| 1566 } | 1567 } |
| 1567 } | 1568 } |
| 1568 m_iStage = 20; | 1569 m_iStage = 20; |
| (...skipping 534 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2103 m_bNewCrypto = FALSE; | 2104 m_bNewCrypto = FALSE; |
| 2104 if (!m_bStandardSecurity) { | 2105 if (!m_bStandardSecurity) { |
| 2105 return; | 2106 return; |
| 2106 } | 2107 } |
| 2107 if (m_pEncryptDict) { | 2108 if (m_pEncryptDict) { |
| 2108 m_pEncryptDict->Release(); | 2109 m_pEncryptDict->Release(); |
| 2109 m_pEncryptDict = NULL; | 2110 m_pEncryptDict = NULL; |
| 2110 } | 2111 } |
| 2111 m_bStandardSecurity = FALSE; | 2112 m_bStandardSecurity = FALSE; |
| 2112 } | 2113 } |
| OLD | NEW |