• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2017 PDFium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef CORE_FPDFAPI_PARSER_CPDF_READ_VALIDATOR_H_
6 #define CORE_FPDFAPI_PARSER_CPDF_READ_VALIDATOR_H_
7 
8 #include "core/fpdfapi/parser/cpdf_data_avail.h"
9 #include "core/fxcrt/fx_stream.h"
10 
11 class CPDF_ReadValidator : public IFX_SeekableReadStream {
12  public:
13   template <typename T, typename... Args>
14   friend RetainPtr<T> pdfium::MakeRetain(Args&&... args);
15 
16   class Session {
17    public:
18     explicit Session(CPDF_ReadValidator* validator);
19     ~Session();
20 
21    private:
22     UnownedPtr<CPDF_ReadValidator> validator_;
23     bool saved_read_error_;
24     bool saved_has_unavailable_data_;
25   };
26 
SetDownloadHints(CPDF_DataAvail::DownloadHints * hints)27   void SetDownloadHints(CPDF_DataAvail::DownloadHints* hints) {
28     hints_ = hints;
29   }
30 
read_error()31   bool read_error() const { return read_error_; }
has_unavailable_data()32   bool has_unavailable_data() const { return has_unavailable_data_; }
33 
has_read_problems()34   bool has_read_problems() const {
35     return read_error() || has_unavailable_data();
36   }
37 
38   void ResetErrors();
39 
40   bool IsWholeFileAvailable();
41 
42   bool CheckDataRangeAndRequestIfUnavailable(FX_FILESIZE offset, size_t size);
43   bool CheckWholeFileAndRequestIfUnavailable();
44 
45   // IFX_SeekableReadStream overrides:
46   bool ReadBlock(void* buffer, FX_FILESIZE offset, size_t size) override;
47   FX_FILESIZE GetSize() override;
48 
49  protected:
50   CPDF_ReadValidator(const RetainPtr<IFX_SeekableReadStream>& file_read,
51                      CPDF_DataAvail::FileAvail* file_avail);
52   ~CPDF_ReadValidator() override;
53 
54  private:
55   void ScheduleDownload(FX_FILESIZE offset, size_t size);
56   bool IsDataRangeAvailable(FX_FILESIZE offset, size_t size) const;
57 
58   RetainPtr<IFX_SeekableReadStream> file_read_;
59   UnownedPtr<CPDF_DataAvail::FileAvail> file_avail_;
60 
61   UnownedPtr<CPDF_DataAvail::DownloadHints> hints_;
62 
63   bool read_error_;
64   bool has_unavailable_data_;
65   bool whole_file_already_available_;
66   const FX_FILESIZE file_size_;
67 };
68 
69 #endif  // CORE_FPDFAPI_PARSER_CPDF_READ_VALIDATOR_H_
70