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:
@@ -975,7 +975,9 @@ SAL_IMPLEMENT_MAIN()
|
|||||||
}
|
}
|
||||||
dumpAttributes(cppOut, mgr, ifc, ifcEnt, {});
|
dumpAttributes(cppOut, mgr, ifc, ifcEnt, {});
|
||||||
dumpMethods(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);
|
dumpRegisterFunctionEpilog(cppOut, n);
|
||||||
for (auto const& attr : ifcEnt->getDirectAttributes())
|
for (auto const& attr : ifcEnt->getDirectAttributes())
|
||||||
{
|
{
|
||||||
|
@@ -334,7 +334,15 @@ EMSCRIPTEN_BINDINGS(PrimaryBindings)
|
|||||||
_emval_take_value(getTypeId(self.getValueType()), argv));
|
_emval_take_value(getTypeId(self.getValueType()), argv));
|
||||||
}
|
}
|
||||||
case css::uno::TypeClass_INTERFACE:
|
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:
|
default:
|
||||||
O3TL_UNREACHABLE;
|
O3TL_UNREACHABLE;
|
||||||
};
|
};
|
||||||
|
@@ -76,6 +76,8 @@ interface XTest {
|
|||||||
boolean isAnyStruct([in] any value);
|
boolean isAnyStruct([in] any value);
|
||||||
any getAnyException();
|
any getAnyException();
|
||||||
boolean isAnyException([in] any value);
|
boolean isAnyException([in] any value);
|
||||||
|
any getAnyInterface();
|
||||||
|
boolean isAnyInterface([in] any value);
|
||||||
sequence<boolean> getSequenceBoolean();
|
sequence<boolean> getSequenceBoolean();
|
||||||
boolean isSequenceBoolean([in] sequence<boolean> value);
|
boolean isSequenceBoolean([in] sequence<boolean> value);
|
||||||
sequence<byte> getSequenceByte();
|
sequence<byte> getSequenceByte();
|
||||||
|
@@ -10,6 +10,7 @@
|
|||||||
#include <sal/config.h>
|
#include <sal/config.h>
|
||||||
|
|
||||||
#include <com/sun/star/uno/Any.hxx>
|
#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/Sequence.hxx>
|
||||||
#include <com/sun/star/uno/Type.hxx>
|
#include <com/sun/star/uno/Type.hxx>
|
||||||
#include <cppu/unotype.hxx>
|
#include <cppu/unotype.hxx>
|
||||||
@@ -283,6 +284,19 @@ class Test : public cppu::WeakImplHelper<org::libreoffice::embindtest::XTest>
|
|||||||
&& e.m3 == u"hä";
|
&& 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
|
css::uno::Sequence<sal_Bool> SAL_CALL getSequenceBoolean() override
|
||||||
{
|
{
|
||||||
return { true, true, false };
|
return { true, true, false };
|
||||||
|
@@ -302,6 +302,16 @@ Module.addOnPostRun(function() {
|
|||||||
//TODO: console.assert(test.isAnyException(a));
|
//TODO: console.assert(test.isAnyException(a));
|
||||||
//TODO: a.delete();
|
//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();
|
let v = test.getSequenceBoolean();
|
||||||
console.log(v);
|
console.log(v);
|
||||||
|
Reference in New Issue
Block a user