From bba5d34d41ae2ec529ff5b93900425a3481f8ebc Mon Sep 17 00:00:00 2001 From: Robbert van der Helm Date: Wed, 7 Sep 2022 22:32:51 +0200 Subject: [PATCH] Add a serialization struct for clap_host data --- src/common/serialization/clap/host.cpp | 30 +++++++++++ src/common/serialization/clap/host.h | 75 ++++++++++++++++++++++++++ 2 files changed, 105 insertions(+) create mode 100644 src/common/serialization/clap/host.cpp create mode 100644 src/common/serialization/clap/host.h diff --git a/src/common/serialization/clap/host.cpp b/src/common/serialization/clap/host.cpp new file mode 100644 index 00000000..34f82cc1 --- /dev/null +++ b/src/common/serialization/clap/host.cpp @@ -0,0 +1,30 @@ +// yabridge: a Wine plugin bridge +// Copyright (C) 2020-2022 Robbert van der Helm +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +#include "host.h" + +namespace clap { +namespace host { + +Host::Host(const clap_host_t& original) + : clap_version(original.clap_version), + name((assert(original.name), original.name)), + vendor(original.vendor ? std::optional(original.vendor) : std::nullopt), + url(original.url ? std::optional(original.url) : std::nullopt), + version((assert(original.version), original.version)) {} + +} // namespace host +} // namespace clap diff --git a/src/common/serialization/clap/host.h b/src/common/serialization/clap/host.h new file mode 100644 index 00000000..2f23fa6c --- /dev/null +++ b/src/common/serialization/clap/host.h @@ -0,0 +1,75 @@ +// yabridge: a Wine plugin bridge +// Copyright (C) 2020-2022 Robbert van der Helm +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +#pragma once + +#include +#include +#include + +#include +#include + +#include "../../bitsery/ext/in-place-optional.h" + +// Serialization messages for `clap/host.h` + +namespace clap { +namespace host { + +/** + * A serializable version of `clap_host_t`'s data fields so we can proxy the + * host on the Wine side. + */ +struct Host { + /** + * Parse a host descriptor so it can be serialized and sent to the Wine + * plugin host. + */ + Host(const clap_host_t& original); + + /** + * Default constructor for bitsery. + */ + Host() {} + + /** + * We'll report the maximum of the plugin's supported CLAP version and + * yabridge's supported CLAP version. I don't know why there's a version + * field here when the entry point also has a version field. + */ + clap_version_t clap_version; + + std::string name; + std::optional vendor; + std::optional url; + std::string version; + + template + void serialize(S& s) { + s.object(clap_version); + + s.text1b(name, 4096); + s.ext(vendor, bitsery::ext::InPlaceOptional(), + [](S& s, auto& v) { s.text1b(v, 4096); }); + s.ext(url, bitsery::ext::InPlaceOptional(), + [](S& s, auto& v) { s.text1b(v, 4096); }); + s.text1b(version, 4096); + } +}; + +} // namespace host +} // namespace clap