Kaydet (Commit) 2dc3a6c2 authored tarafından Miklos Vajna's avatar Miklos Vajna

framework: allow loading a component on the main thread

The user-visible problem was that embedded (OLE) objects contained in a
document that was loaded on a thread were not editable.

This works in the loaded-with-UI case because the Windows version of the
SalData constructor in vcl calls CoInitialize() (which sets the
concurrency model of the main thread to STA) and then later the
OleComponent constructor in embeddedobj calls OleInitialize(), which
just realizes that the concurrency model is already set, and OLE editing
works.

However, if the document is loaded on a thread, things are different.
The concurrency model of the thread is set to MTA in
oslWorkerWrapperFunction() in sal, so the later OleInitialize() will
fail with RPC_E_CHANGED_MODE, as it's not possible to set the
concurrency model of a thread once it's set.

Solve the problem by providing in opt-in way to execute the actual
import on the main thread, since remote UNO clients always invoke
Desktop::loadComponentFromURL() on a thread.

Change-Id: I94f2721b599c3ae3e2ebc1c90dea649a69d51ef7
Reviewed-on: https://gerrit.libreoffice.org/65453Reviewed-by: 's avatarMiklos Vajna <vmiklos@collabora.com>
Tested-by: Jenkins
üst 95094b1b
...@@ -87,6 +87,7 @@ ...@@ -87,6 +87,7 @@
#include <tools/diagnose_ex.h> #include <tools/diagnose_ex.h>
#include <vcl/menu.hxx> #include <vcl/menu.hxx>
#include <unotools/cmdoptions.hxx> #include <unotools/cmdoptions.hxx>
#include <vcl/threadex.hxx>
using namespace framework; using namespace framework;
...@@ -584,7 +585,17 @@ css::uno::Reference< css::lang::XComponent > SAL_CALL XFrameImpl::loadComponentF ...@@ -584,7 +585,17 @@ css::uno::Reference< css::lang::XComponent > SAL_CALL XFrameImpl::loadComponentF
checkDisposed(); checkDisposed();
css::uno::Reference< css::frame::XComponentLoader > xThis(static_cast< css::frame::XComponentLoader* >(this), css::uno::UNO_QUERY); css::uno::Reference< css::frame::XComponentLoader > xThis(static_cast< css::frame::XComponentLoader* >(this), css::uno::UNO_QUERY);
return LoadEnv::loadComponentFromURL(xThis, m_xContext, sURL, sTargetFrameName, nSearchFlags, lArguments);
utl::MediaDescriptor aDescriptor(lArguments);
bool bOnMainThread = aDescriptor.getUnpackedValueOrDefault("OnMainThread", false);
if (bOnMainThread)
return vcl::solarthread::syncExecute(std::bind(&LoadEnv::loadComponentFromURL, xThis,
m_xContext, sURL, sTargetFrameName,
nSearchFlags, lArguments));
else
return LoadEnv::loadComponentFromURL(xThis, m_xContext, sURL, sTargetFrameName,
nSearchFlags, lArguments);
} }
/*-**************************************************************************************************** /*-****************************************************************************************************
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment