summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bridges/source/cpp_uno/gcc3_wasm/uno2cpp.cxx18
-rw-r--r--offapi/org/libreoffice/embindtest/XTest.idl1
-rw-r--r--unotest/source/embindtest/embindtest.cxx6
-rw-r--r--unotest/source/embindtest/embindtest.js8
4 files changed, 32 insertions, 1 deletions
diff --git a/bridges/source/cpp_uno/gcc3_wasm/uno2cpp.cxx b/bridges/source/cpp_uno/gcc3_wasm/uno2cpp.cxx
index 4b4cdb2bbadb..fcc978ab672e 100644
--- a/bridges/source/cpp_uno/gcc3_wasm/uno2cpp.cxx
+++ b/bridges/source/cpp_uno/gcc3_wasm/uno2cpp.cxx
@@ -18,7 +18,9 @@
#include <com/sun/star/uno/Exception.hpp>
#include <com/sun/star/uno/RuntimeException.hpp>
#include <com/sun/star/uno/genfunc.hxx>
+#include <cppu/unotype.hxx>
#include <o3tl/runtimetooustring.hxx>
+#include <o3tl/temporary.hxx>
#include <o3tl/unreachable.hxx>
#include <rtl/strbuf.hxx>
#include <typelib/typeclass.h>
@@ -324,7 +326,21 @@ void unoInterfaceProxyDispatch(uno_Interface* pUnoI, const typelib_TypeDescripti
{
case typelib_TypeClass_INTERFACE_ATTRIBUTE:
{
- std::abort();
+ auto const atd
+ = reinterpret_cast<typelib_InterfaceAttributeTypeDescription const*>(pMemberDescr);
+ VtableSlot slot(getVtableSlot(atd));
+ if (pReturn == nullptr)
+ {
+ slot.index += 1;
+ call(pThis, slot, cppu::UnoType<void>::get().getTypeLibType(), 1,
+ &o3tl::temporary(
+ typelib_MethodParameter{ nullptr, atd->pAttributeTypeRef, true, false }),
+ pReturn, pArgs, ppException);
+ }
+ else
+ {
+ call(pThis, slot, atd->pAttributeTypeRef, 0, nullptr, pReturn, pArgs, ppException);
+ }
break;
}
case typelib_TypeClass_INTERFACE_METHOD:
diff --git a/offapi/org/libreoffice/embindtest/XTest.idl b/offapi/org/libreoffice/embindtest/XTest.idl
index ac8549d05397..1f09c388e30a 100644
--- a/offapi/org/libreoffice/embindtest/XTest.idl
+++ b/offapi/org/libreoffice/embindtest/XTest.idl
@@ -129,6 +129,7 @@ interface XTest {
void passJob([in] com::sun::star::task::XJob object);
void passJobExecutor([in] com::sun::star::task::XJobExecutor object);
void passInterface([in] com::sun::star::uno::XInterface object);
+ [attribute] string StringAttribute;
};
}; }; };
diff --git a/unotest/source/embindtest/embindtest.cxx b/unotest/source/embindtest/embindtest.cxx
index 7b65ed3ed776..929db82e8900 100644
--- a/unotest/source/embindtest/embindtest.cxx
+++ b/unotest/source/embindtest/embindtest.cxx
@@ -594,6 +594,12 @@ class Test : public cppu::WeakImplHelper<org::libreoffice::embindtest::XTest>
css::uno::Reference<css::task::XJobExecutor>(object, css::uno::UNO_QUERY_THROW)
->trigger(u"queried executor"_ustr);
}
+
+ OUString SAL_CALL getStringAttribute() override { return stringAttribute_; }
+
+ void SAL_CALL setStringAttribute(OUString const& value) override { stringAttribute_ = value; }
+
+ OUString stringAttribute_;
};
}
diff --git a/unotest/source/embindtest/embindtest.js b/unotest/source/embindtest/embindtest.js
index a98f828d9eba..c1670689cf2b 100644
--- a/unotest/source/embindtest/embindtest.js
+++ b/unotest/source/embindtest/embindtest.js
@@ -1113,6 +1113,14 @@ Module.addOnPostRun(function() {
outparamindex.delete();
outparam.delete();
}
+ {
+ let a = new Module.uno_Any(Module.uno_Type.String(), 'hä');
+ invoke.setValue('StringAttribute', a);
+ a.delete();
+ const ret = invoke.getValue('StringAttribute');
+ console.assert(ret.get() === 'hä');
+ ret.delete();
+ }
});
/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */