xref: /aosp_15_r20/external/pdfium/core/fpdfapi/parser/cpdf_cross_ref_avail.h (revision 3ac0a46f773bac49fa9476ec2b1cf3f8da5ec3a4)
1 // Copyright 2017 The PDFium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef CORE_FPDFAPI_PARSER_CPDF_CROSS_REF_AVAIL_H_
6 #define CORE_FPDFAPI_PARSER_CPDF_CROSS_REF_AVAIL_H_
7 
8 #include <queue>
9 #include <set>
10 
11 #include "core/fpdfapi/parser/cpdf_data_avail.h"
12 #include "core/fxcrt/retain_ptr.h"
13 #include "core/fxcrt/unowned_ptr.h"
14 
15 class CPDF_SyntaxParser;
16 
17 class CPDF_CrossRefAvail {
18  public:
19   CPDF_CrossRefAvail(CPDF_SyntaxParser* parser,
20                      FX_FILESIZE last_crossref_offset);
21   ~CPDF_CrossRefAvail();
22 
last_crossref_offset()23   FX_FILESIZE last_crossref_offset() const { return last_crossref_offset_; }
24 
25   CPDF_DataAvail::DocAvailStatus CheckAvail();
26 
27  private:
28   enum class State {
29     kCrossRefCheck,
30     kCrossRefV4ItemCheck,
31     kCrossRefV4TrailerCheck,
32     kDone,
33   };
34 
35   bool CheckReadProblems();
36   bool CheckCrossRef();
37   bool CheckCrossRefV4();
38   bool CheckCrossRefV4Item();
39   bool CheckCrossRefV4Trailer();
40   bool CheckCrossRefStream();
41 
42   void AddCrossRefForCheck(FX_FILESIZE crossref_offset);
43 
44   RetainPtr<CPDF_ReadValidator> GetValidator();
45 
46   UnownedPtr<CPDF_SyntaxParser> const parser_;
47   const FX_FILESIZE last_crossref_offset_;
48   CPDF_DataAvail::DocAvailStatus status_ = CPDF_DataAvail::kDataNotAvailable;
49   State state_ = State::kCrossRefCheck;
50   FX_FILESIZE offset_ = 0;
51   std::queue<FX_FILESIZE> cross_refs_for_check_;
52   std::set<FX_FILESIZE> registered_crossrefs_;
53 };
54 
55 #endif  // CORE_FPDFAPI_PARSER_CPDF_CROSS_REF_AVAIL_H_
56