summaryrefslogtreecommitdiff
path: root/core/fpdfapi/parser/cpdf_cross_ref_avail.h
diff options
context:
space:
mode:
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_