summaryrefslogtreecommitdiff
path: root/ucbhelper
diff options
context:
space:
mode:
authorTor Lillqvist <tml@collabora.com>2013-12-24 03:18:45 +0200
committerTor Lillqvist <tml@collabora.com>2013-12-24 03:34:47 +0200
commit55c6dade042eff373b8b8c9ed383b751c035fc80 (patch)
tree7ff849eb9b7fd44478a60d863d18ee5b7308460c /ucbhelper
parent69ea6062d280b93d8372f508864aab60dd810917 (diff)
Hacky workaround for non-working C++/UNO bridge for arm64 iOS
I haven't managed to get the C++/UNO bridge to work for 64-bit iOS code yet. I think I understand the calling convention and the parameter marshalling etc might even be correct now. But something goes wrong in the dynamic creation of type_infos and throwing of exceptions. 64-bit iOS code uses a different unwinding mechanism than 32-bit iOS code, I think, which could be related. Quite possibly there is also an unintended compiler feature (or dare I say bug?) in Apple's Clang for arm64 that affects this: The typeinfos are generated as private_extern symbols in arm64 code (instead of as normal extern in armv7 code), thus the dlsym() thing to look up typeinfos doesn't work. Note that as we don't support any Basic, Java or Python on iOS anyway, the C++/UNO bridge is not used for much. Actually, the only use of the bridge at least in the TiledLibreOffice test app seems to be to throw exceptions. Fun, huh? As the actual types of exceptions thrown seems to be a quite small set, just hack it and throw the appropriate exception directly... The only places where exceptions are thrown through the bridge that is used in the test app seems to be the two cancelCommandExecution() functions in ucbhelper. (It would be nice to change the ucbhelper API to not use exceptions for non-exceptional conditions, but that's another thing...) Change-Id: Ifd1861ccbba23d3b138e82400f2b7d80baf0215a
Diffstat (limited to 'ucbhelper')
-rw-r--r--ucbhelper/source/provider/cancelcommandexecution.cxx27
1 files changed, 26 insertions, 1 deletions
diff --git a/ucbhelper/source/provider/cancelcommandexecution.cxx b/ucbhelper/source/provider/cancelcommandexecution.cxx
index 91bcd79f0295..617c96c0e569 100644
--- a/ucbhelper/source/provider/cancelcommandexecution.cxx
+++ b/ucbhelper/source/provider/cancelcommandexecution.cxx
@@ -25,7 +25,10 @@
*************************************************************************/
#include <osl/diagnose.h>
#include <cppuhelper/exc_hlp.hxx>
+#include <com/sun/star/lang/IllegalArgumentException.hpp>
#include <com/sun/star/ucb/CommandFailedException.hpp>
+#include <com/sun/star/ucb/InteractiveAugmentedIOException.hpp>
+#include <com/sun/star/ucb/NameClashException.hpp>
#include <com/sun/star/ucb/XCommandEnvironment.hpp>
#include <ucbhelper/interactionrequest.hxx>
#include <ucbhelper/cancelcommandexecution.hxx>
@@ -71,8 +74,23 @@ void cancelCommandExecution( const uno::Any & rException,
}
}
- cppu::throwException( rException );
+#if defined IOS && defined __arm64
+ // No Java, Basic, or Python on iOS, so try to throw the exception
+ // directly. Much simpler. Especially as I haven't managed yet to
+ // get the C++/UNO bridge to work for arm64, and this
+ // cppu::throwException thing seems to be the only use for it, at
+ // least in the test apps...
+
+ ucb::NameClashException aNCE;
+ if ( rException >>= aNCE )
+ throw aNCE;
+
+ lang::IllegalArgumentException aIAE;
+ if ( rException >>= aIAE )
+ throw aIAE;
+#endif
+ cppu::throwException( rException );
OSL_FAIL( "Return from cppu::throwException call!!!" );
throw uno::RuntimeException();
}
@@ -109,6 +127,13 @@ void cancelCommandExecution( const ucb::IOErrorCode eError,
}
}
+#if defined IOS && defined __arm64
+ // See comment above.
+ ucb::InteractiveAugmentedIOException aExc;
+ if ( xRequest->getRequest() >>= aExc )
+ throw aExc;
+#endif
+
cppu::throwException( xRequest->getRequest() );
OSL_FAIL( "Return from cppu::throwException call!!!" );