nod/include/nod/IDiscIO.hpp

70 lines
1.8 KiB
C++
Raw Normal View History

2018-10-06 20:39:24 -07:00
#pragma once
2015-06-26 12:30:03 -07:00
2017-12-28 23:57:54 -08:00
#include <cstdint>
#include <cstdio>
#include <memory>
2015-06-26 12:30:03 -07:00
2015-07-07 21:24:34 -07:00
#if NOD_ATHENA
2016-03-04 15:04:30 -08:00
#include <athena/IStreamReader.hpp>
#include <athena/IStreamWriter.hpp>
2015-07-07 21:24:34 -07:00
#endif
2018-12-07 21:21:47 -08:00
namespace nod {
2015-06-26 12:30:03 -07:00
2018-12-07 21:21:47 -08:00
struct IReadStream {
virtual ~IReadStream() = default;
virtual uint64_t read(void* buf, uint64_t length) = 0;
virtual void seek(int64_t offset, int whence = SEEK_SET) = 0;
virtual uint64_t position() const = 0;
};
2018-12-07 21:21:47 -08:00
struct IWriteStream {
virtual ~IWriteStream() = default;
virtual uint64_t write(const void* buf, uint64_t length) = 0;
};
2018-12-07 21:21:47 -08:00
class IDiscIO {
2015-06-26 12:30:03 -07:00
public:
2018-12-07 21:21:47 -08:00
virtual ~IDiscIO() = default;
virtual std::unique_ptr<IReadStream> beginReadStream(uint64_t offset = 0) const = 0;
virtual std::unique_ptr<IWriteStream> beginWriteStream(uint64_t offset = 0) const = 0;
2019-11-23 19:24:33 -08:00
virtual bool hasWiiCrypto() const { return true; } /* NFS overrides this to false */
2015-06-26 12:30:03 -07:00
};
2018-12-07 21:21:47 -08:00
struct IPartReadStream : IReadStream {
~IPartReadStream() override = default;
2015-06-29 23:46:19 -07:00
};
2018-12-07 21:21:47 -08:00
struct IPartWriteStream : IWriteStream {
~IPartWriteStream() override = default;
2018-12-07 21:21:47 -08:00
virtual void close() = 0;
virtual uint64_t position() const = 0;
2015-06-29 23:46:19 -07:00
};
2015-07-06 20:22:19 -07:00
#if NOD_ATHENA
2018-12-07 21:21:47 -08:00
class AthenaPartReadStream : public athena::io::IStreamReader {
std::unique_ptr<IPartReadStream> m_rs;
2015-07-06 20:22:19 -07:00
public:
2018-12-07 21:21:47 -08:00
AthenaPartReadStream(std::unique_ptr<IPartReadStream>&& rs) : m_rs(std::move(rs)) {}
2015-07-06 20:22:19 -07:00
void seek(atInt64 off, athena::SeekOrigin origin) override {
if (origin == athena::SeekOrigin::Begin) {
2018-12-07 21:21:47 -08:00
m_rs->seek(off, SEEK_SET);
} else if (origin == athena::SeekOrigin::Current) {
2018-12-07 21:21:47 -08:00
m_rs->seek(off, SEEK_CUR);
}
2018-12-07 21:21:47 -08:00
}
atUint64 position() const override { return m_rs->position(); }
atUint64 length() const override { return 0; }
atUint64 readUBytesToBuf(void* buf, atUint64 sz) override {
2018-12-07 21:21:47 -08:00
m_rs->read(buf, sz);
return sz;
}
2015-07-06 20:22:19 -07:00
};
#endif
2018-12-07 21:21:47 -08:00
} // namespace nod