Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(137)

Side by Side Diff: core/src/fpdfapi/fpdf_parser/fpdf_parser_objects.cpp

Issue 1415163009: Cleanup CPDF_Stream: (Closed) Base URL: https://pdfium.googlesource.com/pdfium@master
Patch Set: rebase Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « core/src/fpdfapi/fpdf_page/fpdf_page_parser_old.cpp ('k') | core/src/fpdfdoc/doc_ap.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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/include/fpdfapi/fpdf_parser.h" 7 #include "core/include/fpdfapi/fpdf_parser.h"
8 8
9 #include "core/include/fxcrt/fx_string.h" 9 #include "core/include/fxcrt/fx_string.h"
10 10
11 namespace {
12
13 const FX_DWORD kBlockSize = 1024;
14
15 } // namespace
16
11 // static 17 // static
12 int CPDF_Object::s_nCurRefDepth = 0; 18 int CPDF_Object::s_nCurRefDepth = 0;
13 19
14 void CPDF_Object::Release() { 20 void CPDF_Object::Release() {
15 if (m_ObjNum) { 21 if (m_ObjNum) {
16 return; 22 return;
17 } 23 }
18 Destroy(); 24 Destroy();
19 } 25 }
20 void CPDF_Object::Destroy() { 26 void CPDF_Object::Destroy() {
(...skipping 788 matching lines...) Expand 10 before | Expand all | Expand 10 after
809 CPDF_Array* pArray = new CPDF_Array; 815 CPDF_Array* pArray = new CPDF_Array;
810 pArray->AddNumber16(matrix.a); 816 pArray->AddNumber16(matrix.a);
811 pArray->AddNumber16(matrix.b); 817 pArray->AddNumber16(matrix.b);
812 pArray->AddNumber16(matrix.c); 818 pArray->AddNumber16(matrix.c);
813 pArray->AddNumber16(matrix.d); 819 pArray->AddNumber16(matrix.d);
814 pArray->AddNumber(matrix.e); 820 pArray->AddNumber(matrix.e);
815 pArray->AddNumber(matrix.f); 821 pArray->AddNumber(matrix.f);
816 SetAt(key, pArray); 822 SetAt(key, pArray);
817 } 823 }
818 CPDF_Stream::CPDF_Stream(uint8_t* pData, FX_DWORD size, CPDF_Dictionary* pDict) 824 CPDF_Stream::CPDF_Stream(uint8_t* pData, FX_DWORD size, CPDF_Dictionary* pDict)
819 : CPDF_Object(PDFOBJ_STREAM) { 825 : CPDF_Object(PDFOBJ_STREAM),
820 m_pDict = pDict; 826 m_pDict(pDict),
821 m_dwSize = size; 827 m_dwSize(size),
822 m_GenNum = (FX_DWORD)-1; 828 m_GenNum(kMemoryBasedGenNum),
823 m_pDataBuf = pData; 829 m_pDataBuf(pData) {}
824 m_pCryptoHandler = NULL; 830
831 CPDF_Stream::~CPDF_Stream() {
832 if (IsMemoryBased())
833 FX_Free(m_pDataBuf);
834
835 if (m_pDict)
836 m_pDict->Release();
825 } 837 }
826 CPDF_Stream::~CPDF_Stream() { 838
827 if (m_GenNum == (FX_DWORD)-1) { 839 void CPDF_Stream::InitStreamInternal(CPDF_Dictionary* pDict) {
828 FX_Free(m_pDataBuf);
829 }
830 if (m_pDict) {
831 m_pDict->Release();
832 }
833 }
834 void CPDF_Stream::InitStream(CPDF_Dictionary* pDict) {
835 if (pDict) { 840 if (pDict) {
836 if (m_pDict) { 841 if (m_pDict)
837 m_pDict->Release(); 842 m_pDict->Release();
838 }
839 m_pDict = pDict; 843 m_pDict = pDict;
840 } 844 }
841 if (m_GenNum == (FX_DWORD)-1) { 845 if (IsMemoryBased())
842 FX_Free(m_pDataBuf); 846 FX_Free(m_pDataBuf);
843 } 847
844 m_GenNum = 0; 848 m_GenNum = 0;
845 m_pFile = NULL; 849 m_pFile = nullptr;
846 m_pCryptoHandler = NULL;
847 m_FileOffset = 0;
848 } 850 }
851
849 void CPDF_Stream::InitStream(uint8_t* pData, 852 void CPDF_Stream::InitStream(uint8_t* pData,
850 FX_DWORD size, 853 FX_DWORD size,
851 CPDF_Dictionary* pDict) { 854 CPDF_Dictionary* pDict) {
852 InitStream(pDict); 855 InitStreamInternal(pDict);
853 m_GenNum = (FX_DWORD)-1; 856 m_GenNum = kMemoryBasedGenNum;
854 m_pDataBuf = FX_Alloc(uint8_t, size); 857 m_pDataBuf = FX_Alloc(uint8_t, size);
855 if (pData) { 858 if (pData) {
856 FXSYS_memcpy(m_pDataBuf, pData, size); 859 FXSYS_memcpy(m_pDataBuf, pData, size);
857 } 860 }
858 m_dwSize = size; 861 m_dwSize = size;
859 if (m_pDict) { 862 if (m_pDict) {
860 m_pDict->SetAtInteger(FX_BSTRC("Length"), size); 863 m_pDict->SetAtInteger(FX_BSTRC("Length"), size);
861 } 864 }
862 } 865 }
863 void CPDF_Stream::SetData(const uint8_t* pData, 866 void CPDF_Stream::SetData(const uint8_t* pData,
864 FX_DWORD size, 867 FX_DWORD size,
865 FX_BOOL bCompressed, 868 FX_BOOL bCompressed,
866 FX_BOOL bKeepBuf) { 869 FX_BOOL bKeepBuf) {
867 if (m_GenNum == (FX_DWORD)-1) { 870 if (IsMemoryBased())
868 FX_Free(m_pDataBuf); 871 FX_Free(m_pDataBuf);
869 } else { 872 m_GenNum = kMemoryBasedGenNum;
870 m_GenNum = (FX_DWORD)-1; 873
871 m_pCryptoHandler = NULL;
872 }
873 if (bKeepBuf) { 874 if (bKeepBuf) {
874 m_pDataBuf = (uint8_t*)pData; 875 m_pDataBuf = (uint8_t*)pData;
875 } else { 876 } else {
876 m_pDataBuf = FX_Alloc(uint8_t, size); 877 m_pDataBuf = FX_Alloc(uint8_t, size);
877 if (pData) { 878 if (pData) {
878 FXSYS_memcpy(m_pDataBuf, pData, size); 879 FXSYS_memcpy(m_pDataBuf, pData, size);
879 } 880 }
880 } 881 }
881 m_dwSize = size; 882 m_dwSize = size;
882 if (m_pDict == NULL) { 883 if (!m_pDict)
883 m_pDict = new CPDF_Dictionary; 884 m_pDict = new CPDF_Dictionary;
884 }
885 m_pDict->SetAtInteger(FX_BSTRC("Length"), size); 885 m_pDict->SetAtInteger(FX_BSTRC("Length"), size);
886 if (!bCompressed) { 886 if (!bCompressed) {
887 m_pDict->RemoveAt(FX_BSTRC("Filter")); 887 m_pDict->RemoveAt(FX_BSTRC("Filter"));
888 m_pDict->RemoveAt(FX_BSTRC("DecodeParms")); 888 m_pDict->RemoveAt(FX_BSTRC("DecodeParms"));
889 } 889 }
890 } 890 }
891 FX_BOOL CPDF_Stream::ReadRawData(FX_FILESIZE offset, 891 FX_BOOL CPDF_Stream::ReadRawData(FX_FILESIZE offset,
892 uint8_t* buf, 892 uint8_t* buf,
893 FX_DWORD size) const { 893 FX_DWORD size) const {
894 if ((m_GenNum != (FX_DWORD)-1) && m_pFile) { 894 if (!IsMemoryBased() && m_pFile)
895 return m_pFile->ReadBlock(buf, m_FileOffset + offset, size); 895 return m_pFile->ReadBlock(buf, offset, size);
896 } 896
897 if (m_pDataBuf) { 897 if (m_pDataBuf)
898 FXSYS_memcpy(buf, m_pDataBuf + offset, size); 898 FXSYS_memcpy(buf, m_pDataBuf + offset, size);
899 }
900 return TRUE; 899 return TRUE;
901 } 900 }
902 void CPDF_Stream::InitStream(IFX_FileRead* pFile, CPDF_Dictionary* pDict) { 901 void CPDF_Stream::InitStreamFromFile(IFX_FileRead* pFile,
903 InitStream(pDict); 902 CPDF_Dictionary* pDict) {
903 InitStreamInternal(pDict);
904 m_pFile = pFile; 904 m_pFile = pFile;
905 m_dwSize = (FX_DWORD)pFile->GetSize(); 905 m_dwSize = (FX_DWORD)pFile->GetSize();
906 if (m_pDict) { 906 if (m_pDict) {
907 m_pDict->SetAtInteger(FX_BSTRC("Length"), m_dwSize); 907 m_pDict->SetAtInteger(FX_BSTRC("Length"), m_dwSize);
908 } 908 }
909 } 909 }
910 910
911 FX_BOOL CPDF_Stream::Identical(CPDF_Stream* pOther) const { 911 FX_BOOL CPDF_Stream::Identical(CPDF_Stream* pOther) const {
912 if (!m_pDict) 912 if (!m_pDict)
913 return pOther->m_pDict ? FALSE : TRUE; 913 return !pOther->m_pDict;
914 914
915 if (!m_pDict->Identical(pOther->m_pDict)) { 915 if (!m_pDict->Identical(pOther->m_pDict))
916 return FALSE; 916 return FALSE;
917 } 917
918 if (m_dwSize != pOther->m_dwSize) { 918 if (m_dwSize != pOther->m_dwSize)
919 return FALSE; 919 return FALSE;
920 } 920
921 if (m_GenNum != (FX_DWORD)-1 && pOther->m_GenNum != (FX_DWORD)-1) { 921 if (!IsMemoryBased() && !pOther->IsMemoryBased()) {
922 if (m_pFile == pOther->m_pFile && m_pFile == NULL) { 922 if (m_pFile == pOther->m_pFile && !m_pFile)
923 return TRUE; 923 return TRUE;
924 } 924
925 if (!m_pFile || !pOther->m_pFile) { 925 if (!m_pFile || !pOther->m_pFile)
926 return FALSE; 926 return FALSE;
927 } 927
928 uint8_t srcBuf[1024]; 928 uint8_t srcBuf[kBlockSize];
929 uint8_t destBuf[1024]; 929 uint8_t destBuf[kBlockSize];
930 FX_DWORD size = m_dwSize; 930 FX_DWORD size = m_dwSize;
931 FX_DWORD srcOffset = m_FileOffset; 931 if (m_pFile == pOther->m_pFile)
932 FX_DWORD destOffset = pOther->m_FileOffset;
933 if (m_pFile == pOther->m_pFile && srcOffset == destOffset) {
934 return TRUE; 932 return TRUE;
935 } 933
934 FX_DWORD offset = 0;
936 while (size > 0) { 935 while (size > 0) {
937 FX_DWORD actualSize = size > 1024 ? 1024 : size; 936 FX_DWORD actualSize = std::min(size, kBlockSize);
938 m_pFile->ReadBlock(srcBuf, srcOffset, actualSize); 937 m_pFile->ReadBlock(srcBuf, offset, actualSize);
939 pOther->m_pFile->ReadBlock(destBuf, destOffset, actualSize); 938 pOther->m_pFile->ReadBlock(destBuf, offset, actualSize);
940 if (FXSYS_memcmp(srcBuf, destBuf, actualSize) != 0) { 939 if (FXSYS_memcmp(srcBuf, destBuf, actualSize) != 0)
941 return FALSE; 940 return FALSE;
942 } 941
943 size -= actualSize; 942 size -= actualSize;
944 srcOffset += actualSize; 943 offset += actualSize;
945 destOffset += actualSize;
946 } 944 }
947 return TRUE; 945 return TRUE;
948 } 946 }
949 if (m_GenNum != (FX_DWORD)-1 || pOther->m_GenNum != (FX_DWORD)-1) { 947
950 IFX_FileRead* pFile = NULL; 948 if (!IsMemoryBased() || !pOther->IsMemoryBased()) {
951 uint8_t* pBuf = NULL; 949 IFX_FileRead* pFile = nullptr;
952 FX_DWORD offset = 0; 950 uint8_t* pBuf = nullptr;
953 if (pOther->m_GenNum != (FX_DWORD)-1) { 951 if (!pOther->IsMemoryBased()) {
954 pFile = pOther->m_pFile; 952 pFile = pOther->m_pFile;
955 pBuf = m_pDataBuf; 953 pBuf = m_pDataBuf;
956 offset = pOther->m_FileOffset; 954 } else if (!IsMemoryBased()) {
957 } else if (m_GenNum != (FX_DWORD)-1) {
958 pFile = m_pFile; 955 pFile = m_pFile;
959 pBuf = pOther->m_pDataBuf; 956 pBuf = pOther->m_pDataBuf;
960 offset = m_FileOffset;
961 } 957 }
962 if (NULL == pBuf) { 958 if (!pBuf)
963 return FALSE; 959 return FALSE;
964 } 960
965 uint8_t srcBuf[1024]; 961 uint8_t srcBuf[kBlockSize];
966 FX_DWORD size = m_dwSize; 962 FX_DWORD size = m_dwSize;
963 FX_DWORD offset = 0;
967 while (size > 0) { 964 while (size > 0) {
968 FX_DWORD actualSize = std::min(size, 1024U); 965 FX_DWORD actualSize = std::min(size, kBlockSize);
969 pFile->ReadBlock(srcBuf, offset, actualSize); 966 pFile->ReadBlock(srcBuf, offset, actualSize);
970 if (FXSYS_memcmp(srcBuf, pBuf, actualSize) != 0) { 967 if (FXSYS_memcmp(srcBuf, pBuf, actualSize) != 0)
971 return FALSE; 968 return FALSE;
972 } 969
973 pBuf += actualSize; 970 pBuf += actualSize;
974 size -= actualSize; 971 size -= actualSize;
975 offset += actualSize; 972 offset += actualSize;
976 } 973 }
977 return TRUE; 974 return TRUE;
978 } 975 }
979 return FXSYS_memcmp(m_pDataBuf, pOther->m_pDataBuf, m_dwSize) == 0; 976 return FXSYS_memcmp(m_pDataBuf, pOther->m_pDataBuf, m_dwSize) == 0;
980 } 977 }
981 978
982 CPDF_StreamAcc::CPDF_StreamAcc() { 979 CPDF_StreamAcc::CPDF_StreamAcc() {
(...skipping 23 matching lines...) Expand all
1006 if (dwSrcSize == 0) 1003 if (dwSrcSize == 0)
1007 return; 1004 return;
1008 1005
1009 if (!pStream->IsMemoryBased()) { 1006 if (!pStream->IsMemoryBased()) {
1010 pSrcData = m_pSrcData = FX_Alloc(uint8_t, dwSrcSize); 1007 pSrcData = m_pSrcData = FX_Alloc(uint8_t, dwSrcSize);
1011 if (!pStream->ReadRawData(0, pSrcData, dwSrcSize)) 1008 if (!pStream->ReadRawData(0, pSrcData, dwSrcSize))
1012 return; 1009 return;
1013 } else { 1010 } else {
1014 pSrcData = pStream->m_pDataBuf; 1011 pSrcData = pStream->m_pDataBuf;
1015 } 1012 }
1016 uint8_t* pDecryptedData; 1013 uint8_t* pDecryptedData = pSrcData;
1017 FX_DWORD dwDecryptedSize; 1014 FX_DWORD dwDecryptedSize = dwSrcSize;
1018 if (pStream->m_pCryptoHandler) {
1019 CFX_BinaryBuf dest_buf;
1020 dest_buf.EstimateSize(pStream->m_pCryptoHandler->DecryptGetSize(dwSrcSize));
1021 void* context = pStream->m_pCryptoHandler->DecryptStart(
1022 pStream->GetObjNum(), pStream->m_GenNum);
1023 pStream->m_pCryptoHandler->DecryptStream(context, pSrcData, dwSrcSize,
1024 dest_buf);
1025 pStream->m_pCryptoHandler->DecryptFinish(context, dest_buf);
1026 pDecryptedData = dest_buf.GetBuffer();
1027 dwDecryptedSize = dest_buf.GetSize();
1028 dest_buf.DetachBuffer();
1029 } else {
1030 pDecryptedData = pSrcData;
1031 dwDecryptedSize = dwSrcSize;
1032 }
1033 if (!pStream->GetDict()->KeyExist(FX_BSTRC("Filter")) || bRawAccess) { 1015 if (!pStream->GetDict()->KeyExist(FX_BSTRC("Filter")) || bRawAccess) {
1034 m_pData = pDecryptedData; 1016 m_pData = pDecryptedData;
1035 m_dwSize = dwDecryptedSize; 1017 m_dwSize = dwDecryptedSize;
1036 } else { 1018 } else {
1037 FX_BOOL bRet = PDF_DataDecode( 1019 FX_BOOL bRet = PDF_DataDecode(
1038 pDecryptedData, dwDecryptedSize, m_pStream->GetDict(), m_pData, 1020 pDecryptedData, dwDecryptedSize, m_pStream->GetDict(), m_pData,
1039 m_dwSize, m_ImageDecoder, m_pImageParam, estimated_size, bImageAcc); 1021 m_dwSize, m_ImageDecoder, m_pImageParam, estimated_size, bImageAcc);
1040 if (!bRet) { 1022 if (!bRet) {
1041 m_pData = pDecryptedData; 1023 m_pData = pDecryptedData;
1042 m_dwSize = dwDecryptedSize; 1024 m_dwSize = dwDecryptedSize;
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after
1187 } 1169 }
1188 pObj->m_ObjNum = objnum; 1170 pObj->m_ObjNum = objnum;
1189 m_IndirectObjs.SetAt((void*)(uintptr_t)objnum, pObj); 1171 m_IndirectObjs.SetAt((void*)(uintptr_t)objnum, pObj);
1190 if (m_LastObjNum < objnum) { 1172 if (m_LastObjNum < objnum) {
1191 m_LastObjNum = objnum; 1173 m_LastObjNum = objnum;
1192 } 1174 }
1193 } 1175 }
1194 FX_DWORD CPDF_IndirectObjects::GetLastObjNum() const { 1176 FX_DWORD CPDF_IndirectObjects::GetLastObjNum() const {
1195 return m_LastObjNum; 1177 return m_LastObjNum;
1196 } 1178 }
OLDNEW
« no previous file with comments | « core/src/fpdfapi/fpdf_page/fpdf_page_parser_old.cpp ('k') | core/src/fpdfdoc/doc_ap.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698