From 391206eea86eaffd91441ec2e1809d558f64fe14 Mon Sep 17 00:00:00 2001 From: Robbert van der Helm Date: Tue, 2 Feb 2021 15:43:53 +0100 Subject: [PATCH] Work around incorrect wchar_t text serialization `std::char_traits::length()` would return the wrong length for a wide string under Wine, and thus also for `String128`. This would cause parts of the strings to get cut off. As a workaround we'll just serialize the entire container including all null bytes at the end. --- .../vst3/context-menu/context-menu.h | 2 +- src/common/serialization/vst3/plugin-factory.h | 15 +++++++++++---- .../vst3/plugin/keyswitch-controller.h | 4 ++-- .../vst3/plugin/note-expression-controller.h | 6 +++--- src/common/serialization/vst3/plugin/unit-info.h | 4 ++-- 5 files changed, 19 insertions(+), 12 deletions(-) diff --git a/src/common/serialization/vst3/context-menu/context-menu.h b/src/common/serialization/vst3/context-menu/context-menu.h index 2c767287..95d3d44c 100644 --- a/src/common/serialization/vst3/context-menu/context-menu.h +++ b/src/common/serialization/vst3/context-menu/context-menu.h @@ -188,7 +188,7 @@ namespace Steinberg { namespace Vst { template void serialize(S& s, IContextMenuItem& item) { - s.text2b(item.name); + s.container2b(item.name); s.value4b(item.tag); s.value4b(item.flags); } diff --git a/src/common/serialization/vst3/plugin-factory.h b/src/common/serialization/vst3/plugin-factory.h index f472f80c..e4bc6028 100644 --- a/src/common/serialization/vst3/plugin-factory.h +++ b/src/common/serialization/vst3/plugin-factory.h @@ -213,12 +213,19 @@ void serialize(S& s, PClassInfoW& class_info) { s.container1b(class_info.cid); s.value4b(class_info.cardinality); s.text1b(class_info.category); - s.text2b(class_info.name); + // FIXME: Bitsery uses `std::char_traits::length()` under the hood + // for `text2b()` on the Wine side, and under winegcc this function + // this length is incorrect. As a workaround we're just serializing + // the entire container. This applies to every place where we use + // `container2b()` to serialize a `String128`, so if we end up fixing + // this we should replace all of the instances of `container2b()` + // that serialize a `String128`. + s.container2b(class_info.name); s.value4b(class_info.classFlags); s.text1b(class_info.subCategories); - s.text2b(class_info.vendor); - s.text2b(class_info.version); - s.text2b(class_info.sdkVersion); + s.container2b(class_info.vendor); + s.container2b(class_info.version); + s.container2b(class_info.sdkVersion); } template diff --git a/src/common/serialization/vst3/plugin/keyswitch-controller.h b/src/common/serialization/vst3/plugin/keyswitch-controller.h index 315cda33..5217aeaa 100644 --- a/src/common/serialization/vst3/plugin/keyswitch-controller.h +++ b/src/common/serialization/vst3/plugin/keyswitch-controller.h @@ -141,8 +141,8 @@ namespace Vst { template void serialize(S& s, Steinberg::Vst::KeyswitchInfo& info) { s.value4b(info.typeId); - s.text2b(info.title); - s.text2b(info.shortTitle); + s.container2b(info.title); + s.container2b(info.shortTitle); s.value4b(info.keyswitchMin); s.value4b(info.keyswitchMax); s.value4b(info.keyRemapped); diff --git a/src/common/serialization/vst3/plugin/note-expression-controller.h b/src/common/serialization/vst3/plugin/note-expression-controller.h index e2ca84d7..8ed43d29 100644 --- a/src/common/serialization/vst3/plugin/note-expression-controller.h +++ b/src/common/serialization/vst3/plugin/note-expression-controller.h @@ -242,9 +242,9 @@ namespace Vst { template void serialize(S& s, NoteExpressionTypeInfo& info) { s.value4b(info.typeId); - s.text2b(info.title); - s.text2b(info.shortTitle); - s.text2b(info.units); + s.container2b(info.title); + s.container2b(info.shortTitle); + s.container2b(info.units); s.value4b(info.unitId); s.object(info.valueDesc); s.value4b(info.associatedParameterId); diff --git a/src/common/serialization/vst3/plugin/unit-info.h b/src/common/serialization/vst3/plugin/unit-info.h index ebb8ab71..a6223cde 100644 --- a/src/common/serialization/vst3/plugin/unit-info.h +++ b/src/common/serialization/vst3/plugin/unit-info.h @@ -449,14 +449,14 @@ template void serialize(S& s, UnitInfo& info) { s.value4b(info.id); s.value4b(info.parentUnitId); - s.text2b(info.name); + s.container2b(info.name); s.value4b(info.programListId); } template void serialize(S& s, ProgramListInfo& info) { s.value4b(info.id); - s.text2b(info.name); + s.container2b(info.name); s.value4b(info.programCount); } } // namespace Vst