• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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     kCrossRefTableItemCheck,
31     kCrossRefTableTrailerCheck,
32     kDone,
33   };
34 
35   bool CheckReadProblems();
36   bool CheckCrossRef();
37   bool CheckCrossRefTable();
38   bool CheckCrossRefTableItem();
39   bool CheckCrossRefTableTrailer();
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