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 636 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
647 _AppendIndex1(m_Buffer, *offset); | 647 _AppendIndex1(m_Buffer, *offset); |
648 } else { | 648 } else { |
649 _AppendIndex2(m_Buffer, dwObjStmNum, index++); | 649 _AppendIndex2(m_Buffer, dwObjStmNum, index++); |
650 } | 650 } |
651 } else { | 651 } else { |
652 _AppendIndex0(m_Buffer, FALSE); | 652 _AppendIndex0(m_Buffer, FALSE); |
653 } | 653 } |
654 } | 654 } |
655 if (iSize > 0 && bEOF) { | 655 if (iSize > 0 && bEOF) { |
656 pCreator->m_ObjectOffset.Add(dwObjStmNum, 1); | 656 pCreator->m_ObjectOffset.Add(dwObjStmNum, 1); |
657 pCreator->m_ObjectSize.Add(dwObjStmNum, 1); | |
658 pCreator->m_ObjectOffset[dwObjStmNum] = objOffset; | 657 pCreator->m_ObjectOffset[dwObjStmNum] = objOffset; |
659 } | 658 } |
660 m_iSeg = iSeg; | 659 m_iSeg = iSeg; |
661 if (bEOF) { | 660 if (bEOF) { |
662 m_ObjStream.Start(); | 661 m_ObjStream.Start(); |
663 } | 662 } |
664 return 1; | 663 return 1; |
665 } | 664 } |
666 int32_t& j = m_ObjStream.m_index; | 665 int32_t& j = m_ObjStream.m_index; |
667 for (int i = m_iSeg; i < iSeg; i++) { | 666 for (int i = m_iSeg; i < iSeg; i++) { |
(...skipping 590 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1258 void* valuetemp = NULL; | 1257 void* valuetemp = NULL; |
1259 FX_BOOL bExistInMap = | 1258 FX_BOOL bExistInMap = |
1260 m_pDocument->m_IndirectObjs.Lookup((void*)(uintptr_t)objnum, valuetemp); | 1259 m_pDocument->m_IndirectObjs.Lookup((void*)(uintptr_t)objnum, valuetemp); |
1261 FX_BOOL bObjStm = | 1260 FX_BOOL bObjStm = |
1262 (m_pParser->m_V5Type[objnum] == 2) && m_pEncryptDict && !m_pXRefStream; | 1261 (m_pParser->m_V5Type[objnum] == 2) && m_pEncryptDict && !m_pXRefStream; |
1263 if (m_pParser->m_bVersionUpdated || m_bSecurityChanged || bExistInMap || | 1262 if (m_pParser->m_bVersionUpdated || m_bSecurityChanged || bExistInMap || |
1264 bObjStm) { | 1263 bObjStm) { |
1265 CPDF_Object* pObj = m_pDocument->GetIndirectObject(objnum); | 1264 CPDF_Object* pObj = m_pDocument->GetIndirectObject(objnum); |
1266 if (!pObj) { | 1265 if (!pObj) { |
1267 m_ObjectOffset[objnum] = 0; | 1266 m_ObjectOffset[objnum] = 0; |
1268 m_ObjectSize[objnum] = 0; | |
1269 return 0; | 1267 return 0; |
1270 } | 1268 } |
1271 if (WriteIndirectObj(pObj)) { | 1269 if (WriteIndirectObj(pObj)) { |
1272 return -1; | 1270 return -1; |
1273 } | 1271 } |
1274 if (!bExistInMap) { | 1272 if (!bExistInMap) { |
1275 m_pDocument->ReleaseIndirectObject(objnum); | 1273 m_pDocument->ReleaseIndirectObject(objnum); |
1276 } | 1274 } |
1277 } else { | 1275 } else { |
1278 uint8_t* pBuffer; | 1276 uint8_t* pBuffer; |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1325 | 1323 |
1326 FX_DWORD objnum = (FX_DWORD)(uintptr_t)m_Pos; | 1324 FX_DWORD objnum = (FX_DWORD)(uintptr_t)m_Pos; |
1327 for (; objnum <= nLastObjNum; ++objnum) { | 1325 for (; objnum <= nLastObjNum; ++objnum) { |
1328 int32_t iRet = WriteOldIndirectObject(objnum); | 1326 int32_t iRet = WriteOldIndirectObject(objnum); |
1329 if (iRet < 0) | 1327 if (iRet < 0) |
1330 return iRet; | 1328 return iRet; |
1331 | 1329 |
1332 if (!iRet) | 1330 if (!iRet) |
1333 continue; | 1331 continue; |
1334 | 1332 |
1335 m_ObjectSize[objnum] = (FX_DWORD)(m_Offset - m_ObjectOffset[objnum]); | |
1336 if (pPause && pPause->NeedToPauseNow()) { | 1333 if (pPause && pPause->NeedToPauseNow()) { |
1337 m_Pos = (void*)(uintptr_t)(objnum + 1); | 1334 m_Pos = (void*)(uintptr_t)(objnum + 1); |
1338 return 1; | 1335 return 1; |
1339 } | 1336 } |
1340 } | 1337 } |
1341 return 0; | 1338 return 0; |
1342 } | 1339 } |
1343 int32_t CPDF_Creator::WriteNewObjs(FX_BOOL bIncremental, IFX_Pause* pPause) { | 1340 int32_t CPDF_Creator::WriteNewObjs(FX_BOOL bIncremental, IFX_Pause* pPause) { |
1344 int32_t iCount = m_NewObjNumArray.GetSize(); | 1341 int32_t iCount = m_NewObjNumArray.GetSize(); |
1345 int32_t index = (int32_t)(uintptr_t)m_Pos; | 1342 int32_t index = (int32_t)(uintptr_t)m_Pos; |
1346 while (index < iCount) { | 1343 while (index < iCount) { |
1347 FX_DWORD objnum = m_NewObjNumArray.ElementAt(index); | 1344 FX_DWORD objnum = m_NewObjNumArray.ElementAt(index); |
1348 CPDF_Object* pObj = NULL; | 1345 CPDF_Object* pObj = NULL; |
1349 m_pDocument->m_IndirectObjs.Lookup((void*)(uintptr_t)objnum, (void*&)pObj); | 1346 m_pDocument->m_IndirectObjs.Lookup((void*)(uintptr_t)objnum, (void*&)pObj); |
1350 if (NULL == pObj) { | 1347 if (NULL == pObj) { |
1351 ++index; | 1348 ++index; |
1352 continue; | 1349 continue; |
1353 } | 1350 } |
1354 m_ObjectOffset[objnum] = m_Offset; | 1351 m_ObjectOffset[objnum] = m_Offset; |
1355 if (WriteIndirectObj(pObj)) { | 1352 if (WriteIndirectObj(pObj)) { |
1356 return -1; | 1353 return -1; |
1357 } | 1354 } |
1358 m_ObjectSize[objnum] = (FX_DWORD)(m_Offset - m_ObjectOffset[objnum]); | |
1359 index++; | 1355 index++; |
1360 if (pPause && pPause->NeedToPauseNow()) { | 1356 if (pPause && pPause->NeedToPauseNow()) { |
1361 m_Pos = (FX_POSITION)(uintptr_t)index; | 1357 m_Pos = (FX_POSITION)(uintptr_t)index; |
1362 return 1; | 1358 return 1; |
1363 } | 1359 } |
1364 } | 1360 } |
1365 return 0; | 1361 return 0; |
1366 } | 1362 } |
1367 void CPDF_Creator::InitOldObjNumOffsets() { | 1363 void CPDF_Creator::InitOldObjNumOffsets() { |
1368 if (!m_pParser) { | 1364 if (!m_pParser) { |
1369 return; | 1365 return; |
1370 } | 1366 } |
1371 FX_DWORD j = 0; | 1367 FX_DWORD j = 0; |
1372 FX_DWORD dwStart = 0; | 1368 FX_DWORD dwStart = 0; |
1373 FX_DWORD dwEnd = m_pParser->GetLastObjNum(); | 1369 FX_DWORD dwEnd = m_pParser->GetLastObjNum(); |
1374 while (dwStart <= dwEnd) { | 1370 while (dwStart <= dwEnd) { |
1375 while (dwStart <= dwEnd && (m_pParser->m_V5Type[dwStart] == 0 || | 1371 while (dwStart <= dwEnd && (m_pParser->m_V5Type[dwStart] == 0 || |
1376 m_pParser->m_V5Type[dwStart] == 255)) { | 1372 m_pParser->m_V5Type[dwStart] == 255)) { |
1377 dwStart++; | 1373 dwStart++; |
1378 } | 1374 } |
1379 if (dwStart > dwEnd) { | 1375 if (dwStart > dwEnd) { |
1380 break; | 1376 break; |
1381 } | 1377 } |
1382 j = dwStart; | 1378 j = dwStart; |
1383 while (j <= dwEnd && m_pParser->m_V5Type[j] != 0 && | 1379 while (j <= dwEnd && m_pParser->m_V5Type[j] != 0 && |
1384 m_pParser->m_V5Type[j] != 255) { | 1380 m_pParser->m_V5Type[j] != 255) { |
1385 j++; | 1381 j++; |
1386 } | 1382 } |
1387 m_ObjectOffset.Add(dwStart, j - dwStart); | 1383 m_ObjectOffset.Add(dwStart, j - dwStart); |
1388 m_ObjectSize.Add(dwStart, j - dwStart); | |
1389 dwStart = j; | 1384 dwStart = j; |
1390 } | 1385 } |
1391 } | 1386 } |
1392 void CPDF_Creator::InitNewObjNumOffsets() { | 1387 void CPDF_Creator::InitNewObjNumOffsets() { |
1393 FX_BOOL bIncremental = (m_dwFlags & FPDFCREATE_INCREMENTAL) != 0; | 1388 FX_BOOL bIncremental = (m_dwFlags & FPDFCREATE_INCREMENTAL) != 0; |
1394 FX_BOOL bNoOriginal = (m_dwFlags & FPDFCREATE_NO_ORIGINAL) != 0; | 1389 FX_BOOL bNoOriginal = (m_dwFlags & FPDFCREATE_NO_ORIGINAL) != 0; |
1395 FX_POSITION pos = m_pDocument->m_IndirectObjs.GetStartPosition(); | 1390 FX_POSITION pos = m_pDocument->m_IndirectObjs.GetStartPosition(); |
1396 while (pos) { | 1391 while (pos) { |
1397 size_t key = 0; | 1392 size_t key = 0; |
1398 CPDF_Object* pObj; | 1393 CPDF_Object* pObj; |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1430 return; | 1425 return; |
1431 } | 1426 } |
1432 FX_DWORD dwLastObjNum = dwStartObjNum; | 1427 FX_DWORD dwLastObjNum = dwStartObjNum; |
1433 i++; | 1428 i++; |
1434 FX_BOOL bNewStart = FALSE; | 1429 FX_BOOL bNewStart = FALSE; |
1435 for (; i < iCount; i++) { | 1430 for (; i < iCount; i++) { |
1436 FX_DWORD dwCurObjNum = m_NewObjNumArray.ElementAt(i); | 1431 FX_DWORD dwCurObjNum = m_NewObjNumArray.ElementAt(i); |
1437 bool bExist = m_pParser && m_pParser->IsValidObjectNumber(dwCurObjNum) && | 1432 bool bExist = m_pParser && m_pParser->IsValidObjectNumber(dwCurObjNum) && |
1438 m_ObjectOffset.GetPtrAt(dwCurObjNum); | 1433 m_ObjectOffset.GetPtrAt(dwCurObjNum); |
1439 if (bExist || dwCurObjNum - dwLastObjNum > 1) { | 1434 if (bExist || dwCurObjNum - dwLastObjNum > 1) { |
1440 if (!bNewStart) { | 1435 if (!bNewStart) |
1441 m_ObjectOffset.Add(dwStartObjNum, dwLastObjNum - dwStartObjNum + 1); | 1436 m_ObjectOffset.Add(dwStartObjNum, dwLastObjNum - dwStartObjNum + 1); |
1442 m_ObjectSize.Add(dwStartObjNum, dwLastObjNum - dwStartObjNum + 1); | |
1443 } | |
1444 dwStartObjNum = dwCurObjNum; | 1437 dwStartObjNum = dwCurObjNum; |
1445 } | 1438 } |
1446 if (bNewStart) { | 1439 if (bNewStart) { |
1447 dwStartObjNum = dwCurObjNum; | 1440 dwStartObjNum = dwCurObjNum; |
1448 } | 1441 } |
1449 bNewStart = bExist; | 1442 bNewStart = bExist; |
1450 dwLastObjNum = dwCurObjNum; | 1443 dwLastObjNum = dwCurObjNum; |
1451 } | 1444 } |
1452 m_ObjectOffset.Add(dwStartObjNum, dwLastObjNum - dwStartObjNum + 1); | 1445 m_ObjectOffset.Add(dwStartObjNum, dwLastObjNum - dwStartObjNum + 1); |
1453 m_ObjectSize.Add(dwStartObjNum, dwLastObjNum - dwStartObjNum + 1); | |
1454 } | 1446 } |
1455 void CPDF_Creator::AppendNewObjNum(FX_DWORD objbum) { | 1447 void CPDF_Creator::AppendNewObjNum(FX_DWORD objbum) { |
1456 int32_t iStart = 0, iFind = 0; | 1448 int32_t iStart = 0, iFind = 0; |
1457 int32_t iEnd = m_NewObjNumArray.GetUpperBound(); | 1449 int32_t iEnd = m_NewObjNumArray.GetUpperBound(); |
1458 while (iStart <= iEnd) { | 1450 while (iStart <= iEnd) { |
1459 int32_t iMid = (iStart + iEnd) / 2; | 1451 int32_t iMid = (iStart + iEnd) / 2; |
1460 FX_DWORD dwMid = m_NewObjNumArray.ElementAt(iMid); | 1452 FX_DWORD dwMid = m_NewObjNumArray.ElementAt(iMid); |
1461 if (objbum < dwMid) { | 1453 if (objbum < dwMid) { |
1462 iEnd = iMid - 1; | 1454 iEnd = iMid - 1; |
1463 } else { | 1455 } else { |
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1602 } | 1594 } |
1603 if (m_iStage == 27) { | 1595 if (m_iStage == 27) { |
1604 if (NULL != m_pEncryptDict && 0 == m_pEncryptDict->GetObjNum()) { | 1596 if (NULL != m_pEncryptDict && 0 == m_pEncryptDict->GetObjNum()) { |
1605 m_dwLastObjNum += 1; | 1597 m_dwLastObjNum += 1; |
1606 FX_FILESIZE saveOffset = m_Offset; | 1598 FX_FILESIZE saveOffset = m_Offset; |
1607 if (WriteIndirectObj(m_dwLastObjNum, m_pEncryptDict) < 0) { | 1599 if (WriteIndirectObj(m_dwLastObjNum, m_pEncryptDict) < 0) { |
1608 return -1; | 1600 return -1; |
1609 } | 1601 } |
1610 m_ObjectOffset.Add(m_dwLastObjNum, 1); | 1602 m_ObjectOffset.Add(m_dwLastObjNum, 1); |
1611 m_ObjectOffset[m_dwLastObjNum] = saveOffset; | 1603 m_ObjectOffset[m_dwLastObjNum] = saveOffset; |
1612 m_ObjectSize.Add(m_dwLastObjNum, 1); | |
1613 m_ObjectSize[m_dwLastObjNum] = m_Offset - saveOffset; | |
1614 m_dwEnryptObjNum = m_dwLastObjNum; | 1604 m_dwEnryptObjNum = m_dwLastObjNum; |
1615 if (m_dwFlags & FPDFCREATE_INCREMENTAL) { | 1605 if (m_dwFlags & FPDFCREATE_INCREMENTAL) { |
1616 m_NewObjNumArray.Add(m_dwLastObjNum); | 1606 m_NewObjNumArray.Add(m_dwLastObjNum); |
1617 } | 1607 } |
1618 } | 1608 } |
1619 m_iStage = 80; | 1609 m_iStage = 80; |
1620 } | 1610 } |
1621 return m_iStage; | 1611 return m_iStage; |
1622 } | 1612 } |
1623 int32_t CPDF_Creator::WriteDoc_Stage3(IFX_Pause* pPause) { | 1613 int32_t CPDF_Creator::WriteDoc_Stage3(IFX_Pause* pPause) { |
(...skipping 367 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1991 return FALSE; | 1981 return FALSE; |
1992 } | 1982 } |
1993 return Create(flags); | 1983 return Create(flags); |
1994 } | 1984 } |
1995 FX_BOOL CPDF_Creator::Create(FX_DWORD flags) { | 1985 FX_BOOL CPDF_Creator::Create(FX_DWORD flags) { |
1996 m_dwFlags = flags; | 1986 m_dwFlags = flags; |
1997 m_iStage = 0; | 1987 m_iStage = 0; |
1998 m_Offset = 0; | 1988 m_Offset = 0; |
1999 m_dwLastObjNum = m_pDocument->GetLastObjNum(); | 1989 m_dwLastObjNum = m_pDocument->GetLastObjNum(); |
2000 m_ObjectOffset.Clear(); | 1990 m_ObjectOffset.Clear(); |
2001 m_ObjectSize.Clear(); | |
2002 m_NewObjNumArray.RemoveAll(); | 1991 m_NewObjNumArray.RemoveAll(); |
2003 InitID(); | 1992 InitID(); |
2004 if (flags & FPDFCREATE_PROGRESSIVE) { | 1993 if (flags & FPDFCREATE_PROGRESSIVE) { |
2005 return TRUE; | 1994 return TRUE; |
2006 } | 1995 } |
2007 return Continue(NULL) > -1; | 1996 return Continue(NULL) > -1; |
2008 } | 1997 } |
2009 void CPDF_Creator::InitID(FX_BOOL bDefault) { | 1998 void CPDF_Creator::InitID(FX_BOOL bDefault) { |
2010 CPDF_Array* pOldIDArray = m_pParser ? m_pParser->GetIDArray() : NULL; | 1999 CPDF_Array* pOldIDArray = m_pParser ? m_pParser->GetIDArray() : NULL; |
2011 FX_BOOL bNewId = !m_pIDArray; | 2000 FX_BOOL bNewId = !m_pIDArray; |
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2104 m_bNewCrypto = FALSE; | 2093 m_bNewCrypto = FALSE; |
2105 if (!m_bStandardSecurity) { | 2094 if (!m_bStandardSecurity) { |
2106 return; | 2095 return; |
2107 } | 2096 } |
2108 if (m_pEncryptDict) { | 2097 if (m_pEncryptDict) { |
2109 m_pEncryptDict->Release(); | 2098 m_pEncryptDict->Release(); |
2110 m_pEncryptDict = NULL; | 2099 m_pEncryptDict = NULL; |
2111 } | 2100 } |
2112 m_bStandardSecurity = FALSE; | 2101 m_bStandardSecurity = FALSE; |
2113 } | 2102 } |
OLD | NEW |