1*2a97ec55SAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 3*2a97ec55SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 4*2a97ec55SAndrew Rist * or more contributor license agreements. See the NOTICE file 5*2a97ec55SAndrew Rist * distributed with this work for additional information 6*2a97ec55SAndrew Rist * regarding copyright ownership. The ASF licenses this file 7*2a97ec55SAndrew Rist * to you under the Apache License, Version 2.0 (the 8*2a97ec55SAndrew Rist * "License"); you may not use this file except in compliance 9*2a97ec55SAndrew Rist * with the License. You may obtain a copy of the License at 10cdf0e10cSrcweir * 11*2a97ec55SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12cdf0e10cSrcweir * 13*2a97ec55SAndrew Rist * Unless required by applicable law or agreed to in writing, 14*2a97ec55SAndrew Rist * software distributed under the License is distributed on an 15*2a97ec55SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*2a97ec55SAndrew Rist * KIND, either express or implied. See the License for the 17*2a97ec55SAndrew Rist * specific language governing permissions and limitations 18*2a97ec55SAndrew Rist * under the License. 19cdf0e10cSrcweir * 20*2a97ec55SAndrew Rist *************************************************************/ 21*2a97ec55SAndrew Rist 22*2a97ec55SAndrew Rist 23cdf0e10cSrcweir 24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 25cdf0e10cSrcweir #include "precompiled_extensions.hxx" 26cdf0e10cSrcweir 27cdf0e10cSrcweir #ifdef __MINGW32__ 28cdf0e10cSrcweir #define INITGUID 29cdf0e10cSrcweir #include <initguid.h> 30cdf0e10cSrcweir #else 31cdf0e10cSrcweir #include "ole2uno.hxx" 32cdf0e10cSrcweir #include "unoconversionutilities.hxx" 33cdf0e10cSrcweir #endif 34cdf0e10cSrcweir #include "servprov.hxx" 35cdf0e10cSrcweir #include "unoobjw.hxx" 36cdf0e10cSrcweir #include "oleobjw.hxx" 37cdf0e10cSrcweir #include <rtl/unload.h> 38cdf0e10cSrcweir 39cdf0e10cSrcweir #include <tools/presys.h> 40cdf0e10cSrcweir #define _WIN32_WINNT 0x0400 41cdf0e10cSrcweir 42cdf0e10cSrcweir #if defined(_MSC_VER) && (_MSC_VER >= 1300) 43cdf0e10cSrcweir #undef _DEBUG 44cdf0e10cSrcweir #endif 45cdf0e10cSrcweir #include <atlbase.h> 46cdf0e10cSrcweir extern CComModule _Module; 47cdf0e10cSrcweir #include <atlcom.h> 48cdf0e10cSrcweir #include <tools/postsys.h> 49cdf0e10cSrcweir 50cdf0e10cSrcweir 51cdf0e10cSrcweir using namespace std; 52cdf0e10cSrcweir using namespace cppu; 53cdf0e10cSrcweir using namespace rtl; 54cdf0e10cSrcweir using namespace osl; 55cdf0e10cSrcweir using namespace com::sun::star::lang; 56cdf0e10cSrcweir using namespace com::sun::star::uno; 57cdf0e10cSrcweir using namespace com::sun::star::bridge; 58cdf0e10cSrcweir using namespace com::sun::star::bridge::ModelDependent; 59cdf0e10cSrcweir 60cdf0e10cSrcweir 61cdf0e10cSrcweir 62cdf0e10cSrcweir namespace ole_adapter 63cdf0e10cSrcweir { 64cdf0e10cSrcweir 65cdf0e10cSrcweir #include <initguid.h> 66cdf0e10cSrcweir // prior 5.2 ( src569 ver m) 67cdf0e10cSrcweir // {3ECF78F0-B149-11D2-8EBE-00105AD848AF} 68cdf0e10cSrcweir //DEFINE_GUID(OID_ServiceManager, 0x3ECF78F0, 0xB149, 0x11d2, 0x8E, 0xBE, 0x00, 0x10, 0x5A, 0xD8, 0x48, 0xAF); 69cdf0e10cSrcweir 70cdf0e10cSrcweir #ifndef OWNGUID 71cdf0e10cSrcweir // GUID used since 5.2 ( src569 m) 72cdf0e10cSrcweir // {82154420-0FBF-11d4-8313-005004526AB4} 73cdf0e10cSrcweir DEFINE_GUID(OID_ServiceManager, 0x82154420, 0xfbf, 0x11d4, 0x83, 0x13, 0x0, 0x50, 0x4, 0x52, 0x6a, 0xb4); 74cdf0e10cSrcweir #else 75cdf0e10cSrcweir // Alternative GUID 76cdf0e10cSrcweir // {D9BB9D1D-BFA9-4357-9F11-9A2E9061F06E} 77cdf0e10cSrcweir DEFINE_GUID(OID_ServiceManager, 0xd9bb9d1d, 0xbfa9, 0x4357, 0x9f, 0x11, 0x9a, 0x2e, 0x90, 0x61, 0xf0, 0x6e); 78cdf0e10cSrcweir #endif 79cdf0e10cSrcweir 80cdf0e10cSrcweir extern rtl_StandardModuleCount globalModuleCount; 81cdf0e10cSrcweir 82cdf0e10cSrcweir /***************************************************************************** 83cdf0e10cSrcweir 84cdf0e10cSrcweir class implementation ProviderOleWrapper_Impl 85cdf0e10cSrcweir 86cdf0e10cSrcweir *****************************************************************************/ 87cdf0e10cSrcweir 88cdf0e10cSrcweir ProviderOleWrapper_Impl::ProviderOleWrapper_Impl(const Reference<XMultiServiceFactory>& smgr, 89cdf0e10cSrcweir const Reference<XSingleServiceFactory>& xSFact, GUID* pGuid) 90cdf0e10cSrcweir : m_xSingleServiceFactory(xSFact), 91cdf0e10cSrcweir m_smgr( smgr) 92cdf0e10cSrcweir { 93cdf0e10cSrcweir m_guid = *pGuid; 94cdf0e10cSrcweir 95cdf0e10cSrcweir Reference<XInterface> xInt = smgr->createInstance(reinterpret_cast<const sal_Unicode*>(L"com.sun.star.bridge.oleautomation.BridgeSupplier")); 96cdf0e10cSrcweir 97cdf0e10cSrcweir if (xInt.is()) 98cdf0e10cSrcweir { 99cdf0e10cSrcweir Any a= xInt->queryInterface( ::getCppuType( reinterpret_cast< 100cdf0e10cSrcweir Reference< XBridgeSupplier2>* >(0))); 101cdf0e10cSrcweir a >>= m_bridgeSupplier; 102cdf0e10cSrcweir 103cdf0e10cSrcweir } 104cdf0e10cSrcweir } 105cdf0e10cSrcweir 106cdf0e10cSrcweir ProviderOleWrapper_Impl::~ProviderOleWrapper_Impl() 107cdf0e10cSrcweir { 108cdf0e10cSrcweir } 109cdf0e10cSrcweir 110cdf0e10cSrcweir sal_Bool ProviderOleWrapper_Impl::registerClass() 111cdf0e10cSrcweir { 112cdf0e10cSrcweir HRESULT hresult; 113cdf0e10cSrcweir 114cdf0e10cSrcweir o2u_attachCurrentThread(); 115cdf0e10cSrcweir 116cdf0e10cSrcweir hresult = CoRegisterClassObject( 117cdf0e10cSrcweir m_guid, 118cdf0e10cSrcweir this, 119cdf0e10cSrcweir CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER, 120cdf0e10cSrcweir REGCLS_MULTIPLEUSE, 121cdf0e10cSrcweir &m_factoryHandle); 122cdf0e10cSrcweir 123cdf0e10cSrcweir return (hresult == NOERROR); 124cdf0e10cSrcweir } 125cdf0e10cSrcweir 126cdf0e10cSrcweir sal_Bool ProviderOleWrapper_Impl::deregisterClass() 127cdf0e10cSrcweir { 128cdf0e10cSrcweir HRESULT hresult = CoRevokeClassObject(m_factoryHandle); 129cdf0e10cSrcweir 130cdf0e10cSrcweir return (hresult == NOERROR); 131cdf0e10cSrcweir } 132cdf0e10cSrcweir 133cdf0e10cSrcweir STDMETHODIMP ProviderOleWrapper_Impl::QueryInterface(REFIID riid, void FAR* FAR* ppv) 134cdf0e10cSrcweir { 135cdf0e10cSrcweir if(IsEqualIID(riid, IID_IUnknown)) 136cdf0e10cSrcweir { 137cdf0e10cSrcweir AddRef(); 138cdf0e10cSrcweir *ppv = (IUnknown*) (IClassFactory*) this; 139cdf0e10cSrcweir return NOERROR; 140cdf0e10cSrcweir } 141cdf0e10cSrcweir else if (IsEqualIID(riid, IID_IClassFactory)) 142cdf0e10cSrcweir { 143cdf0e10cSrcweir AddRef(); 144cdf0e10cSrcweir *ppv = (IClassFactory*) this; 145cdf0e10cSrcweir return NOERROR; 146cdf0e10cSrcweir } 147cdf0e10cSrcweir 148cdf0e10cSrcweir *ppv = NULL; 149cdf0e10cSrcweir return ResultFromScode(E_NOINTERFACE); 150cdf0e10cSrcweir } 151cdf0e10cSrcweir 152cdf0e10cSrcweir STDMETHODIMP_(ULONG) ProviderOleWrapper_Impl::AddRef() 153cdf0e10cSrcweir { 154cdf0e10cSrcweir return osl_incrementInterlockedCount( &m_refCount); 155cdf0e10cSrcweir } 156cdf0e10cSrcweir 157cdf0e10cSrcweir STDMETHODIMP_(ULONG) ProviderOleWrapper_Impl::Release() 158cdf0e10cSrcweir { 159cdf0e10cSrcweir MutexGuard aGuard( Mutex::getGlobalMutex()); 160cdf0e10cSrcweir ULONG refCount = --m_refCount; 161cdf0e10cSrcweir if (m_refCount == 0) 162cdf0e10cSrcweir { 163cdf0e10cSrcweir delete this; 164cdf0e10cSrcweir } 165cdf0e10cSrcweir 166cdf0e10cSrcweir return refCount; 167cdf0e10cSrcweir } 168cdf0e10cSrcweir 169cdf0e10cSrcweir STDMETHODIMP ProviderOleWrapper_Impl::CreateInstance(IUnknown FAR* punkOuter, 170cdf0e10cSrcweir REFIID riid, 171cdf0e10cSrcweir void FAR* FAR* ppv) 172cdf0e10cSrcweir { 173cdf0e10cSrcweir HRESULT ret = ResultFromScode(E_UNEXPECTED); 174cdf0e10cSrcweir punkOuter = NULL; 175cdf0e10cSrcweir 176cdf0e10cSrcweir Reference<XInterface> xInstance; 177cdf0e10cSrcweir 178cdf0e10cSrcweir if (m_xSingleServiceFactory.is()) 179cdf0e10cSrcweir { 180cdf0e10cSrcweir xInstance = m_xSingleServiceFactory->createInstance(); 181cdf0e10cSrcweir 182cdf0e10cSrcweir if (xInstance.is()) 183cdf0e10cSrcweir { 184cdf0e10cSrcweir Any usrAny(&xInstance, getCppuType( & xInstance)); 185cdf0e10cSrcweir 186cdf0e10cSrcweir sal_uInt8 arId[16]; 187cdf0e10cSrcweir rtl_getGlobalProcessId( arId ); 188cdf0e10cSrcweir Any oleAny = m_bridgeSupplier->createBridge(usrAny, 189cdf0e10cSrcweir Sequence<sal_Int8>((sal_Int8*)arId, 16), 190cdf0e10cSrcweir UNO, 191cdf0e10cSrcweir OLE); 192cdf0e10cSrcweir 193cdf0e10cSrcweir 194cdf0e10cSrcweir if (oleAny.getValueTypeClass() == getCppuType( (sal_uInt32 *)0).getTypeClass()) 195cdf0e10cSrcweir { 196cdf0e10cSrcweir VARIANT* pVariant = *(VARIANT**)oleAny.getValue(); 197cdf0e10cSrcweir 198cdf0e10cSrcweir if (pVariant->vt == VT_DISPATCH) 199cdf0e10cSrcweir { 200cdf0e10cSrcweir ret = pVariant->pdispVal->QueryInterface(riid, ppv); 201cdf0e10cSrcweir } 202cdf0e10cSrcweir 203cdf0e10cSrcweir VariantClear(pVariant); 204cdf0e10cSrcweir CoTaskMemFree(pVariant); 205cdf0e10cSrcweir } 206cdf0e10cSrcweir } 207cdf0e10cSrcweir } 208cdf0e10cSrcweir 209cdf0e10cSrcweir return ret; 210cdf0e10cSrcweir } 211cdf0e10cSrcweir 212cdf0e10cSrcweir STDMETHODIMP ProviderOleWrapper_Impl::LockServer(int /*fLock*/) 213cdf0e10cSrcweir { 214cdf0e10cSrcweir return NOERROR; 215cdf0e10cSrcweir } 216cdf0e10cSrcweir 217cdf0e10cSrcweir /***************************************************************************** 218cdf0e10cSrcweir 219cdf0e10cSrcweir class implementation OneInstanceOleWrapper_Impl 220cdf0e10cSrcweir 221cdf0e10cSrcweir *****************************************************************************/ 222cdf0e10cSrcweir 223cdf0e10cSrcweir OneInstanceOleWrapper_Impl::OneInstanceOleWrapper_Impl( const Reference<XMultiServiceFactory>& smgr, 224cdf0e10cSrcweir const Reference<XInterface>& xInst, 225cdf0e10cSrcweir GUID* pGuid, 226cdf0e10cSrcweir sal_Bool bAsApplication ) 227cdf0e10cSrcweir : m_xInst(xInst), m_refCount(0), 228cdf0e10cSrcweir m_smgr( smgr), 229cdf0e10cSrcweir m_factoryHandle( 0 ), 230cdf0e10cSrcweir m_bAsApplication( bAsApplication ), 231cdf0e10cSrcweir m_nApplRegHandle( 0 ) 232cdf0e10cSrcweir { 233cdf0e10cSrcweir m_guid = *pGuid; 234cdf0e10cSrcweir 235cdf0e10cSrcweir Reference<XInterface> xInt = m_smgr->createInstance(reinterpret_cast<const sal_Unicode*>(L"com.sun.star.bridge.oleautomation.BridgeSupplier")); 236cdf0e10cSrcweir 237cdf0e10cSrcweir if (xInt.is()) 238cdf0e10cSrcweir { 239cdf0e10cSrcweir Any a= xInt->queryInterface( getCppuType( 240cdf0e10cSrcweir reinterpret_cast< Reference<XBridgeSupplier2>*>(0))); 241cdf0e10cSrcweir a >>= m_bridgeSupplier; 242cdf0e10cSrcweir } 243cdf0e10cSrcweir } 244cdf0e10cSrcweir 245cdf0e10cSrcweir OneInstanceOleWrapper_Impl::~OneInstanceOleWrapper_Impl() 246cdf0e10cSrcweir { 247cdf0e10cSrcweir } 248cdf0e10cSrcweir 249cdf0e10cSrcweir sal_Bool OneInstanceOleWrapper_Impl::registerClass() 250cdf0e10cSrcweir { 251cdf0e10cSrcweir HRESULT hresult; 252cdf0e10cSrcweir 253cdf0e10cSrcweir o2u_attachCurrentThread(); 254cdf0e10cSrcweir 255cdf0e10cSrcweir hresult = CoRegisterClassObject( 256cdf0e10cSrcweir m_guid, 257cdf0e10cSrcweir this, 258cdf0e10cSrcweir CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER, 259cdf0e10cSrcweir REGCLS_MULTIPLEUSE, 260cdf0e10cSrcweir &m_factoryHandle); 261cdf0e10cSrcweir 262cdf0e10cSrcweir if ( hresult == NOERROR && m_bAsApplication ) 263cdf0e10cSrcweir hresult = RegisterActiveObject( this, m_guid, ACTIVEOBJECT_WEAK, &m_nApplRegHandle ); 264cdf0e10cSrcweir 265cdf0e10cSrcweir return (hresult == NOERROR); 266cdf0e10cSrcweir } 267cdf0e10cSrcweir 268cdf0e10cSrcweir sal_Bool OneInstanceOleWrapper_Impl::deregisterClass() 269cdf0e10cSrcweir { 270cdf0e10cSrcweir HRESULT hresult1 = NOERROR; 271cdf0e10cSrcweir if ( m_bAsApplication ) 272cdf0e10cSrcweir hresult1 = RevokeActiveObject( m_nApplRegHandle, NULL ); 273cdf0e10cSrcweir 274cdf0e10cSrcweir HRESULT hresult2 = CoRevokeClassObject(m_factoryHandle); 275cdf0e10cSrcweir 276cdf0e10cSrcweir return (hresult1 == NOERROR && hresult2 == NOERROR); 277cdf0e10cSrcweir } 278cdf0e10cSrcweir 279cdf0e10cSrcweir STDMETHODIMP OneInstanceOleWrapper_Impl::QueryInterface(REFIID riid, void FAR* FAR* ppv) 280cdf0e10cSrcweir { 281cdf0e10cSrcweir if(IsEqualIID(riid, IID_IUnknown)) 282cdf0e10cSrcweir { 283cdf0e10cSrcweir AddRef(); 284cdf0e10cSrcweir *ppv = (IUnknown*) (IClassFactory*) this; 285cdf0e10cSrcweir return NOERROR; 286cdf0e10cSrcweir } 287cdf0e10cSrcweir else if (IsEqualIID(riid, IID_IClassFactory)) 288cdf0e10cSrcweir { 289cdf0e10cSrcweir AddRef(); 290cdf0e10cSrcweir *ppv = (IClassFactory*) this; 291cdf0e10cSrcweir return NOERROR; 292cdf0e10cSrcweir } 293cdf0e10cSrcweir 294cdf0e10cSrcweir *ppv = NULL; 295cdf0e10cSrcweir return ResultFromScode(E_NOINTERFACE); 296cdf0e10cSrcweir } 297cdf0e10cSrcweir 298cdf0e10cSrcweir STDMETHODIMP_(ULONG) OneInstanceOleWrapper_Impl::AddRef() 299cdf0e10cSrcweir { 300cdf0e10cSrcweir return osl_incrementInterlockedCount( &m_refCount); 301cdf0e10cSrcweir } 302cdf0e10cSrcweir 303cdf0e10cSrcweir STDMETHODIMP_(ULONG) OneInstanceOleWrapper_Impl::Release() 304cdf0e10cSrcweir { 305cdf0e10cSrcweir MutexGuard oGuard( Mutex::getGlobalMutex()); 306cdf0e10cSrcweir ULONG refCount = --m_refCount; 307cdf0e10cSrcweir if ( m_refCount == 0) 308cdf0e10cSrcweir { 309cdf0e10cSrcweir delete this; 310cdf0e10cSrcweir } 311cdf0e10cSrcweir 312cdf0e10cSrcweir return refCount; 313cdf0e10cSrcweir } 314cdf0e10cSrcweir 315cdf0e10cSrcweir STDMETHODIMP OneInstanceOleWrapper_Impl::CreateInstance(IUnknown FAR* punkOuter, 316cdf0e10cSrcweir REFIID riid, 317cdf0e10cSrcweir void FAR* FAR* ppv) 318cdf0e10cSrcweir { 319cdf0e10cSrcweir HRESULT ret = ResultFromScode(E_UNEXPECTED); 320cdf0e10cSrcweir punkOuter = NULL; 321cdf0e10cSrcweir 322cdf0e10cSrcweir if (m_xInst.is()) 323cdf0e10cSrcweir { 324cdf0e10cSrcweir Any usrAny(&m_xInst, getCppuType( &m_xInst)); 325cdf0e10cSrcweir sal_uInt8 arId[16]; 326cdf0e10cSrcweir rtl_getGlobalProcessId( arId); 327cdf0e10cSrcweir Any oleAny = m_bridgeSupplier->createBridge(usrAny, 328cdf0e10cSrcweir Sequence<sal_Int8>( (sal_Int8*)arId, 16), 329cdf0e10cSrcweir UNO, 330cdf0e10cSrcweir OLE); 331cdf0e10cSrcweir 332cdf0e10cSrcweir 333cdf0e10cSrcweir if (oleAny.getValueTypeClass() == TypeClass_UNSIGNED_LONG) 334cdf0e10cSrcweir { 335cdf0e10cSrcweir VARIANT* pVariant = *(VARIANT**)oleAny.getValue(); 336cdf0e10cSrcweir 337cdf0e10cSrcweir if ((pVariant->vt == VT_UNKNOWN) || (pVariant->vt == VT_DISPATCH)) 338cdf0e10cSrcweir { 339cdf0e10cSrcweir ret = pVariant->punkVal->QueryInterface(riid, ppv); 340cdf0e10cSrcweir } 341cdf0e10cSrcweir 342cdf0e10cSrcweir VariantClear(pVariant); 343cdf0e10cSrcweir CoTaskMemFree(pVariant); 344cdf0e10cSrcweir } 345cdf0e10cSrcweir } 346cdf0e10cSrcweir 347cdf0e10cSrcweir return ret; 348cdf0e10cSrcweir } 349cdf0e10cSrcweir 350cdf0e10cSrcweir STDMETHODIMP OneInstanceOleWrapper_Impl::LockServer(int /*fLock*/) 351cdf0e10cSrcweir { 352cdf0e10cSrcweir return NOERROR; 353cdf0e10cSrcweir } 354cdf0e10cSrcweir 355cdf0e10cSrcweir 356cdf0e10cSrcweir /***************************************************************************** 357cdf0e10cSrcweir 358cdf0e10cSrcweir class implementation OleConverter_Impl2 359cdf0e10cSrcweir 360cdf0e10cSrcweir *****************************************************************************/ 361cdf0e10cSrcweir 362cdf0e10cSrcweir OleConverter_Impl2::OleConverter_Impl2( const Reference<XMultiServiceFactory> &smgr): 363cdf0e10cSrcweir UnoConversionUtilities<OleConverter_Impl2>( smgr) 364cdf0e10cSrcweir 365cdf0e10cSrcweir { 366cdf0e10cSrcweir // library unloading support 367cdf0e10cSrcweir globalModuleCount.modCnt.acquire( &globalModuleCount.modCnt); 368cdf0e10cSrcweir } 369cdf0e10cSrcweir 370cdf0e10cSrcweir // The XMultiServiceFactory is later set by XInitialization 371cdf0e10cSrcweir OleConverter_Impl2::OleConverter_Impl2( const Reference<XMultiServiceFactory>& smgr, sal_uInt8 unoWrapperClass, sal_uInt8 comWrapperClass ): 372cdf0e10cSrcweir UnoConversionUtilities<OleConverter_Impl2>( smgr, unoWrapperClass, comWrapperClass ) 373cdf0e10cSrcweir 374cdf0e10cSrcweir { 375cdf0e10cSrcweir //library unloading support 376cdf0e10cSrcweir globalModuleCount.modCnt.acquire( &globalModuleCount.modCnt); 377cdf0e10cSrcweir } 378cdf0e10cSrcweir 379cdf0e10cSrcweir OleConverter_Impl2::~OleConverter_Impl2() 380cdf0e10cSrcweir { 381cdf0e10cSrcweir globalModuleCount.modCnt.release( &globalModuleCount.modCnt); 382cdf0e10cSrcweir } 383cdf0e10cSrcweir 384cdf0e10cSrcweir // XBridgeSupplier -------------------------------------------------------------- 385cdf0e10cSrcweir Any SAL_CALL OleConverter_Impl2::createBridge(const Any& modelDepObject, 386cdf0e10cSrcweir const Sequence< sal_Int8 >& ProcessId, 387cdf0e10cSrcweir sal_Int16 sourceModelType, 388cdf0e10cSrcweir sal_Int16 destModelType) 389cdf0e10cSrcweir throw (IllegalArgumentException, 390cdf0e10cSrcweir RuntimeException ) 391cdf0e10cSrcweir { 392cdf0e10cSrcweir Any ret; 393cdf0e10cSrcweir sal_uInt8 arId[16]; 394cdf0e10cSrcweir rtl_getGlobalProcessId( arId ); 395cdf0e10cSrcweir 396cdf0e10cSrcweir Sequence< sal_Int8 > seqProcessId( (sal_Int8*)arId, 16); 397cdf0e10cSrcweir 398cdf0e10cSrcweir if ( seqProcessId == ProcessId) 399cdf0e10cSrcweir { 400cdf0e10cSrcweir if (sourceModelType == UNO) 401cdf0e10cSrcweir { 402cdf0e10cSrcweir if (destModelType == UNO) 403cdf0e10cSrcweir { 404cdf0e10cSrcweir // same model -> copy value only 405cdf0e10cSrcweir ret = modelDepObject; 406cdf0e10cSrcweir } 407cdf0e10cSrcweir else if (destModelType == OLE) 408cdf0e10cSrcweir { 409cdf0e10cSrcweir // convert UNO any into variant 410cdf0e10cSrcweir VARIANT* pVariant = (VARIANT*) CoTaskMemAlloc(sizeof(VARIANT)); 411cdf0e10cSrcweir VariantInit( pVariant); 412cdf0e10cSrcweir try 413cdf0e10cSrcweir { 414cdf0e10cSrcweir anyToVariant( pVariant, modelDepObject); 415cdf0e10cSrcweir } 416cdf0e10cSrcweir catch(...) 417cdf0e10cSrcweir { 418cdf0e10cSrcweir CoTaskMemFree(pVariant); 419cdf0e10cSrcweir throw IllegalArgumentException(); 420cdf0e10cSrcweir } 421cdf0e10cSrcweir ret.setValue((void*) &pVariant, getCppuType((sal_uInt32*)0)); 422cdf0e10cSrcweir } 423cdf0e10cSrcweir else 424cdf0e10cSrcweir throw IllegalArgumentException(); 425cdf0e10cSrcweir } 426cdf0e10cSrcweir else if (sourceModelType == OLE) 427cdf0e10cSrcweir { 428cdf0e10cSrcweir if (modelDepObject.getValueType() != getCppuType((sal_uInt32*)0)) 429cdf0e10cSrcweir { 430cdf0e10cSrcweir throw IllegalArgumentException(); 431cdf0e10cSrcweir } 432cdf0e10cSrcweir else if (destModelType == OLE) 433cdf0e10cSrcweir { 434cdf0e10cSrcweir // same model -> copy value only 435cdf0e10cSrcweir VARIANT* pVariant = (VARIANT*) CoTaskMemAlloc(sizeof(VARIANT)); 436cdf0e10cSrcweir 437cdf0e10cSrcweir if (NOERROR != VariantCopy(pVariant, *(VARIANT**)modelDepObject.getValue())) 438cdf0e10cSrcweir { 439cdf0e10cSrcweir CoTaskMemFree(pVariant); 440cdf0e10cSrcweir throw(IllegalArgumentException()); 441cdf0e10cSrcweir } 442cdf0e10cSrcweir else 443cdf0e10cSrcweir { 444cdf0e10cSrcweir ret.setValue((void*) &pVariant, getCppuType((sal_uInt32*)0)); 445cdf0e10cSrcweir } 446cdf0e10cSrcweir } 447cdf0e10cSrcweir else if (destModelType == UNO) 448cdf0e10cSrcweir { 449cdf0e10cSrcweir // convert variant into UNO any 450cdf0e10cSrcweir VARIANT* pVariant = *(VARIANT**)modelDepObject.getValue(); 451cdf0e10cSrcweir try 452cdf0e10cSrcweir { 453cdf0e10cSrcweir variantToAny(pVariant, ret); 454cdf0e10cSrcweir } 455cdf0e10cSrcweir catch (CannotConvertException & e) 456cdf0e10cSrcweir { 457cdf0e10cSrcweir throw IllegalArgumentException( 458cdf0e10cSrcweir e.Message, 0, -1); 459cdf0e10cSrcweir } 460cdf0e10cSrcweir } 461cdf0e10cSrcweir else 462cdf0e10cSrcweir throw IllegalArgumentException(); 463cdf0e10cSrcweir 464cdf0e10cSrcweir } 465cdf0e10cSrcweir else 466cdf0e10cSrcweir throw IllegalArgumentException(); 467cdf0e10cSrcweir } 468cdf0e10cSrcweir 469cdf0e10cSrcweir return ret; 470cdf0e10cSrcweir } 471cdf0e10cSrcweir 472cdf0e10cSrcweir 473cdf0e10cSrcweir // XInitialize ------------------------------------------------------------------------------ 474cdf0e10cSrcweir // the first argument is an XMultiServiceFactory if at all 475cdf0e10cSrcweir void SAL_CALL OleConverter_Impl2::initialize( const Sequence< Any >& aArguments ) 476cdf0e10cSrcweir throw(Exception, RuntimeException) 477cdf0e10cSrcweir { 478cdf0e10cSrcweir if( aArguments.getLength() == 1 && aArguments[0].getValueTypeClass() == TypeClass_INTERFACE) 479cdf0e10cSrcweir { 480cdf0e10cSrcweir Reference < XInterface > xInt; 481cdf0e10cSrcweir aArguments[0] >>= xInt; 482cdf0e10cSrcweir Reference <XMultiServiceFactory> xMulti( xInt, UNO_QUERY); 483cdf0e10cSrcweir m_smgrRemote= xMulti; 484cdf0e10cSrcweir } 485cdf0e10cSrcweir } 486cdf0e10cSrcweir 487cdf0e10cSrcweir // UnoConversionUtilities ------------------------------------------------------------------- 488cdf0e10cSrcweir Reference< XInterface > OleConverter_Impl2::createUnoWrapperInstance() 489cdf0e10cSrcweir { 490cdf0e10cSrcweir if( m_nUnoWrapperClass == INTERFACE_OLE_WRAPPER_IMPL) 491cdf0e10cSrcweir { 492cdf0e10cSrcweir Reference<XWeak> xWeak= static_cast<XWeak*>( new InterfaceOleWrapper_Impl( 493cdf0e10cSrcweir m_smgr, m_nUnoWrapperClass, m_nComWrapperClass)); 494cdf0e10cSrcweir return Reference<XInterface>( xWeak, UNO_QUERY); 495cdf0e10cSrcweir } 496cdf0e10cSrcweir else if( m_nUnoWrapperClass == UNO_OBJECT_WRAPPER_REMOTE_OPT) 497cdf0e10cSrcweir { 498cdf0e10cSrcweir Reference<XWeak> xWeak= static_cast<XWeak*>( new UnoObjectWrapperRemoteOpt( 499cdf0e10cSrcweir m_smgr, m_nUnoWrapperClass, m_nComWrapperClass)); 500cdf0e10cSrcweir return Reference<XInterface>( xWeak, UNO_QUERY); 501cdf0e10cSrcweir } 502cdf0e10cSrcweir else 503cdf0e10cSrcweir return Reference<XInterface>(); 504cdf0e10cSrcweir } 505cdf0e10cSrcweir 506cdf0e10cSrcweir Reference< XInterface > OleConverter_Impl2::createComWrapperInstance() 507cdf0e10cSrcweir { 508cdf0e10cSrcweir Reference<XWeak> xWeak= static_cast<XWeak*>( new IUnknownWrapper_Impl( 509cdf0e10cSrcweir m_smgr, m_nUnoWrapperClass, m_nComWrapperClass)); 510cdf0e10cSrcweir return Reference<XInterface>( xWeak, UNO_QUERY); 511cdf0e10cSrcweir } 512cdf0e10cSrcweir 513cdf0e10cSrcweir 514cdf0e10cSrcweir 515cdf0e10cSrcweir /***************************************************************************** 516cdf0e10cSrcweir 517cdf0e10cSrcweir class implementation OleClient_Impl 518cdf0e10cSrcweir 519cdf0e10cSrcweir *****************************************************************************/ 520cdf0e10cSrcweir 521cdf0e10cSrcweir OleClient_Impl::OleClient_Impl( const Reference<XMultiServiceFactory>& smgr): 522cdf0e10cSrcweir UnoConversionUtilities<OleClient_Impl>( smgr) 523cdf0e10cSrcweir { 524cdf0e10cSrcweir // library unloading support 525cdf0e10cSrcweir globalModuleCount.modCnt.acquire( &globalModuleCount.modCnt); 526cdf0e10cSrcweir Reference<XInterface> xInt;// = m_smgr->createInstance(L"com.sun.star.bridge.OleBridgeSupplier2"); 527cdf0e10cSrcweir 528cdf0e10cSrcweir if (xInt.is()) 529cdf0e10cSrcweir { 530cdf0e10cSrcweir Any a= xInt->queryInterface(getCppuType( 531cdf0e10cSrcweir reinterpret_cast<Reference<XBridgeSupplier2>*>(0))); 532cdf0e10cSrcweir a >>= m_bridgeSupplier; 533cdf0e10cSrcweir } 534cdf0e10cSrcweir } 535cdf0e10cSrcweir 536cdf0e10cSrcweir OleClient_Impl::~OleClient_Impl() 537cdf0e10cSrcweir { 538cdf0e10cSrcweir // library unloading support 539cdf0e10cSrcweir globalModuleCount.modCnt.release( &globalModuleCount.modCnt); 540cdf0e10cSrcweir } 541cdf0e10cSrcweir 542cdf0e10cSrcweir Sequence< OUString > SAL_CALL OleClient_Impl::getAvailableServiceNames() throw( RuntimeException ) 543cdf0e10cSrcweir { 544cdf0e10cSrcweir Sequence< OUString > ret; 545cdf0e10cSrcweir 546cdf0e10cSrcweir return ret; 547cdf0e10cSrcweir } 548cdf0e10cSrcweir 549cdf0e10cSrcweir 550cdf0e10cSrcweir OUString OleClient_Impl::getImplementationName() 551cdf0e10cSrcweir { 552cdf0e10cSrcweir return OUString(reinterpret_cast<const sal_Unicode*>(L"com.sun.star.comp.ole.OleClient")); 553cdf0e10cSrcweir } 554cdf0e10cSrcweir 555cdf0e10cSrcweir Reference<XInterface> SAL_CALL OleClient_Impl::createInstance(const OUString& ServiceSpecifier) throw (Exception, RuntimeException ) 556cdf0e10cSrcweir { 557cdf0e10cSrcweir Reference<XInterface> ret; 558cdf0e10cSrcweir HRESULT result; 559cdf0e10cSrcweir IUnknown* pUnknown = NULL; 560cdf0e10cSrcweir CLSID classId; 561cdf0e10cSrcweir 562cdf0e10cSrcweir o2u_attachCurrentThread(); 563cdf0e10cSrcweir 564cdf0e10cSrcweir result = CLSIDFromProgID( 565cdf0e10cSrcweir reinterpret_cast<LPCWSTR>(ServiceSpecifier.getStr()), //Pointer to the ProgID 566cdf0e10cSrcweir &classId); //Pointer to the CLSID 567cdf0e10cSrcweir 568cdf0e10cSrcweir 569cdf0e10cSrcweir if (result == NOERROR) 570cdf0e10cSrcweir { 571cdf0e10cSrcweir result = CoCreateInstance( 572cdf0e10cSrcweir classId, //Class identifier (CLSID) of the object 573cdf0e10cSrcweir NULL, //Pointer to whether object is or isn't part of an aggregate 574cdf0e10cSrcweir CLSCTX_SERVER, //Context for running executable code 575cdf0e10cSrcweir IID_IUnknown, //Reference to the identifier of the interface 576cdf0e10cSrcweir (void**)&pUnknown); //Address of output variable that receives 577cdf0e10cSrcweir // the interface pointer requested in riid 578cdf0e10cSrcweir } 579cdf0e10cSrcweir 580cdf0e10cSrcweir if (pUnknown != NULL) 581cdf0e10cSrcweir { 582cdf0e10cSrcweir Any any; 583cdf0e10cSrcweir CComVariant variant; 584cdf0e10cSrcweir 585cdf0e10cSrcweir V_VT(&variant) = VT_UNKNOWN; 586cdf0e10cSrcweir V_UNKNOWN(&variant) = pUnknown; 587cdf0e10cSrcweir // AddRef for Variant 588cdf0e10cSrcweir pUnknown->AddRef(); 589cdf0e10cSrcweir 590cdf0e10cSrcweir // When the object is wrapped, then its refcount is increased 591cdf0e10cSrcweir variantToAny(&variant, any); 592cdf0e10cSrcweir if (any.getValueTypeClass() == TypeClass_INTERFACE) 593cdf0e10cSrcweir { 594cdf0e10cSrcweir any >>= ret; 595cdf0e10cSrcweir } 596cdf0e10cSrcweir pUnknown->Release(); // CoCreateInstance 597cdf0e10cSrcweir } 598cdf0e10cSrcweir 599cdf0e10cSrcweir return ret; 600cdf0e10cSrcweir } 601cdf0e10cSrcweir 602cdf0e10cSrcweir Reference<XInterface> SAL_CALL OleClient_Impl::createInstanceWithArguments(const OUString& ServiceSpecifier, const Sequence< Any >& /*Arguments*/) throw (Exception, RuntimeException) 603cdf0e10cSrcweir { 604cdf0e10cSrcweir return createInstance( ServiceSpecifier); 605cdf0e10cSrcweir } 606cdf0e10cSrcweir 607cdf0e10cSrcweir // UnoConversionUtilities ----------------------------------------------------------------------------- 608cdf0e10cSrcweir Reference< XInterface > OleClient_Impl::createUnoWrapperInstance() 609cdf0e10cSrcweir { 610cdf0e10cSrcweir if( m_nUnoWrapperClass == INTERFACE_OLE_WRAPPER_IMPL) 611cdf0e10cSrcweir { 612cdf0e10cSrcweir Reference<XWeak> xWeak= static_cast<XWeak*>( new InterfaceOleWrapper_Impl( 613cdf0e10cSrcweir m_smgr, m_nUnoWrapperClass, m_nComWrapperClass)); 614cdf0e10cSrcweir return Reference<XInterface>( xWeak, UNO_QUERY); 615cdf0e10cSrcweir } 616cdf0e10cSrcweir else if( m_nUnoWrapperClass == UNO_OBJECT_WRAPPER_REMOTE_OPT) 617cdf0e10cSrcweir { 618cdf0e10cSrcweir Reference<XWeak> xWeak= static_cast<XWeak*>( new UnoObjectWrapperRemoteOpt( 619cdf0e10cSrcweir m_smgr, m_nUnoWrapperClass, m_nComWrapperClass)); 620cdf0e10cSrcweir return Reference<XInterface>( xWeak, UNO_QUERY); 621cdf0e10cSrcweir } 622cdf0e10cSrcweir else 623cdf0e10cSrcweir return Reference< XInterface>(); 624cdf0e10cSrcweir } 625cdf0e10cSrcweir // UnoConversionUtilities ----------------------------------------------------------------------------- 626cdf0e10cSrcweir Reference< XInterface > OleClient_Impl::createComWrapperInstance( ) 627cdf0e10cSrcweir { 628cdf0e10cSrcweir Reference<XWeak> xWeak= static_cast<XWeak*>( new IUnknownWrapper_Impl( 629cdf0e10cSrcweir m_smgr, m_nUnoWrapperClass, m_nComWrapperClass)); 630cdf0e10cSrcweir return Reference<XInterface>( xWeak, UNO_QUERY); 631cdf0e10cSrcweir } 632cdf0e10cSrcweir 633cdf0e10cSrcweir 634cdf0e10cSrcweir 635cdf0e10cSrcweir /***************************************************************************** 636cdf0e10cSrcweir 637cdf0e10cSrcweir class implementation OleServer_Impl 638cdf0e10cSrcweir 639cdf0e10cSrcweir *****************************************************************************/ 640cdf0e10cSrcweir 641cdf0e10cSrcweir OleServer_Impl::OleServer_Impl( const Reference<XMultiServiceFactory>& smgr): 642cdf0e10cSrcweir m_smgr( smgr) 643cdf0e10cSrcweir { 644cdf0e10cSrcweir //library unloading support 645cdf0e10cSrcweir globalModuleCount.modCnt.acquire( &globalModuleCount.modCnt); 646cdf0e10cSrcweir Reference<XInterface> xInt = m_smgr->createInstance(reinterpret_cast<const sal_Unicode*>(L"com.sun.star.bridge.oleautomation.BridgeSupplier")); 647cdf0e10cSrcweir 648cdf0e10cSrcweir if (xInt.is()) 649cdf0e10cSrcweir { 650cdf0e10cSrcweir Any a= xInt->queryInterface( getCppuType( 651cdf0e10cSrcweir reinterpret_cast< Reference<XBridgeSupplier2>*>(0))); 652cdf0e10cSrcweir a >>= m_bridgeSupplier; 653cdf0e10cSrcweir } 654cdf0e10cSrcweir 655cdf0e10cSrcweir #ifndef OWNGUID 656cdf0e10cSrcweir sal_Bool bOLERegister = sal_False; 657cdf0e10cSrcweir #else 658cdf0e10cSrcweir sal_Bool bOLERegister = sal_True; 659cdf0e10cSrcweir #endif 660cdf0e10cSrcweir sal_Bool ret = provideInstance( m_smgr, (GUID*)&OID_ServiceManager, bOLERegister ); 661cdf0e10cSrcweir (void)ret; 662cdf0e10cSrcweir } 663cdf0e10cSrcweir 664cdf0e10cSrcweir OleServer_Impl::~OleServer_Impl() 665cdf0e10cSrcweir { 666cdf0e10cSrcweir while (!m_wrapperList.empty()) 667cdf0e10cSrcweir { 668cdf0e10cSrcweir (*m_wrapperList.begin())->deregisterClass(); 669cdf0e10cSrcweir (*m_wrapperList.begin())->Release(); 670cdf0e10cSrcweir m_wrapperList.pop_front(); 671cdf0e10cSrcweir } 672cdf0e10cSrcweir //library unloading support 673cdf0e10cSrcweir globalModuleCount.modCnt.release( &globalModuleCount.modCnt); 674cdf0e10cSrcweir } 675cdf0e10cSrcweir // XInterface -------------------------------------------------- 676cdf0e10cSrcweir Any SAL_CALL OleServer_Impl::queryInterface( const Type& aType ) throw(RuntimeException) 677cdf0e10cSrcweir { 678cdf0e10cSrcweir Any a= ::cppu::queryInterface( aType, static_cast<XTypeProvider*>(this)); 679cdf0e10cSrcweir if( a == Any()) 680cdf0e10cSrcweir return OWeakObject::queryInterface( aType); 681cdf0e10cSrcweir else 682cdf0e10cSrcweir return a; 683cdf0e10cSrcweir } 684cdf0e10cSrcweir void SAL_CALL OleServer_Impl::acquire( ) throw() 685cdf0e10cSrcweir { 686cdf0e10cSrcweir OWeakObject::acquire(); 687cdf0e10cSrcweir } 688cdf0e10cSrcweir void SAL_CALL OleServer_Impl::release( ) throw () 689cdf0e10cSrcweir { 690cdf0e10cSrcweir OWeakObject::release(); 691cdf0e10cSrcweir } 692cdf0e10cSrcweir 693cdf0e10cSrcweir 694cdf0e10cSrcweir // XTypeProvider -------------------------------------------------- 695cdf0e10cSrcweir Sequence< Type > SAL_CALL OleServer_Impl::getTypes( ) throw(RuntimeException) 696cdf0e10cSrcweir { 697cdf0e10cSrcweir static OTypeCollection *pCollection = 0; 698cdf0e10cSrcweir if( ! pCollection ) 699cdf0e10cSrcweir { 700cdf0e10cSrcweir MutexGuard guard( Mutex::getGlobalMutex() ); 701cdf0e10cSrcweir if( ! pCollection ) 702cdf0e10cSrcweir { 703cdf0e10cSrcweir static OTypeCollection collection( 704cdf0e10cSrcweir getCppuType(reinterpret_cast< Reference< XWeak>*>(0)), 705cdf0e10cSrcweir getCppuType(reinterpret_cast< Reference< XTypeProvider>*>(0)) ); 706cdf0e10cSrcweir pCollection = &collection; 707cdf0e10cSrcweir } 708cdf0e10cSrcweir } 709cdf0e10cSrcweir return (*pCollection).getTypes(); 710cdf0e10cSrcweir } 711cdf0e10cSrcweir Sequence< sal_Int8 > SAL_CALL OleServer_Impl::getImplementationId() throw(RuntimeException) 712cdf0e10cSrcweir { 713cdf0e10cSrcweir static OImplementationId *pId = 0; 714cdf0e10cSrcweir if( ! pId ) 715cdf0e10cSrcweir { 716cdf0e10cSrcweir MutexGuard guard( Mutex::getGlobalMutex() ); 717cdf0e10cSrcweir if( ! pId ) 718cdf0e10cSrcweir { 719cdf0e10cSrcweir static OImplementationId id( sal_False ); 720cdf0e10cSrcweir pId = &id; 721cdf0e10cSrcweir } 722cdf0e10cSrcweir } 723cdf0e10cSrcweir return (*pId).getImplementationId(); 724cdf0e10cSrcweir } 725cdf0e10cSrcweir 726cdf0e10cSrcweir 727cdf0e10cSrcweir sal_Bool OleServer_Impl::provideService(const Reference<XSingleServiceFactory>& xSFact, GUID* guid) 728cdf0e10cSrcweir { 729cdf0e10cSrcweir IClassFactoryWrapper* pFac = new ProviderOleWrapper_Impl( m_smgr, xSFact, guid); 730cdf0e10cSrcweir 731cdf0e10cSrcweir pFac->AddRef(); 732cdf0e10cSrcweir 733cdf0e10cSrcweir m_wrapperList.push_back(pFac); 734cdf0e10cSrcweir 735cdf0e10cSrcweir return pFac->registerClass(); 736cdf0e10cSrcweir } 737cdf0e10cSrcweir 738cdf0e10cSrcweir sal_Bool OleServer_Impl::provideInstance(const Reference<XInterface>& xInst, GUID* guid, sal_Bool bAsApplication ) 739cdf0e10cSrcweir { 740cdf0e10cSrcweir IClassFactoryWrapper* pFac = new OneInstanceOleWrapper_Impl( m_smgr, xInst, guid, bAsApplication ); 741cdf0e10cSrcweir 742cdf0e10cSrcweir pFac->AddRef(); 743cdf0e10cSrcweir m_wrapperList.push_back(pFac); 744cdf0e10cSrcweir 745cdf0e10cSrcweir return pFac->registerClass(); 746cdf0e10cSrcweir } 747cdf0e10cSrcweir 748cdf0e10cSrcweir 749cdf0e10cSrcweir 750cdf0e10cSrcweir } // end namespace 751