diff --git a/cpp/list_devices.cpp b/cpp/list_devices.cpp new file mode 100644 index 00000000..5ecf9da2 --- /dev/null +++ b/cpp/list_devices.cpp @@ -0,0 +1,65 @@ +//--------------------------------------------------------------------------- +// +// SCSI Target Emulator RaSCSI Reloaded +// for Raspberry Pi +// +// Copyright (C) 2021-22 Uwe Seimet +// Copyright (C) 2022 akuker +// +//--------------------------------------------------------------------------- + +#include "rascsi_version.h" +#include "rasutil.h" +#include + +using namespace std; +using namespace rascsi_interface; + +string ras_util::ListDevices(const list& pb_devices) +{ + if (pb_devices.empty()) { + return "No devices currently attached.\n"; + } + + ostringstream s; + s << "+----+-----+------+-------------------------------------\n" + << "| ID | LUN | TYPE | IMAGE FILE\n" + << "+----+-----+------+-------------------------------------\n"; + + list devices = pb_devices; + devices.sort([](const auto& a, const auto& b) { return a.id() < b.id() || a.unit() < b.unit(); }); + + for (const auto& device : devices) { + string filename; + switch (device.type()) { + case SCBR: + filename = "X68000 HOST BRIDGE"; + break; + + case SCDP: + filename = "DaynaPort SCSI/Link"; + break; + + case SCHS: + filename = "Host Services"; + break; + + case SCLP: + filename = "SCSI Printer"; + break; + + default: + filename = device.file().name(); + break; + } + + s << "| " << device.id() << " | " << device.unit() << " | " << PbDeviceType_Name(device.type()) << " | " + << (filename.empty() ? "NO MEDIUM" : filename) + << (!device.status().removed() && (device.properties().read_only() || device.status().protected_()) ? " (READ-ONLY)" : "") + << '\n'; + } + + s << "+----+-----+------+-------------------------------------\n"; + + return s.str(); +} diff --git a/cpp/list_devices.h b/cpp/list_devices.h new file mode 100644 index 00000000..a1f63322 --- /dev/null +++ b/cpp/list_devices.h @@ -0,0 +1,24 @@ +//--------------------------------------------------------------------------- +// +// SCSI Target Emulator RaSCSI Reloaded +// for Raspberry Pi +// +// Copyright (C) 2021 Uwe Seimet +// Copyright (C) 2022 akuker +// +// Helper method to list devices in a table for rascsi & rasctl +// +//--------------------------------------------------------------------------- + +#pragma once + +#include +#include +#include "rascsi_interface.pb.h" + +using namespace std; + +namespace ras_util +{ + string ListDevices(const list&); +} diff --git a/cpp/rascsi.cpp b/cpp/rascsi.cpp index 4c5b698f..a93d2b79 100644 --- a/cpp/rascsi.cpp +++ b/cpp/rascsi.cpp @@ -39,6 +39,7 @@ #include #include #include +#include using namespace std; using namespace spdlog; diff --git a/cpp/rasutil.cpp b/cpp/rasutil.cpp index 1c07e835..3e973930 100644 --- a/cpp/rasutil.cpp +++ b/cpp/rasutil.cpp @@ -4,6 +4,7 @@ // for Raspberry Pi // // Copyright (C) 2021-22 Uwe Seimet +// Copyright (C) 2022 akuker // //--------------------------------------------------------------------------- @@ -48,55 +49,6 @@ string ras_util::Banner(const string& app) return s.str(); } -string ras_util::ListDevices(const list& pb_devices) -{ - if (pb_devices.empty()) { - return "No devices currently attached.\n"; - } - - ostringstream s; - s << "+----+-----+------+-------------------------------------\n" - << "| ID | LUN | TYPE | IMAGE FILE\n" - << "+----+-----+------+-------------------------------------\n"; - - list devices = pb_devices; - devices.sort([](const auto& a, const auto& b) { return a.id() < b.id() || a.unit() < b.unit(); }); - - for (const auto& device : devices) { - string filename; - switch (device.type()) { - case SCBR: - filename = "X68000 HOST BRIDGE"; - break; - - case SCDP: - filename = "DaynaPort SCSI/Link"; - break; - - case SCHS: - filename = "Host Services"; - break; - - case SCLP: - filename = "SCSI Printer"; - break; - - default: - filename = device.file().name(); - break; - } - - s << "| " << device.id() << " | " << device.unit() << " | " << PbDeviceType_Name(device.type()) << " | " - << (filename.empty() ? "NO MEDIUM" : filename) - << (!device.status().removed() && (device.properties().read_only() || device.status().protected_()) ? " (READ-ONLY)" : "") - << '\n'; - } - - s << "+----+-----+------+-------------------------------------\n"; - - return s.str(); -} - string ras_util::GetExtensionLowerCase(const string& filename) { string ext;