2023-06-20 04:33:09 +00:00
|
|
|
#include "StarIODevice.hpp"
|
|
|
|
#include "StarMathCommon.hpp"
|
|
|
|
#include "StarFormat.hpp"
|
|
|
|
|
|
|
|
namespace Star {
|
|
|
|
|
|
|
|
IODevice::IODevice(IOMode mode) {
|
|
|
|
m_mode = mode;
|
|
|
|
}
|
|
|
|
|
|
|
|
IODevice::~IODevice() {
|
|
|
|
close();
|
|
|
|
}
|
|
|
|
|
|
|
|
void IODevice::resize(StreamOffset) {
|
|
|
|
throw IOException("resize not supported");
|
|
|
|
}
|
|
|
|
|
|
|
|
void IODevice::readFull(char* data, size_t len) {
|
|
|
|
size_t r = read(data, len);
|
|
|
|
if (r < len) {
|
|
|
|
if (atEnd())
|
|
|
|
throw EofException("Failed to read full buffer in readFull, eof reached.");
|
|
|
|
else
|
|
|
|
throw IOException("Failed to read full buffer in readFull");
|
|
|
|
}
|
|
|
|
data += r;
|
|
|
|
len -= r;
|
|
|
|
}
|
|
|
|
|
|
|
|
void IODevice::writeFull(char const* data, size_t len) {
|
|
|
|
size_t r = write(data, len);
|
|
|
|
if (r < len) {
|
|
|
|
if (atEnd())
|
|
|
|
throw EofException("Failed to write full buffer in writeFull, eof reached.");
|
|
|
|
else
|
|
|
|
throw IOException("Failed to write full buffer in writeFull");
|
|
|
|
}
|
|
|
|
data += r;
|
|
|
|
len -= r;
|
|
|
|
}
|
|
|
|
|
|
|
|
void IODevice::open(IOMode mode) {
|
|
|
|
if (mode != m_mode)
|
2023-06-27 10:23:44 +00:00
|
|
|
throw IOException::format("Cannot reopen device '{}", deviceName());
|
2023-06-20 04:33:09 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void IODevice::close() {
|
|
|
|
m_mode = IOMode::Closed;
|
|
|
|
}
|
|
|
|
|
|
|
|
void IODevice::sync() {}
|
|
|
|
|
|
|
|
String IODevice::deviceName() const {
|
2023-06-27 10:23:44 +00:00
|
|
|
return strf("IODevice <{}>", (void*)this);
|
2023-06-20 04:33:09 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
bool IODevice::atEnd() {
|
|
|
|
return pos() >= size();
|
|
|
|
}
|
|
|
|
|
|
|
|
StreamOffset IODevice::size() {
|
|
|
|
try {
|
|
|
|
StreamOffset storedPos = pos();
|
|
|
|
seek(0, IOSeek::End);
|
|
|
|
StreamOffset size = pos();
|
|
|
|
seek(storedPos);
|
|
|
|
return size;
|
|
|
|
} catch (IOException const& e) {
|
|
|
|
throw IOException("Cannot call size() on IODevice", e);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
size_t IODevice::readAbsolute(StreamOffset readPosition, char* data, size_t len) {
|
|
|
|
StreamOffset storedPos = pos();
|
|
|
|
seek(readPosition);
|
|
|
|
size_t ret = read(data, len);
|
|
|
|
seek(storedPos);
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
size_t IODevice::writeAbsolute(StreamOffset writePosition, char const* data, size_t len) {
|
|
|
|
StreamOffset storedPos = pos();
|
|
|
|
seek(writePosition);
|
|
|
|
size_t ret = write(data, len);
|
|
|
|
seek(storedPos);
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
void IODevice::readFullAbsolute(StreamOffset readPosition, char* data, size_t len) {
|
|
|
|
while (len > 0) {
|
|
|
|
size_t r = readAbsolute(readPosition, data, len);
|
|
|
|
if (r == 0)
|
|
|
|
throw IOException("Failed to read full buffer in readFullAbsolute");
|
|
|
|
readPosition += r;
|
|
|
|
data += r;
|
|
|
|
len -= r;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void IODevice::writeFullAbsolute(StreamOffset writePosition, char const* data, size_t len) {
|
|
|
|
while (len > 0) {
|
|
|
|
size_t r = writeAbsolute(writePosition, data, len);
|
|
|
|
if (r == 0)
|
|
|
|
throw IOException("Failed to write full buffer in writeFullAbsolute");
|
|
|
|
writePosition += r;
|
|
|
|
data += r;
|
|
|
|
len -= r;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
ByteArray IODevice::readBytes(size_t size) {
|
|
|
|
if (!size)
|
|
|
|
return {};
|
|
|
|
|
|
|
|
ByteArray p;
|
|
|
|
p.resize(size);
|
|
|
|
readFull(p.ptr(), size);
|
|
|
|
return p;
|
|
|
|
}
|
|
|
|
|
|
|
|
void IODevice::writeBytes(ByteArray const& p) {
|
|
|
|
writeFull(p.ptr(), p.size());
|
|
|
|
}
|
|
|
|
|
|
|
|
ByteArray IODevice::readBytesAbsolute(StreamOffset readPosition, size_t size) {
|
|
|
|
if (!size)
|
|
|
|
return {};
|
|
|
|
|
|
|
|
ByteArray p;
|
|
|
|
p.resize(size);
|
|
|
|
readFullAbsolute(readPosition, p.ptr(), size);
|
|
|
|
return p;
|
|
|
|
}
|
|
|
|
|
|
|
|
void IODevice::writeBytesAbsolute(StreamOffset writePosition, ByteArray const& p) {
|
|
|
|
writeFullAbsolute(writePosition, p.ptr(), p.size());
|
|
|
|
}
|
|
|
|
|
|
|
|
void IODevice::setMode(IOMode m) {
|
|
|
|
m_mode = m;
|
|
|
|
}
|
|
|
|
|
|
|
|
IODevice::IODevice(IODevice const& rhs) {
|
|
|
|
m_mode = rhs.mode();
|
|
|
|
}
|
|
|
|
|
|
|
|
IODevice& IODevice::operator=(IODevice const& rhs) {
|
|
|
|
m_mode = rhs.mode();
|
|
|
|
return *this;
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|