[Libreoffice-commits] core.git: Branch 'distro/vector/vector-5.4' - framework/source

Libreoffice Gerrit user logerrit at kemper.freedesktop.org
Thu Dec 20 08:25:27 UTC 2018


 framework/source/services/frame.cxx |   13 ++++++++++++-
 1 file changed, 12 insertions(+), 1 deletion(-)

New commits:
commit a21d4480bc624d70c0108aace220aea5924b8b48
Author:     Miklos Vajna <vmiklos at collabora.com>
AuthorDate: Wed Dec 19 17:47:57 2018 +0100
Commit:     Miklos Vajna <vmiklos at collabora.com>
CommitDate: Thu Dec 20 09:18:19 2018 +0100

    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/65453
    Reviewed-by: Miklos Vajna <vmiklos at collabora.com>
    Tested-by: Jenkins
    (cherry picked from commit 2dc3a6c273cb82506842864481d78df7294debbf)

diff --git a/framework/source/services/frame.cxx b/framework/source/services/frame.cxx
index 9cb41494d655..acedfcdaaf01 100644
--- a/framework/source/services/frame.cxx
+++ b/framework/source/services/frame.cxx
@@ -88,6 +88,7 @@
 #include <tools/diagnose_ex.h>
 #include <vcl/menu.hxx>
 #include <unotools/cmdoptions.hxx>
+#include <vcl/threadex.hxx>
 
 using namespace framework;
 
@@ -586,7 +587,17 @@ css::uno::Reference< css::lang::XComponent > SAL_CALL Frame::loadComponentFromUR
     checkDisposed();
 
     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);
 }
 
 /*-****************************************************************************************************


More information about the Libreoffice-commits mailing list