diff --git a/src/chainloader/meson.build b/src/chainloader/meson.build index 4980a112..8e679137 100644 --- a/src/chainloader/meson.build +++ b/src/chainloader/meson.build @@ -19,6 +19,7 @@ vst2_chainloader_sources = files( '../common/linking.cpp', '../common/notifications.cpp', '../common/process.cpp', + '../common/utils.cpp', 'utils.cpp', 'vst2-chainloader.cpp', ) @@ -29,6 +30,7 @@ if with_clap '../common/linking.cpp', '../common/notifications.cpp', '../common/process.cpp', + '../common/utils.cpp', 'utils.cpp', 'clap-chainloader.cpp', ) @@ -40,6 +42,7 @@ if with_vst3 '../common/linking.cpp', '../common/notifications.cpp', '../common/process.cpp', + '../common/utils.cpp', 'utils.cpp', 'vst3-chainloader.cpp', ) diff --git a/src/common/notifications.cpp b/src/common/notifications.cpp index 3f16f6c6..2f19bb71 100644 --- a/src/common/notifications.cpp +++ b/src/common/notifications.cpp @@ -168,112 +168,3 @@ bool send_notification(const std::string& title, }, result); } - -std::string xml_escape(std::string string) { - // Implementation idea stolen from https://stackoverflow.com/a/5665377 - std::string escaped; - escaped.reserve( - static_cast(static_cast(string.size()) * 1.1)); - for (const char& character : string) { - switch (character) { - case '&': - escaped.append("&"); - break; - case '\"': - escaped.append("""); - break; - case '\'': - escaped.append("'"); - break; - case '<': - escaped.append("<"); - break; - case '>': - escaped.append(">"); - break; - default: - escaped.push_back(character); - break; - } - } - - return escaped; -} - -std::string url_encode_path(std::string path) { - // We only need to escape a couple of special characters here. This is used - // in the notifications as well as in the XDND proxy. We encode the reserved - // characters mentioned here, with the exception of the forward slash: - // https://en.wikipedia.org/wiki/Percent-encoding#Reserved_characters - std::string escaped; - escaped.reserve( - static_cast(static_cast(path.size()) * 1.1)); - for (const char& character : path) { - switch (character) { - // Spaces are somehow in the above list, but Bitwig Studio requires - // spaces to be escaped in the `text/uri-list` format - case ' ': - escaped.append("%20"); - break; - case '!': - escaped.append("%21"); - break; - case '#': - escaped.append("%23"); - break; - case '$': - escaped.append("%24"); - break; - case '%': - escaped.append("%25"); - break; - case '&': - escaped.append("%26"); - break; - case '\'': - escaped.append("%27"); - break; - case '(': - escaped.append("%28"); - break; - case ')': - escaped.append("%29"); - break; - case '*': - escaped.append("%2A"); - break; - case '+': - escaped.append("%2B"); - break; - case ',': - escaped.append("%2C"); - break; - case ':': - escaped.append("%3A"); - break; - case ';': - escaped.append("%3B"); - break; - case '=': - escaped.append("%3D"); - break; - case '?': - escaped.append("%3F"); - break; - case '@': - escaped.append("%40"); - break; - case '[': - escaped.append("%5B"); - break; - case ']': - escaped.append("%5D"); - break; - default: - escaped.push_back(character); - break; - } - } - - return escaped; -} diff --git a/src/common/notifications.h b/src/common/notifications.h index 188a0c61..32a60d83 100644 --- a/src/common/notifications.h +++ b/src/common/notifications.h @@ -45,14 +45,3 @@ bool send_notification(const std::string& title, const std::string body, std::optional origin); - -/** - * Escape XML entities within a string. Used inside of desktop notifications. - */ -std::string xml_escape(std::string string); - -/** - * URL encode a file path. We won't escape forward slashes, and `path` should - * not yet include the `file://` prefix. - */ -std::string url_encode_path(std::string path); diff --git a/src/common/utils.cpp b/src/common/utils.cpp index c98e0d27..16d380b6 100644 --- a/src/common/utils.cpp +++ b/src/common/utils.cpp @@ -107,6 +107,115 @@ size_t strlcpy_buffer(char* dst, const std::string& src, size_t size) { return src.size(); } +std::string xml_escape(std::string string) { + // Implementation idea stolen from https://stackoverflow.com/a/5665377 + std::string escaped; + escaped.reserve( + static_cast(static_cast(string.size()) * 1.1)); + for (const char& character : string) { + switch (character) { + case '&': + escaped.append("&"); + break; + case '\"': + escaped.append("""); + break; + case '\'': + escaped.append("'"); + break; + case '<': + escaped.append("<"); + break; + case '>': + escaped.append(">"); + break; + default: + escaped.push_back(character); + break; + } + } + + return escaped; +} + +std::string url_encode_path(std::string path) { + // We only need to escape a couple of special characters here. This is used + // in the notifications as well as in the XDND proxy. We encode the reserved + // characters mentioned here, with the exception of the forward slash: + // https://en.wikipedia.org/wiki/Percent-encoding#Reserved_characters + std::string escaped; + escaped.reserve( + static_cast(static_cast(path.size()) * 1.1)); + for (const char& character : path) { + switch (character) { + // Spaces are somehow in the above list, but Bitwig Studio requires + // spaces to be escaped in the `text/uri-list` format + case ' ': + escaped.append("%20"); + break; + case '!': + escaped.append("%21"); + break; + case '#': + escaped.append("%23"); + break; + case '$': + escaped.append("%24"); + break; + case '%': + escaped.append("%25"); + break; + case '&': + escaped.append("%26"); + break; + case '\'': + escaped.append("%27"); + break; + case '(': + escaped.append("%28"); + break; + case ')': + escaped.append("%29"); + break; + case '*': + escaped.append("%2A"); + break; + case '+': + escaped.append("%2B"); + break; + case ',': + escaped.append("%2C"); + break; + case ':': + escaped.append("%3A"); + break; + case ';': + escaped.append("%3B"); + break; + case '=': + escaped.append("%3D"); + break; + case '?': + escaped.append("%3F"); + break; + case '@': + escaped.append("%40"); + break; + case '[': + escaped.append("%5B"); + break; + case ']': + escaped.append("%5D"); + break; + default: + escaped.push_back(character); + break; + } + } + + return escaped; +} + ScopedFlushToZero::ScopedFlushToZero() noexcept { old_ftz_mode_ = _MM_GET_FLUSH_ZERO_MODE(); _MM_SET_FLUSH_ZERO_MODE(_MM_FLUSH_ZERO_ON); diff --git a/src/common/utils.h b/src/common/utils.h index 7648ce7f..7a7bc276 100644 --- a/src/common/utils.h +++ b/src/common/utils.h @@ -140,6 +140,17 @@ std::optional get_rttime_limit() noexcept; */ bool is_watchdog_timer_disabled(); +/** + * Escape XML entities within a string. Used inside of desktop notifications. + */ +std::string xml_escape(std::string string); + +/** + * URL encode a file path. We won't escape forward slashes, and `path` should + * not yet include the `file://` prefix. + */ +std::string url_encode_path(std::string path); + /** * An implementation of BSD's `strlcpy()` function specialized for copying C++ * strings to char buffers. diff --git a/src/wine-host/meson.build b/src/wine-host/meson.build index 91db1d1c..e86e6d1f 100644 --- a/src/wine-host/meson.build +++ b/src/wine-host/meson.build @@ -8,7 +8,6 @@ if is_64bit_system asio_dep, bitsery_dep, - dbus_dep, function2_dep, ghc_filesystem_dep, rt_dep, @@ -38,7 +37,6 @@ if with_bitbridge asio_dep, ghc_filesystem_dep, bitsery_dep, - dbus_dep, function2_dep, rt_dep, tomlplusplus_dep, @@ -65,7 +63,6 @@ host_sources = files( '../common/logging/common.cpp', '../common/logging/vst2.cpp', '../common/audio-shm.cpp', - '../common/notifications.cpp', '../common/plugins.cpp', '../common/process.cpp', '../common/utils.cpp',