| // 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_READ_VALIDATOR_H_ |
| #define CORE_FPDFAPI_PARSER_CPDF_READ_VALIDATOR_H_ |
| |
| #include "core/fpdfapi/parser/cpdf_data_avail.h" |
| #include "core/fxcrt/fx_memory.h" |
| #include "core/fxcrt/fx_stream.h" |
| #include "core/fxcrt/retain_ptr.h" |
| #include "core/fxcrt/unowned_ptr.h" |
| |
| class CPDF_ReadValidator : public IFX_SeekableReadStream { |
| public: |
| class ScopedSession { |
| public: |
| FX_STACK_ALLOCATED(); |
| |
| explicit ScopedSession(RetainPtr<CPDF_ReadValidator> validator); |
| ScopedSession(const ScopedSession& that) = delete; |
| ScopedSession& operator=(const ScopedSession& that) = delete; |
| ~ScopedSession(); |
| |
| private: |
| RetainPtr<CPDF_ReadValidator> const validator_; |
| const bool saved_read_error_; |
| const bool saved_has_unavailable_data_; |
| }; |
| |
| CONSTRUCT_VIA_MAKE_RETAIN; |
| |
| void SetDownloadHints(CPDF_DataAvail::DownloadHints* hints) { |
| hints_ = hints; |
| } |
| bool read_error() const { return read_error_; } |
| bool has_unavailable_data() const { return has_unavailable_data_; } |
| bool has_read_problems() const { |
| return read_error() || has_unavailable_data(); |
| } |
| |
| void ResetErrors(); |
| bool IsWholeFileAvailable(); |
| bool CheckDataRangeAndRequestIfUnavailable(FX_FILESIZE offset, size_t size); |
| bool CheckWholeFileAndRequestIfUnavailable(); |
| |
| // IFX_SeekableReadStream overrides: |
| bool ReadBlockAtOffset(void* buffer, |
| FX_FILESIZE offset, |
| size_t size) override; |
| FX_FILESIZE GetSize() override; |
| |
| protected: |
| CPDF_ReadValidator(const RetainPtr<IFX_SeekableReadStream>& file_read, |
| CPDF_DataAvail::FileAvail* file_avail); |
| ~CPDF_ReadValidator() override; |
| |
| private: |
| void ScheduleDownload(FX_FILESIZE offset, size_t size); |
| bool IsDataRangeAvailable(FX_FILESIZE offset, size_t size) const; |
| |
| RetainPtr<IFX_SeekableReadStream> const file_read_; |
| UnownedPtr<CPDF_DataAvail::FileAvail> const file_avail_; |
| UnownedPtr<CPDF_DataAvail::DownloadHints> hints_; |
| bool read_error_ = false; |
| bool has_unavailable_data_ = false; |
| bool whole_file_already_available_ = false; |
| const FX_FILESIZE file_size_; |
| }; |
| |
| #endif // CORE_FPDFAPI_PARSER_CPDF_READ_VALIDATOR_H_ |