blob: 276fab1f88e2838815223d179c3d3be749d1982c [file] [log] [blame]
// Copyright 2017 The PDFium Authors
// 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 <queue>
#include <set>
#include "core/fpdfapi/parser/cpdf_data_avail.h"
#include "core/fxcrt/retain_ptr.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);
RetainPtr<CPDF_ReadValidator> GetValidator();
UnownedPtr<CPDF_SyntaxParser> const parser_;
const FX_FILESIZE last_crossref_offset_;
CPDF_DataAvail::DocAvailStatus status_ = CPDF_DataAvail::kDataNotAvailable;
State state_ = State::kCrossRefCheck;
FX_FILESIZE 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_