diff options
author | 2022-09-02 08:55:16 +1000 | |
---|---|---|
committer | 2022-09-02 08:55:16 +1000 | |
commit | 051c380fd14040c83a0d5b919e6289e70fef9df8 (patch) | |
tree | e247a309f4d1c66c07803c02d67ac89837211bd1 /src/osd/modules/file | |
parent | 67f129e31518a50a801413f732991972d2c3538a (diff) |
Patched up some gaps in functionality and fixed some bugs.
ui: Added some missing functionality:
* Added an option to copy input device IDs to the relevant menus.
* Added an item for setting the software lists files path (-hashpath) to
the folder setup menu.
* Allow pasting text from clipboard in most places that allow typing
(searching, entering filenames, entering barcodes).
* Changed the software selection menu heading to be a bit less
misleading.
* Made barcode menu less eager to rebuild itself unnecessarily, and
removed some confusing and apparently pointless code.
Exposed more Lua bindings:
* Added low-level palette objects.
* Added indexed bitmap types.
* Added a bitmap method for extracting pixels from a rectangular area as a
packed binary string.
* Changed screen device pixels method to return width and height in
addition to the pixels.
osd: Added some functionality and cleaned up a little:
* Added a function for copying text to the clipboard.
* Moved function for converting Windows error codes to standard error
conditions to winutil.cpp so it can be used from more places.
* Removed duplicate declaration of osd_get_clipboard_text and made the
function noexcept (including fixing implementations).
* Made macOS implementation of osd_get_clipboard_text skip the encoding
conversion if it finds UTF-8 text first.
* Changed the default -uimodekey setting so it doesn't lose the "not
shift" that stops the default from interfering with UI paste.
Various bug fixes:
* util/unicode.cpp: Fixed the version of utf8_from_uchar that returns
std::string blowing up on invalid codepoints.
* util/bitmap.h: Fixed wrapping constructors for indexed bitmaps taking
the wrong parameter type (nothing was using them before).
* util/bitmap.cpp: Fixed potential use-after-free issues with bitmap
palettes.
* emu/input.cpp, emu/inputdev.cpp: Log 1-based device numbers, matching
what's shown in the internal UI and used in tokens in CFG files.
* emu/emumem.cpp: Added the bank tag to a fatal error message where it
was missing.
docs: Reworked and expanded documentation on configuring stable
controller IDs.
For translators, the changes are quite minor:
* There's a menu item for copying a device ID to the clipboard, and
associated success/failure messages.
* There's the menu item for setting the software list file search path.
* One of the lines in the software selection menu heading has changes as
it could be interpreted as implying it showed a software list name.
Diffstat (limited to 'src/osd/modules/file')
-rw-r--r-- | src/osd/modules/file/winfile.cpp | 88 | ||||
-rw-r--r-- | src/osd/modules/file/winfile.h | 2 | ||||
-rw-r--r-- | src/osd/modules/file/winptty.cpp | 10 |
3 files changed, 16 insertions, 84 deletions
diff --git a/src/osd/modules/file/winfile.cpp b/src/osd/modules/file/winfile.cpp index 199537bbdee..173021121f1 100644 --- a/src/osd/modules/file/winfile.cpp +++ b/src/osd/modules/file/winfile.cpp @@ -62,12 +62,12 @@ public: LARGE_INTEGER largeOffset; largeOffset.QuadPart = offset; if (!SetFilePointerEx(m_handle, largeOffset, nullptr, FILE_BEGIN)) - return win_error_to_file_error(GetLastError()); + return win_error_to_error_condition(GetLastError()); // then perform the read DWORD result = 0; if (!ReadFile(m_handle, buffer, length, &result, nullptr)) - return win_error_to_file_error(GetLastError()); + return win_error_to_error_condition(GetLastError()); actual = result; return std::error_condition(); @@ -79,12 +79,12 @@ public: LARGE_INTEGER largeOffset; largeOffset.QuadPart = offset; if (!SetFilePointerEx(m_handle, largeOffset, nullptr, FILE_BEGIN)) - return win_error_to_file_error(GetLastError()); + return win_error_to_error_condition(GetLastError()); // then perform the write DWORD result = 0; if (!WriteFile(m_handle, buffer, length, &result, nullptr)) - return win_error_to_file_error(GetLastError()); + return win_error_to_error_condition(GetLastError()); actual = result; return std::error_condition(); @@ -96,11 +96,11 @@ public: LARGE_INTEGER largeOffset; largeOffset.QuadPart = offset; if (!SetFilePointerEx(m_handle, largeOffset, nullptr, FILE_BEGIN)) - return win_error_to_file_error(GetLastError()); + return win_error_to_error_condition(GetLastError()); // then perform the truncation if (!SetEndOfFile(m_handle)) - return win_error_to_file_error(GetLastError()); + return win_error_to_error_condition(GetLastError()); else return std::error_condition(); } @@ -229,7 +229,7 @@ std::error_condition osd_file::open(std::string const &orig_path, uint32_t openf // if we still failed, clean up and free if (INVALID_HANDLE_VALUE == h) - return win_error_to_file_error(err); + return win_error_to_error_condition(err); } // get the file size @@ -259,7 +259,7 @@ std::error_condition osd_file::open(std::string const &orig_path, uint32_t openf if (NO_ERROR != err) { CloseHandle(h); - return win_error_to_file_error(err); + return win_error_to_error_condition(err); } } @@ -299,7 +299,7 @@ std::error_condition osd_file::remove(std::string const &filename) noexcept std::error_condition filerr; if (!DeleteFile(tempstr.c_str())) - filerr = win_error_to_file_error(GetLastError()); + filerr = win_error_to_error_condition(GetLastError()); return filerr; } @@ -415,12 +415,12 @@ std::error_condition osd_get_full_path(std::string &dst, std::string const &path std::wstring const w_path(osd::text::to_wstring(path)); DWORD const length(GetFullPathNameW(w_path.c_str(), 0, nullptr, nullptr)); if (!length) - return win_error_to_file_error(GetLastError()); + return win_error_to_error_condition(GetLastError()); // allocate a buffer and get the canonical path std::unique_ptr<wchar_t []> buffer(std::make_unique<wchar_t []>(length)); if (!GetFullPathNameW(w_path.c_str(), length, buffer.get(), nullptr)) - return win_error_to_file_error(GetLastError()); + return win_error_to_error_condition(GetLastError()); // convert the result back to UTF-8 osd::text::from_wstring(dst, buffer.get()); @@ -534,69 +534,3 @@ bool osd_is_valid_filepath_char(char32_t uchar) noexcept && !(uchar >= '\x7F' && uchar <= '\x9F') && uchar_isvalid(uchar); } - - - -//============================================================ -// win_error_to_file_error -//============================================================ - -std::error_condition win_error_to_file_error(DWORD error) noexcept -{ - // TODO: work out if there's a better way to do this - switch (error) - { - case ERROR_SUCCESS: - return std::error_condition(); - - case ERROR_INVALID_HANDLE: - return std::errc::bad_file_descriptor; - - case ERROR_OUTOFMEMORY: - return std::errc::not_enough_memory; - - case ERROR_NOT_SUPPORTED: - return std::errc::not_supported; - - case ERROR_FILE_NOT_FOUND: - case ERROR_PATH_NOT_FOUND: - case ERROR_INVALID_NAME: - return std::errc::no_such_file_or_directory; - - case ERROR_FILENAME_EXCED_RANGE: - return std::errc::filename_too_long; - - case ERROR_ACCESS_DENIED: - case ERROR_SHARING_VIOLATION: - return std::errc::permission_denied; - - case ERROR_ALREADY_EXISTS: - return std::errc::file_exists; - - case ERROR_TOO_MANY_OPEN_FILES: - return std::errc::too_many_files_open; - - case ERROR_WRITE_FAULT: - case ERROR_READ_FAULT: - return std::errc::io_error; - - case ERROR_HANDLE_DISK_FULL: - case ERROR_DISK_FULL: - return std::errc::no_space_on_device; - - case ERROR_PATH_BUSY: - case ERROR_BUSY: - return std::errc::device_or_resource_busy; - - case ERROR_FILE_TOO_LARGE: - return std::errc::file_too_large; - - case ERROR_INVALID_ACCESS: - case ERROR_NEGATIVE_SEEK: - case ERROR_BAD_ARGUMENTS: - return std::errc::invalid_argument; - - default: - return std::error_condition(error, std::system_category()); - } -} diff --git a/src/osd/modules/file/winfile.h b/src/osd/modules/file/winfile.h index 83f0814733d..90cf6e69a60 100644 --- a/src/osd/modules/file/winfile.h +++ b/src/osd/modules/file/winfile.h @@ -32,6 +32,4 @@ std::error_condition win_open_socket(std::string const &path, std::uint32_t open bool win_check_ptty_path(std::string const &path) noexcept; std::error_condition win_open_ptty(std::string const &path, std::uint32_t openflags, osd_file::ptr &file, std::uint64_t &filesize) noexcept; -std::error_condition win_error_to_file_error(DWORD error) noexcept; - #endif // MAME_OSD_MODULES_FILE_WINFILE_H diff --git a/src/osd/modules/file/winptty.cpp b/src/osd/modules/file/winptty.cpp index 7feeacce137..9aac0c5a990 100644 --- a/src/osd/modules/file/winptty.cpp +++ b/src/osd/modules/file/winptty.cpp @@ -8,11 +8,11 @@ #include "winutil.h" #include <cassert> - -#include <windows.h> #include <cstdlib> #include <cstring> +#include <windows.h> + namespace { @@ -44,7 +44,7 @@ public: { DWORD bytes_read; if (!ReadFile(m_handle, buffer, count, &bytes_read, nullptr)) - return win_error_to_file_error(GetLastError()); + return win_error_to_error_condition(GetLastError()); actual = bytes_read; return std::error_condition(); @@ -54,7 +54,7 @@ public: { DWORD bytes_written; if (!WriteFile(m_handle, buffer, count, &bytes_written, nullptr)) - return win_error_to_file_error(GetLastError()); + return win_error_to_error_condition(GetLastError()); actual = bytes_written; return std::error_condition(); @@ -99,7 +99,7 @@ std::error_condition win_open_ptty(std::string const &path, std::uint32_t openfl if (openflags & OPEN_FLAG_CREATE) pipe = CreateNamedPipe(t_name.c_str(), PIPE_ACCESS_DUPLEX, PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_NOWAIT, 1, 32, 32, 0, nullptr); if (INVALID_HANDLE_VALUE == pipe) - return win_error_to_file_error(GetLastError()); + return win_error_to_error_condition(GetLastError()); } else { |