blob: aad58f35e70d09ea24d988715b57e90335e583ee [file] [log] [blame]
Philip P. Moltmannd904c1e2018-03-19 09:26:45 -07001// Copyright 2017 PDFium Authors. All rights reserved.
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 <memory>
9#include <queue>
10#include <set>
11
12#include "core/fpdfapi/parser/cpdf_data_avail.h"
13#include "core/fxcrt/unowned_ptr.h"
14
15class CPDF_SyntaxParser;
16
17class CPDF_CrossRefAvail {
18 public:
19 CPDF_CrossRefAvail(CPDF_SyntaxParser* parser,
20 FX_FILESIZE last_crossref_offset);
21 ~CPDF_CrossRefAvail();
22
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 fxcrt::RetainPtr<CPDF_ReadValidator> GetValidator();
45
46 fxcrt::UnownedPtr<CPDF_SyntaxParser> parser_;
47 const FX_FILESIZE last_crossref_offset_ = 0;
48 CPDF_DataAvail::DocAvailStatus current_status_ =
49 CPDF_DataAvail::DataNotAvailable;
50 State current_state_ = State::kCrossRefCheck;
51 FX_FILESIZE current_offset_ = 0;
52 std::queue<FX_FILESIZE> cross_refs_for_check_;
53 std::set<FX_FILESIZE> registered_crossrefs_;
54};
55
56#endif // CORE_FPDFAPI_PARSER_CPDF_CROSS_REF_AVAIL_H_