Веб-сайт самохостера Lotigara

summaryrefslogtreecommitdiff
path: root/source/core/StarIODevice.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/core/StarIODevice.cpp')
-rw-r--r--source/core/StarIODevice.cpp153
1 files changed, 153 insertions, 0 deletions
diff --git a/source/core/StarIODevice.cpp b/source/core/StarIODevice.cpp
new file mode 100644
index 0000000..d87d33f
--- /dev/null
+++ b/source/core/StarIODevice.cpp
@@ -0,0 +1,153 @@
+#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)
+ throw IOException::format("Cannot reopen device '%s", deviceName());
+}
+
+void IODevice::close() {
+ m_mode = IOMode::Closed;
+}
+
+void IODevice::sync() {}
+
+String IODevice::deviceName() const {
+ return strf("IODevice <%s>", this);
+}
+
+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;
+}
+
+}