summaryrefslogtreecommitdiff
path: root/core/fpdfapi/parser/cpdf_cross_ref_avail.h
diff options
context:
space:
mode:
authorArtem Strygin <art-snake@yandex-team.ru>2017-11-02 19:59:38 +0000
committerChromium commit bot <commit-bot@chromium.org>2017-11-02 19:59:38 +0000
commit626c2a528fdbb53ddc6fede8ce879f56bfe87716 (patch)
treef97b6d2de024e882443d512d3e4788f6c29467af /core/fpdfapi/parser/cpdf_cross_ref_avail.h
parentf1be1e87045da36b52326fb269f7006670c0c9ab (diff)
downloadpdfium-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.h56
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_