summaryrefslogtreecommitdiffstatshomepage
path: root/src/frontend/mame/ui/floppycntrl.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/frontend/mame/ui/floppycntrl.cpp')
-rw-r--r--src/frontend/mame/ui/floppycntrl.cpp149
1 files changed, 92 insertions, 57 deletions
diff --git a/src/frontend/mame/ui/floppycntrl.cpp b/src/frontend/mame/ui/floppycntrl.cpp
index ee7740c76d1..3f6f9bdfb61 100644
--- a/src/frontend/mame/ui/floppycntrl.cpp
+++ b/src/frontend/mame/ui/floppycntrl.cpp
@@ -12,8 +12,13 @@
#include "ui/filecreate.h"
#include "ui/floppycntrl.h"
+#include "formats/flopimg.h"
+#include "formats/fsmgr.h"
+
#include "zippath.h"
+#include <tuple>
+
namespace ui {
@@ -38,26 +43,28 @@ menu_control_floppy_image::~menu_control_floppy_image()
void menu_control_floppy_image::do_load_create()
{
- if(input_filename.compare("")==0) {
- image_init_result err = fd.create(output_filename, nullptr, nullptr);
- if (err != image_init_result::PASS) {
- machine().popmessage("Error: %s", fd.error());
+ if(input_filename.empty()) {
+ auto [err, message] = fd.create(output_filename, nullptr, nullptr);
+ if (err) {
+ machine().popmessage(_("Error creating floppy image: %1$s"), !message.empty() ? message : err.message());
return;
}
if (create_fs) {
// HACK: ensure the floppy_image structure is created since device_image_interface may not otherwise do so during "init phase"
- err = fd.finish_load();
- if (err == image_init_result::PASS) {
- fs_meta_data meta;
+ err = fd.finish_load().first;
+ if (!err) {
+ fs::meta_data meta;
fd.init_fs(create_fs, meta);
}
}
} else {
- image_init_result err = fd.load(input_filename);
- if ((err == image_init_result::PASS) && (output_filename.compare("") != 0))
- err = fd.reopen_for_write(output_filename) ? image_init_result::FAIL : image_init_result::PASS;
- if (err != image_init_result::PASS) {
- machine().popmessage("Error: %s", fd.error());
+ auto [err, message] = fd.load(input_filename);
+ if (!err && !output_filename.empty()) {
+ message.clear();
+ err = fd.reopen_for_write(output_filename);
+ }
+ if (err) {
+ machine().popmessage(_("Error opening floppy image: %1$s"), !message.empty() ? message : err.message());
return;
}
}
@@ -67,18 +74,20 @@ void menu_control_floppy_image::do_load_create()
void menu_control_floppy_image::hook_load(const std::string &filename)
{
+ std::error_condition err;
input_filename = filename;
- input_format = static_cast<floppy_image_device &>(m_image).identify(filename);
+ std::tie(err, input_format) = static_cast<floppy_image_device &>(m_image).identify(filename);
if (!input_format)
{
- machine().popmessage("Error: %s\n", m_image.error());
+ machine().popmessage("Error: %s", err.message());
stack_pop();
}
else
{
bool can_in_place = input_format->supports_save();
- if(can_in_place) {
+ if (can_in_place)
+ {
std::string tmp_path;
util::core_file::ptr tmp_file;
// attempt to open the file for writing but *without* create
@@ -88,25 +97,62 @@ void menu_control_floppy_image::hook_load(const std::string &filename)
else
can_in_place = false;
}
- m_submenu_result.rw = menu_select_rw::result::INVALID;
- menu::stack_push<menu_select_rw>(ui(), container(), can_in_place, m_submenu_result.rw);
- m_state = SELECT_RW;
+ menu::stack_push<menu_select_rw>(
+ ui(),
+ container(),
+ can_in_place,
+ [this] (menu_select_rw::result result)
+ {
+ switch (result)
+ {
+ case menu_select_rw::result::READONLY:
+ do_load_create();
+ fd.setup_write(nullptr);
+ stack_pop();
+ break;
+
+ case menu_select_rw::result::READWRITE:
+ output_format = input_format;
+ do_load_create();
+ stack_pop();
+ break;
+
+ case menu_select_rw::result::WRITE_DIFF:
+ machine().popmessage("Sorry, diffs are not supported yet\n");
+ stack_pop();
+ break;
+
+ case menu_select_rw::result::WRITE_OTHER:
+ menu::stack_push<menu_file_create>(ui(), container(), &m_image, m_current_directory, m_current_file, m_create_ok);
+ m_state = CHECK_CREATE;
+ break;
+
+ case menu_select_rw::result::INVALID:
+ m_state = START_FILE;
+ break;
+ }
+ });
}
}
+bool menu_control_floppy_image::can_format(const floppy_image_device::fs_info &fs)
+{
+ return !fs.m_manager || fs.m_manager->can_format();
+}
+
void menu_control_floppy_image::menu_activated()
{
switch (m_state) {
case DO_CREATE: {
- std::vector<floppy_image_format_t *> format_array;
- for(floppy_image_format_t *i : fd.get_formats()) {
+ std::vector<const floppy_image_format_t *> format_array;
+ for(const floppy_image_format_t *i : fd.get_formats()) {
if(!i->supports_save())
continue;
if (i->extension_matches(m_current_file.c_str()))
format_array.push_back(i);
}
int ext_match = format_array.size();
- for(floppy_image_format_t *i : fd.get_formats()) {
+ for(const floppy_image_format_t *i : fd.get_formats()) {
if(!i->supports_save())
continue;
if (!i->extension_matches(m_current_file.c_str()))
@@ -124,62 +170,51 @@ void menu_control_floppy_image::menu_activated()
m_state = START_FILE;
menu_activated();
} else {
- const auto &fs = fd.get_create_fs();
+ // get all formatable file systems
+ std::vector<std::reference_wrapper<const floppy_image_device::fs_info>> fs;
+ for (const auto &this_fs : fd.get_fs()) {
+ if (can_format(this_fs))
+ fs.emplace_back(std::ref(this_fs));
+ }
+
output_filename = util::zippath_combine(m_current_directory, m_current_file);
if(fs.size() == 1) {
- create_fs = &fs[0];
+ create_fs = &(fs[0].get());
do_load_create();
stack_pop();
} else {
m_submenu_result.i = -1;
- menu::stack_push<menu_select_floppy_init>(ui(), container(), fs, &m_submenu_result.i);
+ menu::stack_push<menu_select_floppy_init>(ui(), container(), std::move(fs), &m_submenu_result.i);
m_state = SELECT_INIT;
}
}
break;
case SELECT_INIT:
- if(m_submenu_result.i == -1) {
+ // figure out which (if any) create file system was selected
+ create_fs = nullptr;
+ if(m_submenu_result.i >= 0) {
+ int i = 0;
+ for (const auto &this_fs : fd.get_fs()) {
+ if (can_format(this_fs)) {
+ if (i == m_submenu_result.i) {
+ create_fs = &this_fs;
+ break;
+ }
+ i++;
+ }
+ }
+ }
+
+ if(!create_fs) {
m_state = START_FILE;
menu_activated();
} else {
- create_fs = &fd.get_create_fs()[m_submenu_result.i];
do_load_create();
stack_pop();
}
break;
- case SELECT_RW:
- switch(m_submenu_result.rw) {
- case menu_select_rw::result::READONLY:
- do_load_create();
- fd.setup_write(nullptr);
- stack_pop();
- break;
-
- case menu_select_rw::result::READWRITE:
- output_format = input_format;
- do_load_create();
- stack_pop();
- break;
-
- case menu_select_rw::result::WRITE_DIFF:
- machine().popmessage("Sorry, diffs are not supported yet\n");
- stack_pop();
- break;
-
- case menu_select_rw::result::WRITE_OTHER:
- menu::stack_push<menu_file_create>(ui(), container(), &m_image, m_current_directory, m_current_file, m_create_ok);
- m_state = CHECK_CREATE;
- break;
-
- case menu_select_rw::result::INVALID:
- m_state = START_FILE;
- menu_activated();
- break;
- }
- break;
-
default:
menu_control_device_image::menu_activated();
}