diff options
author | Stephan Bergmann <stephan.bergmann@allotropia.de> | 2024-03-01 14:30:38 +0100 |
---|---|---|
committer | Stephan Bergmann <stephan.bergmann@allotropia.de> | 2024-03-04 21:43:09 +0100 |
commit | 0bab5cda2123ecc7f3775d05ca5103bdef23bfe8 (patch) | |
tree | df5128463025ae19e008fc6ae2d436c790a1bba1 /static | |
parent | 8428368d79118f1d0e09615c5d2b92065b8838d4 (diff) |
Add Embing'ing of UNO Any getter for enums
...which taps into the internals of emscripten::val, which is based on
std::type_info identifiers, so we need an additional statically-built mapping
between UNO (enum, for now) types and std::type_info
Change-Id: I9fc1ff33fe31a1e1052504905de446ed2193e014
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/164359
Tested-by: Jenkins
Reviewed-by: Stephan Bergmann <stephan.bergmann@allotropia.de>
Diffstat (limited to 'static')
-rw-r--r-- | static/source/embindmaker/embindmaker.cxx | 1 | ||||
-rw-r--r-- | static/source/unoembindhelpers/PrimaryBindings.cxx | 33 |
2 files changed, 33 insertions, 1 deletions
diff --git a/static/source/embindmaker/embindmaker.cxx b/static/source/embindmaker/embindmaker.cxx index 89fdf834ea1d..36b1f56fd5a3 100644 --- a/static/source/embindmaker/embindmaker.cxx +++ b/static/source/embindmaker/embindmaker.cxx @@ -849,6 +849,7 @@ SAL_IMPLEMENT_MAIN() << mem.name << ")"; } cppOut << ";\n"; + cppOut << " ::unoembindhelpers::registerUnoType<" << cppName(enm) << ">();\n"; dumpRegisterFunctionEpilog(cppOut, n); } std::set<OUString> sequences; diff --git a/static/source/unoembindhelpers/PrimaryBindings.cxx b/static/source/unoembindhelpers/PrimaryBindings.cxx index 5b76b549cb13..7cf99c523f0d 100644 --- a/static/source/unoembindhelpers/PrimaryBindings.cxx +++ b/static/source/unoembindhelpers/PrimaryBindings.cxx @@ -31,6 +31,7 @@ #include <stdexcept> #include <string> #include <typeinfo> +#include <utility> using namespace emscripten; using namespace css::uno; @@ -166,6 +167,31 @@ Reference<css::frame::XModel> getCurrentModelFromViewSh() } return pSh->GetCurrentDocument(); } + +struct LessType +{ + bool operator()(css::uno::Type const& type1, css::uno::Type const& type2) const + { + return type1.getTypeLibType() < type2.getTypeLibType(); + } +}; + +std::map<css::uno::Type, std::type_info const*, LessType> unoTypes; + +std::type_info const* getTypeId(css::uno::Type const& type) +{ + auto const i = unoTypes.find(type); + if (i == unoTypes.end()) + { + throw std::runtime_error("unregistered UNO type"); + } + return i->second; +} +} + +namespace unoembindhelpers::detail +{ +void registerUnoType(css::uno::Type const& type, std::type_info const* id) { unoTypes[type] = id; } } EMSCRIPTEN_BINDINGS(PrimaryBindings) @@ -263,7 +289,12 @@ EMSCRIPTEN_BINDINGS(PrimaryBindings) case css::uno::TypeClass_SEQUENCE: return emscripten::val::undefined(); //TODO case css::uno::TypeClass_ENUM: - return emscripten::val::undefined(); //TODO + { + emscripten::internal::WireTypePack argv( + std::move(*static_cast<sal_Int32 const*>(self.getValue()))); + return emscripten::val::take_ownership( + _emval_take_value(getTypeId(self.getValueType()), argv)); + } case css::uno::TypeClass_STRUCT: return emscripten::val::undefined(); //TODO case css::uno::TypeClass_EXCEPTION: |