summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/PlaylistSave.cxx30
-rw-r--r--src/db/update/ExcludeList.cxx12
-rw-r--r--src/fs/Charset.cxx19
-rw-r--r--src/lib/icu/Collate.cxx36
-rw-r--r--src/lib/icu/Win32.cxx9
-rw-r--r--src/lib/icu/Win32.hxx6
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);