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/src/fpdfapi/fpdf_edit/editint.h" | 7 #include "core/src/fpdfapi/fpdf_edit/editint.h" |
8 | 8 |
9 #include <vector> | 9 #include <vector> |
10 | 10 |
11 #include "core/include/fxcrt/fx_ext.h" | 11 #include "core/include/fxcrt/fx_ext.h" |
12 #include "core/include/fpdfapi/fpdf_serial.h" | 12 #include "core/include/fpdfapi/fpdf_serial.h" |
13 #include "core/include/fpdfapi/fpdf_parser.h" | 13 #include "core/include/fpdfapi/fpdf_parser.h" |
| 14 #include "third_party/base/stl_util.h" |
14 | 15 |
15 #define PDF_OBJECTSTREAM_MAXLENGTH (256 * 1024) | 16 #define PDF_OBJECTSTREAM_MAXLENGTH (256 * 1024) |
16 #define PDF_XREFSTREAM_MAXSIZE 10000 | 17 #define PDF_XREFSTREAM_MAXSIZE 10000 |
17 | 18 |
18 // TODO(ochang): Make helper for appending "objnum 0 R ". | 19 // TODO(ochang): Make helper for appending "objnum 0 R ". |
19 | 20 |
20 namespace { | 21 namespace { |
21 | 22 |
22 int32_t PDF_CreatorAppendObject(const CPDF_Object* pObj, | 23 int32_t PDF_CreatorAppendObject(const CPDF_Object* pObj, |
23 CFX_FileBufferArchive* pFile, | 24 CFX_FileBufferArchive* pFile, |
(...skipping 1252 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1276 break; | 1277 break; |
1277 } | 1278 } |
1278 } | 1279 } |
1279 return 1; | 1280 return 1; |
1280 } | 1281 } |
1281 int32_t CPDF_Creator::WriteOldIndirectObject(FX_DWORD objnum) { | 1282 int32_t CPDF_Creator::WriteOldIndirectObject(FX_DWORD objnum) { |
1282 if (m_pParser->m_V5Type[objnum] == 0 || m_pParser->m_V5Type[objnum] == 255) { | 1283 if (m_pParser->m_V5Type[objnum] == 0 || m_pParser->m_V5Type[objnum] == 255) { |
1283 return 0; | 1284 return 0; |
1284 } | 1285 } |
1285 m_ObjectOffset[objnum] = m_Offset; | 1286 m_ObjectOffset[objnum] = m_Offset; |
1286 void* valuetemp = NULL; | |
1287 FX_BOOL bExistInMap = | 1287 FX_BOOL bExistInMap = |
1288 m_pDocument->m_IndirectObjs.Lookup((void*)(uintptr_t)objnum, valuetemp); | 1288 pdfium::ContainsKey(m_pDocument->m_IndirectObjs, objnum); |
1289 FX_BOOL bObjStm = | 1289 FX_BOOL bObjStm = |
1290 (m_pParser->m_V5Type[objnum] == 2) && m_pEncryptDict && !m_pXRefStream; | 1290 (m_pParser->m_V5Type[objnum] == 2) && m_pEncryptDict && !m_pXRefStream; |
1291 if (m_pParser->m_bVersionUpdated || m_bSecurityChanged || bExistInMap || | 1291 if (m_pParser->m_bVersionUpdated || m_bSecurityChanged || bExistInMap || |
1292 bObjStm) { | 1292 bObjStm) { |
1293 CPDF_Object* pObj = m_pDocument->GetIndirectObject(objnum, nullptr); | 1293 CPDF_Object* pObj = m_pDocument->GetIndirectObject(objnum, nullptr); |
1294 if (!pObj) { | 1294 if (!pObj) { |
1295 m_ObjectOffset[objnum] = 0; | 1295 m_ObjectOffset[objnum] = 0; |
1296 return 0; | 1296 return 0; |
1297 } | 1297 } |
1298 if (WriteIndirectObj(pObj)) { | 1298 if (WriteIndirectObj(pObj)) { |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1364 return 1; | 1364 return 1; |
1365 } | 1365 } |
1366 } | 1366 } |
1367 return 0; | 1367 return 0; |
1368 } | 1368 } |
1369 int32_t CPDF_Creator::WriteNewObjs(FX_BOOL bIncremental, IFX_Pause* pPause) { | 1369 int32_t CPDF_Creator::WriteNewObjs(FX_BOOL bIncremental, IFX_Pause* pPause) { |
1370 int32_t iCount = m_NewObjNumArray.GetSize(); | 1370 int32_t iCount = m_NewObjNumArray.GetSize(); |
1371 int32_t index = (int32_t)(uintptr_t)m_Pos; | 1371 int32_t index = (int32_t)(uintptr_t)m_Pos; |
1372 while (index < iCount) { | 1372 while (index < iCount) { |
1373 FX_DWORD objnum = m_NewObjNumArray.ElementAt(index); | 1373 FX_DWORD objnum = m_NewObjNumArray.ElementAt(index); |
1374 CPDF_Object* pObj = NULL; | 1374 auto it = m_pDocument->m_IndirectObjs.find(objnum); |
1375 m_pDocument->m_IndirectObjs.Lookup((void*)(uintptr_t)objnum, (void*&)pObj); | 1375 if (it == m_pDocument->m_IndirectObjs.end()) { |
1376 if (NULL == pObj) { | |
1377 ++index; | 1376 ++index; |
1378 continue; | 1377 continue; |
1379 } | 1378 } |
1380 m_ObjectOffset[objnum] = m_Offset; | 1379 m_ObjectOffset[objnum] = m_Offset; |
1381 if (WriteIndirectObj(pObj)) { | 1380 if (WriteIndirectObj(it->second)) { |
1382 return -1; | 1381 return -1; |
1383 } | 1382 } |
1384 index++; | 1383 index++; |
1385 if (pPause && pPause->NeedToPauseNow()) { | 1384 if (pPause && pPause->NeedToPauseNow()) { |
1386 m_Pos = (FX_POSITION)(uintptr_t)index; | 1385 m_Pos = (FX_POSITION)(uintptr_t)index; |
1387 return 1; | 1386 return 1; |
1388 } | 1387 } |
1389 } | 1388 } |
1390 return 0; | 1389 return 0; |
1391 } | 1390 } |
(...skipping 17 matching lines...) Expand all Loading... |
1409 m_pParser->m_V5Type[j] != 255) { | 1408 m_pParser->m_V5Type[j] != 255) { |
1410 j++; | 1409 j++; |
1411 } | 1410 } |
1412 m_ObjectOffset.Add(dwStart, j - dwStart); | 1411 m_ObjectOffset.Add(dwStart, j - dwStart); |
1413 dwStart = j; | 1412 dwStart = j; |
1414 } | 1413 } |
1415 } | 1414 } |
1416 void CPDF_Creator::InitNewObjNumOffsets() { | 1415 void CPDF_Creator::InitNewObjNumOffsets() { |
1417 FX_BOOL bIncremental = (m_dwFlags & FPDFCREATE_INCREMENTAL) != 0; | 1416 FX_BOOL bIncremental = (m_dwFlags & FPDFCREATE_INCREMENTAL) != 0; |
1418 FX_BOOL bNoOriginal = (m_dwFlags & FPDFCREATE_NO_ORIGINAL) != 0; | 1417 FX_BOOL bNoOriginal = (m_dwFlags & FPDFCREATE_NO_ORIGINAL) != 0; |
1419 FX_POSITION pos = m_pDocument->m_IndirectObjs.GetStartPosition(); | 1418 for (const auto& pair : m_pDocument->m_IndirectObjs) { |
1420 while (pos) { | 1419 if (pair.second->GetObjNum() == -1) |
1421 size_t key = 0; | 1420 continue; |
1422 CPDF_Object* pObj; | 1421 if (bIncremental) { |
1423 m_pDocument->m_IndirectObjs.GetNextAssoc(pos, (void*&)key, (void*&)pObj); | 1422 if (!pair.second->IsModified()) |
1424 FX_DWORD objnum = (FX_DWORD)key; | 1423 continue; |
1425 if (pObj->GetObjNum() == -1) { | 1424 } else if (m_pParser && m_pParser->IsValidObjectNumber(pair.first) && |
| 1425 m_pParser->m_V5Type[pair.first]) { |
1426 continue; | 1426 continue; |
1427 } | 1427 } |
1428 if (bIncremental) { | 1428 AppendNewObjNum(pair.first); |
1429 if (!pObj->IsModified()) { | |
1430 continue; | |
1431 } | |
1432 } else if (m_pParser && m_pParser->IsValidObjectNumber(objnum) && | |
1433 m_pParser->m_V5Type[objnum]) { | |
1434 continue; | |
1435 } | |
1436 AppendNewObjNum(objnum); | |
1437 } | 1429 } |
1438 int32_t iCount = m_NewObjNumArray.GetSize(); | 1430 int32_t iCount = m_NewObjNumArray.GetSize(); |
1439 if (iCount == 0) { | 1431 if (iCount == 0) { |
1440 return; | 1432 return; |
1441 } | 1433 } |
1442 int32_t i = 0; | 1434 int32_t i = 0; |
1443 FX_DWORD dwStartObjNum = 0; | 1435 FX_DWORD dwStartObjNum = 0; |
1444 FX_BOOL bCrossRefValid = m_pParser && m_pParser->GetLastXRefOffset() > 0; | 1436 FX_BOOL bCrossRefValid = m_pParser && m_pParser->GetLastXRefOffset() > 0; |
1445 while (i < iCount) { | 1437 while (i < iCount) { |
1446 dwStartObjNum = m_NewObjNumArray.ElementAt(i); | 1438 dwStartObjNum = m_NewObjNumArray.ElementAt(i); |
(...skipping 639 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2086 m_bNewCrypto = FALSE; | 2078 m_bNewCrypto = FALSE; |
2087 if (!m_bStandardSecurity) { | 2079 if (!m_bStandardSecurity) { |
2088 return; | 2080 return; |
2089 } | 2081 } |
2090 if (m_pEncryptDict) { | 2082 if (m_pEncryptDict) { |
2091 m_pEncryptDict->Release(); | 2083 m_pEncryptDict->Release(); |
2092 m_pEncryptDict = NULL; | 2084 m_pEncryptDict = NULL; |
2093 } | 2085 } |
2094 m_bStandardSecurity = FALSE; | 2086 m_bStandardSecurity = FALSE; |
2095 } | 2087 } |
OLD | NEW |