diff options
Diffstat (limited to 'src/frontend/mame/ui/floppycntrl.cpp')
-rw-r--r-- | src/frontend/mame/ui/floppycntrl.cpp | 170 |
1 files changed, 170 insertions, 0 deletions
diff --git a/src/frontend/mame/ui/floppycntrl.cpp b/src/frontend/mame/ui/floppycntrl.cpp new file mode 100644 index 00000000000..05a4e03c825 --- /dev/null +++ b/src/frontend/mame/ui/floppycntrl.cpp @@ -0,0 +1,170 @@ +// license:BSD-3-Clause +// copyright-holders:Olivier Galibert +/*************************************************************************** + + ui/floppycntrl.cpp + +***************************************************************************/ + +#include "emu.h" +#include "zippath.h" +#include "ui/menu.h" +#include "ui/imgcntrl.h" +#include "ui/filesel.h" +#include "ui/floppycntrl.h" + +/*************************************************************************** + IMPLEMENTATION +***************************************************************************/ + +ui_menu_control_floppy_image::ui_menu_control_floppy_image(running_machine &machine, render_container *container, device_image_interface *_image) : ui_menu_control_device_image(machine, container, _image) +{ + floppy_image_device *fd = static_cast<floppy_image_device *>(image); + const floppy_image_format_t *fif_list = fd->get_formats(); + int fcnt = 0; + for(const floppy_image_format_t *i = fif_list; i; i = i->next) + fcnt++; + + format_array = global_alloc_array(floppy_image_format_t *, fcnt); + input_format = output_format = nullptr; + input_filename = output_filename = ""; +} + +ui_menu_control_floppy_image::~ui_menu_control_floppy_image() +{ + global_free_array(format_array); +} + +void ui_menu_control_floppy_image::do_load_create() +{ + floppy_image_device *fd = static_cast<floppy_image_device *>(image); + if(input_filename.compare("")==0) { + int err = fd->create(output_filename.c_str(), nullptr, nullptr); + if (err != 0) { + machine().popmessage("Error: %s", fd->error()); + return; + } + fd->setup_write(output_format); + } else { + int err = fd->load(input_filename.c_str()); + if (!err && output_filename.compare("") != 0) + err = fd->reopen_for_write(output_filename.c_str()); + if(err != 0) { + machine().popmessage("Error: %s", fd->error()); + return; + } + if(output_format) + fd->setup_write(output_format); + } +} + +void ui_menu_control_floppy_image::hook_load(std::string filename, bool softlist) +{ + if (softlist) + { + machine().popmessage("When loaded from software list, the disk is Read-only.\n"); + image->load(filename.c_str()); + ui_menu::stack_pop(machine()); + return; + } + + input_filename = filename; + input_format = static_cast<floppy_image_device *>(image)->identify(filename); + + if (!input_format) + { + machine().popmessage("Error: %s\n", image->error()); + ui_menu::stack_pop(machine()); + return; + } + + bool can_in_place = input_format->supports_save(); + if(can_in_place) { + osd_file::error filerr; + std::string tmp_path; + util::core_file::ptr tmp_file; + // attempt to open the file for writing but *without* create + filerr = util::zippath_fopen(filename.c_str(), OPEN_FLAG_READ | OPEN_FLAG_WRITE, tmp_file, tmp_path); + if(filerr == osd_file::error::NONE) + tmp_file.reset(); + else + can_in_place = false; + } + submenu_result = -1; + ui_menu::stack_push(global_alloc_clear<ui_menu_select_rw>(machine(), container, can_in_place, &submenu_result)); + state = SELECT_RW; +} + +void ui_menu_control_floppy_image::handle() +{ + floppy_image_device *fd = static_cast<floppy_image_device *>(image); + switch (state) { + case DO_CREATE: { + floppy_image_format_t *fif_list = fd->get_formats(); + int ext_match; + int total_usable = 0; + for(floppy_image_format_t *i = fif_list; i; i = i->next) { + if(!i->supports_save()) + continue; + if (i->extension_matches(current_file.c_str())) + format_array[total_usable++] = i; + } + ext_match = total_usable; + for(floppy_image_format_t *i = fif_list; i; i = i->next) { + if(!i->supports_save()) + continue; + if (!i->extension_matches(current_file.c_str())) + format_array[total_usable++] = i; + } + submenu_result = -1; + ui_menu::stack_push(global_alloc_clear<ui_menu_select_format>(machine(), container, format_array, ext_match, total_usable, &submenu_result)); + + state = SELECT_FORMAT; + break; + } + + case SELECT_FORMAT: + if(submenu_result == -1) { + state = START_FILE; + handle(); + } else { + util::zippath_combine(output_filename, current_directory.c_str(), current_file.c_str()); + output_format = format_array[submenu_result]; + do_load_create(); + ui_menu::stack_pop(machine()); + } + break; + + case SELECT_RW: + switch(submenu_result) { + case ui_menu_select_rw::READONLY: + do_load_create(); + ui_menu::stack_pop(machine()); + break; + + case ui_menu_select_rw::READWRITE: + output_format = input_format; + do_load_create(); + ui_menu::stack_pop(machine()); + break; + + case ui_menu_select_rw::WRITE_DIFF: + machine().popmessage("Sorry, diffs are not supported yet\n"); + ui_menu::stack_pop(machine()); + break; + + case ui_menu_select_rw::WRITE_OTHER: + ui_menu::stack_push(global_alloc_clear<ui_menu_file_create>(machine(), container, image, current_directory, current_file, &create_ok)); + state = CHECK_CREATE; + break; + + case -1: + state = START_FILE; + break; + } + break; + + default: + ui_menu_control_device_image::handle(); + } +}
\ No newline at end of file |