11#include <promeki/config.h>
12#if PROMEKI_ENABLE_CORE
28typedef struct cirf_file cirf_file_t;
30PROMEKI_NAMESPACE_BEGIN
53class File :
public BufferedIODevice {
54 PROMEKI_OBJECT(File, BufferedIODevice)
57 using UPtr = UniquePtr<File>;
85#if defined(PROMEKI_PLATFORM_WINDOWS)
87 using FileHandle = HANDLE;
89 static constexpr FileHandle FileHandleClosedValue =
nullptr;
92 using FileHandle = int;
94 static constexpr FileHandle FileHandleClosedValue = -1;
101 File(ObjectBase *parent =
nullptr);
108 File(
const String &fn, ObjectBase *parent =
nullptr);
115 File(
const char *fn, ObjectBase *parent =
nullptr);
122 File(
const FilePath &fp, ObjectBase *parent =
nullptr);
131 const String &filename()
const {
return _filename; }
139 void setFilename(
const String &fn) { _filename = fn; }
145 int flags()
const {
return _fileFlags; }
151 FileHandle handle()
const {
return _handle; }
158 Error open(OpenMode mode)
override;
166 Error open(OpenMode mode,
int fileFlags);
172 Error close()
override;
175 bool isOpen()
const override;
183 int64_t write(
const void *data, int64_t maxSize)
override;
186 bool isSequential()
const override;
193 Error seek(int64_t offset)
override;
199 int64_t pos()
const override;
206 Result<int64_t> size()
const override;
212 bool atEnd()
const override;
219 Result<int64_t> seekFromCurrent(int64_t offset)
const;
226 Result<int64_t> seekFromEnd(int64_t offset)
const;
233 Error truncate(int64_t offset)
const;
249 int64_t writev(
const IOVec *iov,
int count);
262 Error preallocate(int64_t offset, int64_t length);
274 Result<size_t> directIOAlignment()
const;
328 Error readBulk(Buffer &buf, int64_t size);
364 int64_t writeBulk(
const void *data, int64_t size);
383 Error sync(
bool dataOnly =
true);
395 Error setDirectIO(
bool enable);
401 bool isDirectIO()
const {
return _directIO; }
411 Error setSynchronous(
bool enable);
417 bool isSynchronous()
const {
return _synchronous; }
427 Error setNonBlocking(
bool enable);
433 bool isNonBlocking()
const {
return _nonBlocking; }
444 bool isResource()
const {
return _resourceFile !=
nullptr; }
448 int64_t readFromDevice(
void *data, int64_t maxSize)
override;
451 int64_t deviceBytesAvailable()
const override;
454 bool _directIO =
false;
455 bool _synchronous =
false;
456 bool _nonBlocking =
false;
458 int _fileFlags = NoFlags;
459 FileHandle _handle = FileHandleClosedValue;
460 bool _savedUnbuffered =
false;
461 const cirf_file_t *_resourceFile =
nullptr;
462 int64_t _resourcePos = 0;