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 | 14 |
15 #define PDF_OBJECTSTREAM_MAXLENGTH (256 * 1024) | 15 #define PDF_OBJECTSTREAM_MAXLENGTH (256 * 1024) |
16 #define PDF_XREFSTREAM_MAXSIZE 10000 | 16 #define PDF_XREFSTREAM_MAXSIZE 10000 |
17 | 17 |
| 18 // TODO(ochang): Make helper for appending "objnum 0 R ". |
| 19 |
18 namespace { | 20 namespace { |
19 | 21 |
20 int32_t PDF_CreatorAppendObject(const CPDF_Object* pObj, | 22 int32_t PDF_CreatorAppendObject(const CPDF_Object* pObj, |
21 CFX_FileBufferArchive* pFile, | 23 CFX_FileBufferArchive* pFile, |
22 FX_FILESIZE& offset) { | 24 FX_FILESIZE& offset) { |
23 int32_t len = 0; | 25 int32_t len = 0; |
24 if (!pObj) { | 26 if (!pObj) { |
25 if (pFile->AppendString(" null") < 0) { | 27 if (pFile->AppendString(" null") < 0) { |
26 return -1; | 28 return -1; |
27 } | 29 } |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
105 } | 107 } |
106 offset += 1; | 108 offset += 1; |
107 break; | 109 break; |
108 } | 110 } |
109 case PDFOBJ_DICTIONARY: { | 111 case PDFOBJ_DICTIONARY: { |
110 if (pFile->AppendString("<<") < 0) { | 112 if (pFile->AppendString("<<") < 0) { |
111 return -1; | 113 return -1; |
112 } | 114 } |
113 offset += 2; | 115 offset += 2; |
114 const CPDF_Dictionary* p = pObj->AsDictionary(); | 116 const CPDF_Dictionary* p = pObj->AsDictionary(); |
115 FX_POSITION pos = p->GetStartPos(); | 117 for (const auto& it : *p) { |
116 while (pos) { | 118 const CFX_ByteString& key = it.first; |
117 CFX_ByteString key; | 119 CPDF_Object* pValue = it.second; |
118 CPDF_Object* pValue = p->GetNextElement(pos, key); | |
119 if (pFile->AppendString("/") < 0) { | 120 if (pFile->AppendString("/") < 0) { |
120 return -1; | 121 return -1; |
121 } | 122 } |
122 if ((len = pFile->AppendString(PDF_NameEncode(key))) < 0) { | 123 if ((len = pFile->AppendString(PDF_NameEncode(key))) < 0) { |
123 return -1; | 124 return -1; |
124 } | 125 } |
125 offset += len + 1; | 126 offset += len + 1; |
126 if (pValue->GetObjNum()) { | 127 if (pValue->GetObjNum()) { |
127 if (pFile->AppendString(" ") < 0) { | 128 if (pFile->AppendString(" ") < 0) { |
128 return -1; | 129 return -1; |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
177 int32_t PDF_CreatorWriteTrailer(CPDF_Document* pDocument, | 178 int32_t PDF_CreatorWriteTrailer(CPDF_Document* pDocument, |
178 CFX_FileBufferArchive* pFile, | 179 CFX_FileBufferArchive* pFile, |
179 CPDF_Array* pIDArray, | 180 CPDF_Array* pIDArray, |
180 FX_BOOL bCompress) { | 181 FX_BOOL bCompress) { |
181 FX_FILESIZE offset = 0; | 182 FX_FILESIZE offset = 0; |
182 int32_t len = 0; | 183 int32_t len = 0; |
183 FXSYS_assert(pDocument && pFile); | 184 FXSYS_assert(pDocument && pFile); |
184 CPDF_Parser* pParser = (CPDF_Parser*)pDocument->GetParser(); | 185 CPDF_Parser* pParser = (CPDF_Parser*)pDocument->GetParser(); |
185 if (pParser) { | 186 if (pParser) { |
186 CPDF_Dictionary* p = pParser->GetTrailer(); | 187 CPDF_Dictionary* p = pParser->GetTrailer(); |
187 FX_POSITION pos = p->GetStartPos(); | 188 for (const auto& it : *p) { |
188 while (pos) { | 189 const CFX_ByteString& key = it.first; |
189 CFX_ByteString key; | 190 CPDF_Object* pValue = it.second; |
190 CPDF_Object* pValue = p->GetNextElement(pos, key); | |
191 if (key == "Encrypt" || key == "Size" || key == "Filter" || | 191 if (key == "Encrypt" || key == "Size" || key == "Filter" || |
192 key == "Index" || key == "Length" || key == "Prev" || key == "W" || | 192 key == "Index" || key == "Length" || key == "Prev" || key == "W" || |
193 key == "XRefStm" || key == "Type" || key == "ID") { | 193 key == "XRefStm" || key == "Type" || key == "ID") { |
194 continue; | 194 continue; |
195 } | 195 } |
196 if (bCompress && key == "DecodeParms") { | 196 if (bCompress && key == "DecodeParms") { |
197 continue; | 197 continue; |
198 } | 198 } |
199 if (pFile->AppendString(("/")) < 0) { | 199 if (pFile->AppendString(("/")) < 0) { |
200 return -1; | 200 return -1; |
(...skipping 1030 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1231 case PDFOBJ_DICTIONARY: { | 1231 case PDFOBJ_DICTIONARY: { |
1232 if (!m_pCryptoHandler || pObj == m_pEncryptDict) { | 1232 if (!m_pCryptoHandler || pObj == m_pEncryptDict) { |
1233 return PDF_CreatorAppendObject(pObj, &m_File, m_Offset); | 1233 return PDF_CreatorAppendObject(pObj, &m_File, m_Offset); |
1234 } | 1234 } |
1235 if (m_File.AppendString("<<") < 0) { | 1235 if (m_File.AppendString("<<") < 0) { |
1236 return -1; | 1236 return -1; |
1237 } | 1237 } |
1238 m_Offset += 2; | 1238 m_Offset += 2; |
1239 const CPDF_Dictionary* p = pObj->AsDictionary(); | 1239 const CPDF_Dictionary* p = pObj->AsDictionary(); |
1240 bool bSignDict = IsSignatureDict(p); | 1240 bool bSignDict = IsSignatureDict(p); |
1241 FX_POSITION pos = p->GetStartPos(); | 1241 for (const auto& it : *p) { |
1242 while (pos) { | |
1243 FX_BOOL bSignValue = FALSE; | 1242 FX_BOOL bSignValue = FALSE; |
1244 CFX_ByteString key; | 1243 const CFX_ByteString& key = it.first; |
1245 CPDF_Object* pValue = p->GetNextElement(pos, key); | 1244 CPDF_Object* pValue = it.second; |
1246 if (m_File.AppendString("/") < 0) { | 1245 if (m_File.AppendString("/") < 0) { |
1247 return -1; | 1246 return -1; |
1248 } | 1247 } |
1249 if ((len = m_File.AppendString(PDF_NameEncode(key))) < 0) { | 1248 if ((len = m_File.AppendString(PDF_NameEncode(key))) < 0) { |
1250 return -1; | 1249 return -1; |
1251 } | 1250 } |
1252 m_Offset += len + 1; | 1251 m_Offset += len + 1; |
1253 if (bSignDict && key == "Contents") { | 1252 if (bSignDict && key == "Contents") { |
1254 bSignValue = TRUE; | 1253 bSignValue = TRUE; |
1255 } | 1254 } |
(...skipping 510 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1766 } else { | 1765 } else { |
1767 if (m_File.AppendDWord(m_pDocument->m_LastObjNum + 1) < 0) { | 1766 if (m_File.AppendDWord(m_pDocument->m_LastObjNum + 1) < 0) { |
1768 return -1; | 1767 return -1; |
1769 } | 1768 } |
1770 if (m_File.AppendString(" 0 obj <<") < 0) { | 1769 if (m_File.AppendString(" 0 obj <<") < 0) { |
1771 return -1; | 1770 return -1; |
1772 } | 1771 } |
1773 } | 1772 } |
1774 if (m_pParser) { | 1773 if (m_pParser) { |
1775 CPDF_Dictionary* p = m_pParser->m_pTrailer; | 1774 CPDF_Dictionary* p = m_pParser->m_pTrailer; |
1776 FX_POSITION pos = p->GetStartPos(); | 1775 for (const auto& it : *p) { |
1777 while (pos) { | 1776 const CFX_ByteString& key = it.first; |
1778 CFX_ByteString key; | 1777 CPDF_Object* pValue = it.second; |
1779 CPDF_Object* pValue = p->GetNextElement(pos, key); | 1778 // TODO(ochang): Consolidate with similar check in |
| 1779 // PDF_CreatorWriteTrailer. |
1780 if (key == "Encrypt" || key == "Size" || key == "Filter" || | 1780 if (key == "Encrypt" || key == "Size" || key == "Filter" || |
1781 key == "Index" || key == "Length" || key == "Prev" || key == "W" || | 1781 key == "Index" || key == "Length" || key == "Prev" || key == "W" || |
1782 key == "XRefStm" || key == "ID") { | 1782 key == "XRefStm" || key == "ID") { |
1783 continue; | 1783 continue; |
1784 } | 1784 } |
1785 if (m_File.AppendString(("/")) < 0) { | 1785 if (m_File.AppendString(("/")) < 0) { |
1786 return -1; | 1786 return -1; |
1787 } | 1787 } |
1788 if (m_File.AppendString(PDF_NameEncode(key)) < 0) { | 1788 if (m_File.AppendString(PDF_NameEncode(key)) < 0) { |
1789 return -1; | 1789 return -1; |
(...skipping 296 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2086 m_bNewCrypto = FALSE; | 2086 m_bNewCrypto = FALSE; |
2087 if (!m_bStandardSecurity) { | 2087 if (!m_bStandardSecurity) { |
2088 return; | 2088 return; |
2089 } | 2089 } |
2090 if (m_pEncryptDict) { | 2090 if (m_pEncryptDict) { |
2091 m_pEncryptDict->Release(); | 2091 m_pEncryptDict->Release(); |
2092 m_pEncryptDict = NULL; | 2092 m_pEncryptDict = NULL; |
2093 } | 2093 } |
2094 m_bStandardSecurity = FALSE; | 2094 m_bStandardSecurity = FALSE; |
2095 } | 2095 } |
OLD | NEW |