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/fpdfapi/fpdf_edit/editint.h" | 7 #include "core/fpdfapi/fpdf_edit/editint.h" |
8 | 8 |
9 #include <vector> | 9 #include <vector> |
10 | 10 |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
47 if (pFile->AppendString(" null") < 0) { | 47 if (pFile->AppendString(" null") < 0) { |
48 return -1; | 48 return -1; |
49 } | 49 } |
50 offset += 5; | 50 offset += 5; |
51 break; | 51 break; |
52 case CPDF_Object::BOOLEAN: | 52 case CPDF_Object::BOOLEAN: |
53 case CPDF_Object::NUMBER: | 53 case CPDF_Object::NUMBER: |
54 if (pFile->AppendString(" ") < 0) { | 54 if (pFile->AppendString(" ") < 0) { |
55 return -1; | 55 return -1; |
56 } | 56 } |
57 if ((len = pFile->AppendString(pObj->GetString().AsByteStringC())) < 0) { | 57 if ((len = pFile->AppendString(pObj->GetString().AsStringC())) < 0) { |
58 return -1; | 58 return -1; |
59 } | 59 } |
60 offset += len + 1; | 60 offset += len + 1; |
61 break; | 61 break; |
62 case CPDF_Object::STRING: { | 62 case CPDF_Object::STRING: { |
63 CFX_ByteString str = pObj->GetString(); | 63 CFX_ByteString str = pObj->GetString(); |
64 FX_BOOL bHex = pObj->AsString()->IsHex(); | 64 FX_BOOL bHex = pObj->AsString()->IsHex(); |
65 if ((len = pFile->AppendString( | 65 if ((len = pFile->AppendString(PDF_EncodeString(str, bHex).AsStringC())) < |
66 PDF_EncodeString(str, bHex).AsByteStringC())) < 0) { | 66 0) { |
67 return -1; | 67 return -1; |
68 } | 68 } |
69 offset += len; | 69 offset += len; |
70 break; | 70 break; |
71 } | 71 } |
72 case CPDF_Object::NAME: { | 72 case CPDF_Object::NAME: { |
73 if (pFile->AppendString("/") < 0) { | 73 if (pFile->AppendString("/") < 0) { |
74 return -1; | 74 return -1; |
75 } | 75 } |
76 CFX_ByteString str = pObj->GetString(); | 76 CFX_ByteString str = pObj->GetString(); |
77 if ((len = pFile->AppendString(PDF_NameEncode(str).AsByteStringC())) < | 77 if ((len = pFile->AppendString(PDF_NameEncode(str).AsStringC())) < 0) { |
78 0) { | |
79 return -1; | 78 return -1; |
80 } | 79 } |
81 offset += len + 1; | 80 offset += len + 1; |
82 break; | 81 break; |
83 } | 82 } |
84 case CPDF_Object::REFERENCE: { | 83 case CPDF_Object::REFERENCE: { |
85 if (pFile->AppendString(" ") < 0) | 84 if (pFile->AppendString(" ") < 0) |
86 return -1; | 85 return -1; |
87 if ((len = pFile->AppendDWord(pObj->AsReference()->GetRefObjNum())) < 0) | 86 if ((len = pFile->AppendDWord(pObj->AsReference()->GetRefObjNum())) < 0) |
88 return -1; | 87 return -1; |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
127 return -1; | 126 return -1; |
128 } | 127 } |
129 offset += 2; | 128 offset += 2; |
130 const CPDF_Dictionary* p = pObj->AsDictionary(); | 129 const CPDF_Dictionary* p = pObj->AsDictionary(); |
131 for (const auto& it : *p) { | 130 for (const auto& it : *p) { |
132 const CFX_ByteString& key = it.first; | 131 const CFX_ByteString& key = it.first; |
133 CPDF_Object* pValue = it.second; | 132 CPDF_Object* pValue = it.second; |
134 if (pFile->AppendString("/") < 0) { | 133 if (pFile->AppendString("/") < 0) { |
135 return -1; | 134 return -1; |
136 } | 135 } |
137 if ((len = pFile->AppendString(PDF_NameEncode(key).AsByteStringC())) < | 136 if ((len = pFile->AppendString(PDF_NameEncode(key).AsStringC())) < 0) { |
138 0) { | |
139 return -1; | 137 return -1; |
140 } | 138 } |
141 offset += len + 1; | 139 offset += len + 1; |
142 if (pValue->GetObjNum()) { | 140 if (pValue->GetObjNum()) { |
143 if (pFile->AppendString(" ") < 0) { | 141 if (pFile->AppendString(" ") < 0) { |
144 return -1; | 142 return -1; |
145 } | 143 } |
146 if ((len = pFile->AppendDWord(pValue->GetObjNum())) < 0) { | 144 if ((len = pFile->AppendDWord(pValue->GetObjNum())) < 0) { |
147 return -1; | 145 return -1; |
148 } | 146 } |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
207 key == "Index" || key == "Length" || key == "Prev" || key == "W" || | 205 key == "Index" || key == "Length" || key == "Prev" || key == "W" || |
208 key == "XRefStm" || key == "Type" || key == "ID") { | 206 key == "XRefStm" || key == "Type" || key == "ID") { |
209 continue; | 207 continue; |
210 } | 208 } |
211 if (bCompress && key == "DecodeParms") { | 209 if (bCompress && key == "DecodeParms") { |
212 continue; | 210 continue; |
213 } | 211 } |
214 if (pFile->AppendString(("/")) < 0) { | 212 if (pFile->AppendString(("/")) < 0) { |
215 return -1; | 213 return -1; |
216 } | 214 } |
217 if ((len = pFile->AppendString(PDF_NameEncode(key).AsByteStringC())) < | 215 if ((len = pFile->AppendString(PDF_NameEncode(key).AsStringC())) < 0) { |
218 0) { | |
219 return -1; | 216 return -1; |
220 } | 217 } |
221 offset += len + 1; | 218 offset += len + 1; |
222 if (pValue->GetObjNum()) { | 219 if (pValue->GetObjNum()) { |
223 if (pFile->AppendString(" ") < 0) { | 220 if (pFile->AppendString(" ") < 0) { |
224 return -1; | 221 return -1; |
225 } | 222 } |
226 if ((len = pFile->AppendDWord(pValue->GetObjNum())) < 0) { | 223 if ((len = pFile->AppendDWord(pValue->GetObjNum())) < 0) { |
227 return -1; | 224 return -1; |
228 } | 225 } |
(...skipping 882 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1111 if (m_File.AppendString(" null") < 0) { | 1108 if (m_File.AppendString(" null") < 0) { |
1112 return -1; | 1109 return -1; |
1113 } | 1110 } |
1114 m_Offset += 5; | 1111 m_Offset += 5; |
1115 break; | 1112 break; |
1116 case CPDF_Object::BOOLEAN: | 1113 case CPDF_Object::BOOLEAN: |
1117 case CPDF_Object::NUMBER: | 1114 case CPDF_Object::NUMBER: |
1118 if (m_File.AppendString(" ") < 0) { | 1115 if (m_File.AppendString(" ") < 0) { |
1119 return -1; | 1116 return -1; |
1120 } | 1117 } |
1121 if ((len = m_File.AppendString(pObj->GetString().AsByteStringC())) < 0) { | 1118 if ((len = m_File.AppendString(pObj->GetString().AsStringC())) < 0) { |
1122 return -1; | 1119 return -1; |
1123 } | 1120 } |
1124 m_Offset += len + 1; | 1121 m_Offset += len + 1; |
1125 break; | 1122 break; |
1126 case CPDF_Object::STRING: { | 1123 case CPDF_Object::STRING: { |
1127 CFX_ByteString str = pObj->GetString(); | 1124 CFX_ByteString str = pObj->GetString(); |
1128 FX_BOOL bHex = pObj->AsString()->IsHex(); | 1125 FX_BOOL bHex = pObj->AsString()->IsHex(); |
1129 if (!m_pCryptoHandler || !bEncrypt) { | 1126 if (!m_pCryptoHandler || !bEncrypt) { |
1130 CFX_ByteString content = PDF_EncodeString(str, bHex); | 1127 CFX_ByteString content = PDF_EncodeString(str, bHex); |
1131 if ((len = m_File.AppendString(content.AsByteStringC())) < 0) { | 1128 if ((len = m_File.AppendString(content.AsStringC())) < 0) { |
1132 return -1; | 1129 return -1; |
1133 } | 1130 } |
1134 m_Offset += len; | 1131 m_Offset += len; |
1135 break; | 1132 break; |
1136 } | 1133 } |
1137 CPDF_Encryptor encryptor; | 1134 CPDF_Encryptor encryptor; |
1138 encryptor.Initialize(m_pCryptoHandler, objnum, (uint8_t*)str.c_str(), | 1135 encryptor.Initialize(m_pCryptoHandler, objnum, (uint8_t*)str.c_str(), |
1139 str.GetLength()); | 1136 str.GetLength()); |
1140 CFX_ByteString content = PDF_EncodeString( | 1137 CFX_ByteString content = PDF_EncodeString( |
1141 CFX_ByteString((const FX_CHAR*)encryptor.m_pData, encryptor.m_dwSize), | 1138 CFX_ByteString((const FX_CHAR*)encryptor.m_pData, encryptor.m_dwSize), |
1142 bHex); | 1139 bHex); |
1143 if ((len = m_File.AppendString(content.AsByteStringC())) < 0) { | 1140 if ((len = m_File.AppendString(content.AsStringC())) < 0) { |
1144 return -1; | 1141 return -1; |
1145 } | 1142 } |
1146 m_Offset += len; | 1143 m_Offset += len; |
1147 break; | 1144 break; |
1148 } | 1145 } |
1149 case CPDF_Object::STREAM: { | 1146 case CPDF_Object::STREAM: { |
1150 CPDF_FlateEncoder encoder; | 1147 CPDF_FlateEncoder encoder; |
1151 encoder.Initialize(const_cast<CPDF_Stream*>(pObj->AsStream()), | 1148 encoder.Initialize(const_cast<CPDF_Stream*>(pObj->AsStream()), |
1152 m_bCompress); | 1149 m_bCompress); |
1153 CPDF_Encryptor encryptor; | 1150 CPDF_Encryptor encryptor; |
(...skipping 19 matching lines...) Expand all Loading... |
1173 return -1; | 1170 return -1; |
1174 } | 1171 } |
1175 m_Offset += len; | 1172 m_Offset += len; |
1176 break; | 1173 break; |
1177 } | 1174 } |
1178 case CPDF_Object::NAME: { | 1175 case CPDF_Object::NAME: { |
1179 if (m_File.AppendString("/") < 0) { | 1176 if (m_File.AppendString("/") < 0) { |
1180 return -1; | 1177 return -1; |
1181 } | 1178 } |
1182 CFX_ByteString str = pObj->GetString(); | 1179 CFX_ByteString str = pObj->GetString(); |
1183 if ((len = m_File.AppendString(PDF_NameEncode(str).AsByteStringC())) < | 1180 if ((len = m_File.AppendString(PDF_NameEncode(str).AsStringC())) < 0) { |
1184 0) { | |
1185 return -1; | 1181 return -1; |
1186 } | 1182 } |
1187 m_Offset += len + 1; | 1183 m_Offset += len + 1; |
1188 break; | 1184 break; |
1189 } | 1185 } |
1190 case CPDF_Object::REFERENCE: { | 1186 case CPDF_Object::REFERENCE: { |
1191 if (m_File.AppendString(" ") < 0) | 1187 if (m_File.AppendString(" ") < 0) |
1192 return -1; | 1188 return -1; |
1193 if ((len = m_File.AppendDWord(pObj->AsReference()->GetRefObjNum())) < 0) | 1189 if ((len = m_File.AppendDWord(pObj->AsReference()->GetRefObjNum())) < 0) |
1194 return -1; | 1190 return -1; |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1238 m_Offset += 2; | 1234 m_Offset += 2; |
1239 const CPDF_Dictionary* p = pObj->AsDictionary(); | 1235 const CPDF_Dictionary* p = pObj->AsDictionary(); |
1240 bool bSignDict = p->IsSignatureDict(); | 1236 bool bSignDict = p->IsSignatureDict(); |
1241 for (const auto& it : *p) { | 1237 for (const auto& it : *p) { |
1242 FX_BOOL bSignValue = FALSE; | 1238 FX_BOOL bSignValue = FALSE; |
1243 const CFX_ByteString& key = it.first; | 1239 const CFX_ByteString& key = it.first; |
1244 CPDF_Object* pValue = it.second; | 1240 CPDF_Object* pValue = it.second; |
1245 if (m_File.AppendString("/") < 0) { | 1241 if (m_File.AppendString("/") < 0) { |
1246 return -1; | 1242 return -1; |
1247 } | 1243 } |
1248 if ((len = m_File.AppendString(PDF_NameEncode(key).AsByteStringC())) < | 1244 if ((len = m_File.AppendString(PDF_NameEncode(key).AsStringC())) < 0) { |
1249 0) { | |
1250 return -1; | 1245 return -1; |
1251 } | 1246 } |
1252 m_Offset += len + 1; | 1247 m_Offset += len + 1; |
1253 if (bSignDict && key == "Contents") { | 1248 if (bSignDict && key == "Contents") { |
1254 bSignValue = TRUE; | 1249 bSignValue = TRUE; |
1255 } | 1250 } |
1256 if (pValue->GetObjNum()) { | 1251 if (pValue->GetObjNum()) { |
1257 if (m_File.AppendString(" ") < 0) { | 1252 if (m_File.AppendString(" ") < 0) { |
1258 return -1; | 1253 return -1; |
1259 } | 1254 } |
(...skipping 381 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1641 m_XrefStart = m_pXRefStream->m_PrevOffset; | 1636 m_XrefStart = m_pXRefStream->m_PrevOffset; |
1642 m_iStage = 90; | 1637 m_iStage = 90; |
1643 } else if ((m_dwFlags & FPDFCREATE_INCREMENTAL) == 0 || | 1638 } else if ((m_dwFlags & FPDFCREATE_INCREMENTAL) == 0 || |
1644 !m_pParser->IsXRefStream()) { | 1639 !m_pParser->IsXRefStream()) { |
1645 if ((m_dwFlags & FPDFCREATE_INCREMENTAL) == 0 || | 1640 if ((m_dwFlags & FPDFCREATE_INCREMENTAL) == 0 || |
1646 m_pParser->GetLastXRefOffset() == 0) { | 1641 m_pParser->GetLastXRefOffset() == 0) { |
1647 CFX_ByteString str; | 1642 CFX_ByteString str; |
1648 str = m_ObjectOffset.GetPtrAt(1) | 1643 str = m_ObjectOffset.GetPtrAt(1) |
1649 ? "xref\r\n" | 1644 ? "xref\r\n" |
1650 : "xref\r\n0 1\r\n0000000000 65535 f\r\n"; | 1645 : "xref\r\n0 1\r\n0000000000 65535 f\r\n"; |
1651 if (m_File.AppendString(str.AsByteStringC()) < 0) { | 1646 if (m_File.AppendString(str.AsStringC()) < 0) { |
1652 return -1; | 1647 return -1; |
1653 } | 1648 } |
1654 m_Pos = (void*)(uintptr_t)1; | 1649 m_Pos = (void*)(uintptr_t)1; |
1655 m_iStage = 81; | 1650 m_iStage = 81; |
1656 } else { | 1651 } else { |
1657 if (m_File.AppendString("xref\r\n") < 0) { | 1652 if (m_File.AppendString("xref\r\n") < 0) { |
1658 return -1; | 1653 return -1; |
1659 } | 1654 } |
1660 m_Pos = (void*)(uintptr_t)0; | 1655 m_Pos = (void*)(uintptr_t)0; |
1661 m_iStage = 82; | 1656 m_iStage = 82; |
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1770 // TODO(ochang): Consolidate with similar check in | 1765 // TODO(ochang): Consolidate with similar check in |
1771 // PDF_CreatorWriteTrailer. | 1766 // PDF_CreatorWriteTrailer. |
1772 if (key == "Encrypt" || key == "Size" || key == "Filter" || | 1767 if (key == "Encrypt" || key == "Size" || key == "Filter" || |
1773 key == "Index" || key == "Length" || key == "Prev" || key == "W" || | 1768 key == "Index" || key == "Length" || key == "Prev" || key == "W" || |
1774 key == "XRefStm" || key == "ID") { | 1769 key == "XRefStm" || key == "ID") { |
1775 continue; | 1770 continue; |
1776 } | 1771 } |
1777 if (m_File.AppendString(("/")) < 0) { | 1772 if (m_File.AppendString(("/")) < 0) { |
1778 return -1; | 1773 return -1; |
1779 } | 1774 } |
1780 if (m_File.AppendString(PDF_NameEncode(key).AsByteStringC()) < 0) { | 1775 if (m_File.AppendString(PDF_NameEncode(key).AsStringC()) < 0) { |
1781 return -1; | 1776 return -1; |
1782 } | 1777 } |
1783 if (pValue->GetObjNum()) { | 1778 if (pValue->GetObjNum()) { |
1784 if (m_File.AppendString(" ") < 0) { | 1779 if (m_File.AppendString(" ") < 0) { |
1785 return -1; | 1780 return -1; |
1786 } | 1781 } |
1787 if (m_File.AppendDWord(pValue->GetObjNum()) < 0) { | 1782 if (m_File.AppendDWord(pValue->GetObjNum()) < 0) { |
1788 return -1; | 1783 return -1; |
1789 } | 1784 } |
1790 if (m_File.AppendString(" 0 R ") < 0) { | 1785 if (m_File.AppendString(" 0 R ") < 0) { |
(...skipping 284 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2075 m_bNewCrypto = FALSE; | 2070 m_bNewCrypto = FALSE; |
2076 if (!m_bStandardSecurity) { | 2071 if (!m_bStandardSecurity) { |
2077 return; | 2072 return; |
2078 } | 2073 } |
2079 if (m_pEncryptDict) { | 2074 if (m_pEncryptDict) { |
2080 m_pEncryptDict->Release(); | 2075 m_pEncryptDict->Release(); |
2081 m_pEncryptDict = NULL; | 2076 m_pEncryptDict = NULL; |
2082 } | 2077 } |
2083 m_bStandardSecurity = FALSE; | 2078 m_bStandardSecurity = FALSE; |
2084 } | 2079 } |
OLD | NEW |