File:  [Isaki's NoNo m68k/m88k emulator] / nono / host / diskdriver.h
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs
Wed Apr 29 17:06:02 2026 UTC (2 months, 3 weeks ago) by root
Branches: MAIN, Isaki
CVS tags: v027, HEAD
nono 1.7.0

//
// nono
// Copyright (C) 2021 nono project
// Licensed under nono-license.txt
//

//
// ディスクイメージのドライバ (基本クラス)。
//

// Driver クラスとは無関係。

#pragma once

#include "object.h"

class DiskImageDriver : public Object
{
	using inherited = Object;

 public:
	DiskImageDriver(const std::string& objname_, const std::string& pathname_);
	~DiskImageDriver() override;

	// このドライバが知っているファイルフォーマットなら true を返す。
	// 知らないファイルフォーマットなら黙って false を返す。
	virtual bool Match() = 0;

	// このイメージがサポートしている形式なら true を返す。
	// サポートしていない形式 (例えば未知のバージョンや機能等) なら
	// errmsg にエラーメッセージをセットして (pathname の接頭は不要)
	// false を返す。
	virtual bool Attach(std::string& errmsg) = 0;

	// このイメージが書き込み可能かどうかを返す。
	// 書き込み可能なら 1、不可なら 0 を返す。
	// エラーなら (errno をセットして?) -1 を返す。
	int IsWriteable() const;

	// イメージをオープンする。
	// 実際にはこの時点では書き込み禁止でオープンされており、
	// read_only == false が指定されたらオープンし直す、となっている。
	// 成功すれば true を返す。
	// 失敗すれば warn 系でエラーを表示して false を返す。
	virtual bool Open(bool read_only) = 0;

	// イメージをクローズする。
	virtual void Close() = 0;

	// イメージのサイズを返す。
	// オープンされてなければ 0 を返す。
	off_t GetSize() const { return filesize; }

	// イメージの offset から size バイトを buf に読み出す。
	// 成功すれば true を返す。失敗すれば false を返す。
	virtual bool Read(void *buf, off_t offset, size_t size) = 0;

	// イメージの offset 以降に buf から size バイトを書き込む。
	// 成功すれば true を返す。失敗すれば false を返す。
	virtual bool Write(const void *buf, off_t offset, size_t size) = 0;

 protected:
	// fd から dst に size バイト読んでポインタを進める。
	// 必ず size バイト読み込むため成功すれば戻り値は size。
	// エラーなら errno をセットして -1 を返す。EOF を超えるのもエラー扱い。
	static ssize_t readimg(int fd, void *dst, size_t size);

	// fd に src に size バイト書いてポインタを進める。
	// 必ず size バイト書き出すため成功すれば戻り値は size。
	// エラーなら errno をセットして -1 を返す。
	static ssize_t writeimg(int fd, const void *src, size_t size);

	// fd の offset から dst に size バイト読み込む。ポインタは移動しない。
	// 必ず size バイト読み込むため成功すれば戻り値は size。
	// エラーなら errno をセットして -1 を返す。EOF を超えるのもエラー扱い。
	static ssize_t readpos(int fd, void *dst, size_t size, off_t offset);

	// fd の offset に src から size バイト書き出す。ポインタは移動しない。
	// 必ず size バイト書き出すため成功すれば戻り値は size。
	// エラーなら errno をセットして -1 を返す。
	static ssize_t writepos(int fd, const void *src, size_t size, off_t offset);

	const std::string& pathname;

	// イメージサイズ。オープンされなければ 0。
	off_t filesize {};
};

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.