Files
libreoffice/embedserv/source/inprocserv/inprocembobj.cxx
2008-11-20 15:13:11 +00:00

1812 lines
64 KiB
C++

/*************************************************************************
*
* OpenOffice.org - a multi-platform office productivity suite
*
* $RCSfile: inprocembobj.cxx,v $
*
* $Revision: 1.1.8.2 $
*
* last change: $Author: mav $ $Date: 2008/10/30 11:59:06 $
*
* The Contents of this file are made available subject to
* the terms of GNU Lesser General Public License Version 2.1.
*
*
* GNU Lesser General Public License Version 2.1
* =============================================
* Copyright 2005 by Sun Microsystems, Inc.
* 901 San Antonio Road, Palo Alto, CA 94303, USA
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License version 2.1, as published by the Free Software Foundation.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*
************************************************************************/
#include <stdio.h>
#include <embservconst.h>
#include "inprocembobj.h"
// #define OWNDEBUG
#ifdef OWNDEBUG
#define WRITEDEBUGINFO( x ) WriteDebugInfo( x )
#else
#define WRITEDEBUGINFO( x )
#endif
namespace inprocserv
{
//-------------------------------------------------------------------------------
#ifdef OWNDEBUG
void WriteDebugInfo( char* pString )
{
FILE* pFile = fopen( "c:\\inproc.log", "aw" );
if ( pFile )
{
fprintf( pFile, pString );
fclose( pFile );
}
}
#endif
//-------------------------------------------------------------------------------
HRESULT InprocEmbedDocument_Impl::Init()
{
return S_OK;
}
//-------------------------------------------------------------------------------
void InprocEmbedDocument_Impl::SetFileName( LPCOLESTR pszFileName )
{
// copy the string
size_t nLen = wcslen( pszFileName );
if ( m_pFileName )
{
delete[] m_pFileName;
m_pFileName = NULL;
}
m_pFileName = new wchar_t[nLen+1];
wcsncpy( m_pFileName, pszFileName, nLen );
m_pFileName[nLen] = 0;
}
//-------------------------------------------------------------------------------
BOOL InprocEmbedDocument_Impl::CheckDefHandler()
{
// set the own listener
if ( m_pOleAdvises[0] == NULL )
{
m_pOleAdvises[0] = new OleWrapperAdviseSink();
}
else
{
if ( m_pOleAdvises[0]->IsClosed() )
{
if ( m_pDefHandler )
{
// deregister all the listeners
ComSmart< IOleObject > pOleObject;
HRESULT hr = m_pDefHandler->QueryInterface( IID_IOleObject, (void**)&pOleObject );
if ( SUCCEEDED( hr ) && pOleObject )
{
for ( DWORD nInd = 0; nInd < DEFAULT_ARRAY_LEN; nInd++ )
if ( m_pOleAdvises[nInd] )
{
DWORD nID = m_pOleAdvises[nInd]->GetRegID();
pOleObject->Unadvise( nID );
m_pOleAdvises[nInd]->SetRegID( 0 );
}
}
ComSmart< IDataObject > pIDataObject;
hr = m_pDefHandler->QueryInterface( IID_IDataObject, (void**)&pIDataObject );
if ( SUCCEEDED( hr ) && pIDataObject )
{
for ( DWORD nInd = 0; nInd < DEFAULT_ARRAY_LEN; nInd++ )
if ( m_pDataAdvises[nInd] )
{
DWORD nID = m_pDataAdvises[nInd]->GetRegID();
pIDataObject->DUnadvise( nID );
m_pDataAdvises[nInd]->SetRegID( 0 );
}
}
ComSmart< IViewObject > pIViewObject;
hr = m_pDefHandler->QueryInterface( IID_IViewObject, (void**)&pIViewObject );
if ( SUCCEEDED( hr ) && pIViewObject )
{
if ( m_pViewAdvise )
pIViewObject->SetAdvise( m_pViewAdvise->GetAspect(), m_pViewAdvise->GetViewAdviseFlag(), NULL );
}
m_pDefHandler = NULL;
}
m_pOleAdvises[0]->UnsetClosed();
}
}
if ( m_nCallsOnStack )
return FALSE;
if ( !m_pDefHandler )
{
// create a new default inprocess handler
HRESULT hr = OleCreateDefaultHandler( m_guid, NULL, IID_IUnknown, (void**)&m_pDefHandler );
if ( SUCCEEDED( hr ) )
{
// // reinit the handler
// ComSmart< IRunnableObject > pIRunObj;
// hr = m_pDefHandler->QueryInterface( IID_IRunnableObject, (void**)&pIRunObj );
//
// if ( SUCCEEDED( hr ) && pIRunObj )
{
// {
// ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
// hr = pIRunObj->Run( NULL );
// }
//
// if ( SUCCEEDED( hr ) )
{
if ( m_nInitMode == INIT_FROM_STORAGE )
{
ComSmart< IPersistStorage > pPersist;
hr = m_pDefHandler->QueryInterface( IID_IPersistStorage, (void**)&pPersist );
ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
if ( SUCCEEDED( hr ) && pPersist && m_pStorage )
hr = pPersist->InitNew( m_pStorage );
}
else if ( m_nInitMode == LOAD_FROM_STORAGE )
{
ComSmart< IPersistStorage > pPersist;
hr = m_pDefHandler->QueryInterface( IID_IPersistStorage, (void**)&pPersist );
ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
if ( SUCCEEDED( hr ) && pPersist && m_pStorage )
hr = pPersist->Load( m_pStorage );
}
else if ( m_nInitMode == LOAD_FROM_FILE )
{
ComSmart< IPersistFile > pPersistFile;
hr = m_pDefHandler->QueryInterface( IID_IPersistFile, (void**)&pPersistFile );
ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
if ( SUCCEEDED( hr ) && pPersistFile && m_pFileName )
hr = pPersistFile->Load( m_pFileName, m_nFileOpenMode );
}
}
}
}
if ( !SUCCEEDED( hr ) || !m_pDefHandler )
{
m_pDefHandler = NULL;
return FALSE;
}
// register all the listeners new
ComSmart< IOleObject > pOleObject;
hr = m_pDefHandler->QueryInterface( IID_IOleObject, (void**)&pOleObject );
if ( SUCCEEDED( hr ) && pOleObject )
{
if ( m_pClientSite )
pOleObject->SetClientSite( m_pClientSite );
for ( DWORD nInd = 0; nInd < DEFAULT_ARRAY_LEN; nInd++ )
if ( m_pOleAdvises[nInd] )
{
DWORD nRegID = 0;
if ( SUCCEEDED( pOleObject->Advise( m_pOleAdvises[nInd], &nRegID ) ) && nRegID > 0 )
m_pOleAdvises[nInd]->SetRegID( nRegID );
}
}
ComSmart< IDataObject > pIDataObject;
hr = m_pDefHandler->QueryInterface( IID_IDataObject, (void**)&pIDataObject );
if ( SUCCEEDED( hr ) && pIDataObject )
{
for ( DWORD nInd = 0; nInd < DEFAULT_ARRAY_LEN; nInd++ )
if ( m_pDataAdvises[nInd] )
{
DWORD nRegID = 0;
if ( SUCCEEDED( pIDataObject->DAdvise( m_pDataAdvises[nInd]->GetFormatEtc(), m_pDataAdvises[nInd]->GetDataAdviseFlag(), m_pDataAdvises[nInd], &nRegID ) ) && nRegID > 0 )
m_pDataAdvises[nInd]->SetRegID( nRegID );
}
}
ComSmart< IViewObject > pIViewObject;
hr = m_pDefHandler->QueryInterface( IID_IViewObject, (void**)&pIViewObject );
if ( SUCCEEDED( hr ) && pIViewObject )
{
if ( m_pViewAdvise )
pIViewObject->SetAdvise( m_pViewAdvise->GetAspect(), m_pViewAdvise->GetViewAdviseFlag(), m_pViewAdvise );
}
}
return TRUE;
}
//-------------------------------------------------------------------------------
DWORD InprocEmbedDocument_Impl::InsertAdviseLinkToList( const ComSmart<OleWrapperAdviseSink>& pOwnAdvise, ComSmart< OleWrapperAdviseSink > pAdvises[] )
{
// the result should start from 1 in case of success, the element 0 can be used for own needs
DWORD nResult = 0;
if ( pOwnAdvise )
{
for ( DWORD nInd = 1; nInd < DEFAULT_ARRAY_LEN && nResult == 0; nInd++ )
{
if ( pAdvises[nInd] == pOwnAdvise )
{
nResult = nInd;
}
else if ( pAdvises[nInd] == NULL )
{
pAdvises[nInd] = pOwnAdvise;
nResult = nInd;
}
}
}
return nResult;
}
//-------------------------------------------------------------------------------
void InprocEmbedDocument_Impl::Clean()
{
m_pDefHandler = (IUnknown*)NULL;
for ( DWORD nInd = 0; nInd < DEFAULT_ARRAY_LEN; nInd++ )
{
if ( m_pOleAdvises[nInd] )
{
ComSmart< OleWrapperAdviseSink > pAdvice = m_pOleAdvises[nInd];
m_pOleAdvises[nInd] = NULL;
}
if ( m_pDataAdvises[nInd] )
{
ComSmart< OleWrapperAdviseSink > pAdvice = m_pDataAdvises[nInd];
m_pDataAdvises[nInd] = NULL;
}
}
m_nInitMode = NOINIT;
m_pStorage = NULL;
m_pClientSite = NULL;
m_nFileOpenMode = 0;
if ( m_pFileName )
{
delete m_pFileName;
m_pFileName = NULL;
}
}
// IUnknown
//-------------------------------------------------------------------------------
STDMETHODIMP InprocEmbedDocument_Impl::QueryInterface( REFIID riid, void FAR* FAR* ppv )
{
if(IsEqualIID(riid, IID_IUnknown))
{
AddRef();
*ppv = (IUnknown*) (IPersistStorage*) this;
return S_OK;
}
else if (IsEqualIID(riid, IID_IPersist))
{
AddRef();
*ppv = (IPersist*) (IPersistStorage*) this;
return S_OK;
}
else if (IsEqualIID(riid, IID_IPersistStorage))
{
AddRef();
*ppv = (IPersistStorage*) this;
return S_OK;
}
else if (IsEqualIID(riid, IID_IDataObject))
{
AddRef();
*ppv = (IDataObject*) this;
return S_OK;
}
else if (IsEqualIID(riid, IID_IOleObject))
{
AddRef();
*ppv = (IOleObject*) this;
return S_OK;
}
else if (IsEqualIID(riid, IID_IPersistFile))
{
AddRef();
*ppv = (IPersistFile*) this;
return S_OK;
}
else if (IsEqualIID(riid, IID_IRunnableObject))
{
AddRef();
*ppv = (IRunnableObject*) this;
return S_OK;
}
else if (IsEqualIID(riid, IID_IViewObject))
{
AddRef();
*ppv = (IViewObject*) this;
return S_OK;
}
else if (IsEqualIID(riid, IID_IViewObject2))
{
AddRef();
*ppv = (IViewObject2*) this;
return S_OK;
}
else if (IsEqualIID(riid, IID_IOleCache))
{
AddRef();
*ppv = (IOleCache*) &m_aInternalCache;
return S_OK;
}
else if (IsEqualIID(riid, IID_IOleCache2))
{
AddRef();
*ppv = (IOleCache2*) &m_aInternalCache;
return S_OK;
}
else if (IsEqualIID(riid, IID_IOleWindow))
{
AddRef();
*ppv = (IOleWindow*) this;
return S_OK;
}
else if (IsEqualIID(riid, IID_IOleInPlaceObject))
{
AddRef();
*ppv = (IOleInPlaceObject*) this;
return S_OK;
}
else if (IsEqualIID(riid, IID_IDispatch))
{
AddRef();
*ppv = (IDispatch*) this;
return S_OK;
}
*ppv = NULL;
return ResultFromScode(E_NOINTERFACE);
}
//-------------------------------------------------------------------------------
STDMETHODIMP_(ULONG) InprocEmbedDocument_Impl::AddRef()
{
return ++m_refCount;
}
//-------------------------------------------------------------------------------
STDMETHODIMP_(ULONG) InprocEmbedDocument_Impl::Release()
{
// unfortunately there are reentrance problems in mfc that have to be workarounded
sal_Int32 nCount = m_refCount > 0 ? --m_refCount : 0;
if ( nCount == 0 && !m_bDeleted )
{
// deleting of this object can trigger deleting of mfc objects that will try to delete this object one more time
m_bDeleted = TRUE;
Clean();
delete this;
}
return nCount;
}
// IPersist
//-------------------------------------------------------------------------------
STDMETHODIMP InprocEmbedDocument_Impl::GetClassID( CLSID* pClassId )
{
*pClassId = *&m_guid;
return S_OK;
}
// IPersistStorage
//-------------------------------------------------------------------------------
STDMETHODIMP InprocEmbedDocument_Impl::IsDirty()
{
WRITEDEBUGINFO( "InprocEmbedDocument_Impl::IsDirty()1\n" );
if ( m_pDefHandler == NULL || m_pOleAdvises[0] == NULL || m_pOleAdvises[0]->IsClosed() )
return S_FALSE;
WRITEDEBUGINFO( "InprocEmbedDocument_Impl::IsDirty()2\n" );
if ( CheckDefHandler() )
{
ComSmart< IPersistStorage > pPersist;
HRESULT hr = m_pDefHandler->QueryInterface( IID_IPersistStorage, (void**)&pPersist );
ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
if ( SUCCEEDED( hr ) && pPersist )
return pPersist->IsDirty();
}
return E_FAIL;
}
//-------------------------------------------------------------------------------
STDMETHODIMP InprocEmbedDocument_Impl::InitNew( IStorage *pStg )
{
WRITEDEBUGINFO( "InprocEmbedDocument_Impl::InitNew( IStorage *pStg )\n" );
if ( CheckDefHandler() )
{
ComSmart< IPersistStorage > pPersist;
HRESULT hr = m_pDefHandler->QueryInterface( IID_IPersistStorage, (void**)&pPersist );
ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
if ( SUCCEEDED( hr ) && pPersist )
{
hr = pPersist->InitNew( pStg );
if ( SUCCEEDED( hr ) )
{
m_nInitMode = INIT_FROM_STORAGE;
m_pStorage = pStg;
m_nFileOpenMode = 0;
if ( m_pFileName )
{
delete[] m_pFileName;
m_pFileName = NULL;
}
}
return hr;
}
}
return E_FAIL;
}
//-------------------------------------------------------------------------------
STDMETHODIMP InprocEmbedDocument_Impl::Load( IStorage *pStg )
{
WRITEDEBUGINFO( "InprocEmbedDocument_Impl::Load( IStorage *pStg )\n" );
if ( CheckDefHandler() )
{
ComSmart< IPersistStorage > pPersist;
HRESULT hr = m_pDefHandler->QueryInterface( IID_IPersistStorage, (void**)&pPersist );
ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
if ( SUCCEEDED( hr ) && pPersist )
{
hr = pPersist->Load( pStg );
if ( SUCCEEDED( hr ) )
{
m_nInitMode = LOAD_FROM_STORAGE;
m_pStorage = pStg;
m_nFileOpenMode = 0;
if ( m_pFileName )
{
delete[] m_pFileName;
m_pFileName = NULL;
}
}
return hr;
}
}
return E_FAIL;
}
//-------------------------------------------------------------------------------
STDMETHODIMP InprocEmbedDocument_Impl::Save( IStorage *pStgSave, BOOL fSameAsLoad )
{
WRITEDEBUGINFO( "InprocEmbedDocument_Impl::Save( IStorage *pStgSave, BOOL fSameAsLoad )1\n" );
if ( fSameAsLoad && ( m_pDefHandler == NULL || m_pOleAdvises[0] == NULL || m_pOleAdvises[0]->IsClosed() ) )
return S_OK;
WRITEDEBUGINFO( "InprocEmbedDocument_Impl::Save( IStorage *pStgSave, BOOL fSameAsLoad )2\n" );
if ( CheckDefHandler() )
{
ComSmart< IPersistStorage > pPersist;
HRESULT hr = m_pDefHandler->QueryInterface( IID_IPersistStorage, (void**)&pPersist );
ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
if ( SUCCEEDED( hr ) && pPersist )
return pPersist->Save( pStgSave, fSameAsLoad );
}
return E_FAIL;
}
//-------------------------------------------------------------------------------
STDMETHODIMP InprocEmbedDocument_Impl::SaveCompleted( IStorage *pStgNew )
{
WRITEDEBUGINFO( "InprocEmbedDocument_Impl::SaveCompleted( IStorage *pStgNew )1\n" );
if ( m_pDefHandler == NULL || m_pOleAdvises[0] == NULL || m_pOleAdvises[0]->IsClosed() )
{
if ( pStgNew )
m_pStorage = pStgNew;
return S_OK;
}
WRITEDEBUGINFO( "InprocEmbedDocument_Impl::SaveCompleted( IStorage *pStgNew )2\n" );
if ( CheckDefHandler() )
{
ComSmart< IPersistStorage > pPersist;
HRESULT hr = m_pDefHandler->QueryInterface( IID_IPersistStorage, (void**)&pPersist );
ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
if ( SUCCEEDED( hr ) && pPersist )
{
hr = pPersist->SaveCompleted( pStgNew );
if ( SUCCEEDED( hr ) )
{
m_nInitMode = LOAD_FROM_STORAGE;
if ( pStgNew )
m_pStorage = pStgNew;
m_nFileOpenMode = 0;
if ( m_pFileName )
{
delete[] m_pFileName;
m_pFileName = NULL;
}
}
return hr;
}
}
return E_FAIL;
}
//-------------------------------------------------------------------------------
STDMETHODIMP InprocEmbedDocument_Impl::HandsOffStorage()
{
WRITEDEBUGINFO( "InprocEmbedDocument_Impl::HandsOffStorage()\n" );
if ( CheckDefHandler() )
{
ComSmart< IPersistStorage > pPersist;
HRESULT hr = m_pDefHandler->QueryInterface( IID_IPersistStorage, (void**)&pPersist );
ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
if ( SUCCEEDED( hr ) && pPersist )
return pPersist->HandsOffStorage();
}
return E_FAIL;
}
// IPersistFile
//-------------------------------------------------------------------------------
STDMETHODIMP InprocEmbedDocument_Impl::Load( LPCOLESTR pszFileName, DWORD dwMode )
{
WRITEDEBUGINFO( "InprocEmbedDocument_Impl::Load( LPCOLESTR pszFileName, DWORD dwMode )\n" );
if ( CheckDefHandler() && pszFileName )
{
ComSmart< IPersistFile > pPersist;
HRESULT hr = m_pDefHandler->QueryInterface( IID_IPersistFile, (void**)&pPersist );
ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
if ( SUCCEEDED( hr ) && pPersist )
{
hr = pPersist->Load( pszFileName, dwMode );
if ( SUCCEEDED( hr ) )
{
m_nInitMode = LOAD_FROM_FILE;
if ( m_pStorage )
m_pStorage = NULL;
m_nFileOpenMode = dwMode;
// copy the string
SetFileName( pszFileName );
}
return hr;
}
}
return E_FAIL;
}
//-------------------------------------------------------------------------------
STDMETHODIMP InprocEmbedDocument_Impl::Save( LPCOLESTR pszFileName, BOOL fRemember )
{
WRITEDEBUGINFO( "InprocEmbedDocument_Impl::Save( LPCOLESTR pszFileName, BOOL fRemember )\n" );
if ( CheckDefHandler() )
{
ComSmart< IPersistFile > pPersist;
HRESULT hr = m_pDefHandler->QueryInterface( IID_IPersistFile, (void**)&pPersist );
ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
if ( SUCCEEDED( hr ) && pPersist )
return pPersist->Save( pszFileName, fRemember );
}
return E_FAIL;
}
//-------------------------------------------------------------------------------
STDMETHODIMP InprocEmbedDocument_Impl::SaveCompleted( LPCOLESTR pszFileName )
{
WRITEDEBUGINFO( "InprocEmbedDocument_Impl::SaveCompleted( LPCOLESTR pszFileName )\n" );
if ( CheckDefHandler() )
{
ComSmart< IPersistFile > pPersist;
HRESULT hr = m_pDefHandler->QueryInterface( IID_IPersistFile, (void**)&pPersist );
ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
if ( SUCCEEDED( hr ) && pPersist )
{
hr = pPersist->SaveCompleted( pszFileName );
if ( SUCCEEDED( hr ) )
{
m_nInitMode = LOAD_FROM_STORAGE;
if ( m_pStorage )
m_pStorage = NULL;
m_nFileOpenMode = STGM_READWRITE; // was just written
// copy the string
SetFileName( pszFileName );
}
}
}
return E_FAIL;
}
//-------------------------------------------------------------------------------
STDMETHODIMP InprocEmbedDocument_Impl::GetCurFile( LPOLESTR *ppszFileName )
{
WRITEDEBUGINFO( "InprocEmbedDocument_Impl::GetCurFile( LPOLESTR *ppszFileName )\n" );
if ( CheckDefHandler() )
{
ComSmart< IPersistFile > pPersist;
HRESULT hr = m_pDefHandler->QueryInterface( IID_IPersistFile, (void**)&pPersist );
ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
if ( SUCCEEDED( hr ) && pPersist )
return pPersist->GetCurFile( ppszFileName );
}
return E_FAIL;
}
// IOleObject
//-------------------------------------------------------------------------------
STDMETHODIMP InprocEmbedDocument_Impl::SetClientSite( IOleClientSite* pSite )
{
WRITEDEBUGINFO( "InprocEmbedDocument_Impl::SetClientSite( IOleClientSite* pSite )\n" );
if ( CheckDefHandler() )
{
ComSmart< IOleObject > pOleObject;
HRESULT hr = m_pDefHandler->QueryInterface( IID_IOleObject, (void**)&pOleObject );
ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
if ( SUCCEEDED( hr ) && pOleObject )
{
HRESULT hr = pOleObject->SetClientSite( pSite );
if ( SUCCEEDED( hr ) )
m_pClientSite = pSite;
return hr;
}
}
return E_FAIL;
}
//-------------------------------------------------------------------------------
STDMETHODIMP InprocEmbedDocument_Impl::GetClientSite( IOleClientSite** pSite )
{
WRITEDEBUGINFO( "InprocEmbedDocument_Impl::GetClientSite( IOleClientSite** pSite )\n" );
if ( CheckDefHandler() )
{
ComSmart< IOleObject > pOleObject;
HRESULT hr = m_pDefHandler->QueryInterface( IID_IOleObject, (void**)&pOleObject );
ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
if ( SUCCEEDED( hr ) && pOleObject )
return pOleObject->GetClientSite( pSite );
}
return E_FAIL;
}
//-------------------------------------------------------------------------------
STDMETHODIMP InprocEmbedDocument_Impl::SetHostNames( LPCOLESTR szContainerApp, LPCOLESTR szContainerObj )
{
WRITEDEBUGINFO( "InprocEmbedDocument_Impl::SetHostNames( LPCOLESTR szContainerApp, LPCOLESTR szContainerObj )\n" );
if ( CheckDefHandler() )
{
ComSmart< IOleObject > pOleObject;
HRESULT hr = m_pDefHandler->QueryInterface( IID_IOleObject, (void**)&pOleObject );
ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
if ( SUCCEEDED( hr ) && pOleObject )
return pOleObject->SetHostNames( szContainerApp, szContainerObj );
}
return E_FAIL;
}
//-------------------------------------------------------------------------------
STDMETHODIMP InprocEmbedDocument_Impl::Close( DWORD dwSaveOption )
{
WRITEDEBUGINFO( "InprocEmbedDocument_Impl::Close( DWORD dwSaveOption )\n" );
if ( CheckDefHandler() )
{
ComSmart< IOleObject > pOleObject;
HRESULT hr = m_pDefHandler->QueryInterface( IID_IOleObject, (void**)&pOleObject );
ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
if ( SUCCEEDED( hr ) && pOleObject )
{
hr = pOleObject->Close( dwSaveOption );
hr = CoDisconnectObject( (IUnknown*)(IPersistStorage*)this, 0 );
// if the object is closed from outside that means that it should go to uninitialized state
Clean();
return S_OK;
}
}
return E_FAIL;
}
//-------------------------------------------------------------------------------
STDMETHODIMP InprocEmbedDocument_Impl::SetMoniker( DWORD dwWhichMoniker, IMoniker * pmk )
{
WRITEDEBUGINFO( "InprocEmbedDocument_Impl::SetMoniker( DWORD dwWhichMoniker, IMoniker * pmk )\n" );
if ( CheckDefHandler() )
{
ComSmart< IOleObject > pOleObject;
HRESULT hr = m_pDefHandler->QueryInterface( IID_IOleObject, (void**)&pOleObject );
ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
if ( SUCCEEDED( hr ) && pOleObject )
return pOleObject->SetMoniker( dwWhichMoniker, pmk );
}
return E_FAIL;
}
//-------------------------------------------------------------------------------
STDMETHODIMP InprocEmbedDocument_Impl::GetMoniker( DWORD dwAssign, DWORD dwWhichMoniker, IMoniker ** ppmk )
{
WRITEDEBUGINFO( "InprocEmbedDocument_Impl::GetMoniker( DWORD dwAssign, DWORD dwWhichMoniker, IMoniker ** ppmk )\n" );
if ( CheckDefHandler() )
{
ComSmart< IOleObject > pOleObject;
HRESULT hr = m_pDefHandler->QueryInterface( IID_IOleObject, (void**)&pOleObject );
ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
if ( SUCCEEDED( hr ) && pOleObject )
return pOleObject->GetMoniker( dwAssign, dwWhichMoniker, ppmk );
}
return E_FAIL;
}
//-------------------------------------------------------------------------------
STDMETHODIMP InprocEmbedDocument_Impl::InitFromData( IDataObject * pDataObject, BOOL fCreation, DWORD dwReserved )
{
WRITEDEBUGINFO( "InprocEmbedDocument_Impl::InitFromData( IDataObject * pDataObject, BOOL fCreation, DWORD dwReserved )\n" );
if ( CheckDefHandler() )
{
ComSmart< IOleObject > pOleObject;
HRESULT hr = m_pDefHandler->QueryInterface( IID_IOleObject, (void**)&pOleObject );
ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
if ( SUCCEEDED( hr ) && pOleObject )
return pOleObject->InitFromData( pDataObject, fCreation, dwReserved );
}
return E_FAIL;
}
//-------------------------------------------------------------------------------
STDMETHODIMP InprocEmbedDocument_Impl::GetClipboardData( DWORD dwReserved, IDataObject ** ppDataObject )
{
WRITEDEBUGINFO( "InprocEmbedDocument_Impl::GetClipboardData( DWORD dwReserved, IDataObject ** ppDataObject )\n" );
if ( CheckDefHandler() )
{
ComSmart< IOleObject > pOleObject;
HRESULT hr = m_pDefHandler->QueryInterface( IID_IOleObject, (void**)&pOleObject );
ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
if ( SUCCEEDED( hr ) && pOleObject )
return pOleObject->GetClipboardData( dwReserved, ppDataObject );
}
return E_FAIL;
}
//-------------------------------------------------------------------------------
STDMETHODIMP InprocEmbedDocument_Impl::DoVerb(
LONG iVerb,
LPMSG pMsg,
IOleClientSite *pActiveSite,
LONG nLong,
HWND hWin,
LPCRECT pRect )
{
WRITEDEBUGINFO( "DoVerb\n" );
if ( CheckDefHandler() )
{
ComSmart< IOleObject > pOleObject;
HRESULT hr = m_pDefHandler->QueryInterface( IID_IOleObject, (void**)&pOleObject );
ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
if ( SUCCEEDED( hr ) && pOleObject )
return pOleObject->DoVerb( iVerb, pMsg, pActiveSite, nLong, hWin, pRect );
}
return E_FAIL;
}
//-------------------------------------------------------------------------------
STDMETHODIMP InprocEmbedDocument_Impl::EnumVerbs( IEnumOLEVERB ** ppEnumOleVerb )
{
WRITEDEBUGINFO( "InprocEmbedDocument_Impl::EnumVerbs( IEnumOLEVERB ** ppEnumOleVerb )\n" );
if ( CheckDefHandler() )
{
ComSmart< IOleObject > pOleObject;
HRESULT hr = m_pDefHandler->QueryInterface( IID_IOleObject, (void**)&pOleObject );
ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
if ( SUCCEEDED( hr ) && pOleObject )
return pOleObject->EnumVerbs( ppEnumOleVerb );
}
return E_FAIL;
}
//-------------------------------------------------------------------------------
STDMETHODIMP InprocEmbedDocument_Impl::Update()
{
WRITEDEBUGINFO( "InprocEmbedDocument_Impl::Update()\n" );
if ( CheckDefHandler() )
{
ComSmart< IOleObject > pOleObject;
HRESULT hr = m_pDefHandler->QueryInterface( IID_IOleObject, (void**)&pOleObject );
ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
if ( SUCCEEDED( hr ) && pOleObject )
return pOleObject->Update();
}
return E_FAIL;
}
//-------------------------------------------------------------------------------
STDMETHODIMP InprocEmbedDocument_Impl::IsUpToDate()
{
WRITEDEBUGINFO( "InprocEmbedDocument_Impl::IsUpToDate()\n" );
if ( CheckDefHandler() )
{
ComSmart< IOleObject > pOleObject;
HRESULT hr = m_pDefHandler->QueryInterface( IID_IOleObject, (void**)&pOleObject );
ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
if ( SUCCEEDED( hr ) && pOleObject )
return pOleObject->IsUpToDate();
}
return E_FAIL;
}
//-------------------------------------------------------------------------------
STDMETHODIMP InprocEmbedDocument_Impl::GetUserClassID( CLSID *pClsid )
{
WRITEDEBUGINFO( "InprocEmbedDocument_Impl::GetUserClassID( CLSID *pClsid )\n" );
if ( CheckDefHandler() )
{
ComSmart< IOleObject > pOleObject;
HRESULT hr = m_pDefHandler->QueryInterface( IID_IOleObject, (void**)&pOleObject );
ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
if ( SUCCEEDED( hr ) && pOleObject )
return pOleObject->GetUserClassID( pClsid );
}
return E_FAIL;
}
//-------------------------------------------------------------------------------
STDMETHODIMP InprocEmbedDocument_Impl::GetUserType( DWORD dwFormOfType, LPOLESTR * pszUserType )
{
WRITEDEBUGINFO( "InprocEmbedDocument_Impl::GetUserType( DWORD dwFormOfType, LPOLESTR * pszUserType )\n" );
if ( CheckDefHandler() )
{
ComSmart< IOleObject > pOleObject;
HRESULT hr = m_pDefHandler->QueryInterface( IID_IOleObject, (void**)&pOleObject );
ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
if ( SUCCEEDED( hr ) && pOleObject )
return pOleObject->GetUserType( dwFormOfType, pszUserType );
}
return E_FAIL;
}
//-------------------------------------------------------------------------------
STDMETHODIMP InprocEmbedDocument_Impl::SetExtent( DWORD dwDrawAspect, SIZEL *psizel )
{
WRITEDEBUGINFO( "InprocEmbedDocument_Impl::SetExtent( DWORD dwDrawAspect, SIZEL *psizel )\n" );
if ( CheckDefHandler() )
{
ComSmart< IOleObject > pOleObject;
HRESULT hr = m_pDefHandler->QueryInterface( IID_IOleObject, (void**)&pOleObject );
ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
if ( SUCCEEDED( hr ) && pOleObject )
return pOleObject->SetExtent( dwDrawAspect, psizel );
}
return E_FAIL;
}
//-------------------------------------------------------------------------------
STDMETHODIMP InprocEmbedDocument_Impl::GetExtent( DWORD dwDrawAspect, SIZEL * psizel )
{
WRITEDEBUGINFO( "InprocEmbedDocument_Impl::GetExtent( DWORD dwDrawAspect, SIZEL * psizel )\n" );
if ( CheckDefHandler() )
{
ComSmart< IOleObject > pOleObject;
HRESULT hr = m_pDefHandler->QueryInterface( IID_IOleObject, (void**)&pOleObject );
ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
if ( SUCCEEDED( hr ) && pOleObject )
return pOleObject->GetExtent( dwDrawAspect, psizel );
}
return E_FAIL;
}
//-------------------------------------------------------------------------------
STDMETHODIMP InprocEmbedDocument_Impl::Advise( IAdviseSink *pAdvSink, DWORD *pdwConnection )
{
WRITEDEBUGINFO( "InprocEmbedDocument_Impl::Advise( IAdviseSink *pAdvSink, DWORD *pdwConnection )\n" );
if ( pAdvSink && CheckDefHandler() )
{
ComSmart< IOleObject > pOleObject;
HRESULT hr = m_pDefHandler->QueryInterface( IID_IOleObject, (void**)&pOleObject );
ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
if ( SUCCEEDED( hr ) && pOleObject )
{
ComSmart< OleWrapperAdviseSink > pOwnAdvise( new OleWrapperAdviseSink( pAdvSink ) );
DWORD nRegID = 0;
if ( SUCCEEDED( pOleObject->Advise( pOwnAdvise, &nRegID ) ) && nRegID > 0 )
{
pOwnAdvise->SetRegID( nRegID );
*pdwConnection = InsertAdviseLinkToList( pOwnAdvise, m_pOleAdvises );
if ( *pdwConnection )
return S_OK;
else
pOleObject->Unadvise( nRegID );
}
}
}
return E_FAIL;
}
//-------------------------------------------------------------------------------
STDMETHODIMP InprocEmbedDocument_Impl::Unadvise( DWORD dwConnection )
{
if ( DEFAULT_ARRAY_LEN > dwConnection && dwConnection > 0 && m_pOleAdvises[dwConnection] )
{
if ( m_pDefHandler )
{
ComSmart< IOleObject > pOleObject;
HRESULT hr = m_pDefHandler->QueryInterface( IID_IOleObject, (void**)&pOleObject );
ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
if ( SUCCEEDED( hr ) && pOleObject )
{
DWORD nID = m_pOleAdvises[dwConnection]->GetRegID();
return pOleObject->Unadvise( nID );
}
}
m_pOleAdvises[dwConnection] = NULL;
}
return E_FAIL;
}
//-------------------------------------------------------------------------------
STDMETHODIMP InprocEmbedDocument_Impl::EnumAdvise( IEnumSTATDATA ** /*ppenumAdvise*/ )
{
return E_NOTIMPL;
// if ( CheckDefHandler() )
// {
// ComSmart< IOleObject > pOleObject;
// HRESULT hr = m_pDefHandler->QueryInterface( IID_IOleObject, (void**)&pOleObject );
//
// ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
// if ( SUCCEEDED( hr ) && pOleObject )
// return pOleObject->EnumAdvise( ppenumAdvise );
// }
//
// return E_FAIL;
}
//-------------------------------------------------------------------------------
STDMETHODIMP InprocEmbedDocument_Impl::GetMiscStatus( DWORD dwAspect, DWORD * pdwStatus )
{
WRITEDEBUGINFO( "InprocEmbedDocument_Impl::GetMiscStatus( DWORD dwAspect, DWORD * pdwStatus )\n" );
if ( CheckDefHandler() )
{
ComSmart< IOleObject > pOleObject;
HRESULT hr = m_pDefHandler->QueryInterface( IID_IOleObject, (void**)&pOleObject );
ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
if ( SUCCEEDED( hr ) && pOleObject )
return pOleObject->GetMiscStatus( dwAspect, pdwStatus );
}
return E_FAIL;
}
//-------------------------------------------------------------------------------
STDMETHODIMP InprocEmbedDocument_Impl::SetColorScheme( LOGPALETTE * pLogpal )
{
WRITEDEBUGINFO( "InprocEmbedDocument_Impl::SetColorScheme( LOGPALETTE * pLogpal )\n" );
if ( CheckDefHandler() )
{
ComSmart< IOleObject > pOleObject;
HRESULT hr = m_pDefHandler->QueryInterface( IID_IOleObject, (void**)&pOleObject );
ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
if ( SUCCEEDED( hr ) && pOleObject )
return pOleObject->SetColorScheme( pLogpal );
}
return E_FAIL;
}
//IDataObject
//-------------------------------------------------------------------------------
STDMETHODIMP InprocEmbedDocument_Impl::GetData( FORMATETC * pFormatetc, STGMEDIUM * pMedium )
{
WRITEDEBUGINFO( "InprocEmbedDocument_Impl::GetData( FORMATETC * pFormatetc, STGMEDIUM * pMedium )\n" );
if ( CheckDefHandler() )
{
ComSmart< IDataObject > pIDataObject;
HRESULT hr = m_pDefHandler->QueryInterface( IID_IDataObject, (void**)&pIDataObject );
ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
if ( SUCCEEDED( hr ) && pIDataObject )
return pIDataObject->GetData( pFormatetc, pMedium );
}
return E_FAIL;
}
//-------------------------------------------------------------------------------
STDMETHODIMP InprocEmbedDocument_Impl::GetDataHere( FORMATETC * pFormatetc, STGMEDIUM * pMedium )
{
WRITEDEBUGINFO( "InprocEmbedDocument_Impl::GetDataHere( FORMATETC * pFormatetc, STGMEDIUM * pMedium )\n" );
if ( CheckDefHandler() )
{
ComSmart< IDataObject > pIDataObject;
HRESULT hr = m_pDefHandler->QueryInterface( IID_IDataObject, (void**)&pIDataObject );
ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
if ( SUCCEEDED( hr ) && pIDataObject )
return pIDataObject->GetDataHere( pFormatetc, pMedium );
}
return E_FAIL;
}
//-------------------------------------------------------------------------------
STDMETHODIMP InprocEmbedDocument_Impl::QueryGetData( FORMATETC * pFormatetc )
{
WRITEDEBUGINFO( "InprocEmbedDocument_Impl::QueryGetData( FORMATETC * pFormatetc )\n" );
if ( CheckDefHandler() )
{
ComSmart< IDataObject > pIDataObject;
HRESULT hr = m_pDefHandler->QueryInterface( IID_IDataObject, (void**)&pIDataObject );
ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
if ( SUCCEEDED( hr ) && pIDataObject )
return pIDataObject->QueryGetData( pFormatetc );
}
return E_FAIL;
}
//-------------------------------------------------------------------------------
STDMETHODIMP InprocEmbedDocument_Impl::GetCanonicalFormatEtc( FORMATETC * pFormatetcIn, FORMATETC * pFormatetcOut )
{
WRITEDEBUGINFO( "InprocEmbedDocument_Impl::GetCanonicalFormatEtc( FORMATETC * pFormatetcIn, FORMATETC * pFormatetcOut )\n" );
if ( CheckDefHandler() )
{
ComSmart< IDataObject > pIDataObject;
HRESULT hr = m_pDefHandler->QueryInterface( IID_IDataObject, (void**)&pIDataObject );
ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
if ( SUCCEEDED( hr ) && pIDataObject )
return pIDataObject->GetCanonicalFormatEtc( pFormatetcIn, pFormatetcOut );
}
return E_FAIL;
}
//-------------------------------------------------------------------------------
STDMETHODIMP InprocEmbedDocument_Impl::SetData( FORMATETC * pFormatetc, STGMEDIUM * pMedium, BOOL fRelease )
{
WRITEDEBUGINFO( "InprocEmbedDocument_Impl::SetData( FORMATETC * pFormatetc, STGMEDIUM * pMedium, BOOL fRelease )\n" );
if ( CheckDefHandler() )
{
ComSmart< IDataObject > pIDataObject;
HRESULT hr = m_pDefHandler->QueryInterface( IID_IDataObject, (void**)&pIDataObject );
ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
if ( SUCCEEDED( hr ) && pIDataObject )
return pIDataObject->SetData( pFormatetc, pMedium, fRelease );
}
return E_FAIL;
}
//-------------------------------------------------------------------------------
STDMETHODIMP InprocEmbedDocument_Impl::EnumFormatEtc( DWORD dwDirection, IEnumFORMATETC ** ppFormatetc )
{
WRITEDEBUGINFO( "InprocEmbedDocument_Impl::EnumFormatEtc( DWORD dwDirection, IEnumFORMATETC ** ppFormatetc )\n" );
if ( CheckDefHandler() )
{
ComSmart< IDataObject > pIDataObject;
HRESULT hr = m_pDefHandler->QueryInterface( IID_IDataObject, (void**)&pIDataObject );
ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
if ( SUCCEEDED( hr ) && pIDataObject )
return pIDataObject->EnumFormatEtc( dwDirection, ppFormatetc );
}
return E_FAIL;
}
//-------------------------------------------------------------------------------
STDMETHODIMP InprocEmbedDocument_Impl::DAdvise( FORMATETC * pFormatetc, DWORD advf, IAdviseSink * pAdvSink, DWORD * pdwConnection )
{
WRITEDEBUGINFO( "InprocEmbedDocument_Impl::DAdvise( FORMATETC * pFormatetc, DWORD advf, IAdviseSink * pAdvSink, DWORD * pdwConnection )\n" );
if ( pAdvSink && CheckDefHandler() )
{
ComSmart< IDataObject > pIDataObject;
HRESULT hr = m_pDefHandler->QueryInterface( IID_IDataObject, (void**)&pIDataObject );
ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
if ( SUCCEEDED( hr ) && pIDataObject )
{
ComSmart< OleWrapperAdviseSink > pOwnAdvise( new OleWrapperAdviseSink( ComSmart<IAdviseSink>( pAdvSink ), pFormatetc, advf ) );
DWORD nRegID = 0;
if ( SUCCEEDED( pIDataObject->DAdvise( pFormatetc, advf, pOwnAdvise, &nRegID ) ) && nRegID > 0 )
{
pOwnAdvise->SetRegID( nRegID );
*pdwConnection = InsertAdviseLinkToList( pOwnAdvise, m_pDataAdvises );
if ( *pdwConnection )
return S_OK;
else
pIDataObject->DUnadvise( nRegID );
}
}
}
return E_FAIL;
}
//-------------------------------------------------------------------------------
STDMETHODIMP InprocEmbedDocument_Impl::DUnadvise( DWORD dwConnection )
{
WRITEDEBUGINFO( "InprocEmbedDocument_Impl::DUnadvise( DWORD dwConnection )\n" );
if ( m_pDefHandler && DEFAULT_ARRAY_LEN > dwConnection && dwConnection > 0 && m_pDataAdvises[dwConnection] )
{
if ( CheckDefHandler() )
{
ComSmart< IDataObject > pIDataObject;
HRESULT hr = m_pDefHandler->QueryInterface( IID_IDataObject, (void**)&pIDataObject );
ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
if ( SUCCEEDED( hr ) && pIDataObject )
{
DWORD nID = m_pDataAdvises[dwConnection]->GetRegID();
return pIDataObject->DUnadvise( nID );
}
}
m_pDataAdvises[dwConnection] = NULL;
}
return E_FAIL;
}
//-------------------------------------------------------------------------------
STDMETHODIMP InprocEmbedDocument_Impl::EnumDAdvise( IEnumSTATDATA ** ppenumAdvise )
{
WRITEDEBUGINFO( "InprocEmbedDocument_Impl::EnumDAdvise( IEnumSTATDATA ** ppenumAdvise )\n" );
if ( CheckDefHandler() )
{
ComSmart< IDataObject > pIDataObject;
HRESULT hr = m_pDefHandler->QueryInterface( IID_IDataObject, (void**)&pIDataObject );
ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
if ( SUCCEEDED( hr ) && pIDataObject )
return pIDataObject->EnumDAdvise( ppenumAdvise );
}
return E_FAIL;
}
// IRunnableObject
//-------------------------------------------------------------------------------
STDMETHODIMP InprocEmbedDocument_Impl::GetRunningClass( LPCLSID lpClsid )
{
WRITEDEBUGINFO( "InprocEmbedDocument_Impl::GetRunningClass( LPCLSID lpClsid )\n" );
if ( CheckDefHandler() )
{
ComSmart< IRunnableObject > pIRunObj;
HRESULT hr = m_pDefHandler->QueryInterface( IID_IRunnableObject, (void**)&pIRunObj );
ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
if ( SUCCEEDED( hr ) && pIRunObj )
return pIRunObj->GetRunningClass( lpClsid );
}
return E_FAIL;
}
//-------------------------------------------------------------------------------
STDMETHODIMP InprocEmbedDocument_Impl::Run( LPBINDCTX pbc )
{
WRITEDEBUGINFO( "InprocEmbedDocument_Impl::Run( LPBINDCTX pbc )\n" );
if ( CheckDefHandler() )
{
ComSmart< IRunnableObject > pIRunObj;
HRESULT hr = m_pDefHandler->QueryInterface( IID_IRunnableObject, (void**)&pIRunObj );
ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
if ( SUCCEEDED( hr ) && pIRunObj )
return pIRunObj->Run( pbc );
}
return E_FAIL;
}
//-------------------------------------------------------------------------------
BOOL STDMETHODCALLTYPE InprocEmbedDocument_Impl::IsRunning()
{
WRITEDEBUGINFO( "InprocEmbedDocument_Impl::IsRunning()\n" );
if ( CheckDefHandler() )
{
ComSmart< IRunnableObject > pIRunObj;
HRESULT hr = m_pDefHandler->QueryInterface( IID_IRunnableObject, (void**)&pIRunObj );
ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
if ( SUCCEEDED( hr ) && pIRunObj )
return pIRunObj->IsRunning();
}
return E_FAIL;
}
//-------------------------------------------------------------------------------
STDMETHODIMP InprocEmbedDocument_Impl::LockRunning( BOOL fLock, BOOL fLastUnlockCloses )
{
WRITEDEBUGINFO( "InprocEmbedDocument_Impl::LockRunning( BOOL fLock, BOOL fLastUnlockCloses )\n" );
if ( CheckDefHandler() )
{
ComSmart< IRunnableObject > pIRunObj;
HRESULT hr = m_pDefHandler->QueryInterface( IID_IRunnableObject, (void**)&pIRunObj );
ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
if ( SUCCEEDED( hr ) && pIRunObj )
return pIRunObj->LockRunning( fLock, fLastUnlockCloses );
}
return E_FAIL;
}
//-------------------------------------------------------------------------------
STDMETHODIMP InprocEmbedDocument_Impl::SetContainedObject( BOOL fContained)
{
WRITEDEBUGINFO( "InprocEmbedDocument_Impl::SetContainedObject( BOOL fContained)\n" );
if ( CheckDefHandler() )
{
ComSmart< IRunnableObject > pIRunObj;
HRESULT hr = m_pDefHandler->QueryInterface( IID_IRunnableObject, (void**)&pIRunObj );
ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
if ( SUCCEEDED( hr ) && pIRunObj )
return pIRunObj->SetContainedObject( fContained );
}
return E_FAIL;
}
// IViewObject methods
//-------------------------------------------------------------------------------
STDMETHODIMP InprocEmbedDocument_Impl::Draw( DWORD dwDrawAspect, LONG lindex, void *pvAspect, DVTARGETDEVICE *ptd, HDC hdcTargetDev, HDC hdcDraw, LPCRECTL lprcBounds, LPCRECTL lprcWBounds, BOOL ( STDMETHODCALLTYPE *pfnContinue )( ULONG_PTR dwContinue ), ULONG_PTR dwContinue )
{
WRITEDEBUGINFO( "InprocEmbedDocument_Impl::Draw( DWORD dwDrawAspect, LONG lindex, void *pvAspect, DVTARGETDEVICE *ptd, HDC hdcTargetDev, HDC hdcDraw, LPCRECTL lprcBounds, LPCRECTL lprcWBounds, BOOL ( STDMETHODCALLTYPE *pfnContinue )( ULONG_PTR dwContinue ), ULONG_PTR dwContinue )\n" );
if ( CheckDefHandler() )
{
ComSmart< IViewObject > pIViewObject;
HRESULT hr = m_pDefHandler->QueryInterface( IID_IViewObject, (void**)&pIViewObject );
ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
if ( SUCCEEDED( hr ) && pIViewObject )
return pIViewObject->Draw( dwDrawAspect, lindex, pvAspect, ptd, hdcTargetDev, hdcDraw, lprcBounds, lprcWBounds, pfnContinue, dwContinue );
}
return E_FAIL;
}
//-------------------------------------------------------------------------------
STDMETHODIMP InprocEmbedDocument_Impl::GetColorSet( DWORD dwDrawAspect, LONG lindex, void *pvAspect, DVTARGETDEVICE *ptd, HDC hicTargetDev, LOGPALETTE **ppColorSet )
{
WRITEDEBUGINFO( "InprocEmbedDocument_Impl::GetColorSet( DWORD dwDrawAspect, LONG lindex, void *pvAspect, DVTARGETDEVICE *ptd, HDC hicTargetDev, LOGPALETTE **ppColorSet )\n" );
if ( CheckDefHandler() )
{
ComSmart< IViewObject > pIViewObject;
HRESULT hr = m_pDefHandler->QueryInterface( IID_IViewObject, (void**)&pIViewObject );
ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
if ( SUCCEEDED( hr ) && pIViewObject )
return pIViewObject->GetColorSet( dwDrawAspect, lindex, pvAspect, ptd, hicTargetDev, ppColorSet );
}
return E_FAIL;
}
//-------------------------------------------------------------------------------
STDMETHODIMP InprocEmbedDocument_Impl::Freeze( DWORD dwDrawAspect, LONG lindex, void *pvAspect, DWORD *pdwFreeze )
{
WRITEDEBUGINFO( "InprocEmbedDocument_Impl::Freeze( DWORD dwDrawAspect, LONG lindex, void *pvAspect, DWORD *pdwFreeze )\n" );
if ( CheckDefHandler() )
{
ComSmart< IViewObject > pIViewObject;
HRESULT hr = m_pDefHandler->QueryInterface( IID_IViewObject, (void**)&pIViewObject );
ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
if ( SUCCEEDED( hr ) && pIViewObject )
return pIViewObject->Freeze( dwDrawAspect, lindex, pvAspect, pdwFreeze );
}
return E_FAIL;
}
//-------------------------------------------------------------------------------
STDMETHODIMP InprocEmbedDocument_Impl::Unfreeze( DWORD dwFreeze )
{
WRITEDEBUGINFO( "InprocEmbedDocument_Impl::Unfreeze( DWORD dwFreeze )\n" );
if ( CheckDefHandler() )
{
ComSmart< IViewObject > pIViewObject;
HRESULT hr = m_pDefHandler->QueryInterface( IID_IViewObject, (void**)&pIViewObject );
ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
if ( SUCCEEDED( hr ) && pIViewObject )
return pIViewObject->Unfreeze( dwFreeze );
}
return E_FAIL;
}
//-------------------------------------------------------------------------------
STDMETHODIMP InprocEmbedDocument_Impl::SetAdvise( DWORD aspects, DWORD advf, IAdviseSink *pAdvSink )
{
WRITEDEBUGINFO( "InprocEmbedDocument_Impl::SetAdvise( DWORD aspects, DWORD advf, IAdviseSink *pAdvSink )\n" );
if ( CheckDefHandler() )
{
ComSmart< IViewObject > pIViewObject;
HRESULT hr = m_pDefHandler->QueryInterface( IID_IViewObject, (void**)&pIViewObject );
ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
if ( SUCCEEDED( hr ) && pIViewObject )
{
ComSmart< OleWrapperAdviseSink > pOwnAdvise( new OleWrapperAdviseSink( pAdvSink, aspects, advf ) );
if ( SUCCEEDED( pIViewObject->SetAdvise( aspects, advf, pOwnAdvise ) ) )
{
m_pViewAdvise = pOwnAdvise;
return S_OK;
}
}
}
return E_FAIL;
}
//-------------------------------------------------------------------------------
STDMETHODIMP InprocEmbedDocument_Impl::GetAdvise( DWORD *pAspects, DWORD *pAdvf, IAdviseSink **ppAdvSink )
{
if ( !ppAdvSink )
return E_INVALIDARG;
if ( m_pViewAdvise )
{
if ( pAspects )
*pAspects = m_pViewAdvise->GetAspect();
if ( pAdvf )
*pAdvf = m_pViewAdvise->GetViewAdviseFlag();
*ppAdvSink = m_pViewAdvise->GetOrigAdvise();
if ( *ppAdvSink )
(*ppAdvSink)->AddRef();
}
else
*ppAdvSink = NULL;
return S_OK;
}
// IViewObject2 methods
//-------------------------------------------------------------------------------
STDMETHODIMP InprocEmbedDocument_Impl::GetExtent( DWORD dwDrawAspect, LONG lindex, DVTARGETDEVICE *ptd, LPSIZEL lpsizel )
{
WRITEDEBUGINFO( "InprocEmbedDocument_Impl::GetExtent( DWORD dwDrawAspect, LONG lindex, DVTARGETDEVICE *ptd, LPSIZEL lpsizel )\n" );
if ( CheckDefHandler() )
{
ComSmart< IViewObject2 > pIViewObject2;
HRESULT hr = m_pDefHandler->QueryInterface( IID_IViewObject2, (void**)&pIViewObject2 );
ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
if ( SUCCEEDED( hr ) && pIViewObject2 )
return pIViewObject2->GetExtent( dwDrawAspect, lindex, ptd, lpsizel );
}
return E_FAIL;
}
// IOleWindow methods
//-------------------------------------------------------------------------------
STDMETHODIMP InprocEmbedDocument_Impl::GetWindow( HWND *phwnd )
{
WRITEDEBUGINFO( "InprocEmbedDocument_Impl::GetWindow( HWND *phwnd )\n" );
if ( CheckDefHandler() )
{
ComSmart< IOleWindow > pIOleWindow;
HRESULT hr = m_pDefHandler->QueryInterface( IID_IOleWindow, (void**)&pIOleWindow );
ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
if ( SUCCEEDED( hr ) && pIOleWindow )
return pIOleWindow->GetWindow( phwnd );
}
return E_FAIL;
}
//-------------------------------------------------------------------------------
STDMETHODIMP InprocEmbedDocument_Impl::ContextSensitiveHelp( BOOL fEnterMode )
{
WRITEDEBUGINFO( "InprocEmbedDocument_Impl::ContextSensitiveHelp( BOOL fEnterMode )\n" );
if ( CheckDefHandler() )
{
ComSmart< IOleWindow > pIOleWindow;
HRESULT hr = m_pDefHandler->QueryInterface( IID_IOleWindow, (void**)&pIOleWindow );
ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
if ( SUCCEEDED( hr ) && pIOleWindow )
return pIOleWindow->ContextSensitiveHelp( fEnterMode );
}
return E_FAIL;
}
// IOleInPlaceObject methods
//-------------------------------------------------------------------------------
STDMETHODIMP InprocEmbedDocument_Impl::InPlaceDeactivate( void )
{
WRITEDEBUGINFO( "InprocEmbedDocument_Impl::InPlaceDeactivate( void )\n" );
if ( CheckDefHandler() )
{
ComSmart< IOleInPlaceObject > pIOleInPlaceObject;
HRESULT hr = m_pDefHandler->QueryInterface( IID_IOleInPlaceObject, (void**)&pIOleInPlaceObject );
ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
if ( SUCCEEDED( hr ) && pIOleInPlaceObject )
return pIOleInPlaceObject->InPlaceDeactivate();
}
return E_FAIL;
}
//-------------------------------------------------------------------------------
STDMETHODIMP InprocEmbedDocument_Impl::UIDeactivate( void )
{
WRITEDEBUGINFO( "InprocEmbedDocument_Impl::UIDeactivate( void )\n" );
if ( CheckDefHandler() )
{
ComSmart< IOleInPlaceObject > pIOleInPlaceObject;
HRESULT hr = m_pDefHandler->QueryInterface( IID_IOleInPlaceObject, (void**)&pIOleInPlaceObject );
ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
if ( SUCCEEDED( hr ) && pIOleInPlaceObject )
return pIOleInPlaceObject->UIDeactivate();
}
return E_FAIL;
}
//-------------------------------------------------------------------------------
STDMETHODIMP InprocEmbedDocument_Impl::SetObjectRects( LPCRECT lprcPosRect, LPCRECT lprcClipRect )
{
WRITEDEBUGINFO( "InprocEmbedDocument_Impl::SetObjectRects( LPCRECT lprcPosRect, LPCRECT lprcClipRect )\n" );
if ( CheckDefHandler() )
{
ComSmart< IOleInPlaceObject > pIOleInPlaceObject;
HRESULT hr = m_pDefHandler->QueryInterface( IID_IOleInPlaceObject, (void**)&pIOleInPlaceObject );
ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
if ( SUCCEEDED( hr ) && pIOleInPlaceObject )
return pIOleInPlaceObject->SetObjectRects( lprcPosRect, lprcClipRect );
}
return E_FAIL;
}
//-------------------------------------------------------------------------------
STDMETHODIMP InprocEmbedDocument_Impl::ReactivateAndUndo( void )
{
WRITEDEBUGINFO( "InprocEmbedDocument_Impl::ReactivateAndUndo( void )\n" );
if ( CheckDefHandler() )
{
ComSmart< IOleInPlaceObject > pIOleInPlaceObject;
HRESULT hr = m_pDefHandler->QueryInterface( IID_IOleInPlaceObject, (void**)&pIOleInPlaceObject );
ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
if ( SUCCEEDED( hr ) && pIOleInPlaceObject )
return pIOleInPlaceObject->ReactivateAndUndo();
}
return E_FAIL;
}
// IDispatch methods
//-------------------------------------------------------------------------------
STDMETHODIMP InprocEmbedDocument_Impl::GetTypeInfoCount( UINT *pctinfo )
{
WRITEDEBUGINFO( "InprocEmbedDocument_Impl::GetTypeInfoCount( UINT *pctinfo )\n" );
if ( CheckDefHandler() )
{
ComSmart< IDispatch > pIDispatch;
HRESULT hr = m_pDefHandler->QueryInterface( IID_IDispatch, (void**)&pIDispatch );
ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
if ( SUCCEEDED( hr ) && pIDispatch )
return pIDispatch->GetTypeInfoCount( pctinfo );
}
return E_FAIL;
}
//-------------------------------------------------------------------------------
STDMETHODIMP InprocEmbedDocument_Impl::GetTypeInfo( UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo )
{
WRITEDEBUGINFO( "InprocEmbedDocument_Impl::GetTypeInfo( UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo )\n" );
if ( CheckDefHandler() )
{
ComSmart< IDispatch > pIDispatch;
HRESULT hr = m_pDefHandler->QueryInterface( IID_IDispatch, (void**)&pIDispatch );
ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
if ( SUCCEEDED( hr ) && pIDispatch )
return pIDispatch->GetTypeInfo( iTInfo, lcid, ppTInfo );
}
return E_FAIL;
}
//-------------------------------------------------------------------------------
STDMETHODIMP InprocEmbedDocument_Impl::GetIDsOfNames( REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId )
{
WRITEDEBUGINFO( "InprocEmbedDocument_Impl::GetIDsOfNames( REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId )\n" );
if ( CheckDefHandler() )
{
ComSmart< IDispatch > pIDispatch;
HRESULT hr = m_pDefHandler->QueryInterface( IID_IDispatch, (void**)&pIDispatch );
ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
if ( SUCCEEDED( hr ) && pIDispatch )
return pIDispatch->GetIDsOfNames( riid, rgszNames, cNames, lcid, rgDispId );
}
return E_FAIL;
}
//-------------------------------------------------------------------------------
STDMETHODIMP InprocEmbedDocument_Impl::Invoke( DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr )
{
WRITEDEBUGINFO( "InprocEmbedDocument_Impl::Invoke( DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr )\n" );
if ( CheckDefHandler() )
{
ComSmart< IDispatch > pIDispatch;
HRESULT hr = m_pDefHandler->QueryInterface( IID_IDispatch, (void**)&pIDispatch );
ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
if ( SUCCEEDED( hr ) && pIDispatch )
return pIDispatch->Invoke( dispIdMember, riid, lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr );
}
return E_FAIL;
}
// ====
// InternalCacheWrapper
// ====
// IUnknown
//-------------------------------------------------------------------------------
STDMETHODIMP InprocEmbedDocument_Impl::InternalCacheWrapper::QueryInterface( REFIID riid, void FAR* FAR* ppv )
{
return m_rOwnDocument.QueryInterface( riid, ppv );
}
//-------------------------------------------------------------------------------
STDMETHODIMP_(ULONG) InprocEmbedDocument_Impl::InternalCacheWrapper::AddRef()
{
return m_rOwnDocument.AddRef();
}
//-------------------------------------------------------------------------------
STDMETHODIMP_(ULONG) InprocEmbedDocument_Impl::InternalCacheWrapper::Release()
{
return m_rOwnDocument.Release();
}
// IOleCache methods
//-------------------------------------------------------------------------------
STDMETHODIMP InprocEmbedDocument_Impl::InternalCacheWrapper::Cache( FORMATETC *pformatetc, DWORD advf, DWORD *pdwConnection )
{
WRITEDEBUGINFO( "InprocEmbedDocument_Impl::InternalCacheWrapper::Cache( FORMATETC *pformatetc, DWORD advf, DWORD *pdwConnection )\n" );
if ( m_rOwnDocument.CheckDefHandler() )
{
ComSmart< IOleCache > pIOleCache;
HRESULT hr = m_rOwnDocument.GetDefHandler()->QueryInterface( IID_IOleCache, (void**)&pIOleCache );
ULONGGuard aGuard( &m_rOwnDocument.m_nCallsOnStack ); // avoid reentrance problem
if ( SUCCEEDED( hr ) && pIOleCache )
return pIOleCache->Cache( pformatetc, advf, pdwConnection );
}
return E_FAIL;
}
//-------------------------------------------------------------------------------
STDMETHODIMP InprocEmbedDocument_Impl::InternalCacheWrapper::Uncache( DWORD dwConnection )
{
WRITEDEBUGINFO( "InprocEmbedDocument_Impl::InternalCacheWrapper::Uncache( DWORD dwConnection )\n" );
if ( m_rOwnDocument.CheckDefHandler() )
{
ComSmart< IOleCache > pIOleCache;
HRESULT hr = m_rOwnDocument.GetDefHandler()->QueryInterface( IID_IOleCache, (void**)&pIOleCache );
ULONGGuard aGuard( &m_rOwnDocument.m_nCallsOnStack ); // avoid reentrance problem
if ( SUCCEEDED( hr ) && pIOleCache )
return pIOleCache->Uncache( dwConnection );
}
return E_FAIL;
}
//-------------------------------------------------------------------------------
STDMETHODIMP InprocEmbedDocument_Impl::InternalCacheWrapper::EnumCache( IEnumSTATDATA **ppenumSTATDATA )
{
WRITEDEBUGINFO( "InprocEmbedDocument_Impl::InternalCacheWrapper::EnumCache( IEnumSTATDATA **ppenumSTATDATA )\n" );
if ( m_rOwnDocument.CheckDefHandler() )
{
ComSmart< IOleCache > pIOleCache;
HRESULT hr = m_rOwnDocument.GetDefHandler()->QueryInterface( IID_IOleCache, (void**)&pIOleCache );
ULONGGuard aGuard( &m_rOwnDocument.m_nCallsOnStack ); // avoid reentrance problem
if ( SUCCEEDED( hr ) && pIOleCache )
return pIOleCache->EnumCache( ppenumSTATDATA );
}
return E_FAIL;
}
//-------------------------------------------------------------------------------
STDMETHODIMP InprocEmbedDocument_Impl::InternalCacheWrapper::InitCache( IDataObject *pDataObject )
{
WRITEDEBUGINFO( "InprocEmbedDocument_Impl::InternalCacheWrapper::InitCache( IDataObject *pDataObject )\n" );
if ( m_rOwnDocument.CheckDefHandler() )
{
ComSmart< IOleCache > pIOleCache;
HRESULT hr = m_rOwnDocument.GetDefHandler()->QueryInterface( IID_IOleCache, (void**)&pIOleCache );
ULONGGuard aGuard( &m_rOwnDocument.m_nCallsOnStack ); // avoid reentrance problem
if ( SUCCEEDED( hr ) && pIOleCache )
return pIOleCache->InitCache( pDataObject );
}
return E_FAIL;
}
//-------------------------------------------------------------------------------
STDMETHODIMP InprocEmbedDocument_Impl::InternalCacheWrapper::SetData( FORMATETC *pformatetc, STGMEDIUM *pmedium, BOOL fRelease )
{
WRITEDEBUGINFO( "InprocEmbedDocument_Impl::InternalCacheWrapper::SetData( FORMATETC *pformatetc, STGMEDIUM *pmedium, BOOL fRelease )\n" );
if ( m_rOwnDocument.CheckDefHandler() )
{
ComSmart< IOleCache > pIOleCache;
HRESULT hr = m_rOwnDocument.GetDefHandler()->QueryInterface( IID_IOleCache, (void**)&pIOleCache );
ULONGGuard aGuard( &m_rOwnDocument.m_nCallsOnStack ); // avoid reentrance problem
if ( SUCCEEDED( hr ) && pIOleCache )
return pIOleCache->SetData( pformatetc, pmedium, fRelease );
}
return E_FAIL;
}
// IOleCache2 methods
//-------------------------------------------------------------------------------
STDMETHODIMP InprocEmbedDocument_Impl::InternalCacheWrapper::UpdateCache( LPDATAOBJECT pDataObject, DWORD grfUpdf, LPVOID pReserved )
{
WRITEDEBUGINFO( "InprocEmbedDocument_Impl::InternalCacheWrapper::UpdateCache( LPDATAOBJECT pDataObject, DWORD grfUpdf, LPVOID pReserved )\n" );
if ( m_rOwnDocument.CheckDefHandler() )
{
ComSmart< IOleCache2 > pIOleCache2;
HRESULT hr = m_rOwnDocument.GetDefHandler()->QueryInterface( IID_IOleCache2, (void**)&pIOleCache2 );
ULONGGuard aGuard( &m_rOwnDocument.m_nCallsOnStack ); // avoid reentrance problem
if ( SUCCEEDED( hr ) && pIOleCache2 )
return pIOleCache2->UpdateCache( pDataObject, grfUpdf, pReserved );
}
return E_FAIL;
}
//-------------------------------------------------------------------------------
STDMETHODIMP InprocEmbedDocument_Impl::InternalCacheWrapper::DiscardCache( DWORD dwDiscardOptions )
{
WRITEDEBUGINFO( "InprocEmbedDocument_Impl::InternalCacheWrapper::DiscardCache( DWORD dwDiscardOptions )\n" );
if ( m_rOwnDocument.CheckDefHandler() )
{
ComSmart< IOleCache2 > pIOleCache2;
HRESULT hr = m_rOwnDocument.GetDefHandler()->QueryInterface( IID_IOleCache2, (void**)&pIOleCache2 );
ULONGGuard aGuard( &m_rOwnDocument.m_nCallsOnStack ); // avoid reentrance problem
if ( SUCCEEDED( hr ) && pIOleCache2 )
return pIOleCache2->DiscardCache( dwDiscardOptions );
}
return E_FAIL;
}
}; // namespace inprocserv