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