diff options
-rw-r--r-- | src/PlaylistSave.cxx | 30 | ||||
-rw-r--r-- | src/db/update/ExcludeList.cxx | 12 | ||||
-rw-r--r-- | src/fs/Charset.cxx | 19 | ||||
-rw-r--r-- | src/lib/icu/Collate.cxx | 36 | ||||
-rw-r--r-- | src/lib/icu/Win32.cxx | 9 | ||||
-rw-r--r-- | src/lib/icu/Win32.hxx | 6 |
6 files changed, 72 insertions, 40 deletions
diff --git a/src/PlaylistSave.cxx b/src/PlaylistSave.cxx index 23e6f3f49..c8010b3d7 100644 --- a/src/PlaylistSave.cxx +++ b/src/PlaylistSave.cxx @@ -33,6 +33,8 @@ #include "fs/io/BufferedOutputStream.hxx" #include "util/UriUtil.hxx" +#include <stdexcept> + void playlist_print_song(BufferedOutputStream &os, const DetachedSong &song) { @@ -40,25 +42,31 @@ playlist_print_song(BufferedOutputStream &os, const DetachedSong &song) ? song.GetRealURI() : song.GetURI(); - const auto uri_fs = AllocatedPath::FromUTF8(uri_utf8); - if (!uri_fs.IsNull()) - os.Format("%s\n", NarrowPath(uri_fs).c_str()); + try { + const auto uri_fs = AllocatedPath::FromUTF8(uri_utf8); + if (!uri_fs.IsNull()) + os.Format("%s\n", NarrowPath(uri_fs).c_str()); + } catch (const std::runtime_error &) { + } } void playlist_print_uri(BufferedOutputStream &os, const char *uri) { - auto path = + try { + auto path = #ifdef ENABLE_DATABASE - playlist_saveAbsolutePaths && !uri_has_scheme(uri) && - !PathTraitsUTF8::IsAbsolute(uri) - ? map_uri_fs(uri) - : + playlist_saveAbsolutePaths && !uri_has_scheme(uri) && + !PathTraitsUTF8::IsAbsolute(uri) + ? map_uri_fs(uri) + : #endif - AllocatedPath::FromUTF8(uri); + AllocatedPath::FromUTF8(uri); - if (!path.IsNull()) - os.Format("%s\n", NarrowPath(path).c_str()); + if (!path.IsNull()) + os.Format("%s\n", NarrowPath(path).c_str()); + } catch (const std::runtime_error &) { + } } void diff --git a/src/db/update/ExcludeList.cxx b/src/db/update/ExcludeList.cxx index c1dc9face..5c15ad6da 100644 --- a/src/db/update/ExcludeList.cxx +++ b/src/db/update/ExcludeList.cxx @@ -30,6 +30,8 @@ #include "system/Error.hxx" #include "Log.hxx" +#include <stdexcept> + #include <assert.h> #include <string.h> @@ -78,9 +80,13 @@ ExcludeList::Check(Path name_fs) const } } - for (const auto &i : patterns) - if (i.Check(NarrowPath(name_fs).c_str())) - return true; + for (const auto &i : patterns) { + try { + if (i.Check(NarrowPath(name_fs).c_str())) + return true; + } catch (const std::runtime_error &) { + } + } #else /* not implemented */ (void)name_fs; diff --git a/src/fs/Charset.cxx b/src/fs/Charset.cxx index c44238faa..f91920819 100644 --- a/src/fs/Charset.cxx +++ b/src/fs/Charset.cxx @@ -30,6 +30,7 @@ #endif #include <algorithm> +#include <stdexcept> #include <assert.h> #include <string.h> @@ -100,11 +101,12 @@ PathToUTF8(PathTraitsFS::const_pointer_type path_fs) #endif #ifdef WIN32 - const auto buffer = WideCharToMultiByte(CP_UTF8, path_fs); - if (buffer.IsNull()) + try { + const auto buffer = WideCharToMultiByte(CP_UTF8, path_fs); + return FixSeparators(PathTraitsUTF8::string(buffer.c_str())); + } catch (const std::runtime_error &) { return PathTraitsUTF8::string(); - - return FixSeparators(PathTraitsUTF8::string(buffer.c_str())); + } #else #ifdef HAVE_FS_CHARSET if (fs_converter == nullptr) @@ -132,11 +134,12 @@ PathFromUTF8(PathTraitsUTF8::const_pointer_type path_utf8) #endif #ifdef WIN32 - const auto buffer = MultiByteToWideChar(CP_UTF8, path_utf8); - if (buffer.IsNull()) + try { + const auto buffer = MultiByteToWideChar(CP_UTF8, path_utf8); + return PathTraitsFS::string(buffer.c_str()); + } catch (const std::runtime_error &) { return PathTraitsFS::string(); - - return PathTraitsFS::string(buffer.c_str()); + } #else if (fs_converter == nullptr) return path_utf8; diff --git a/src/lib/icu/Collate.cxx b/src/lib/icu/Collate.cxx index 77826e13e..aa5df4e47 100644 --- a/src/lib/icu/Collate.cxx +++ b/src/lib/icu/Collate.cxx @@ -42,6 +42,7 @@ #endif #include <memory> +#include <stdexcept> #include <assert.h> #include <string.h> @@ -108,12 +109,24 @@ IcuCollate(const char *a, const char *b) #endif #elif defined(WIN32) - const auto wa = MultiByteToWideChar(CP_UTF8, a); - const auto wb = MultiByteToWideChar(CP_UTF8, b); - if (wa.IsNull()) - return wb.IsNull() ? 0 : -1; - else if (wb.IsNull()) + AllocatedString<wchar_t> wa = nullptr, wb = nullptr; + + try { + wa = MultiByteToWideChar(CP_UTF8, a); + } catch (const std::runtime_error &) { + try { + wb = MultiByteToWideChar(CP_UTF8, b); + return -1; + } catch (const std::runtime_error &) { + return 0; + } + } + + try { + wb = MultiByteToWideChar(CP_UTF8, b); + } catch (const std::runtime_error &) { return 1; + } auto result = CompareStringEx(LOCALE_NAME_INVARIANT, LINGUISTIC_IGNORECASE, @@ -134,7 +147,7 @@ IcuCollate(const char *a, const char *b) AllocatedString<> IcuCaseFold(const char *src) -{ +try { #ifdef HAVE_ICU assert(collator != nullptr); #if !CLANG_CHECK_VERSION(3,6) @@ -161,8 +174,6 @@ IcuCaseFold(const char *src) #elif defined(WIN32) const auto u = MultiByteToWideChar(CP_UTF8, src); - if (u.IsNull()) - return AllocatedString<>::Duplicate(src); const int size = LCMapStringEx(LOCALE_NAME_INVARIANT, LCMAP_SORTKEY|LINGUISTIC_IGNORECASE, @@ -178,11 +189,7 @@ IcuCaseFold(const char *src) nullptr, nullptr, 0) <= 0) return AllocatedString<>::Duplicate(src); - auto result = WideCharToMultiByte(CP_UTF8, buffer.get()); - if (result.IsNull()) - return AllocatedString<>::Duplicate(src); - - return result; + return WideCharToMultiByte(CP_UTF8, buffer.get()); #else size_t size = strlen(src) + 1; @@ -201,5 +208,6 @@ IcuCaseFold(const char *src) return AllocatedString<>::Donate(buffer.release()); #endif +} catch (const std::runtime_error &) { + return AllocatedString<>::Duplicate(src); } - diff --git a/src/lib/icu/Win32.cxx b/src/lib/icu/Win32.cxx index 862ccf67b..0bc694dc8 100644 --- a/src/lib/icu/Win32.cxx +++ b/src/lib/icu/Win32.cxx @@ -19,6 +19,7 @@ #include "config.h" #include "Win32.hxx" +#include "system/Error.hxx" #include "util/AllocatedString.hxx" #include <memory> @@ -31,14 +32,14 @@ WideCharToMultiByte(unsigned code_page, const wchar_t *src) int length = WideCharToMultiByte(code_page, 0, src, -1, nullptr, 0, nullptr, nullptr); if (length <= 0) - return nullptr; + throw MakeLastError("Failed to convert from Unicode"); std::unique_ptr<char[]> buffer(new char[length]); length = WideCharToMultiByte(code_page, 0, src, -1, buffer.get(), length, nullptr, nullptr); if (length <= 0) - return nullptr; + throw MakeLastError("Failed to convert from Unicode"); return AllocatedString<char>::Donate(buffer.release()); } @@ -48,13 +49,13 @@ MultiByteToWideChar(unsigned code_page, const char *src) { int length = MultiByteToWideChar(code_page, 0, src, -1, nullptr, 0); if (length <= 0) - return nullptr; + throw MakeLastError("Failed to convert to Unicode"); std::unique_ptr<wchar_t[]> buffer(new wchar_t[length]); length = MultiByteToWideChar(code_page, 0, src, -1, buffer.get(), length); if (length <= 0) - return nullptr; + throw MakeLastError("Failed to convert to Unicode"); return AllocatedString<wchar_t>::Donate(buffer.release()); } diff --git a/src/lib/icu/Win32.hxx b/src/lib/icu/Win32.hxx index 40b92c6de..7afc45d7b 100644 --- a/src/lib/icu/Win32.hxx +++ b/src/lib/icu/Win32.hxx @@ -27,10 +27,16 @@ template<typename T> class AllocatedString; +/** + * Throws std::system_error on error. + */ gcc_pure gcc_nonnull_all AllocatedString<char> WideCharToMultiByte(unsigned code_page, const wchar_t *src); +/** + * Throws std::system_error on error. + */ gcc_pure gcc_nonnull_all AllocatedString<wchar_t> MultiByteToWideChar(unsigned code_page, const char *src); |