--- nono/host/diskimage.cpp 2026/04/29 17:05:30 1.1.1.6 +++ nono/host/diskimage.cpp 2026/04/29 17:06:02 1.1.1.8 @@ -9,17 +9,17 @@ // #include "diskimage.h" -#include "diskimage_raw.h" +#include "diskdriver_qcow2.h" +#include "diskdriver_raw.h" #include "mainapp.h" #include -// -// ディスクイメージクラス (外部向け) -// - // コンストラクタ DiskImage::DiskImage() + : inherited(OBJ_NONE) { + // ログ名は SetName() で設定するのと、 + // このオブジェクトを ID で検索することはないので、OBJ_NONE でいい。 } // デストラクタ @@ -28,6 +28,26 @@ DiskImage::~DiskImage() Close(); } +// このディスクイメージのログ表示名とログ指定名を設定する。 +// 歴史的経緯によりコンストラクタで指定できないので、ここで指定する。 +void +DiskImage::SetName(const std::string& name) +{ + // 名前は長いけどもうしょうがない。しょっちゅう指定するわけじゃないし…。 + inherited::SetName("HostImage-" + name); + ClearAlias(); + AddAlias(GetName()); +} + +void +DiskImage::SetLogLevel(int loglevel_) +{ + inherited::SetLogLevel(loglevel_); + if ((bool)driver) { + driver->SetLogLevel(loglevel_); + } +} + // パス名を指定して、下位ドライバをオープン bool DiskImage::CreateHandler(const std::string& pathname_) @@ -35,14 +55,35 @@ DiskImage::CreateHandler(const std::stri pathname = pathname_; cow_enable = false; - // 今の所 Raw しかない - driver.reset(new DiskImageRaw(pathname)); - if ((bool)driver) { - return true; + // ドライバを順に試す。 + std::string errmsg; + try { + driver.reset(new DiskDriverQcow2(GetName(), pathname)); + } catch (...) { } + if ((bool)driver && driver->Match()) { + goto match; } + + try { + driver.reset(new DiskDriverRaw(GetName(), pathname)); + } catch (...) { } + if ((bool)driver && driver->Match()) { + goto match; + } + return false; -} + match: + // 初期ログレベルをセット。 + driver->SetLogLevel(loglevel); + + if (driver->Attach(errmsg) == false) { + warn("%s: %s", pathname.c_str(), errmsg.c_str()); + return false; + } + + return true; +} // このディスクイメージが書き込み可能かどうかを返す。 // Open() 前でも動作する。 @@ -229,19 +270,3 @@ DiskImage::Write(const void *buf, off_t return true; } - - -// -// ディスクイメージドライバの基本クラス -// - -// コンストラクタ -DiskImageDriver::DiskImageDriver(const std::string& pathname_) - : pathname(pathname_) -{ -} - -// デストラクタ -DiskImageDriver::~DiskImageDriver() -{ -}