diff options
author | Artem Strygin <art-snake@yandex-team.ru> | 2017-11-02 19:59:38 +0000 |
---|---|---|
committer | Chromium commit bot <commit-bot@chromium.org> | 2017-11-02 19:59:38 +0000 |
commit | 626c2a528fdbb53ddc6fede8ce879f56bfe87716 (patch) | |
tree | f97b6d2de024e882443d512d3e4788f6c29467af /core/fpdfapi/parser/cpdf_cross_ref_avail.h | |
parent | f1be1e87045da36b52326fb269f7006670c0c9ab (diff) | |
download | pdfium-626c2a528fdbb53ddc6fede8ce879f56bfe87716.tar.xz |
Refactoring of cross refs availability check.
Use CPDF_CrossRefAvail to check crossrefs.
Change-Id: Ia333cff4e86eaab5bad17424c1bb8ef9bdbca8ff
Reviewed-on: https://pdfium-review.googlesource.com/15510
Commit-Queue: Art Snake <art-snake@yandex-team.ru>
Reviewed-by: dsinclair <dsinclair@chromium.org>
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_ |