--- nono/host/diskimage.h 2026/04/29 17:05:00 1.1.1.2 +++ nono/host/diskimage.h 2026/04/29 17:06:02 1.1.1.5 @@ -6,33 +6,19 @@ #pragma once -#include "header.h" +#include "object.h" #include "autofd.h" +#include #include -// ディスクイメージを実際に処理するドライバ -// (DiskImage クラスの下請けになる) -class DiskImageDriver -{ - public: - DiskImageDriver(const std::string& pathname_); - virtual ~DiskImageDriver(); - - virtual bool GetInfo(off_t *size, bool *w_ok) = 0; - virtual bool Open(bool read_only) = 0; - virtual void Close() = 0; - virtual off_t GetSize() const = 0; - virtual bool Read(void *buf, off_t offset, size_t size) = 0; - virtual bool Write(const void *buf, off_t offset, size_t size) = 0; - - protected: - const std::string& pathname; -}; +class DiskImageDriver; // ディスクイメージ -class DiskImage +class DiskImage : public Object { private: + using inherited = Object; + // Copy-on-Write キャッシュのブロックサイズ static const uint BLKSIZE = 4096; @@ -40,16 +26,24 @@ class DiskImage public: DiskImage(); - virtual ~DiskImage(); + ~DiskImage() override; + + // ログ名を設定する。 + // 歴史的経緯により、コンストラクタではなく後から設定する。 + // Object::SetName() は protected だがここでは public にする。 + void SetName(const std::string& name) override; + + void SetLogLevel(int loglevel_) override; // パス名を指定して、下位ドライバをオープン。 // コンストラクタ後最初に実行すること。 bool CreateHandler(const std::string& pathname_); - // このディスクイメージのサイズと書き込み可能かどうかを返す。 + // このディスクイメージが書き込み可能かどうかを返す。 // Open() 前でも動作する。 - // 成功すれば true、失敗なら errno をセットして false を返す。 - bool GetInfo(off_t *size, bool *w_ok); + // 書き込み可能なら 1、不可なら 0 を返す。 + // 失敗なら errno をセットして -1 を返す。 + int IsWriteable() const; // このディスクイメージを実際のアクセス用にオープンする。 // read_only == true なら、ディスクイメージを読み込み専用でオープンする。 @@ -85,7 +79,7 @@ class DiskImage std::string pathname {}; - std::unique_ptr driver {}; + std::unique_ptr driver /*{}*/; // Copy-on-Write モード bool cow_enable {};