summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--static/source/unoembindhelpers/PrimaryBindings.cxx122
-rw-r--r--unotest/source/embindtest/embindtest.cxx9
-rw-r--r--unotest/source/embindtest/embindtest.js5
3 files changed, 77 insertions, 59 deletions
diff --git a/static/source/unoembindhelpers/PrimaryBindings.cxx b/static/source/unoembindhelpers/PrimaryBindings.cxx
index fee0c3e214d1..7abf88669d02 100644
--- a/static/source/unoembindhelpers/PrimaryBindings.cxx
+++ b/static/source/unoembindhelpers/PrimaryBindings.cxx
@@ -16,6 +16,7 @@
#include <com/sun/star/uno/RuntimeException.hpp>
#include <com/sun/star/uno/Type.hxx>
#include <comphelper/processfactory.hxx>
+#include <cppuhelper/exc_hlp.hxx>
#include <o3tl/any.hxx>
#include <o3tl/temporary.hxx>
#include <o3tl/unreachable.hxx>
@@ -191,6 +192,65 @@ std::type_info const* getTypeId(css::uno::Type const& type)
}
return i->second;
}
+
+Any constructAny(const css::uno::Type& rUnoType, const val& rObject)
+{
+ switch (rUnoType.getTypeClass())
+ {
+ case TypeClass_VOID:
+ return {};
+ case TypeClass_BOOLEAN:
+ return Any{ rObject.as<bool>() };
+ case TypeClass_BYTE:
+ return Any{ rObject.as<sal_Int8>() };
+ case TypeClass_SHORT:
+ return Any{ rObject.as<sal_Int16>() };
+ case TypeClass_UNSIGNED_SHORT:
+ return Any{ rObject.as<sal_uInt16>() };
+ case TypeClass_LONG:
+ return Any{ rObject.as<sal_Int32>() };
+ case TypeClass_UNSIGNED_LONG:
+ return Any{ rObject.as<sal_uInt32>() };
+ case TypeClass_HYPER:
+ return Any{ rObject.as<sal_Int64>() };
+ case TypeClass_UNSIGNED_HYPER:
+ return Any{ rObject.as<sal_uInt64>() };
+ case TypeClass_FLOAT:
+ return Any{ rObject.as<float>() };
+ case TypeClass_DOUBLE:
+ return Any{ rObject.as<double>() };
+ case TypeClass_CHAR:
+ return Any{ rObject.as<char16_t>() };
+ case TypeClass_STRING:
+ return Any{ OUString(rObject.as<std::u16string>()) };
+ case TypeClass_TYPE:
+ return css::uno::Any(rObject.as<css::uno::Type>());
+ case TypeClass_SEQUENCE:
+ case TypeClass_STRUCT:
+ case TypeClass_EXCEPTION:
+ case TypeClass_INTERFACE:
+ {
+ emscripten::internal::EM_DESTRUCTORS destructors = nullptr;
+ emscripten::internal::EM_GENERIC_WIRE_TYPE result
+ = _emval_as(rObject.as_handle(), getTypeId(rUnoType), &destructors);
+ emscripten::internal::DestructorsRunner dr(destructors);
+ return css::uno::Any(emscripten::internal::fromGenericWireType<void const*>(result),
+ rUnoType);
+ }
+ case TypeClass_ENUM:
+ {
+ emscripten::internal::EM_DESTRUCTORS destructors = nullptr;
+ emscripten::internal::EM_GENERIC_WIRE_TYPE result
+ = _emval_as(rObject.as_handle(), getTypeId(rUnoType), &destructors);
+ emscripten::internal::DestructorsRunner dr(destructors);
+ return css::uno::Any(
+ &o3tl::temporary(emscripten::internal::fromGenericWireType<sal_Int32>(result)),
+ rUnoType);
+ }
+ default:
+ throw std::invalid_argument("bad type class");
+ }
+}
}
namespace unoembindhelpers::detail
@@ -248,64 +308,7 @@ EMSCRIPTEN_BINDINGS(PrimaryBindings)
// Any
class_<Any>("uno_Any")
- .constructor(+[](const css::uno::Type& rUnoType, const val& rObject) -> Any {
- switch (rUnoType.getTypeClass())
- {
- case TypeClass_VOID:
- return {};
- case TypeClass_BOOLEAN:
- return Any{ rObject.as<bool>() };
- case TypeClass_BYTE:
- return Any{ rObject.as<sal_Int8>() };
- case TypeClass_SHORT:
- return Any{ rObject.as<sal_Int16>() };
- case TypeClass_UNSIGNED_SHORT:
- return Any{ rObject.as<sal_uInt16>() };
- case TypeClass_LONG:
- return Any{ rObject.as<sal_Int32>() };
- case TypeClass_UNSIGNED_LONG:
- return Any{ rObject.as<sal_uInt32>() };
- case TypeClass_HYPER:
- return Any{ rObject.as<sal_Int64>() };
- case TypeClass_UNSIGNED_HYPER:
- return Any{ rObject.as<sal_uInt64>() };
- case TypeClass_FLOAT:
- return Any{ rObject.as<float>() };
- case TypeClass_DOUBLE:
- return Any{ rObject.as<double>() };
- case TypeClass_CHAR:
- return Any{ rObject.as<char16_t>() };
- case TypeClass_STRING:
- return Any{ OUString(rObject.as<std::u16string>()) };
- case TypeClass_TYPE:
- return css::uno::Any(rObject.as<css::uno::Type>());
- case TypeClass_SEQUENCE:
- case TypeClass_STRUCT:
- case TypeClass_EXCEPTION:
- case TypeClass_INTERFACE:
- {
- emscripten::internal::EM_DESTRUCTORS destructors = nullptr;
- emscripten::internal::EM_GENERIC_WIRE_TYPE result
- = _emval_as(rObject.as_handle(), getTypeId(rUnoType), &destructors);
- emscripten::internal::DestructorsRunner dr(destructors);
- return css::uno::Any(
- emscripten::internal::fromGenericWireType<void const*>(result), rUnoType);
- }
- case TypeClass_ENUM:
- {
- emscripten::internal::EM_DESTRUCTORS destructors = nullptr;
- emscripten::internal::EM_GENERIC_WIRE_TYPE result
- = _emval_as(rObject.as_handle(), getTypeId(rUnoType), &destructors);
- emscripten::internal::DestructorsRunner dr(destructors);
- return css::uno::Any(
- &o3tl::temporary(
- emscripten::internal::fromGenericWireType<sal_Int32>(result)),
- rUnoType);
- }
- default:
- throw std::invalid_argument("bad type class");
- }
- })
+ .constructor(&constructAny)
.function("get", +[](css::uno::Any const& self) {
switch (self.getValueType().getTypeClass())
{
@@ -395,6 +398,9 @@ EMSCRIPTEN_BINDINGS(PrimaryBindings)
function("getCurrentModelFromViewSh", &getCurrentModelFromViewSh);
function("getUnoComponentContext", &comphelper::getProcessComponentContext);
+ function("throwUnoException", +[](css::uno::Type const& type, emscripten::val const& value) {
+ cppu::throwException(constructAny(type, value));
+ });
function("rtl_uString_release",
+[](std::uintptr_t ptr) { rtl_uString_release(reinterpret_cast<rtl_uString*>(ptr)); });
diff --git a/unotest/source/embindtest/embindtest.cxx b/unotest/source/embindtest/embindtest.cxx
index bcbb6d0ec870..c5127a2fe695 100644
--- a/unotest/source/embindtest/embindtest.cxx
+++ b/unotest/source/embindtest/embindtest.cxx
@@ -508,7 +508,14 @@ class Test : public cppu::WeakImplHelper<org::libreoffice::embindtest::XTest>
void SAL_CALL passJob(css::uno::Reference<css::task::XJob> const& object) override
{
- object->execute({ { u"name"_ustr, css::uno::Any(u"job"_ustr) } });
+ try
+ {
+ object->execute({});
+ }
+ catch (css::uno::RuntimeException& e)
+ {
+ object->execute({ { u"name"_ustr, css::uno::Any(e.Message) } });
+ }
}
void SAL_CALL
diff --git a/unotest/source/embindtest/embindtest.js b/unotest/source/embindtest/embindtest.js
index 08bded0c81f8..7d69f9908cdf 100644
--- a/unotest/source/embindtest/embindtest.js
+++ b/unotest/source/embindtest/embindtest.js
@@ -585,6 +585,11 @@ Module.addOnPostRun(function() {
getTypes() { return this.implTypes; },
getImplementationId() { return this.implImplementationId; },
execute(args) {
+ if (args.size() !== 1 || args.get(0).Name !== 'name') {
+ Module.throwUnoException(
+ Module.uno_Type.Exception('com.sun.star.lang.IllegalArgumentException'),
+ {Message: 'bad args', Context: null, ArgumentPosition: 0});
+ }
console.log('Hello ' + args.get(0).Value.get());
return new Module.uno_Any(Module.uno_Type.Void(), undefined);
},