diff options
author | Stephan Bergmann <stephan.bergmann@allotropia.de> | 2024-03-07 17:10:25 +0100 |
---|---|---|
committer | Stephan Bergmann <stephan.bergmann@allotropia.de> | 2024-03-07 23:13:31 +0100 |
commit | da49e5edb2fba9e99ed7d58952dc761b0804e7fc (patch) | |
tree | 9deb1e34a60a999196dff43ff6a71b6a43cea03b | |
parent | dbb05dc818afb08b3e05ac62bd92389a5cf90fa7 (diff) |
Add Embind'ing of UNO Any getter for interfaces
Change-Id: Ia56439e0e99c193c7cc56676677df2c671278e24
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/164554
Tested-by: Jenkins
Reviewed-by: Stephan Bergmann <stephan.bergmann@allotropia.de>
-rw-r--r-- | static/source/embindmaker/embindmaker.cxx | 4 | ||||
-rw-r--r-- | static/source/unoembindhelpers/PrimaryBindings.cxx | 10 | ||||
-rw-r--r-- | udkapi/org/libreoffice/embindtest/XTest.idl | 2 | ||||
-rw-r--r-- | unotest/source/embindtest/embindtest.cxx | 14 | ||||
-rw-r--r-- | unotest/source/embindtest/embindtest.js | 10 |
5 files changed, 38 insertions, 2 deletions
diff --git a/static/source/embindmaker/embindmaker.cxx b/static/source/embindmaker/embindmaker.cxx index f0f14b7e31aa..4241d10b1575 100644 --- a/static/source/embindmaker/embindmaker.cxx +++ b/static/source/embindmaker/embindmaker.cxx @@ -975,7 +975,9 @@ SAL_IMPLEMENT_MAIN() } dumpAttributes(cppOut, mgr, ifc, ifcEnt, {}); dumpMethods(cppOut, mgr, ifc, ifcEnt, {}); - cppOut << " ;\n"; + cppOut << " ;\n" + " ::unoembindhelpers::registerUnoType<::com::sun::star::uno::Reference<" + << cppName(ifc) << ">>();\n"; dumpRegisterFunctionEpilog(cppOut, n); for (auto const& attr : ifcEnt->getDirectAttributes()) { diff --git a/static/source/unoembindhelpers/PrimaryBindings.cxx b/static/source/unoembindhelpers/PrimaryBindings.cxx index 2e5ecac00054..985ebacc52b2 100644 --- a/static/source/unoembindhelpers/PrimaryBindings.cxx +++ b/static/source/unoembindhelpers/PrimaryBindings.cxx @@ -334,7 +334,15 @@ EMSCRIPTEN_BINDINGS(PrimaryBindings) _emval_take_value(getTypeId(self.getValueType()), argv)); } case css::uno::TypeClass_INTERFACE: - return emscripten::val::undefined(); //TODO + { + auto const ifc = *static_cast<css::uno::XInterface* const*>(self.getValue()); + auto const copy = std::malloc(sizeof(css::uno::XInterface*)); + *static_cast<css::uno::XInterface**>(copy) = ifc; + ifc->acquire(); + emscripten::internal::WireTypePack argv(std::move(copy)); + return emscripten::val::take_ownership( + _emval_take_value(getTypeId(self.getValueType()), argv)); + } default: O3TL_UNREACHABLE; }; diff --git a/udkapi/org/libreoffice/embindtest/XTest.idl b/udkapi/org/libreoffice/embindtest/XTest.idl index e5b5a4535982..45042663cf47 100644 --- a/udkapi/org/libreoffice/embindtest/XTest.idl +++ b/udkapi/org/libreoffice/embindtest/XTest.idl @@ -76,6 +76,8 @@ interface XTest { boolean isAnyStruct([in] any value); any getAnyException(); boolean isAnyException([in] any value); + any getAnyInterface(); + boolean isAnyInterface([in] any value); sequence<boolean> getSequenceBoolean(); boolean isSequenceBoolean([in] sequence<boolean> value); sequence<byte> getSequenceByte(); diff --git a/unotest/source/embindtest/embindtest.cxx b/unotest/source/embindtest/embindtest.cxx index 1f8b916fbbf1..d437f3907e3a 100644 --- a/unotest/source/embindtest/embindtest.cxx +++ b/unotest/source/embindtest/embindtest.cxx @@ -10,6 +10,7 @@ #include <sal/config.h> #include <com/sun/star/uno/Any.hxx> +#include <com/sun/star/uno/Reference.hxx> #include <com/sun/star/uno/Sequence.hxx> #include <com/sun/star/uno/Type.hxx> #include <cppu/unotype.hxx> @@ -283,6 +284,19 @@ class Test : public cppu::WeakImplHelper<org::libreoffice::embindtest::XTest> && e.m3 == u"hä"; } + css::uno::Any SAL_CALL getAnyInterface() override + { + return css::uno::Any(css::uno::Reference<org::libreoffice::embindtest::XTest>(this)); + } + + sal_Bool SAL_CALL isAnyInterface(css::uno::Any const& value) override + { + return value.getValueType() == cppu::UnoType<org::libreoffice::embindtest::XTest>::get() + && *o3tl::forceAccess<css::uno::Reference<org::libreoffice::embindtest::XTest>>( + value) + == static_cast<OWeakObject*>(this); + } + css::uno::Sequence<sal_Bool> SAL_CALL getSequenceBoolean() override { return { true, true, false }; diff --git a/unotest/source/embindtest/embindtest.js b/unotest/source/embindtest/embindtest.js index c661589683f6..e238af32c003 100644 --- a/unotest/source/embindtest/embindtest.js +++ b/unotest/source/embindtest/embindtest.js @@ -303,6 +303,16 @@ Module.addOnPostRun(function() { //TODO: a.delete(); } { + let v = test.getAnyInterface(); + console.log(v); + console.assert(v.get().$equals(test.$query())); + console.assert(test.isAnyInterface(v)); + v.delete(); + //TODO: let a = new Module.Any(test, css.uno.TypeClass.INTERFACE); + //TODO: console.assert(test.isAnyInterface(a)); + //TODO: a.delete(); + } + { let v = test.getSequenceBoolean(); console.log(v); console.assert(v.size() === 3); |