lib/icu/Win32: throw exception on error
This commit is contained in:
parent
e228144159
commit
b9f535cd49
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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());
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue