1*3ac0a46fSAndroid Build Coastguard Worker // Copyright 2017 The PDFium Authors
2*3ac0a46fSAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*3ac0a46fSAndroid Build Coastguard Worker // found in the LICENSE file.
4*3ac0a46fSAndroid Build Coastguard Worker
5*3ac0a46fSAndroid Build Coastguard Worker #include "testing/fake_file_access.h"
6*3ac0a46fSAndroid Build Coastguard Worker
7*3ac0a46fSAndroid Build Coastguard Worker #include <utility>
8*3ac0a46fSAndroid Build Coastguard Worker
9*3ac0a46fSAndroid Build Coastguard Worker #include "core/fxcrt/fx_system.h"
10*3ac0a46fSAndroid Build Coastguard Worker #include "third_party/base/check.h"
11*3ac0a46fSAndroid Build Coastguard Worker
12*3ac0a46fSAndroid Build Coastguard Worker namespace {
13*3ac0a46fSAndroid Build Coastguard Worker
14*3ac0a46fSAndroid Build Coastguard Worker class FileAccessWrapper final : public FPDF_FILEACCESS {
15*3ac0a46fSAndroid Build Coastguard Worker public:
FileAccessWrapper(FakeFileAccess * simulator)16*3ac0a46fSAndroid Build Coastguard Worker explicit FileAccessWrapper(FakeFileAccess* simulator)
17*3ac0a46fSAndroid Build Coastguard Worker : simulator_(simulator) {
18*3ac0a46fSAndroid Build Coastguard Worker m_FileLen = simulator_->GetFileSize();
19*3ac0a46fSAndroid Build Coastguard Worker m_GetBlock = &GetBlockImpl;
20*3ac0a46fSAndroid Build Coastguard Worker m_Param = this;
21*3ac0a46fSAndroid Build Coastguard Worker }
22*3ac0a46fSAndroid Build Coastguard Worker
GetBlockImpl(void * param,unsigned long position,unsigned char * pBuf,unsigned long size)23*3ac0a46fSAndroid Build Coastguard Worker static int GetBlockImpl(void* param,
24*3ac0a46fSAndroid Build Coastguard Worker unsigned long position,
25*3ac0a46fSAndroid Build Coastguard Worker unsigned char* pBuf,
26*3ac0a46fSAndroid Build Coastguard Worker unsigned long size) {
27*3ac0a46fSAndroid Build Coastguard Worker return static_cast<FileAccessWrapper*>(param)->simulator_->GetBlock(
28*3ac0a46fSAndroid Build Coastguard Worker position, pBuf, size);
29*3ac0a46fSAndroid Build Coastguard Worker }
30*3ac0a46fSAndroid Build Coastguard Worker
31*3ac0a46fSAndroid Build Coastguard Worker private:
32*3ac0a46fSAndroid Build Coastguard Worker UnownedPtr<FakeFileAccess> simulator_;
33*3ac0a46fSAndroid Build Coastguard Worker };
34*3ac0a46fSAndroid Build Coastguard Worker
35*3ac0a46fSAndroid Build Coastguard Worker class FileAvailImpl final : public FX_FILEAVAIL {
36*3ac0a46fSAndroid Build Coastguard Worker public:
FileAvailImpl(FakeFileAccess * simulator)37*3ac0a46fSAndroid Build Coastguard Worker explicit FileAvailImpl(FakeFileAccess* simulator) : simulator_(simulator) {
38*3ac0a46fSAndroid Build Coastguard Worker version = 1;
39*3ac0a46fSAndroid Build Coastguard Worker IsDataAvail = &IsDataAvailImpl;
40*3ac0a46fSAndroid Build Coastguard Worker }
41*3ac0a46fSAndroid Build Coastguard Worker
IsDataAvailImpl(FX_FILEAVAIL * pThis,size_t offset,size_t size)42*3ac0a46fSAndroid Build Coastguard Worker static FPDF_BOOL IsDataAvailImpl(FX_FILEAVAIL* pThis,
43*3ac0a46fSAndroid Build Coastguard Worker size_t offset,
44*3ac0a46fSAndroid Build Coastguard Worker size_t size) {
45*3ac0a46fSAndroid Build Coastguard Worker return static_cast<FileAvailImpl*>(pThis)->simulator_->IsDataAvail(offset,
46*3ac0a46fSAndroid Build Coastguard Worker size);
47*3ac0a46fSAndroid Build Coastguard Worker }
48*3ac0a46fSAndroid Build Coastguard Worker
49*3ac0a46fSAndroid Build Coastguard Worker private:
50*3ac0a46fSAndroid Build Coastguard Worker UnownedPtr<FakeFileAccess> simulator_;
51*3ac0a46fSAndroid Build Coastguard Worker };
52*3ac0a46fSAndroid Build Coastguard Worker
53*3ac0a46fSAndroid Build Coastguard Worker class DownloadHintsImpl final : public FX_DOWNLOADHINTS {
54*3ac0a46fSAndroid Build Coastguard Worker public:
DownloadHintsImpl(FakeFileAccess * simulator)55*3ac0a46fSAndroid Build Coastguard Worker explicit DownloadHintsImpl(FakeFileAccess* simulator)
56*3ac0a46fSAndroid Build Coastguard Worker : simulator_(simulator) {
57*3ac0a46fSAndroid Build Coastguard Worker version = 1;
58*3ac0a46fSAndroid Build Coastguard Worker AddSegment = &AddSegmentImpl;
59*3ac0a46fSAndroid Build Coastguard Worker }
60*3ac0a46fSAndroid Build Coastguard Worker
AddSegmentImpl(FX_DOWNLOADHINTS * pThis,size_t offset,size_t size)61*3ac0a46fSAndroid Build Coastguard Worker static void AddSegmentImpl(FX_DOWNLOADHINTS* pThis,
62*3ac0a46fSAndroid Build Coastguard Worker size_t offset,
63*3ac0a46fSAndroid Build Coastguard Worker size_t size) {
64*3ac0a46fSAndroid Build Coastguard Worker return static_cast<DownloadHintsImpl*>(pThis)->simulator_->AddSegment(
65*3ac0a46fSAndroid Build Coastguard Worker offset, size);
66*3ac0a46fSAndroid Build Coastguard Worker }
67*3ac0a46fSAndroid Build Coastguard Worker
68*3ac0a46fSAndroid Build Coastguard Worker private:
69*3ac0a46fSAndroid Build Coastguard Worker UnownedPtr<FakeFileAccess> simulator_;
70*3ac0a46fSAndroid Build Coastguard Worker };
71*3ac0a46fSAndroid Build Coastguard Worker
72*3ac0a46fSAndroid Build Coastguard Worker } // namespace
73*3ac0a46fSAndroid Build Coastguard Worker
FakeFileAccess(FPDF_FILEACCESS * file_access)74*3ac0a46fSAndroid Build Coastguard Worker FakeFileAccess::FakeFileAccess(FPDF_FILEACCESS* file_access)
75*3ac0a46fSAndroid Build Coastguard Worker : file_access_(file_access),
76*3ac0a46fSAndroid Build Coastguard Worker file_access_wrapper_(std::make_unique<FileAccessWrapper>(this)),
77*3ac0a46fSAndroid Build Coastguard Worker file_avail_(std::make_unique<FileAvailImpl>(this)),
78*3ac0a46fSAndroid Build Coastguard Worker download_hints_(std::make_unique<DownloadHintsImpl>(this)) {
79*3ac0a46fSAndroid Build Coastguard Worker DCHECK(file_access_);
80*3ac0a46fSAndroid Build Coastguard Worker }
81*3ac0a46fSAndroid Build Coastguard Worker
82*3ac0a46fSAndroid Build Coastguard Worker FakeFileAccess::~FakeFileAccess() = default;
83*3ac0a46fSAndroid Build Coastguard Worker
IsDataAvail(size_t offset,size_t size) const84*3ac0a46fSAndroid Build Coastguard Worker FPDF_BOOL FakeFileAccess::IsDataAvail(size_t offset, size_t size) const {
85*3ac0a46fSAndroid Build Coastguard Worker return available_data_.Contains(RangeSet::Range(offset, offset + size));
86*3ac0a46fSAndroid Build Coastguard Worker }
87*3ac0a46fSAndroid Build Coastguard Worker
AddSegment(size_t offset,size_t size)88*3ac0a46fSAndroid Build Coastguard Worker void FakeFileAccess::AddSegment(size_t offset, size_t size) {
89*3ac0a46fSAndroid Build Coastguard Worker requested_data_.Union(RangeSet::Range(offset, offset + size));
90*3ac0a46fSAndroid Build Coastguard Worker }
91*3ac0a46fSAndroid Build Coastguard Worker
GetFileSize()92*3ac0a46fSAndroid Build Coastguard Worker unsigned long FakeFileAccess::GetFileSize() {
93*3ac0a46fSAndroid Build Coastguard Worker return file_access_->m_FileLen;
94*3ac0a46fSAndroid Build Coastguard Worker }
95*3ac0a46fSAndroid Build Coastguard Worker
GetBlock(unsigned long position,unsigned char * pBuf,unsigned long size)96*3ac0a46fSAndroid Build Coastguard Worker int FakeFileAccess::GetBlock(unsigned long position,
97*3ac0a46fSAndroid Build Coastguard Worker unsigned char* pBuf,
98*3ac0a46fSAndroid Build Coastguard Worker unsigned long size) {
99*3ac0a46fSAndroid Build Coastguard Worker if (!pBuf || !size)
100*3ac0a46fSAndroid Build Coastguard Worker return false;
101*3ac0a46fSAndroid Build Coastguard Worker
102*3ac0a46fSAndroid Build Coastguard Worker if (!IsDataAvail(static_cast<size_t>(position), static_cast<size_t>(size)))
103*3ac0a46fSAndroid Build Coastguard Worker return false;
104*3ac0a46fSAndroid Build Coastguard Worker
105*3ac0a46fSAndroid Build Coastguard Worker return file_access_->m_GetBlock(file_access_->m_Param, position, pBuf, size);
106*3ac0a46fSAndroid Build Coastguard Worker }
107*3ac0a46fSAndroid Build Coastguard Worker
SetRequestedDataAvailable()108*3ac0a46fSAndroid Build Coastguard Worker void FakeFileAccess::SetRequestedDataAvailable() {
109*3ac0a46fSAndroid Build Coastguard Worker available_data_.Union(requested_data_);
110*3ac0a46fSAndroid Build Coastguard Worker requested_data_.Clear();
111*3ac0a46fSAndroid Build Coastguard Worker }
112*3ac0a46fSAndroid Build Coastguard Worker
SetWholeFileAvailable()113*3ac0a46fSAndroid Build Coastguard Worker void FakeFileAccess::SetWholeFileAvailable() {
114*3ac0a46fSAndroid Build Coastguard Worker available_data_.Union(RangeSet::Range(0, static_cast<size_t>(GetFileSize())));
115*3ac0a46fSAndroid Build Coastguard Worker requested_data_.Clear();
116*3ac0a46fSAndroid Build Coastguard Worker }
117