|
|
1.1 ! root 1: // ! 2: // nono ! 3: // Copyright (C) 2021 nono project ! 4: // Licensed under nono-license.txt ! 5: // ! 6: ! 7: // ! 8: // ディスクイメージのドライバ (基本クラス)。 ! 9: // ! 10: ! 11: // Driver クラスとは無関係。 ! 12: ! 13: #pragma once ! 14: ! 15: #include "object.h" ! 16: ! 17: class DiskImageDriver : public Object ! 18: { ! 19: using inherited = Object; ! 20: ! 21: public: ! 22: DiskImageDriver(const std::string& objname_, const std::string& pathname_); ! 23: ~DiskImageDriver() override; ! 24: ! 25: // このドライバが知っているファイルフォーマットなら true を返す。 ! 26: // 知らないファイルフォーマットなら黙って false を返す。 ! 27: virtual bool Match() = 0; ! 28: ! 29: // このイメージがサポートしている形式なら true を返す。 ! 30: // サポートしていない形式 (例えば未知のバージョンや機能等) なら ! 31: // errmsg にエラーメッセージをセットして (pathname の接頭は不要) ! 32: // false を返す。 ! 33: virtual bool Attach(std::string& errmsg) = 0; ! 34: ! 35: // このイメージが書き込み可能かどうかを返す。 ! 36: // 書き込み可能なら 1、不可なら 0 を返す。 ! 37: // エラーなら (errno をセットして?) -1 を返す。 ! 38: int IsWriteable() const; ! 39: ! 40: // イメージをオープンする。 ! 41: // 実際にはこの時点では書き込み禁止でオープンされており、 ! 42: // read_only == false が指定されたらオープンし直す、となっている。 ! 43: // 成功すれば true を返す。 ! 44: // 失敗すれば warn 系でエラーを表示して false を返す。 ! 45: virtual bool Open(bool read_only) = 0; ! 46: ! 47: // イメージをクローズする。 ! 48: virtual void Close() = 0; ! 49: ! 50: // イメージのサイズを返す。 ! 51: // オープンされてなければ 0 を返す。 ! 52: off_t GetSize() const { return filesize; } ! 53: ! 54: // イメージの offset から size バイトを buf に読み出す。 ! 55: // 成功すれば true を返す。失敗すれば false を返す。 ! 56: virtual bool Read(void *buf, off_t offset, size_t size) = 0; ! 57: ! 58: // イメージの offset 以降に buf から size バイトを書き込む。 ! 59: // 成功すれば true を返す。失敗すれば false を返す。 ! 60: virtual bool Write(const void *buf, off_t offset, size_t size) = 0; ! 61: ! 62: protected: ! 63: // fd から dst に size バイト読んでポインタを進める。 ! 64: // 必ず size バイト読み込むため成功すれば戻り値は size。 ! 65: // エラーなら errno をセットして -1 を返す。EOF を超えるのもエラー扱い。 ! 66: static ssize_t readimg(int fd, void *dst, size_t size); ! 67: ! 68: // fd に src に size バイト書いてポインタを進める。 ! 69: // 必ず size バイト書き出すため成功すれば戻り値は size。 ! 70: // エラーなら errno をセットして -1 を返す。 ! 71: static ssize_t writeimg(int fd, const void *src, size_t size); ! 72: ! 73: // fd の offset から dst に size バイト読み込む。ポインタは移動しない。 ! 74: // 必ず size バイト読み込むため成功すれば戻り値は size。 ! 75: // エラーなら errno をセットして -1 を返す。EOF を超えるのもエラー扱い。 ! 76: static ssize_t readpos(int fd, void *dst, size_t size, off_t offset); ! 77: ! 78: // fd の offset に src から size バイト書き出す。ポインタは移動しない。 ! 79: // 必ず size バイト書き出すため成功すれば戻り値は size。 ! 80: // エラーなら errno をセットして -1 を返す。 ! 81: static ssize_t writepos(int fd, const void *src, size_t size, off_t offset); ! 82: ! 83: const std::string& pathname; ! 84: ! 85: // イメージサイズ。オープンされなければ 0。 ! 86: off_t filesize {}; ! 87: };
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.