// // Copyright (c) 2019 Mika Fischer (mika.fischer@zoopnet.de) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // // Official repository: https://github.com/boostorg/beast // #ifndef BOOST_BEAST_CORE_DETAIL_WIN32_UNICODE_PATH_HPP #define BOOST_BEAST_CORE_DETAIL_WIN32_UNICODE_PATH_HPP #ifdef _WIN32 #include #include #include #include #include #include #include namespace boost { namespace beast { namespace detail { class win32_unicode_path { using WCHAR_ = boost::winapi::WCHAR_; public: win32_unicode_path(const char* utf8_path, error_code& ec) { int ret = mb2wide(utf8_path, static_buf_.data(), static_buf_.size()); if (ret == 0) { int sz = mb2wide(utf8_path, nullptr, 0); if (sz == 0) { ec.assign(boost::winapi::GetLastError(), system_category()); return; } dynamic_buf_.resize(sz); int ret2 = mb2wide(utf8_path, dynamic_buf_.data(), dynamic_buf_.size()); if (ret2 == 0) { ec.assign(boost::winapi::GetLastError(), system_category()); return; } } } WCHAR_ const* c_str() const noexcept { return dynamic_buf_.empty() ? static_buf_.data() : dynamic_buf_.data(); } private: int mb2wide(const char* utf8_path, WCHAR_* buf, size_t sz) { return boost::winapi::MultiByteToWideChar( boost::winapi::CP_UTF8_, boost::winapi::MB_ERR_INVALID_CHARS_, utf8_path, -1, buf, static_cast(sz)); } std::array static_buf_; std::vector dynamic_buf_; }; } // detail } // beast } // boost #endif #endif