summaryrefslogtreecommitdiff
path: root/static
diff options
context:
space:
mode:
authorStephan Bergmann <stephan.bergmann@allotropia.de>2024-03-01 14:30:38 +0100
committerStephan Bergmann <stephan.bergmann@allotropia.de>2024-03-04 21:43:09 +0100
commit0bab5cda2123ecc7f3775d05ca5103bdef23bfe8 (patch)
treedf5128463025ae19e008fc6ae2d436c790a1bba1 /static
parent8428368d79118f1d0e09615c5d2b92065b8838d4 (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.cxx1
-rw-r--r--static/source/unoembindhelpers/PrimaryBindings.cxx33
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: