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 "../../../include/fxcrt/fx_ext.h" | 7 #include "../../../include/fxcrt/fx_ext.h" |
8 #include "../../../include/fpdfapi/fpdf_serial.h" | 8 #include "../../../include/fpdfapi/fpdf_serial.h" |
9 #include "../../../include/fpdfapi/fpdf_parser.h" | 9 #include "../../../include/fpdfapi/fpdf_parser.h" |
10 #include "editint.h" | 10 #include "editint.h" |
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
139 } | 139 } |
140 } | 140 } |
141 } | 141 } |
142 if (pFile->AppendString(FX_BSTRC(">>")) < 0) { | 142 if (pFile->AppendString(FX_BSTRC(">>")) < 0) { |
143 return -1; | 143 return -1; |
144 } | 144 } |
145 offset += 2; | 145 offset += 2; |
146 break; | 146 break; |
147 } | 147 } |
148 case PDFOBJ_STREAM: { | 148 case PDFOBJ_STREAM: { |
149 CPDF_Stream* p = (CPDF_Stream*)pObj; | 149 const CPDF_Stream* p = pObj->AsStream(); |
150 if (PDF_CreatorAppendObject(p->GetDict(), pFile, offset) < 0) { | 150 if (PDF_CreatorAppendObject(p->GetDict(), pFile, offset) < 0) { |
151 return -1; | 151 return -1; |
152 } | 152 } |
153 if (pFile->AppendString(FX_BSTRC("stream\r\n")) < 0) { | 153 if (pFile->AppendString(FX_BSTRC("stream\r\n")) < 0) { |
154 return -1; | 154 return -1; |
155 } | 155 } |
156 offset += 8; | 156 offset += 8; |
157 CPDF_StreamAcc acc; | 157 CPDF_StreamAcc acc; |
158 acc.LoadAllData(p, TRUE); | 158 acc.LoadAllData(p, TRUE); |
159 if (pFile->AppendBlock(acc.GetData(), acc.GetSize()) < 0) { | 159 if (pFile->AppendBlock(acc.GetData(), acc.GetSize()) < 0) { |
(...skipping 762 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
922 return FALSE; | 922 return FALSE; |
923 } | 923 } |
924 int32_t iSize = pXRef->m_IndexArray.GetSize() / 2; | 924 int32_t iSize = pXRef->m_IndexArray.GetSize() / 2; |
925 int32_t iCount = 0; | 925 int32_t iCount = 0; |
926 for (int32_t i = 0; i < iSize; i++) { | 926 for (int32_t i = 0; i < iSize; i++) { |
927 iCount += pXRef->m_IndexArray.ElementAt(i * 2 + 1); | 927 iCount += pXRef->m_IndexArray.ElementAt(i * 2 + 1); |
928 } | 928 } |
929 return (iCount >= PDF_XREFSTREAM_MAXSIZE); | 929 return (iCount >= PDF_XREFSTREAM_MAXSIZE); |
930 } | 930 } |
931 int32_t CPDF_Creator::WriteIndirectObjectToStream(const CPDF_Object* pObj) { | 931 int32_t CPDF_Creator::WriteIndirectObjectToStream(const CPDF_Object* pObj) { |
932 if (!m_pXRefStream) { | 932 if (!m_pXRefStream) |
933 return 1; | 933 return 1; |
934 } | 934 |
935 FX_DWORD objnum = pObj->GetObjNum(); | 935 FX_DWORD objnum = pObj->GetObjNum(); |
936 if (m_pParser && m_pParser->m_ObjVersion.GetSize() > (int32_t)objnum && | 936 if (m_pParser && m_pParser->m_ObjVersion.GetSize() > (int32_t)objnum && |
937 m_pParser->m_ObjVersion[objnum] > 0) { | 937 m_pParser->m_ObjVersion[objnum] > 0) { |
938 return 1; | 938 return 1; |
939 } | 939 } |
940 | 940 |
941 if (pObj->IsNumber()) | 941 if (pObj->IsNumber()) |
942 return 1; | 942 return 1; |
943 | 943 |
944 CPDF_Dictionary* pDict = pObj->GetDict(); | 944 CPDF_Dictionary* pDict = pObj->GetDict(); |
945 if (pObj->GetType() == PDFOBJ_STREAM) { | 945 if (pObj->IsStream()) |
946 if (pDict && pDict->GetString(FX_BSTRC("Type")) == FX_BSTRC("XRef")) { | 946 return !pDict || pDict->GetString(FX_BSTRC("Type")) != FX_BSTRC("XRef"); |
Tom Sepez
2015/10/22 17:16:45
nit: this is an int32_t function so it probably sh
dsinclair
2015/10/22 17:42:56
Done.
| |
947 return 0; | 947 |
948 } | 948 if (pDict) { |
949 return 1; | 949 if (pDict == m_pDocument->m_pRootDict || pDict == m_pEncryptDict) |
950 return 1; | |
951 if (IsSignatureDict(pDict)) | |
952 return 1; | |
953 if (pDict->GetString(FX_BSTRC("Type")) == FX_BSTRC("Page")) | |
954 return 1; | |
950 } | 955 } |
951 if (pDict) { | 956 |
952 if (pDict == m_pDocument->m_pRootDict || pDict == m_pEncryptDict) { | |
953 return 1; | |
954 } | |
955 if (IsSignatureDict(pDict)) { | |
956 return 1; | |
957 } | |
958 if (pDict->GetString(FX_BSTRC("Type")) == FX_BSTRC("Page")) { | |
959 return 1; | |
960 } | |
961 } | |
962 m_pXRefStream->AddObjectNumberToIndexArray(objnum); | 957 m_pXRefStream->AddObjectNumberToIndexArray(objnum); |
963 if (m_pXRefStream->CompressIndirectObject(objnum, pObj, this) < 0) { | 958 if (m_pXRefStream->CompressIndirectObject(objnum, pObj, this) < 0) |
964 return -1; | 959 return -1; |
965 } | 960 if (!_IsXRefNeedEnd(m_pXRefStream, m_dwFlags)) |
966 if (!_IsXRefNeedEnd(m_pXRefStream, m_dwFlags)) { | |
967 return 0; | 961 return 0; |
968 } | 962 if (!m_pXRefStream->End(this)) |
969 if (!m_pXRefStream->End(this)) { | |
970 return -1; | 963 return -1; |
971 } | 964 if (!m_pXRefStream->Start()) |
972 if (!m_pXRefStream->Start()) { | |
973 return -1; | 965 return -1; |
974 } | |
975 return 0; | 966 return 0; |
976 } | 967 } |
977 int32_t CPDF_Creator::WriteIndirectObjectToStream(FX_DWORD objnum, | 968 int32_t CPDF_Creator::WriteIndirectObjectToStream(FX_DWORD objnum, |
978 const uint8_t* pBuffer, | 969 const uint8_t* pBuffer, |
979 FX_DWORD dwSize) { | 970 FX_DWORD dwSize) { |
980 if (!m_pXRefStream) { | 971 if (!m_pXRefStream) { |
981 return 1; | 972 return 1; |
982 } | 973 } |
983 m_pXRefStream->AddObjectNumberToIndexArray(objnum); | 974 m_pXRefStream->AddObjectNumberToIndexArray(objnum); |
984 int32_t iRet = | 975 int32_t iRet = |
(...skipping 25 matching lines...) Expand all Loading... | |
1010 } | 1001 } |
1011 if (!m_pXRefStream->Start()) { | 1002 if (!m_pXRefStream->Start()) { |
1012 return -1; | 1003 return -1; |
1013 } | 1004 } |
1014 return 0; | 1005 return 0; |
1015 } | 1006 } |
1016 int32_t CPDF_Creator::WriteStream(const CPDF_Object* pStream, | 1007 int32_t CPDF_Creator::WriteStream(const CPDF_Object* pStream, |
1017 FX_DWORD objnum, | 1008 FX_DWORD objnum, |
1018 CPDF_CryptoHandler* pCrypto) { | 1009 CPDF_CryptoHandler* pCrypto) { |
1019 CPDF_FlateEncoder encoder; | 1010 CPDF_FlateEncoder encoder; |
1020 encoder.Initialize((CPDF_Stream*)pStream, | 1011 encoder.Initialize(const_cast<CPDF_Stream*>(pStream->AsStream()), |
1021 pStream == m_pMetadata ? FALSE : m_bCompress); | 1012 pStream == m_pMetadata ? FALSE : m_bCompress); |
1022 CPDF_Encryptor encryptor; | 1013 CPDF_Encryptor encryptor; |
1023 if (!encryptor.Initialize(pCrypto, objnum, encoder.m_pData, | 1014 if (!encryptor.Initialize(pCrypto, objnum, encoder.m_pData, |
1024 encoder.m_dwSize)) { | 1015 encoder.m_dwSize)) { |
1025 return -1; | 1016 return -1; |
1026 } | 1017 } |
1027 if ((FX_DWORD)encoder.m_pDict->GetInteger(FX_BSTRC("Length")) != | 1018 if ((FX_DWORD)encoder.m_pDict->GetInteger(FX_BSTRC("Length")) != |
1028 encryptor.m_dwSize) { | 1019 encryptor.m_dwSize) { |
1029 encoder.CloneDict(); | 1020 encoder.CloneDict(); |
1030 encoder.m_pDict->SetAtInteger(FX_BSTRC("Length"), encryptor.m_dwSize); | 1021 encoder.m_pDict->SetAtInteger(FX_BSTRC("Length"), encryptor.m_dwSize); |
(...skipping 12 matching lines...) Expand all Loading... | |
1043 m_Offset += encryptor.m_dwSize; | 1034 m_Offset += encryptor.m_dwSize; |
1044 if ((len = m_File.AppendString(FX_BSTRC("\r\nendstream"))) < 0) { | 1035 if ((len = m_File.AppendString(FX_BSTRC("\r\nendstream"))) < 0) { |
1045 return -1; | 1036 return -1; |
1046 } | 1037 } |
1047 m_Offset += len; | 1038 m_Offset += len; |
1048 return 1; | 1039 return 1; |
1049 } | 1040 } |
1050 int32_t CPDF_Creator::WriteIndirectObj(FX_DWORD objnum, | 1041 int32_t CPDF_Creator::WriteIndirectObj(FX_DWORD objnum, |
1051 const CPDF_Object* pObj) { | 1042 const CPDF_Object* pObj) { |
1052 int32_t len = m_File.AppendDWord(objnum); | 1043 int32_t len = m_File.AppendDWord(objnum); |
1053 if (len < 0) { | 1044 if (len < 0) |
1054 return -1; | 1045 return -1; |
1055 } | 1046 |
1056 m_Offset += len; | 1047 m_Offset += len; |
1057 if ((len = m_File.AppendString(FX_BSTRC(" 0 obj\r\n"))) < 0) { | 1048 if ((len = m_File.AppendString(FX_BSTRC(" 0 obj\r\n"))) < 0) |
1058 return -1; | 1049 return -1; |
1059 } | 1050 |
1060 m_Offset += len; | 1051 m_Offset += len; |
1061 if (pObj->GetType() == PDFOBJ_STREAM) { | 1052 if (pObj->IsStream()) { |
1062 CPDF_CryptoHandler* pHandler = NULL; | 1053 CPDF_CryptoHandler* pHandler = nullptr; |
1063 pHandler = | 1054 pHandler = |
1064 (pObj == m_pMetadata && !m_bEncryptMetadata) ? NULL : m_pCryptoHandler; | 1055 (pObj == m_pMetadata && !m_bEncryptMetadata) ? NULL : m_pCryptoHandler; |
1065 if (WriteStream(pObj, objnum, pHandler) < 0) { | 1056 if (WriteStream(pObj, objnum, pHandler) < 0) |
1066 return -1; | 1057 return -1; |
1067 } | |
1068 } else { | 1058 } else { |
1069 if (WriteDirectObj(objnum, pObj) < 0) { | 1059 if (WriteDirectObj(objnum, pObj) < 0) |
1070 return -1; | 1060 return -1; |
1071 } | |
1072 } | 1061 } |
1073 if ((len = m_File.AppendString(FX_BSTRC("\r\nendobj\r\n"))) < 0) { | 1062 if ((len = m_File.AppendString(FX_BSTRC("\r\nendobj\r\n"))) < 0) |
1074 return -1; | 1063 return -1; |
1075 } | 1064 |
1076 m_Offset += len; | 1065 m_Offset += len; |
1077 if (AppendObjectNumberToXRef(objnum) < 0) { | 1066 if (AppendObjectNumberToXRef(objnum) < 0) |
1078 return -1; | 1067 return -1; |
1079 } | |
1080 return 0; | 1068 return 0; |
1081 } | 1069 } |
1082 int32_t CPDF_Creator::WriteIndirectObj(const CPDF_Object* pObj) { | 1070 int32_t CPDF_Creator::WriteIndirectObj(const CPDF_Object* pObj) { |
1083 int32_t iRet = WriteIndirectObjectToStream(pObj); | 1071 int32_t iRet = WriteIndirectObjectToStream(pObj); |
1084 if (iRet < 1) { | 1072 if (iRet < 1) { |
1085 return iRet; | 1073 return iRet; |
1086 } | 1074 } |
1087 return WriteIndirectObj(pObj->GetObjNum(), pObj); | 1075 return WriteIndirectObj(pObj->GetObjNum(), pObj); |
1088 } | 1076 } |
1089 int32_t CPDF_Creator::WriteDirectObj(FX_DWORD objnum, | 1077 int32_t CPDF_Creator::WriteDirectObj(FX_DWORD objnum, |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1132 CFX_ByteString((const FX_CHAR*)encryptor.m_pData, encryptor.m_dwSize), | 1120 CFX_ByteString((const FX_CHAR*)encryptor.m_pData, encryptor.m_dwSize), |
1133 bHex); | 1121 bHex); |
1134 if ((len = m_File.AppendString(content)) < 0) { | 1122 if ((len = m_File.AppendString(content)) < 0) { |
1135 return -1; | 1123 return -1; |
1136 } | 1124 } |
1137 m_Offset += len; | 1125 m_Offset += len; |
1138 break; | 1126 break; |
1139 } | 1127 } |
1140 case PDFOBJ_STREAM: { | 1128 case PDFOBJ_STREAM: { |
1141 CPDF_FlateEncoder encoder; | 1129 CPDF_FlateEncoder encoder; |
1142 encoder.Initialize((CPDF_Stream*)pObj, m_bCompress); | 1130 encoder.Initialize(const_cast<CPDF_Stream*>(pObj->AsStream()), |
1131 m_bCompress); | |
1143 CPDF_Encryptor encryptor; | 1132 CPDF_Encryptor encryptor; |
1144 CPDF_CryptoHandler* pHandler = m_pCryptoHandler; | 1133 CPDF_CryptoHandler* pHandler = m_pCryptoHandler; |
1145 encryptor.Initialize(pHandler, objnum, encoder.m_pData, encoder.m_dwSize); | 1134 encryptor.Initialize(pHandler, objnum, encoder.m_pData, encoder.m_dwSize); |
1146 if ((FX_DWORD)encoder.m_pDict->GetInteger(FX_BSTRC("Length")) != | 1135 if ((FX_DWORD)encoder.m_pDict->GetInteger(FX_BSTRC("Length")) != |
1147 encryptor.m_dwSize) { | 1136 encryptor.m_dwSize) { |
1148 encoder.CloneDict(); | 1137 encoder.CloneDict(); |
1149 encoder.m_pDict->SetAtInteger(FX_BSTRC("Length"), encryptor.m_dwSize); | 1138 encoder.m_pDict->SetAtInteger(FX_BSTRC("Length"), encryptor.m_dwSize); |
1150 } | 1139 } |
1151 if (WriteDirectObj(objnum, encoder.m_pDict) < 0) { | 1140 if (WriteDirectObj(objnum, encoder.m_pDict) < 0) { |
1152 return -1; | 1141 return -1; |
(...skipping 975 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2128 m_bNewCrypto = FALSE; | 2117 m_bNewCrypto = FALSE; |
2129 if (!m_bStandardSecurity) { | 2118 if (!m_bStandardSecurity) { |
2130 return; | 2119 return; |
2131 } | 2120 } |
2132 if (m_pEncryptDict) { | 2121 if (m_pEncryptDict) { |
2133 m_pEncryptDict->Release(); | 2122 m_pEncryptDict->Release(); |
2134 m_pEncryptDict = NULL; | 2123 m_pEncryptDict = NULL; |
2135 } | 2124 } |
2136 m_bStandardSecurity = FALSE; | 2125 m_bStandardSecurity = FALSE; |
2137 } | 2126 } |
OLD | NEW |