diff options
Diffstat (limited to 'core/fpdfapi/parser/cpdf_cross_ref_avail.h')
-rw-r--r-- | core/fpdfapi/parser/cpdf_cross_ref_avail.h | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/core/fpdfapi/parser/cpdf_cross_ref_avail.h b/core/fpdfapi/parser/cpdf_cross_ref_avail.h new file mode 100644 index 0000000000..aad58f35e7 --- /dev/null +++ b/core/fpdfapi/parser/cpdf_cross_ref_avail.h @@ -0,0 +1,56 @@ +// 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 <memory> +#include <queue> +#include <set> + +#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<CPDF_ReadValidator> GetValidator(); + + fxcrt::UnownedPtr<CPDF_SyntaxParser> 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<FX_FILESIZE> cross_refs_for_check_; + std::set<FX_FILESIZE> registered_crossrefs_; +}; + +#endif // CORE_FPDFAPI_PARSER_CPDF_CROSS_REF_AVAIL_H_ |