summaryrefslogtreecommitdiffstatshomepage
path: root/src/osd/modules/file
diff options
context:
space:
mode:
author Vas Crabb <vas@vastheman.com>2022-09-02 08:55:16 +1000
committer Vas Crabb <vas@vastheman.com>2022-09-02 08:55:16 +1000
commit051c380fd14040c83a0d5b919e6289e70fef9df8 (patch)
treee247a309f4d1c66c07803c02d67ac89837211bd1 /src/osd/modules/file
parent67f129e31518a50a801413f732991972d2c3538a (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.cpp88
-rw-r--r--src/osd/modules/file/winfile.h2
-rw-r--r--src/osd/modules/file/winptty.cpp10
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
{