1e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// Copyright 2014 PDFium Authors. All rights reserved. 2e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// Use of this source code is governed by a BSD-style license that can be 3e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// found in the LICENSE file. 4e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 5e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 6e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 7e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#ifndef CORE_INCLUDE_FXCRT_FX_STREAM_H_ 8e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#define CORE_INCLUDE_FXCRT_FX_STREAM_H_ 9e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 10e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include "fx_string.h" 11e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 12ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid* FX_OpenFolder(const FX_CHAR* path); 13ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid* FX_OpenFolder(const FX_WCHAR* path); 14ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL FX_GetNextFile(void* handle, 15ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_ByteString& filename, 16ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL& bFolder); 17ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL FX_GetNextFile(void* handle, 18ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_WideString& filename, 19ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL& bFolder); 20e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid FX_CloseFolder(void* handle); 21e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_WCHAR FX_GetFolderSeparator(); 22e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ 23ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FX_FILESIZE int32_t 24e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#else 25e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include <fcntl.h> 26e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include <unistd.h> 27e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include <sys/stat.h> 28e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#ifndef O_BINARY 29ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define O_BINARY 0 30e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif 31e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#ifndef O_LARGEFILE 32ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define O_LARGEFILE 0 33e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif 34ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FX_FILESIZE off_t 35e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif 36ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FX_GETBYTEOFFSET32(a) 0 37ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FX_GETBYTEOFFSET40(a) 0 38ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FX_GETBYTEOFFSET48(a) 0 39ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FX_GETBYTEOFFSET56(a) 0 40ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FX_GETBYTEOFFSET24(a) ((uint8_t)(a >> 24)) 41ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FX_GETBYTEOFFSET16(a) ((uint8_t)(a >> 16)) 42ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FX_GETBYTEOFFSET8(a) ((uint8_t)(a >> 8)) 43ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FX_GETBYTEOFFSET0(a) ((uint8_t)(a)) 44ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FX_FILEMODE_Write 0 45ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FX_FILEMODE_ReadOnly 1 46ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FX_FILEMODE_Truncate 2 47ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 48ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannclass IFX_StreamWrite { 49ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann public: 50ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann virtual ~IFX_StreamWrite() {} 51ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann virtual void Release() = 0; 52ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann virtual FX_BOOL WriteBlock(const void* pData, size_t size) = 0; 53e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}; 54e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 55ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannclass IFX_FileWrite : public IFX_StreamWrite { 56ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann public: 57ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann // IFX_StreamWrite: 58ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL WriteBlock(const void* pData, size_t size) override { 59ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return WriteBlock(pData, GetSize(), size); 60ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 61ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 62ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann virtual FX_FILESIZE GetSize() = 0; 63ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann virtual FX_BOOL Flush() = 0; 64ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann virtual FX_BOOL WriteBlock(const void* pData, 65ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_FILESIZE offset, 66ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann size_t size) = 0; 67e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}; 68e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 69ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannclass IFX_StreamRead { 70ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann public: 71ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann virtual ~IFX_StreamRead() {} 72e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 73ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann virtual void Release() = 0; 74ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann virtual FX_BOOL IsEOF() = 0; 75ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann virtual FX_FILESIZE GetPosition() = 0; 76ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann virtual size_t ReadBlock(void* buffer, size_t size) = 0; 77e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}; 78e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 79ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannclass IFX_FileRead : IFX_StreamRead { 80ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann public: 81ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann // IFX_StreamRead: 82ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann void Release() override = 0; 83ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL IsEOF() override { return FALSE; } 84ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_FILESIZE GetPosition() override { return 0; } 85ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann size_t ReadBlock(void* buffer, size_t size) override { return 0; } 86e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 87ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann virtual FX_BOOL ReadBlock(void* buffer, FX_FILESIZE offset, size_t size) = 0; 88ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann virtual FX_FILESIZE GetSize() = 0; 89e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}; 90e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 91ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannIFX_FileRead* FX_CreateFileRead(const FX_CHAR* filename); 92ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannIFX_FileRead* FX_CreateFileRead(const FX_WCHAR* filename); 93ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 94ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannclass IFX_FileStream : public IFX_FileRead, public IFX_FileWrite { 95ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann public: 96ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann virtual IFX_FileStream* Retain() = 0; 97ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 98ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann // IFX_FileRead: 99ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann void Release() override = 0; 100ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL IsEOF() override = 0; 101ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_FILESIZE GetPosition() override = 0; 102ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann size_t ReadBlock(void* buffer, size_t size) override = 0; 103ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL ReadBlock(void* buffer, FX_FILESIZE offset, size_t size) override = 0; 104ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_FILESIZE GetSize() override = 0; 105ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 106ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann // IFX_FileWrite: 107ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL WriteBlock(const void* buffer, 108ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_FILESIZE offset, 109ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann size_t size) override = 0; 110ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL WriteBlock(const void* buffer, size_t size) override { 111ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return WriteBlock(buffer, GetSize(), size); 112ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 113ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL Flush() override = 0; 114e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}; 115e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 116ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannIFX_FileStream* FX_CreateFileStream(const FX_CHAR* filename, FX_DWORD dwModes); 117ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannIFX_FileStream* FX_CreateFileStream(const FX_WCHAR* filename, FX_DWORD dwModes); 118ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 119ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#ifdef PDF_ENABLE_XFA 120ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannclass IFX_FileAccess { 121ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann public: 122ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann virtual ~IFX_FileAccess() {} 123ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann virtual void Release() = 0; 124ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann virtual IFX_FileAccess* Retain() = 0; 125ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann virtual void GetPath(CFX_WideString& wsPath) = 0; 126ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann virtual IFX_FileStream* CreateFileStream(FX_DWORD dwModes) = 0; 127e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}; 128ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannIFX_FileAccess* FX_CreateDefaultFileAccess(const CFX_WideStringC& wsPath); 129ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#endif // PDF_ENABLE_XFA 130e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 131ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannclass IFX_MemoryStream : public IFX_FileStream { 132ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann public: 133ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann virtual FX_BOOL IsConsecutive() const = 0; 134e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 135ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann virtual void EstimateSize(size_t nInitSize, size_t nGrowSize) = 0; 136e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 137ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann virtual uint8_t* GetBuffer() const = 0; 138e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 139ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann virtual void AttachBuffer(uint8_t* pBuffer, 140ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann size_t nSize, 141ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL bTakeOver = FALSE) = 0; 142e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 143ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann virtual void DetachBuffer() = 0; 144ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}; 145ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannIFX_MemoryStream* FX_CreateMemoryStream(uint8_t* pBuffer, 146ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann size_t nSize, 147ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL bTakeOver = FALSE); 148ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannIFX_MemoryStream* FX_CreateMemoryStream(FX_BOOL bConsecutive = FALSE); 149ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannclass IFX_BufferRead : public IFX_StreamRead { 150ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann public: 151ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann // IFX_StreamRead: 152ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann void Release() override = 0; 153ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL IsEOF() override = 0; 154ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_FILESIZE GetPosition() override = 0; 155ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann size_t ReadBlock(void* buffer, size_t size) override = 0; 156ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 157ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann virtual FX_BOOL ReadNextBlock(FX_BOOL bRestart = FALSE) = 0; 158ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann virtual const uint8_t* GetBlockBuffer() = 0; 159ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann virtual size_t GetBlockSize() = 0; 160ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann virtual FX_FILESIZE GetBlockOffset() = 0; 161e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}; 162e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 163e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif // CORE_INCLUDE_FXCRT_FX_STREAM_H_ 164