1 // Copyright 2019 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 #include "testing/utils/file_util.h" 6 7 #include <stdio.h> 8 #include <string.h> 9 10 #include "testing/utils/path_service.h" 11 GetFileContents(const char * filename,size_t * retlen)12 std::unique_ptr<char, pdfium::FreeDeleter> GetFileContents(const char* filename, 13 size_t* retlen) { 14 FILE* file = fopen(filename, "rb"); 15 if (!file) { 16 fprintf(stderr, "Failed to open: %s\n", filename); 17 return nullptr; 18 } 19 (void)fseek(file, 0, SEEK_END); 20 size_t file_length = ftell(file); 21 if (!file_length) { 22 return nullptr; 23 } 24 (void)fseek(file, 0, SEEK_SET); 25 std::unique_ptr<char, pdfium::FreeDeleter> buffer( 26 static_cast<char*>(malloc(file_length))); 27 if (!buffer) { 28 return nullptr; 29 } 30 size_t bytes_read = fread(buffer.get(), 1, file_length, file); 31 (void)fclose(file); 32 if (bytes_read != file_length) { 33 fprintf(stderr, "Failed to read: %s\n", filename); 34 return nullptr; 35 } 36 *retlen = bytes_read; 37 return buffer; 38 } 39 FileAccessForTesting(const std::string & file_name)40 FileAccessForTesting::FileAccessForTesting(const std::string& file_name) { 41 std::string file_path; 42 if (!PathService::GetTestFilePath(file_name, &file_path)) 43 return; 44 45 file_contents_ = GetFileContents(file_path.c_str(), &file_length_); 46 if (!file_contents_) 47 return; 48 49 m_FileLen = static_cast<unsigned long>(file_length_); 50 m_GetBlock = SGetBlock; 51 m_Param = this; 52 } 53 GetBlockImpl(unsigned long pos,unsigned char * pBuf,unsigned long size)54 int FileAccessForTesting::GetBlockImpl(unsigned long pos, 55 unsigned char* pBuf, 56 unsigned long size) { 57 memcpy(pBuf, file_contents_.get() + pos, size); 58 return size; 59 } 60 61 // static SGetBlock(void * param,unsigned long pos,unsigned char * pBuf,unsigned long size)62 int FileAccessForTesting::SGetBlock(void* param, 63 unsigned long pos, 64 unsigned char* pBuf, 65 unsigned long size) { 66 auto* file_access = static_cast<FileAccessForTesting*>(param); 67 return file_access->GetBlockImpl(pos, pBuf, size); 68 } 69