You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
80 lines
1.5 KiB
C++
80 lines
1.5 KiB
C++
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
// Copyright The Music Player Daemon Project
|
|
|
|
#pragma once
|
|
|
|
#include "lib/icu/Features.h" // for HAVE_ICU, HAVE_ICONV
|
|
|
|
#ifdef HAVE_ICU
|
|
#include "thread/Mutex.hxx"
|
|
#define HAVE_ICU_CONVERTER
|
|
#elif defined(HAVE_ICONV)
|
|
#include <iconv.h>
|
|
#define HAVE_ICU_CONVERTER
|
|
#endif
|
|
|
|
#ifdef HAVE_ICU_CONVERTER
|
|
|
|
#include <memory>
|
|
#include <string_view>
|
|
|
|
#ifdef HAVE_ICU
|
|
struct UConverter;
|
|
#endif
|
|
|
|
class AllocatedString;
|
|
|
|
/**
|
|
* This class can convert strings with a certain character set to and
|
|
* from UTF-8.
|
|
*/
|
|
class IcuConverter {
|
|
#ifdef HAVE_ICU
|
|
/**
|
|
* ICU's UConverter class is not thread-safe. This mutex
|
|
* serializes simultaneous calls.
|
|
*/
|
|
mutable Mutex mutex;
|
|
|
|
UConverter *const converter;
|
|
|
|
IcuConverter(UConverter *_converter):converter(_converter) {}
|
|
#elif defined(HAVE_ICONV)
|
|
const iconv_t to_utf8, from_utf8;
|
|
|
|
IcuConverter(iconv_t _to, iconv_t _from)
|
|
:to_utf8(_to), from_utf8(_from) {}
|
|
#endif
|
|
|
|
public:
|
|
#ifdef HAVE_ICU
|
|
~IcuConverter() noexcept;
|
|
#elif defined(HAVE_ICONV)
|
|
~IcuConverter() noexcept {
|
|
iconv_close(to_utf8);
|
|
iconv_close(from_utf8);
|
|
}
|
|
#endif
|
|
|
|
/**
|
|
* Throws std::runtime_error on error.
|
|
*/
|
|
static std::unique_ptr<IcuConverter> Create(const char *charset);
|
|
|
|
/**
|
|
* Convert the string to UTF-8.
|
|
*
|
|
* Throws std::runtime_error on error.
|
|
*/
|
|
AllocatedString ToUTF8(std::string_view s) const;
|
|
|
|
/**
|
|
* Convert the string from UTF-8.
|
|
*
|
|
* Throws std::runtime_error on error.
|
|
*/
|
|
AllocatedString FromUTF8(std::string_view s) const;
|
|
};
|
|
|
|
#endif
|