// Copyright 2017 PDFium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef CORE_FPDFAPI_PARSER_CPDF_CROSS_REF_AVAIL_H_ #define CORE_FPDFAPI_PARSER_CPDF_CROSS_REF_AVAIL_H_ #include #include #include #include "core/fpdfapi/parser/cpdf_data_avail.h" #include "core/fxcrt/unowned_ptr.h" class CPDF_SyntaxParser; class CPDF_CrossRefAvail { public: CPDF_CrossRefAvail(CPDF_SyntaxParser* parser, FX_FILESIZE last_crossref_offset); ~CPDF_CrossRefAvail(); FX_FILESIZE last_crossref_offset() const { return last_crossref_offset_; } CPDF_DataAvail::DocAvailStatus CheckAvail(); private: enum class State { kCrossRefCheck, kCrossRefV4ItemCheck, kCrossRefV4TrailerCheck, kDone, }; bool CheckReadProblems(); bool CheckCrossRef(); bool CheckCrossRefV4(); bool CheckCrossRefV4Item(); bool CheckCrossRefV4Trailer(); bool CheckCrossRefStream(); void AddCrossRefForCheck(FX_FILESIZE crossref_offset); fxcrt::RetainPtr GetValidator(); fxcrt::UnownedPtr parser_; const FX_FILESIZE last_crossref_offset_ = 0; CPDF_DataAvail::DocAvailStatus current_status_ = CPDF_DataAvail::DataNotAvailable; State current_state_ = State::kCrossRefCheck; FX_FILESIZE current_offset_ = 0; std::queue cross_refs_for_check_; std::set registered_crossrefs_; }; #endif // CORE_FPDFAPI_PARSER_CPDF_CROSS_REF_AVAIL_H_