2023-09-02 19:56:50 +08:00
|
|
|
// Copyright (c) 2018-2019 HALX99
|
|
|
|
// Copyright (c) 2020 C4games Ltd
|
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include <string>
|
|
|
|
|
|
|
|
#include "platform/PlatformConfig.h"
|
|
|
|
#include "platform/PlatformMacros.h"
|
|
|
|
|
|
|
|
NS_AX_BEGIN
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @addtogroup platform
|
|
|
|
* @{
|
|
|
|
*/
|
|
|
|
|
|
|
|
#if defined(_WIN32)
|
|
|
|
using osfhnd_t = void*;
|
|
|
|
#else
|
|
|
|
using osfhnd_t = int;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
class AX_DLL IFileStream
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
virtual ~IFileStream() = default;
|
|
|
|
|
|
|
|
enum class Mode
|
|
|
|
{
|
|
|
|
READ,
|
|
|
|
WRITE,
|
|
|
|
APPEND,
|
|
|
|
OVERLAPPED,
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Open a file
|
|
|
|
* @param path file to open
|
|
|
|
* @param mode File open mode, being READ, WRITE, APPEND
|
|
|
|
* @return true if successful, false if not
|
|
|
|
*/
|
|
|
|
virtual bool open(std::string_view path, IFileStream::Mode mode) = 0;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Close a file stream
|
|
|
|
* @return 0 if successful, -1 if not
|
|
|
|
*/
|
|
|
|
virtual int close() = 0;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Seek to position in a file stream
|
|
|
|
* @param offset how many bytes to move within the stream
|
|
|
|
* @param origin SEEK_SET, SEEK_CUR, SEEK_END
|
|
|
|
* @return offset from file begining
|
|
|
|
*/
|
|
|
|
virtual int64_t seek(int64_t offset, int origin) const = 0;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Read data from file stream
|
|
|
|
* @param buf pointer to data
|
|
|
|
* @param size the amount of data to read in bytes
|
|
|
|
* @return amount of data read successfully, -1 if error
|
|
|
|
*/
|
|
|
|
virtual int read(void* buf, unsigned int size) const = 0;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Write data to file stream
|
|
|
|
* @param buf pointer to data
|
|
|
|
* @param size the amount of data to write in bytes
|
|
|
|
* @return amount of data written successfully, -1 if error
|
|
|
|
*/
|
|
|
|
virtual int write(const void* buf, unsigned int size) const = 0;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Get the current position in the file stream
|
|
|
|
* @return current position, -1 if error
|
|
|
|
*/
|
2023-10-01 22:05:45 +08:00
|
|
|
virtual int64_t tell() const = 0;
|
2023-09-02 19:56:50 +08:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Get the size of the file stream
|
|
|
|
* @return stream size, -1 if error (Mode::WRITE and Mode::APPEND may return -1)
|
|
|
|
*/
|
|
|
|
virtual int64_t size() const = 0;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Resize file
|
|
|
|
*/
|
|
|
|
virtual bool resize(int64_t /*size*/) const
|
|
|
|
{
|
|
|
|
errno = ENOTSUP;
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Get status of file stream
|
|
|
|
* @return true if open, false if closed
|
|
|
|
*/
|
|
|
|
virtual bool isOpen() const = 0;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Get native handle if support
|
|
|
|
* @returns -1 if not a local disk file or file not open
|
|
|
|
* Windows: HANDLE
|
|
|
|
* Other: file descriptor
|
|
|
|
*/
|
|
|
|
virtual osfhnd_t nativeHandle() const { return (osfhnd_t)-1; }
|
|
|
|
|
|
|
|
virtual operator bool() const { return isOpen(); }
|
|
|
|
|
|
|
|
protected:
|
|
|
|
IFileStream(){};
|
|
|
|
};
|
|
|
|
|
|
|
|
// end of support group
|
|
|
|
/** @} */
|
|
|
|
|
|
|
|
NS_AX_END
|