summaryrefslogtreecommitdiff
path: root/extensions
diff options
context:
space:
mode:
authorTor Lillqvist <tml@collabora.com>2018-02-13 18:41:24 +0200
committerTor Lillqvist <tml@collabora.com>2018-05-31 21:37:55 +0300
commit46aba03f2982ad77fba5522b696ff3f5a6b45157 (patch)
tree227a882836b1f752b5f06453e80f84a4447531a3 /extensions
parented6234c0ab6b04f95847f6ee40d77934b9b5f03f (diff)
Provide also an ooo.vba.word.XApplication object
Create the objects on offer to Automation clients lazily It would be silly to create the ooo.vba.word.XApplication in every LibreOffice instance, even if no Writer functionality was going to be used at all in that process. I did not have to do what the old FIXME said, "make Application a proper service", whatever that means. Change-Id: I02a0ceb6290012b4bb6afacadc03871feaf57406 Reviewed-on: https://gerrit.libreoffice.org/55005 Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Tor Lillqvist <tml@collabora.com> (cherry picked from commit 0667df70dc749ae50ce29713308f14d624f2a683)
Diffstat (limited to 'extensions')
-rw-r--r--extensions/Library_oleautobridge.mk6
-rw-r--r--extensions/source/ole/servprov.cxx36
-rw-r--r--extensions/source/ole/servprov.hxx8
3 files changed, 39 insertions, 11 deletions
diff --git a/extensions/Library_oleautobridge.mk b/extensions/Library_oleautobridge.mk
index 70b518c50d41..ec59f715c504 100644
--- a/extensions/Library_oleautobridge.mk
+++ b/extensions/Library_oleautobridge.mk
@@ -13,7 +13,11 @@ $(eval $(call gb_Library_Library,oleautobridge))
$(eval $(call gb_Library_set_componentfile,oleautobridge,extensions/source/ole/oleautobridge))
-$(eval $(call gb_Library_use_sdk_api,oleautobridge))
+$(eval $(call gb_Library_use_api,oleautobridge,\
+ offapi \
+ oovbaapi \
+ udkapi \
+))
$(eval $(call gb_Library_set_include,oleautobridge,\
$(foreach inc,$(ATL_INCLUDE),-I$(inc)) \
diff --git a/extensions/source/ole/servprov.cxx b/extensions/source/ole/servprov.cxx
index 05d84e1ae118..15aa544441db 100644
--- a/extensions/source/ole/servprov.cxx
+++ b/extensions/source/ole/servprov.cxx
@@ -29,6 +29,7 @@
#include <cppuhelper/supportsservice.hxx>
#include <o3tl/any.hxx>
#include <o3tl/char16_t2wchar_t.hxx>
+#include <ooo/vba/XHelperInterface.hpp>
using namespace cppu;
using namespace osl;
@@ -43,10 +44,14 @@ using namespace com::sun::star::bridge::ModelDependent;
// {82154420-0FBF-11d4-8313-005004526AB4}
DEFINE_GUID(OID_ServiceManager, 0x82154420, 0xfbf, 0x11d4, 0x83, 0x13, 0x0, 0x50, 0x4, 0x52, 0x6a, 0xb4);
+// FIXME: This GUID is just the above with the initial part bumped by one. Is that good enough?
+// {82154421-0FBF-11d4-8313-005004526AB4}
+DEFINE_GUID(OID_LibreOfficeWriterApplication, 0x82154421, 0xfbf, 0x11d4, 0x83, 0x13, 0x0, 0x50, 0x4, 0x52, 0x6a, 0xb4);
+
OneInstanceOleWrapper::OneInstanceOleWrapper( const Reference<XMultiServiceFactory>& smgr,
- const Reference<XInterface>& xInst )
+ std::function<const Reference<XInterface>()> xInstFunction )
: m_refCount(0)
- , m_xInst(xInst)
+ , m_xInstFunction(xInstFunction)
, m_factoryHandle(0)
, m_smgr(smgr)
{
@@ -127,9 +132,10 @@ STDMETHODIMP OneInstanceOleWrapper::CreateInstance(IUnknown FAR* punkOuter,
HRESULT ret = ResultFromScode(E_UNEXPECTED);
punkOuter = nullptr;
- if (m_xInst.is())
+ const Reference<XInterface>& xInst = m_xInstFunction();
+ if (xInst.is())
{
- Any usrAny(&m_xInst, cppu::UnoType<decltype(m_xInst)>::get());
+ Any usrAny(&xInst, cppu::UnoType<decltype(xInst)>::get());
sal_uInt8 arId[16];
rtl_getGlobalProcessId( arId);
Any oleAny = m_bridgeSupplier->createBridge(usrAny,
@@ -456,7 +462,23 @@ OleServer::OleServer( const Reference<XMultiServiceFactory>& smgr):
a >>= m_bridgeSupplier;
}
- (void) provideInstance( m_smgr, &OID_ServiceManager );
+ (void) provideInstance( [&]
+ {
+ return m_smgr;
+ },
+ &OID_ServiceManager );
+
+ (void) provideInstance( [&]
+ {
+ const Reference<XInterface> xWordGlobals = m_smgr->createInstance("ooo.vba.word.Globals");
+ xWordGlobals->acquire();
+ const Reference<ooo::vba::XHelperInterface> xHelperInterface(xWordGlobals, UNO_QUERY);
+ Any aApplication = xHelperInterface->Application();
+ Reference<XInterface> xApplication;
+ aApplication >>= xApplication;
+ return xApplication;
+ },
+ &OID_LibreOfficeWriterApplication );
}
OleServer::~OleServer()
@@ -486,9 +508,9 @@ css::uno::Sequence<OUString> OleServer::getSupportedServiceNames()
"com.sun.star.bridge.oleautomation.ApplicationRegistration"};
}
-bool OleServer::provideInstance(const Reference<XInterface>& xInst, GUID const * guid)
+bool OleServer::provideInstance(std::function<const Reference<XInterface>()> xInstFunction, GUID const * guid)
{
- OneInstanceOleWrapper* pWrapper = new OneInstanceOleWrapper( m_smgr, xInst );
+ OneInstanceOleWrapper* pWrapper = new OneInstanceOleWrapper( m_smgr, xInstFunction );
pWrapper->AddRef();
m_wrapperList.push_back(pWrapper);
diff --git a/extensions/source/ole/servprov.hxx b/extensions/source/ole/servprov.hxx
index a57ead04a51d..68af7ba6cce8 100644
--- a/extensions/source/ole/servprov.hxx
+++ b/extensions/source/ole/servprov.hxx
@@ -20,6 +20,8 @@
#ifndef INCLUDED_EXTENSIONS_SOURCE_OLE_SERVPROV_HXX
#define INCLUDED_EXTENSIONS_SOURCE_OLE_SERVPROV_HXX
+#include <functional>
+
#include <com/sun/star/lang/XInitialization.hpp>
#include <com/sun/star/lang/XServiceInfo.hpp>
#include <cppuhelper/implbase.hxx>
@@ -56,7 +58,7 @@ class OneInstanceOleWrapper : public IClassFactory
public:
OneInstanceOleWrapper( const Reference<XMultiServiceFactory>& smgr,
- const Reference<XInterface>& xInst );
+ std::function<const Reference<XInterface>()> xInstFunction );
virtual ~OneInstanceOleWrapper();
bool registerClass(GUID const * pGuid);
@@ -73,7 +75,7 @@ public:
protected:
oslInterlockedCount m_refCount;
- Reference<XInterface> m_xInst;
+ std::function<const Reference<XInterface>()> m_xInstFunction;
DWORD m_factoryHandle;
Reference<XBridgeSupplier2> m_bridgeSupplier;
Reference<XMultiServiceFactory> m_smgr;
@@ -173,7 +175,7 @@ public:
css::uno::Sequence<OUString> SAL_CALL getSupportedServiceNames() override;
protected:
- bool provideInstance(const Reference<XInterface>& xInst, GUID const * guid);
+ bool provideInstance(std::function<const Reference<XInterface>()> xInstFunction, GUID const * guid);
list< OneInstanceOleWrapper* > m_wrapperList;
Reference< XBridgeSupplier2 > m_bridgeSupplier;