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>
This commit is contained in:
Stephan Bergmann
2024-03-07 17:10:25 +01:00
parent dbb05dc818
commit da49e5edb2
5 changed files with 38 additions and 2 deletions

View File

@@ -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())
{

View File

@@ -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;
};

View File

@@ -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();

View File

@@ -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"";
}
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 };

View File

@@ -302,6 +302,16 @@ Module.addOnPostRun(function() {
//TODO: console.assert(test.isAnyException(a));
//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);