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

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

Issue 1576113003: Use std::map in CPDF_IndirectObjects (Closed) Base URL: https://pdfium.googlesource.com/pdfium.git@master
Patch Set: Remove cbegin() and cend(). Created 4 years, 11 months 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_parser/fpdf_parser_objects.cpp ('k') | no next file » | 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 <algorithm> 9 #include <algorithm>
10 #include <memory> 10 #include <memory>
(...skipping 1181 matching lines...) Expand 10 before | Expand all | Expand 10 after
1192 FX_FILESIZE size = ((FX_FILESIZE*)pResult)[1] - pos; 1192 FX_FILESIZE size = ((FX_FILESIZE*)pResult)[1] - pos;
1193 FX_FILESIZE SavedPos = m_Syntax.SavePos(); 1193 FX_FILESIZE SavedPos = m_Syntax.SavePos();
1194 m_Syntax.RestorePos(pos); 1194 m_Syntax.RestorePos(pos);
1195 const char kFormStream[] = "/Form\0stream"; 1195 const char kFormStream[] = "/Form\0stream";
1196 const CFX_ByteStringC kFormStreamStr(kFormStream, sizeof(kFormStream) - 1); 1196 const CFX_ByteStringC kFormStreamStr(kFormStream, sizeof(kFormStream) - 1);
1197 bForm = m_Syntax.SearchMultiWord(kFormStreamStr, TRUE, size) == 0; 1197 bForm = m_Syntax.SearchMultiWord(kFormStreamStr, TRUE, size) == 0;
1198 m_Syntax.RestorePos(SavedPos); 1198 m_Syntax.RestorePos(SavedPos);
1199 return TRUE; 1199 return TRUE;
1200 } 1200 }
1201 1201
1202 CPDF_Object* CPDF_Parser::ParseIndirectObject(CPDF_IndirectObjects* pObjList, 1202 CPDF_Object* CPDF_Parser::ParseIndirectObject(
1203 FX_DWORD objnum, 1203 CPDF_IndirectObjectHolder* pObjList,
1204 PARSE_CONTEXT* pContext) { 1204 FX_DWORD objnum,
1205 PARSE_CONTEXT* pContext) {
1205 if (!IsValidObjectNumber(objnum)) 1206 if (!IsValidObjectNumber(objnum))
1206 return nullptr; 1207 return nullptr;
1207 1208
1208 // Prevent circular parsing the same object. 1209 // Prevent circular parsing the same object.
1209 if (pdfium::ContainsKey(m_ParsingObjNums, objnum)) 1210 if (pdfium::ContainsKey(m_ParsingObjNums, objnum))
1210 return nullptr; 1211 return nullptr;
1211 ScopedSetInsertion<FX_DWORD> local_insert(&m_ParsingObjNums, objnum); 1212 ScopedSetInsertion<FX_DWORD> local_insert(&m_ParsingObjNums, objnum);
1212 1213
1213 if (m_V5Type[objnum] == 1 || m_V5Type[objnum] == 255) { 1214 if (m_V5Type[objnum] == 1 || m_V5Type[objnum] == 255) {
1214 FX_FILESIZE pos = m_ObjectInfo[objnum].pos; 1215 FX_FILESIZE pos = m_ObjectInfo[objnum].pos;
(...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after
1390 } 1391 }
1391 nextoff = m_Syntax.SavePos(); 1392 nextoff = m_Syntax.SavePos();
1392 } 1393 }
1393 size = (FX_DWORD)(nextoff - pos); 1394 size = (FX_DWORD)(nextoff - pos);
1394 pBuffer = FX_Alloc(uint8_t, size); 1395 pBuffer = FX_Alloc(uint8_t, size);
1395 m_Syntax.RestorePos(pos); 1396 m_Syntax.RestorePos(pos);
1396 m_Syntax.ReadBlock(pBuffer, size); 1397 m_Syntax.ReadBlock(pBuffer, size);
1397 m_Syntax.RestorePos(SavedPos); 1398 m_Syntax.RestorePos(SavedPos);
1398 } 1399 }
1399 1400
1400 CPDF_Object* CPDF_Parser::ParseIndirectObjectAt(CPDF_IndirectObjects* pObjList, 1401 CPDF_Object* CPDF_Parser::ParseIndirectObjectAt(
1401 FX_FILESIZE pos, 1402 CPDF_IndirectObjectHolder* pObjList,
1402 FX_DWORD objnum, 1403 FX_FILESIZE pos,
1403 PARSE_CONTEXT* pContext) { 1404 FX_DWORD objnum,
1405 PARSE_CONTEXT* pContext) {
1404 FX_FILESIZE SavedPos = m_Syntax.SavePos(); 1406 FX_FILESIZE SavedPos = m_Syntax.SavePos();
1405 m_Syntax.RestorePos(pos); 1407 m_Syntax.RestorePos(pos);
1406 bool bIsNumber; 1408 bool bIsNumber;
1407 CFX_ByteString word = m_Syntax.GetNextWord(&bIsNumber); 1409 CFX_ByteString word = m_Syntax.GetNextWord(&bIsNumber);
1408 if (!bIsNumber) { 1410 if (!bIsNumber) {
1409 m_Syntax.RestorePos(SavedPos); 1411 m_Syntax.RestorePos(SavedPos);
1410 return NULL; 1412 return NULL;
1411 } 1413 }
1412 FX_FILESIZE objOffset = m_Syntax.SavePos(); 1414 FX_FILESIZE objOffset = m_Syntax.SavePos();
1413 objOffset -= word.GetLength(); 1415 objOffset -= word.GetLength();
(...skipping 21 matching lines...) Expand all
1435 } 1437 }
1436 m_Syntax.RestorePos(SavedPos); 1438 m_Syntax.RestorePos(SavedPos);
1437 if (pObj) { 1439 if (pObj) {
1438 if (!objnum) 1440 if (!objnum)
1439 pObj->m_ObjNum = parser_objnum; 1441 pObj->m_ObjNum = parser_objnum;
1440 pObj->m_GenNum = parser_gennum; 1442 pObj->m_GenNum = parser_gennum;
1441 } 1443 }
1442 return pObj; 1444 return pObj;
1443 } 1445 }
1444 CPDF_Object* CPDF_Parser::ParseIndirectObjectAtByStrict( 1446 CPDF_Object* CPDF_Parser::ParseIndirectObjectAtByStrict(
1445 CPDF_IndirectObjects* pObjList, 1447 CPDF_IndirectObjectHolder* pObjList,
1446 FX_FILESIZE pos, 1448 FX_FILESIZE pos,
1447 FX_DWORD objnum, 1449 FX_DWORD objnum,
1448 PARSE_CONTEXT* pContext, 1450 PARSE_CONTEXT* pContext,
1449 FX_FILESIZE* pResultPos) { 1451 FX_FILESIZE* pResultPos) {
1450 FX_FILESIZE SavedPos = m_Syntax.SavePos(); 1452 FX_FILESIZE SavedPos = m_Syntax.SavePos();
1451 m_Syntax.RestorePos(pos); 1453 m_Syntax.RestorePos(pos);
1452 bool bIsNumber; 1454 bool bIsNumber;
1453 CFX_ByteString word = m_Syntax.GetNextWord(&bIsNumber); 1455 CFX_ByteString word = m_Syntax.GetNextWord(&bIsNumber);
1454 if (!bIsNumber) { 1456 if (!bIsNumber) {
1455 m_Syntax.RestorePos(SavedPos); 1457 m_Syntax.RestorePos(SavedPos);
(...skipping 578 matching lines...) Expand 10 before | Expand all | Expand 10 after
2034 2036
2035 CFX_ByteString CPDF_SyntaxParser::GetNextWord(bool* bIsNumber) { 2037 CFX_ByteString CPDF_SyntaxParser::GetNextWord(bool* bIsNumber) {
2036 GetNextWordInternal(bIsNumber); 2038 GetNextWordInternal(bIsNumber);
2037 return CFX_ByteString((const FX_CHAR*)m_WordBuffer, m_WordSize); 2039 return CFX_ByteString((const FX_CHAR*)m_WordBuffer, m_WordSize);
2038 } 2040 }
2039 2041
2040 CFX_ByteString CPDF_SyntaxParser::GetKeyword() { 2042 CFX_ByteString CPDF_SyntaxParser::GetKeyword() {
2041 return GetNextWord(nullptr); 2043 return GetNextWord(nullptr);
2042 } 2044 }
2043 2045
2044 CPDF_Object* CPDF_SyntaxParser::GetObject(CPDF_IndirectObjects* pObjList, 2046 CPDF_Object* CPDF_SyntaxParser::GetObject(CPDF_IndirectObjectHolder* pObjList,
2045 FX_DWORD objnum, 2047 FX_DWORD objnum,
2046 FX_DWORD gennum, 2048 FX_DWORD gennum,
2047 PARSE_CONTEXT* pContext, 2049 PARSE_CONTEXT* pContext,
2048 FX_BOOL bDecrypt) { 2050 FX_BOOL bDecrypt) {
2049 CFX_AutoRestorer<int> restorer(&s_CurrentRecursionDepth); 2051 CFX_AutoRestorer<int> restorer(&s_CurrentRecursionDepth);
2050 if (++s_CurrentRecursionDepth > kParserMaxRecursionDepth) { 2052 if (++s_CurrentRecursionDepth > kParserMaxRecursionDepth) {
2051 return NULL; 2053 return NULL;
2052 } 2054 }
2053 FX_FILESIZE SavedPos = m_Pos; 2055 FX_FILESIZE SavedPos = m_Pos;
2054 FX_BOOL bTypeOnly = pContext && (pContext->m_Flags & PDFPARSE_TYPEONLY); 2056 FX_BOOL bTypeOnly = pContext && (pContext->m_Flags & PDFPARSE_TYPEONLY);
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after
2190 m_Pos = SavedPos; 2192 m_Pos = SavedPos;
2191 return nullptr; 2193 return nullptr;
2192 } 2194 }
2193 if (bTypeOnly) 2195 if (bTypeOnly)
2194 return (CPDF_Object*)PDFOBJ_INVALID; 2196 return (CPDF_Object*)PDFOBJ_INVALID;
2195 2197
2196 return nullptr; 2198 return nullptr;
2197 } 2199 }
2198 2200
2199 CPDF_Object* CPDF_SyntaxParser::GetObjectByStrict( 2201 CPDF_Object* CPDF_SyntaxParser::GetObjectByStrict(
2200 CPDF_IndirectObjects* pObjList, 2202 CPDF_IndirectObjectHolder* pObjList,
2201 FX_DWORD objnum, 2203 FX_DWORD objnum,
2202 FX_DWORD gennum, 2204 FX_DWORD gennum,
2203 PARSE_CONTEXT* pContext) { 2205 PARSE_CONTEXT* pContext) {
2204 CFX_AutoRestorer<int> restorer(&s_CurrentRecursionDepth); 2206 CFX_AutoRestorer<int> restorer(&s_CurrentRecursionDepth);
2205 if (++s_CurrentRecursionDepth > kParserMaxRecursionDepth) { 2207 if (++s_CurrentRecursionDepth > kParserMaxRecursionDepth) {
2206 return NULL; 2208 return NULL;
2207 } 2209 }
2208 FX_FILESIZE SavedPos = m_Pos; 2210 FX_FILESIZE SavedPos = m_Pos;
2209 FX_BOOL bTypeOnly = pContext && (pContext->m_Flags & PDFPARSE_TYPEONLY); 2211 FX_BOOL bTypeOnly = pContext && (pContext->m_Flags & PDFPARSE_TYPEONLY);
2210 bool bIsNumber; 2212 bool bIsNumber;
(...skipping 543 matching lines...) Expand 10 before | Expand all | Expand 10 after
2754 FX_BOOL CheckTrailerAppend(IFX_DownloadHints* pHints); 2756 FX_BOOL CheckTrailerAppend(IFX_DownloadHints* pHints);
2755 FX_BOOL CheckPageStatus(IFX_DownloadHints* pHints); 2757 FX_BOOL CheckPageStatus(IFX_DownloadHints* pHints);
2756 FX_BOOL CheckAllCrossRefStream(IFX_DownloadHints* pHints); 2758 FX_BOOL CheckAllCrossRefStream(IFX_DownloadHints* pHints);
2757 2759
2758 int32_t CheckCrossRefStream(IFX_DownloadHints* pHints, 2760 int32_t CheckCrossRefStream(IFX_DownloadHints* pHints,
2759 FX_FILESIZE& xref_offset); 2761 FX_FILESIZE& xref_offset);
2760 FX_BOOL IsLinearizedFile(uint8_t* pData, FX_DWORD dwLen); 2762 FX_BOOL IsLinearizedFile(uint8_t* pData, FX_DWORD dwLen);
2761 void SetStartOffset(FX_FILESIZE dwOffset); 2763 void SetStartOffset(FX_FILESIZE dwOffset);
2762 FX_BOOL GetNextToken(CFX_ByteString& token); 2764 FX_BOOL GetNextToken(CFX_ByteString& token);
2763 FX_BOOL GetNextChar(uint8_t& ch); 2765 FX_BOOL GetNextChar(uint8_t& ch);
2764 CPDF_Object* ParseIndirectObjectAt(FX_FILESIZE pos, 2766 CPDF_Object* ParseIndirectObjectAt(
2765 FX_DWORD objnum, 2767 FX_FILESIZE pos,
2766 CPDF_IndirectObjects* pObjList = NULL); 2768 FX_DWORD objnum,
2769 CPDF_IndirectObjectHolder* pObjList = NULL);
2767 CPDF_Object* GetObject(FX_DWORD objnum, 2770 CPDF_Object* GetObject(FX_DWORD objnum,
2768 IFX_DownloadHints* pHints, 2771 IFX_DownloadHints* pHints,
2769 FX_BOOL* pExistInFile); 2772 FX_BOOL* pExistInFile);
2770 FX_BOOL GetPageKids(CPDF_Parser* pParser, CPDF_Object* pPages); 2773 FX_BOOL GetPageKids(CPDF_Parser* pParser, CPDF_Object* pPages);
2771 FX_BOOL PreparePageItem(); 2774 FX_BOOL PreparePageItem();
2772 FX_BOOL LoadPages(IFX_DownloadHints* pHints); 2775 FX_BOOL LoadPages(IFX_DownloadHints* pHints);
2773 FX_BOOL LoadAllXref(IFX_DownloadHints* pHints); 2776 FX_BOOL LoadAllXref(IFX_DownloadHints* pHints);
2774 FX_BOOL LoadAllFile(IFX_DownloadHints* pHints); 2777 FX_BOOL LoadAllFile(IFX_DownloadHints* pHints);
2775 int32_t CheckLinearizedData(IFX_DownloadHints* pHints); 2778 int32_t CheckLinearizedData(IFX_DownloadHints* pHints);
2776 FX_BOOL CheckPageAnnots(int iPage, IFX_DownloadHints* pHints); 2779 FX_BOOL CheckPageAnnots(int iPage, IFX_DownloadHints* pHints);
(...skipping 849 matching lines...) Expand 10 before | Expand all | Expand 10 after
3626 CPDF_Stream* pStream = ToStream(pHintStream.get()); 3629 CPDF_Stream* pStream = ToStream(pHintStream.get());
3627 if (pStream && pHintTables->LoadHintStream(pStream)) 3630 if (pStream && pHintTables->LoadHintStream(pStream))
3628 m_pHintTables = std::move(pHintTables); 3631 m_pHintTables = std::move(pHintTables);
3629 3632
3630 m_docStatus = PDF_DATAAVAIL_DONE; 3633 m_docStatus = PDF_DATAAVAIL_DONE;
3631 return TRUE; 3634 return TRUE;
3632 } 3635 }
3633 CPDF_Object* CPDF_DataAvail::ParseIndirectObjectAt( 3636 CPDF_Object* CPDF_DataAvail::ParseIndirectObjectAt(
3634 FX_FILESIZE pos, 3637 FX_FILESIZE pos,
3635 FX_DWORD objnum, 3638 FX_DWORD objnum,
3636 CPDF_IndirectObjects* pObjList) { 3639 CPDF_IndirectObjectHolder* pObjList) {
3637 FX_FILESIZE SavedPos = m_syntaxParser.SavePos(); 3640 FX_FILESIZE SavedPos = m_syntaxParser.SavePos();
3638 m_syntaxParser.RestorePos(pos); 3641 m_syntaxParser.RestorePos(pos);
3639 bool bIsNumber; 3642 bool bIsNumber;
3640 CFX_ByteString word = m_syntaxParser.GetNextWord(&bIsNumber); 3643 CFX_ByteString word = m_syntaxParser.GetNextWord(&bIsNumber);
3641 if (!bIsNumber) 3644 if (!bIsNumber)
3642 return nullptr; 3645 return nullptr;
3643 3646
3644 FX_DWORD parser_objnum = FXSYS_atoi(word); 3647 FX_DWORD parser_objnum = FXSYS_atoi(word);
3645 if (objnum && parser_objnum != objnum) 3648 if (objnum && parser_objnum != objnum)
3646 return nullptr; 3649 return nullptr;
(...skipping 1335 matching lines...) Expand 10 before | Expand all | Expand 10 after
4982 if (!m_pLinearizedDict) 4985 if (!m_pLinearizedDict)
4983 return -1; 4986 return -1;
4984 CPDF_Array* pRange = m_pLinearizedDict->GetArray("H"); 4987 CPDF_Array* pRange = m_pLinearizedDict->GetArray("H");
4985 if (!pRange) 4988 if (!pRange)
4986 return -1; 4989 return -1;
4987 CPDF_Object* pStreamLen = pRange->GetElementValue(1); 4990 CPDF_Object* pStreamLen = pRange->GetElementValue(1);
4988 if (!pStreamLen) 4991 if (!pStreamLen)
4989 return -1; 4992 return -1;
4990 return pStreamLen->GetInteger(); 4993 return pStreamLen->GetInteger();
4991 } 4994 }
OLDNEW
« no previous file with comments | « core/src/fpdfapi/fpdf_parser/fpdf_parser_objects.cpp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698