1*cdf0e10cSrcweir /************************************************************************* 2*cdf0e10cSrcweir * 3*cdf0e10cSrcweir * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4*cdf0e10cSrcweir * 5*cdf0e10cSrcweir * Copyright 2000, 2010 Oracle and/or its affiliates. 6*cdf0e10cSrcweir * 7*cdf0e10cSrcweir * OpenOffice.org - a multi-platform office productivity suite 8*cdf0e10cSrcweir * 9*cdf0e10cSrcweir * This file is part of OpenOffice.org. 10*cdf0e10cSrcweir * 11*cdf0e10cSrcweir * OpenOffice.org is free software: you can redistribute it and/or modify 12*cdf0e10cSrcweir * it under the terms of the GNU Lesser General Public License version 3 13*cdf0e10cSrcweir * only, as published by the Free Software Foundation. 14*cdf0e10cSrcweir * 15*cdf0e10cSrcweir * OpenOffice.org is distributed in the hope that it will be useful, 16*cdf0e10cSrcweir * but WITHOUT ANY WARRANTY; without even the implied warranty of 17*cdf0e10cSrcweir * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18*cdf0e10cSrcweir * GNU Lesser General Public License version 3 for more details 19*cdf0e10cSrcweir * (a copy is included in the LICENSE file that accompanied this code). 20*cdf0e10cSrcweir * 21*cdf0e10cSrcweir * You should have received a copy of the GNU Lesser General Public License 22*cdf0e10cSrcweir * version 3 along with OpenOffice.org. If not, see 23*cdf0e10cSrcweir * <http://www.openoffice.org/license.html> 24*cdf0e10cSrcweir * for a copy of the LGPLv3 License. 25*cdf0e10cSrcweir * 26*cdf0e10cSrcweir ************************************************************************/ 27*cdf0e10cSrcweir 28*cdf0e10cSrcweir #include "embeddoc.hxx" 29*cdf0e10cSrcweir #include <osl/diagnose.h> 30*cdf0e10cSrcweir #include <com/sun/star/frame/XController.hpp> 31*cdf0e10cSrcweir #include <com/sun/star/beans/PropertyValue.hpp> 32*cdf0e10cSrcweir 33*cdf0e10cSrcweir 34*cdf0e10cSrcweir using namespace ::com::sun::star; 35*cdf0e10cSrcweir 36*cdf0e10cSrcweir 37*cdf0e10cSrcweir extern ::rtl::OUString getFilterNameFromGUID_Impl( GUID* ); 38*cdf0e10cSrcweir 39*cdf0e10cSrcweir //------------------------------------------------------------------------------- 40*cdf0e10cSrcweir // IOleObject 41*cdf0e10cSrcweir 42*cdf0e10cSrcweir 43*cdf0e10cSrcweir STDMETHODIMP EmbedDocument_Impl::SetClientSite( IOleClientSite* pSite ) 44*cdf0e10cSrcweir { 45*cdf0e10cSrcweir m_pClientSite = pSite; 46*cdf0e10cSrcweir return S_OK; 47*cdf0e10cSrcweir } 48*cdf0e10cSrcweir 49*cdf0e10cSrcweir STDMETHODIMP EmbedDocument_Impl::GetClientSite( IOleClientSite** pSite ) 50*cdf0e10cSrcweir { 51*cdf0e10cSrcweir *pSite = m_pClientSite; 52*cdf0e10cSrcweir return S_OK; 53*cdf0e10cSrcweir } 54*cdf0e10cSrcweir 55*cdf0e10cSrcweir STDMETHODIMP EmbedDocument_Impl::SetHostNames( LPCOLESTR szContainerApp, LPCOLESTR szContainerObj ) 56*cdf0e10cSrcweir { 57*cdf0e10cSrcweir // the code should be ignored for links 58*cdf0e10cSrcweir if ( !m_aFileName.getLength() ) 59*cdf0e10cSrcweir { 60*cdf0e10cSrcweir m_pDocHolder->setTitle( 61*cdf0e10cSrcweir rtl::OUString( 62*cdf0e10cSrcweir (sal_Unicode*)szContainerObj)); 63*cdf0e10cSrcweir m_pDocHolder->setContainerName( 64*cdf0e10cSrcweir rtl::OUString( 65*cdf0e10cSrcweir (sal_Unicode*)szContainerApp)); 66*cdf0e10cSrcweir } 67*cdf0e10cSrcweir 68*cdf0e10cSrcweir return S_OK; 69*cdf0e10cSrcweir } 70*cdf0e10cSrcweir 71*cdf0e10cSrcweir STDMETHODIMP EmbedDocument_Impl::Close( DWORD dwSaveOption ) 72*cdf0e10cSrcweir { 73*cdf0e10cSrcweir HRESULT hr = S_OK; 74*cdf0e10cSrcweir 75*cdf0e10cSrcweir if ( m_pDocHolder->HasFrame() ) 76*cdf0e10cSrcweir { 77*cdf0e10cSrcweir if ( dwSaveOption == 2 && m_aFileName.getLength() ) 78*cdf0e10cSrcweir { 79*cdf0e10cSrcweir // ask the user about saving 80*cdf0e10cSrcweir if ( m_pDocHolder->ExecuteSuspendCloseFrame() ) 81*cdf0e10cSrcweir { 82*cdf0e10cSrcweir m_pDocHolder->CloseDocument(); 83*cdf0e10cSrcweir return S_OK; 84*cdf0e10cSrcweir } 85*cdf0e10cSrcweir else 86*cdf0e10cSrcweir return OLE_E_PROMPTSAVECANCELLED; 87*cdf0e10cSrcweir } 88*cdf0e10cSrcweir 89*cdf0e10cSrcweir if ( dwSaveOption != 1 ) 90*cdf0e10cSrcweir hr = SaveObject(); // ADVF_DATAONSTOP); 91*cdf0e10cSrcweir 92*cdf0e10cSrcweir m_pDocHolder->CloseFrame(); 93*cdf0e10cSrcweir OLENotifyDeactivation(); 94*cdf0e10cSrcweir } 95*cdf0e10cSrcweir 96*cdf0e10cSrcweir m_pDocHolder->FreeOffice(); 97*cdf0e10cSrcweir m_pDocHolder->CloseDocument(); 98*cdf0e10cSrcweir 99*cdf0e10cSrcweir OLENotifyClosing(); 100*cdf0e10cSrcweir 101*cdf0e10cSrcweir return hr; 102*cdf0e10cSrcweir } 103*cdf0e10cSrcweir 104*cdf0e10cSrcweir 105*cdf0e10cSrcweir HRESULT EmbedDocument_Impl::OLENotifyClosing() 106*cdf0e10cSrcweir { 107*cdf0e10cSrcweir HRESULT hr = S_OK; 108*cdf0e10cSrcweir 109*cdf0e10cSrcweir AdviseSinkHashMap aAHM(m_aAdviseHashMap); 110*cdf0e10cSrcweir 111*cdf0e10cSrcweir for ( AdviseSinkHashMapIterator iAdvise = aAHM.begin(); 112*cdf0e10cSrcweir iAdvise != aAHM.end(); iAdvise++ ) 113*cdf0e10cSrcweir { 114*cdf0e10cSrcweir if ( iAdvise->second ) 115*cdf0e10cSrcweir iAdvise->second->OnClose(); 116*cdf0e10cSrcweir } 117*cdf0e10cSrcweir 118*cdf0e10cSrcweir return hr; 119*cdf0e10cSrcweir 120*cdf0e10cSrcweir } 121*cdf0e10cSrcweir 122*cdf0e10cSrcweir STDMETHODIMP EmbedDocument_Impl::SetMoniker( DWORD /*dwWhichMoniker*/, IMoniker * /*pmk*/ ) 123*cdf0e10cSrcweir { 124*cdf0e10cSrcweir return E_NOTIMPL; 125*cdf0e10cSrcweir } 126*cdf0e10cSrcweir 127*cdf0e10cSrcweir STDMETHODIMP EmbedDocument_Impl::GetMoniker( DWORD /*dwAssign*/, DWORD /*dwWhichMoniker*/, IMoniker ** /*ppmk*/ ) 128*cdf0e10cSrcweir { 129*cdf0e10cSrcweir return E_NOTIMPL; 130*cdf0e10cSrcweir } 131*cdf0e10cSrcweir 132*cdf0e10cSrcweir STDMETHODIMP EmbedDocument_Impl::InitFromData( IDataObject * /*pDataObject*/, BOOL /*fCreation*/, DWORD /*dwReserved*/ ) 133*cdf0e10cSrcweir { 134*cdf0e10cSrcweir return E_NOTIMPL; 135*cdf0e10cSrcweir } 136*cdf0e10cSrcweir 137*cdf0e10cSrcweir STDMETHODIMP EmbedDocument_Impl::GetClipboardData( DWORD /*dwReserved*/, IDataObject ** /*ppDataObject*/ ) 138*cdf0e10cSrcweir { 139*cdf0e10cSrcweir return E_NOTIMPL; 140*cdf0e10cSrcweir } 141*cdf0e10cSrcweir 142*cdf0e10cSrcweir /** 143*cdf0e10cSrcweir * Well, this is a not so very inefficient way to deliver 144*cdf0e10cSrcweir * 145*cdf0e10cSrcweir */ 146*cdf0e10cSrcweir 147*cdf0e10cSrcweir STDMETHODIMP EmbedDocument_Impl::DoVerb( 148*cdf0e10cSrcweir LONG iVerb, 149*cdf0e10cSrcweir LPMSG, 150*cdf0e10cSrcweir IOleClientSite *pActiveSite, 151*cdf0e10cSrcweir LONG, 152*cdf0e10cSrcweir HWND, 153*cdf0e10cSrcweir LPCRECT ) 154*cdf0e10cSrcweir { 155*cdf0e10cSrcweir // no locking is used since the OLE must use the same thread always 156*cdf0e10cSrcweir if ( m_bIsInVerbHandling ) 157*cdf0e10cSrcweir return OLEOBJ_S_CANNOT_DOVERB_NOW; 158*cdf0e10cSrcweir 159*cdf0e10cSrcweir // an object can not handle any Verbs in Hands off mode 160*cdf0e10cSrcweir if ( m_pMasterStorage == NULL || m_pOwnStream == NULL ) 161*cdf0e10cSrcweir return OLE_E_CANT_BINDTOSOURCE; 162*cdf0e10cSrcweir 163*cdf0e10cSrcweir 164*cdf0e10cSrcweir BooleanGuard_Impl aGuard( m_bIsInVerbHandling ); 165*cdf0e10cSrcweir 166*cdf0e10cSrcweir if ( iVerb == OLEIVERB_PRIMARY ) 167*cdf0e10cSrcweir { 168*cdf0e10cSrcweir if ( m_aFileName.getLength() ) 169*cdf0e10cSrcweir { 170*cdf0e10cSrcweir // that should be a link 171*cdf0e10cSrcweir iVerb = OLEIVERB_OPEN; 172*cdf0e10cSrcweir } 173*cdf0e10cSrcweir else 174*cdf0e10cSrcweir iVerb = OLEIVERB_SHOW; 175*cdf0e10cSrcweir } 176*cdf0e10cSrcweir 177*cdf0e10cSrcweir try 178*cdf0e10cSrcweir { 179*cdf0e10cSrcweir switch(iVerb) { 180*cdf0e10cSrcweir case OLEIVERB_DISCARDUNDOSTATE: 181*cdf0e10cSrcweir // free any undostate? 182*cdf0e10cSrcweir break; 183*cdf0e10cSrcweir case OLEIVERB_INPLACEACTIVATE: 184*cdf0e10cSrcweir OSL_ENSURE(m_pDocHolder,"no document for inplace activation"); 185*cdf0e10cSrcweir 186*cdf0e10cSrcweir return m_pDocHolder->InPlaceActivate(pActiveSite,FALSE); 187*cdf0e10cSrcweir break; 188*cdf0e10cSrcweir case OLEIVERB_UIACTIVATE: 189*cdf0e10cSrcweir OSL_ENSURE(m_pDocHolder,"no document for inplace activation"); 190*cdf0e10cSrcweir 191*cdf0e10cSrcweir return m_pDocHolder->InPlaceActivate(pActiveSite,TRUE); 192*cdf0e10cSrcweir break; 193*cdf0e10cSrcweir case OLEIVERB_PRIMARY: 194*cdf0e10cSrcweir case OLEIVERB_SHOW: 195*cdf0e10cSrcweir OSL_ENSURE(m_pDocHolder,"no document for inplace activation"); 196*cdf0e10cSrcweir 197*cdf0e10cSrcweir if(m_pDocHolder->isActive()) 198*cdf0e10cSrcweir return NOERROR; //Already active 199*cdf0e10cSrcweir 200*cdf0e10cSrcweir if(SUCCEEDED( 201*cdf0e10cSrcweir m_pDocHolder->InPlaceActivate( 202*cdf0e10cSrcweir pActiveSite,TRUE))) 203*cdf0e10cSrcweir return NOERROR; 204*cdf0e10cSrcweir 205*cdf0e10cSrcweir // intended fall trough 206*cdf0e10cSrcweir case OLEIVERB_OPEN: 207*cdf0e10cSrcweir OSL_ENSURE(m_pDocHolder,"no document to open"); 208*cdf0e10cSrcweir 209*cdf0e10cSrcweir // the commented code could be usefull in case 210*cdf0e10cSrcweir // outer window would be resized depending from inner one 211*cdf0e10cSrcweir // RECTL aEmbArea; 212*cdf0e10cSrcweir // m_pDocHolder->GetVisArea( &aEmbArea ); 213*cdf0e10cSrcweir // m_pDocHolder->show(); 214*cdf0e10cSrcweir // m_pDocHolder->SetVisArea( &aEmbArea ); 215*cdf0e10cSrcweir 216*cdf0e10cSrcweir if(m_pDocHolder->isActive()) 217*cdf0e10cSrcweir { 218*cdf0e10cSrcweir m_pDocHolder->InPlaceDeactivate(); 219*cdf0e10cSrcweir m_pDocHolder->DisableInplaceActivation(true); 220*cdf0e10cSrcweir } 221*cdf0e10cSrcweir 222*cdf0e10cSrcweir SIZEL aEmbSize; 223*cdf0e10cSrcweir m_pDocHolder->GetExtent( &aEmbSize ); 224*cdf0e10cSrcweir m_pDocHolder->show(); 225*cdf0e10cSrcweir m_pDocHolder->resizeWin( aEmbSize ); 226*cdf0e10cSrcweir 227*cdf0e10cSrcweir if ( m_pClientSite ) 228*cdf0e10cSrcweir m_pClientSite->OnShowWindow( TRUE ); 229*cdf0e10cSrcweir 230*cdf0e10cSrcweir notify(); 231*cdf0e10cSrcweir break; 232*cdf0e10cSrcweir case OLEIVERB_HIDE: 233*cdf0e10cSrcweir OSL_ENSURE(m_pDocHolder,"no document to hide"); 234*cdf0e10cSrcweir 235*cdf0e10cSrcweir if(m_pDocHolder->isActive()) 236*cdf0e10cSrcweir m_pDocHolder->InPlaceDeactivate(); 237*cdf0e10cSrcweir else { 238*cdf0e10cSrcweir m_pDocHolder->hide(); 239*cdf0e10cSrcweir 240*cdf0e10cSrcweir if( m_pClientSite ) 241*cdf0e10cSrcweir m_pClientSite->OnShowWindow(FALSE); 242*cdf0e10cSrcweir } 243*cdf0e10cSrcweir break; 244*cdf0e10cSrcweir default: 245*cdf0e10cSrcweir break; 246*cdf0e10cSrcweir } 247*cdf0e10cSrcweir } 248*cdf0e10cSrcweir catch( uno::Exception& ) 249*cdf0e10cSrcweir { 250*cdf0e10cSrcweir return OLEOBJ_S_CANNOT_DOVERB_NOW; 251*cdf0e10cSrcweir } 252*cdf0e10cSrcweir 253*cdf0e10cSrcweir return NOERROR; 254*cdf0e10cSrcweir } 255*cdf0e10cSrcweir 256*cdf0e10cSrcweir 257*cdf0e10cSrcweir 258*cdf0e10cSrcweir STDMETHODIMP EmbedDocument_Impl::EnumVerbs( IEnumOLEVERB ** /*ppEnumOleVerb*/ ) 259*cdf0e10cSrcweir { 260*cdf0e10cSrcweir return OLE_S_USEREG; 261*cdf0e10cSrcweir } 262*cdf0e10cSrcweir 263*cdf0e10cSrcweir STDMETHODIMP EmbedDocument_Impl::Update() 264*cdf0e10cSrcweir { 265*cdf0e10cSrcweir return S_OK; 266*cdf0e10cSrcweir // HRESULT hr = CACHE_E_NOCACHE_UPDATED; 267*cdf0e10cSrcweir // return hr; 268*cdf0e10cSrcweir } 269*cdf0e10cSrcweir 270*cdf0e10cSrcweir STDMETHODIMP EmbedDocument_Impl::IsUpToDate() 271*cdf0e10cSrcweir { 272*cdf0e10cSrcweir return S_OK; 273*cdf0e10cSrcweir } 274*cdf0e10cSrcweir 275*cdf0e10cSrcweir STDMETHODIMP EmbedDocument_Impl::GetUserClassID( CLSID *pClsid ) 276*cdf0e10cSrcweir { 277*cdf0e10cSrcweir return GetClassID( pClsid ); 278*cdf0e10cSrcweir } 279*cdf0e10cSrcweir 280*cdf0e10cSrcweir STDMETHODIMP EmbedDocument_Impl::GetUserType( DWORD /*dwFormOfTypeUe*/, LPOLESTR * /*pszUserType*/ ) 281*cdf0e10cSrcweir { 282*cdf0e10cSrcweir return OLE_S_USEREG; 283*cdf0e10cSrcweir } 284*cdf0e10cSrcweir 285*cdf0e10cSrcweir STDMETHODIMP EmbedDocument_Impl::SetExtent( DWORD /*dwDrawAspect*/, SIZEL *psizel ) 286*cdf0e10cSrcweir { 287*cdf0e10cSrcweir if ( !psizel ) 288*cdf0e10cSrcweir return E_FAIL; 289*cdf0e10cSrcweir 290*cdf0e10cSrcweir m_pDocHolder->SetExtent( psizel ); 291*cdf0e10cSrcweir 292*cdf0e10cSrcweir return S_OK; 293*cdf0e10cSrcweir } 294*cdf0e10cSrcweir 295*cdf0e10cSrcweir STDMETHODIMP EmbedDocument_Impl::GetExtent( DWORD /*dwDrawAspect*/, SIZEL * psizel ) 296*cdf0e10cSrcweir { 297*cdf0e10cSrcweir if ( !psizel ) 298*cdf0e10cSrcweir return E_INVALIDARG; 299*cdf0e10cSrcweir 300*cdf0e10cSrcweir if ( FAILED( m_pDocHolder->GetExtent( psizel ) ) ) 301*cdf0e10cSrcweir { 302*cdf0e10cSrcweir // return default values 303*cdf0e10cSrcweir psizel->cx = 500; 304*cdf0e10cSrcweir psizel->cy = 500; 305*cdf0e10cSrcweir } 306*cdf0e10cSrcweir 307*cdf0e10cSrcweir return S_OK; 308*cdf0e10cSrcweir } 309*cdf0e10cSrcweir 310*cdf0e10cSrcweir STDMETHODIMP EmbedDocument_Impl::Advise( IAdviseSink *pAdvSink, DWORD *pdwConnection ) 311*cdf0e10cSrcweir { 312*cdf0e10cSrcweir if ( m_nAdviseNum == 0xFFFFFFFF ) 313*cdf0e10cSrcweir return E_OUTOFMEMORY; 314*cdf0e10cSrcweir 315*cdf0e10cSrcweir pAdvSink->AddRef(); 316*cdf0e10cSrcweir m_aAdviseHashMap.insert( ::std::pair< DWORD, IAdviseSink* >( m_nAdviseNum, pAdvSink ) ); 317*cdf0e10cSrcweir *pdwConnection = m_nAdviseNum++; 318*cdf0e10cSrcweir 319*cdf0e10cSrcweir return S_OK; 320*cdf0e10cSrcweir } 321*cdf0e10cSrcweir 322*cdf0e10cSrcweir STDMETHODIMP EmbedDocument_Impl::Unadvise( DWORD dwConnection ) 323*cdf0e10cSrcweir { 324*cdf0e10cSrcweir AdviseSinkHashMapIterator iAdvise = m_aAdviseHashMap.find( dwConnection ); 325*cdf0e10cSrcweir if ( iAdvise != m_aAdviseHashMap.end() ) 326*cdf0e10cSrcweir { 327*cdf0e10cSrcweir iAdvise->second->Release(); 328*cdf0e10cSrcweir m_aAdviseHashMap.erase( iAdvise ); 329*cdf0e10cSrcweir } 330*cdf0e10cSrcweir else 331*cdf0e10cSrcweir return OLE_E_NOCONNECTION; 332*cdf0e10cSrcweir 333*cdf0e10cSrcweir return S_OK; 334*cdf0e10cSrcweir } 335*cdf0e10cSrcweir 336*cdf0e10cSrcweir STDMETHODIMP EmbedDocument_Impl::EnumAdvise( IEnumSTATDATA ** /*ppenumAdvise*/ ) 337*cdf0e10cSrcweir { 338*cdf0e10cSrcweir return E_NOTIMPL; 339*cdf0e10cSrcweir } 340*cdf0e10cSrcweir 341*cdf0e10cSrcweir STDMETHODIMP EmbedDocument_Impl::GetMiscStatus( DWORD /*dwAspect*/, DWORD * /*pdwStatus*/ ) 342*cdf0e10cSrcweir { 343*cdf0e10cSrcweir return OLE_S_USEREG; 344*cdf0e10cSrcweir } 345*cdf0e10cSrcweir 346*cdf0e10cSrcweir STDMETHODIMP EmbedDocument_Impl::SetColorScheme( LOGPALETTE * /*pLogpal*/ ) 347*cdf0e10cSrcweir { 348*cdf0e10cSrcweir return E_NOTIMPL; 349*cdf0e10cSrcweir } 350*cdf0e10cSrcweir 351*cdf0e10cSrcweir //------------------------------------------------------------------------------- 352*cdf0e10cSrcweir // IDispatch 353*cdf0e10cSrcweir 354*cdf0e10cSrcweir STDMETHODIMP EmbedDocument_Impl::GetTypeInfoCount( unsigned int FAR* pctinfo ) 355*cdf0e10cSrcweir { 356*cdf0e10cSrcweir if ( m_pDocHolder->GetIDispatch() ) 357*cdf0e10cSrcweir return m_pDocHolder->GetIDispatch()->GetTypeInfoCount( pctinfo ); 358*cdf0e10cSrcweir 359*cdf0e10cSrcweir return E_NOTIMPL; 360*cdf0e10cSrcweir } 361*cdf0e10cSrcweir 362*cdf0e10cSrcweir STDMETHODIMP EmbedDocument_Impl::GetTypeInfo( unsigned int iTInfo, LCID lcid, ITypeInfo FAR* FAR* ppTInfo ) 363*cdf0e10cSrcweir { 364*cdf0e10cSrcweir if ( m_pDocHolder->GetIDispatch() ) 365*cdf0e10cSrcweir return m_pDocHolder->GetIDispatch()->GetTypeInfo( iTInfo, lcid, ppTInfo ); 366*cdf0e10cSrcweir 367*cdf0e10cSrcweir return DISP_E_BADINDEX; // the only error that can be returned 368*cdf0e10cSrcweir } 369*cdf0e10cSrcweir 370*cdf0e10cSrcweir STDMETHODIMP EmbedDocument_Impl::GetIDsOfNames( REFIID riid, 371*cdf0e10cSrcweir OLECHAR FAR* FAR* rgszNames, 372*cdf0e10cSrcweir unsigned int cNames, 373*cdf0e10cSrcweir LCID lcid, 374*cdf0e10cSrcweir DISPID FAR* rgDispId ) 375*cdf0e10cSrcweir { 376*cdf0e10cSrcweir if ( m_pDocHolder->GetIDispatch() ) 377*cdf0e10cSrcweir return m_pDocHolder->GetIDispatch()->GetIDsOfNames( riid, rgszNames, cNames, lcid, rgDispId ); 378*cdf0e10cSrcweir 379*cdf0e10cSrcweir for ( unsigned int ind = 0; ind < cNames; ind++ ) 380*cdf0e10cSrcweir rgDispId[ind] = DISPID_UNKNOWN; 381*cdf0e10cSrcweir 382*cdf0e10cSrcweir return DISP_E_UNKNOWNNAME; 383*cdf0e10cSrcweir } 384*cdf0e10cSrcweir 385*cdf0e10cSrcweir STDMETHODIMP EmbedDocument_Impl::Invoke( DISPID dispIdMember, 386*cdf0e10cSrcweir REFIID riid, 387*cdf0e10cSrcweir LCID lcid, 388*cdf0e10cSrcweir WORD wFlags, 389*cdf0e10cSrcweir DISPPARAMS FAR* pDispParams, 390*cdf0e10cSrcweir VARIANT FAR* pVarResult, 391*cdf0e10cSrcweir EXCEPINFO FAR* pExcepInfo, 392*cdf0e10cSrcweir unsigned int FAR* puArgErr ) 393*cdf0e10cSrcweir { 394*cdf0e10cSrcweir if ( m_pDocHolder->GetIDispatch() ) 395*cdf0e10cSrcweir return m_pDocHolder->GetIDispatch()->Invoke( dispIdMember, 396*cdf0e10cSrcweir riid, 397*cdf0e10cSrcweir lcid, 398*cdf0e10cSrcweir wFlags, 399*cdf0e10cSrcweir pDispParams, 400*cdf0e10cSrcweir pVarResult, 401*cdf0e10cSrcweir pExcepInfo, 402*cdf0e10cSrcweir puArgErr ); 403*cdf0e10cSrcweir 404*cdf0e10cSrcweir return DISP_E_MEMBERNOTFOUND; 405*cdf0e10cSrcweir } 406*cdf0e10cSrcweir 407*cdf0e10cSrcweir //------------------------------------------------------------------------------- 408*cdf0e10cSrcweir // IExternalConnection 409*cdf0e10cSrcweir 410*cdf0e10cSrcweir DWORD STDMETHODCALLTYPE EmbedDocument_Impl::AddConnection( DWORD , DWORD ) 411*cdf0e10cSrcweir { 412*cdf0e10cSrcweir return AddRef(); 413*cdf0e10cSrcweir } 414*cdf0e10cSrcweir 415*cdf0e10cSrcweir DWORD STDMETHODCALLTYPE EmbedDocument_Impl::ReleaseConnection( DWORD , DWORD , BOOL ) 416*cdf0e10cSrcweir { 417*cdf0e10cSrcweir return Release(); 418*cdf0e10cSrcweir } 419*cdf0e10cSrcweir 420*cdf0e10cSrcweir // C++ - methods 421*cdf0e10cSrcweir 422*cdf0e10cSrcweir HRESULT EmbedDocument_Impl::SaveObject() 423*cdf0e10cSrcweir { 424*cdf0e10cSrcweir HRESULT hr = S_OK; 425*cdf0e10cSrcweir 426*cdf0e10cSrcweir if(m_pClientSite) { 427*cdf0e10cSrcweir hr = m_pClientSite->SaveObject(); 428*cdf0e10cSrcweir 429*cdf0e10cSrcweir for ( AdviseSinkHashMapIterator iAdvise = 430*cdf0e10cSrcweir m_aAdviseHashMap.begin(); 431*cdf0e10cSrcweir iAdvise != m_aAdviseHashMap.end(); 432*cdf0e10cSrcweir iAdvise++ ) 433*cdf0e10cSrcweir if ( iAdvise->second ) 434*cdf0e10cSrcweir iAdvise->second->OnSave( ); 435*cdf0e10cSrcweir } 436*cdf0e10cSrcweir else if ( m_aFileName.getLength() && IsDirty() == S_OK ) 437*cdf0e10cSrcweir { 438*cdf0e10cSrcweir ::rtl::OUString aPreservFileName = m_aFileName; 439*cdf0e10cSrcweir 440*cdf0e10cSrcweir // in case of links the containers does not provide client site sometimes 441*cdf0e10cSrcweir hr = Save( (LPCOLESTR)NULL, FALSE ); // triggers saving to the link location 442*cdf0e10cSrcweir SaveCompleted( (LPCOLESTR)aPreservFileName.getStr() ); 443*cdf0e10cSrcweir } 444*cdf0e10cSrcweir 445*cdf0e10cSrcweir notify( false ); 446*cdf0e10cSrcweir 447*cdf0e10cSrcweir return hr; 448*cdf0e10cSrcweir } 449*cdf0e10cSrcweir 450*cdf0e10cSrcweir 451*cdf0e10cSrcweir HRESULT EmbedDocument_Impl::ShowObject() 452*cdf0e10cSrcweir { 453*cdf0e10cSrcweir HRESULT hr = S_OK; 454*cdf0e10cSrcweir 455*cdf0e10cSrcweir if(m_pClientSite) 456*cdf0e10cSrcweir hr = m_pClientSite->ShowObject(); 457*cdf0e10cSrcweir 458*cdf0e10cSrcweir return hr; 459*cdf0e10cSrcweir } 460*cdf0e10cSrcweir 461*cdf0e10cSrcweir 462*cdf0e10cSrcweir void EmbedDocument_Impl::notify( bool bDataChanged ) 463*cdf0e10cSrcweir { 464*cdf0e10cSrcweir for ( AdviseSinkHashMapIterator iAdvise = 465*cdf0e10cSrcweir m_aAdviseHashMap.begin(); 466*cdf0e10cSrcweir iAdvise != m_aAdviseHashMap.end(); 467*cdf0e10cSrcweir iAdvise++ ) 468*cdf0e10cSrcweir if ( iAdvise->second ) 469*cdf0e10cSrcweir iAdvise->second->OnViewChange( DVASPECT_CONTENT, -1 ); 470*cdf0e10cSrcweir 471*cdf0e10cSrcweir if ( m_pDAdviseHolder && bDataChanged ) 472*cdf0e10cSrcweir m_pDAdviseHolder->SendOnDataChange( (IDataObject*)this, 0, 0 ); 473*cdf0e10cSrcweir } 474*cdf0e10cSrcweir 475*cdf0e10cSrcweir void EmbedDocument_Impl::Deactivate() 476*cdf0e10cSrcweir { 477*cdf0e10cSrcweir HRESULT hr = S_OK; 478*cdf0e10cSrcweir 479*cdf0e10cSrcweir if ( m_pDocHolder->HasFrame() ) 480*cdf0e10cSrcweir { 481*cdf0e10cSrcweir hr = SaveObject(); 482*cdf0e10cSrcweir m_pDocHolder->CloseFrame(); 483*cdf0e10cSrcweir OLENotifyDeactivation(); 484*cdf0e10cSrcweir } 485*cdf0e10cSrcweir } 486*cdf0e10cSrcweir 487*cdf0e10cSrcweir HRESULT EmbedDocument_Impl::OLENotifyDeactivation() 488*cdf0e10cSrcweir { 489*cdf0e10cSrcweir HRESULT hr = S_OK; 490*cdf0e10cSrcweir 491*cdf0e10cSrcweir if ( m_pClientSite ) 492*cdf0e10cSrcweir hr = m_pClientSite->OnShowWindow( FALSE ); 493*cdf0e10cSrcweir 494*cdf0e10cSrcweir return hr; 495*cdf0e10cSrcweir 496*cdf0e10cSrcweir } 497*cdf0e10cSrcweir 498*cdf0e10cSrcweir // Fix strange warnings about some 499*cdf0e10cSrcweir // ATL::CAxHostWindow::QueryInterface|AddRef|Releae functions. 500*cdf0e10cSrcweir // warning C4505: 'xxx' : unreferenced local function has been removed 501*cdf0e10cSrcweir #if defined(_MSC_VER) 502*cdf0e10cSrcweir #pragma warning(disable: 4505) 503*cdf0e10cSrcweir #endif 504*cdf0e10cSrcweir 505