1*f78e906fSAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*f78e906fSAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*f78e906fSAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*f78e906fSAndrew Rist  * distributed with this work for additional information
6*f78e906fSAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*f78e906fSAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*f78e906fSAndrew Rist  * "License"); you may not use this file except in compliance
9*f78e906fSAndrew Rist  * with the License.  You may obtain a copy of the License at
10*f78e906fSAndrew Rist  *
11*f78e906fSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*f78e906fSAndrew Rist  *
13*f78e906fSAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*f78e906fSAndrew Rist  * software distributed under the License is distributed on an
15*f78e906fSAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*f78e906fSAndrew Rist  * KIND, either express or implied.  See the License for the
17*f78e906fSAndrew Rist  * specific language governing permissions and limitations
18*f78e906fSAndrew Rist  * under the License.
19*f78e906fSAndrew Rist  *
20*f78e906fSAndrew Rist  *************************************************************/
21*f78e906fSAndrew Rist 
22*f78e906fSAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir #include <embservconst.h>
25cdf0e10cSrcweir #include "inprocembobj.h"
26cdf0e10cSrcweir 
27cdf0e10cSrcweir namespace inprocserv
28cdf0e10cSrcweir {
29cdf0e10cSrcweir 
30cdf0e10cSrcweir #ifdef OWNDEBUG
31cdf0e10cSrcweir //-------------------------------------------------------------------------------
WriteDebugInfo(DWORD pThis,char * pString,DWORD nToWrite)32cdf0e10cSrcweir void WriteDebugInfo( DWORD pThis, char* pString, DWORD nToWrite )
33cdf0e10cSrcweir {
34cdf0e10cSrcweir     if ( nToWrite )
35cdf0e10cSrcweir     {
36cdf0e10cSrcweir         char pNumber[12];
37cdf0e10cSrcweir         pNumber[0] = '0';
38cdf0e10cSrcweir         pNumber[1] = 'x';
39cdf0e10cSrcweir         for ( int nInd = 0; nInd < 8; nInd++ )
40cdf0e10cSrcweir             pNumber[nInd+2] = (char)( ( pThis / ( 1 << ( 7 - nInd ) ) ) % 16 ) + 48;
41cdf0e10cSrcweir         pNumber[10] = ' ';
42cdf0e10cSrcweir         pNumber[11] = 0;
43cdf0e10cSrcweir 
44cdf0e10cSrcweir         HANDLE pFile = CreateFileA( "h:\\inproc.log", GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, 0, NULL );
45cdf0e10cSrcweir         if ( pFile )
46cdf0e10cSrcweir         {
47cdf0e10cSrcweir             DWORD dwWritten = 0;
48cdf0e10cSrcweir             SetFilePointer( pFile, 0, 0, FILE_END );
49cdf0e10cSrcweir             WriteFile( pFile, pNumber, 11, &dwWritten, NULL );
50cdf0e10cSrcweir             WriteFile( pFile, pString, nToWrite - 1, &dwWritten, NULL );
51cdf0e10cSrcweir             CloseHandle( pFile );
52cdf0e10cSrcweir         }
53cdf0e10cSrcweir     }
54cdf0e10cSrcweir }
55cdf0e10cSrcweir #endif
56cdf0e10cSrcweir 
57cdf0e10cSrcweir //-------------------------------------------------------------------------------
StringsEqual(LPCOLESTR pszNameFromOutside,wchar_t * pOwnName)58cdf0e10cSrcweir BOOL StringsEqual( LPCOLESTR pszNameFromOutside, wchar_t* pOwnName )
59cdf0e10cSrcweir {
60cdf0e10cSrcweir     BOOL bResult = TRUE;
61cdf0e10cSrcweir 
62cdf0e10cSrcweir     if ( pszNameFromOutside && pOwnName )
63cdf0e10cSrcweir     {
64cdf0e10cSrcweir         for ( int nInd = 0; pszNameFromOutside[nInd] != 0 || pOwnName[nInd] != 0; nInd++ )
65cdf0e10cSrcweir         {
66cdf0e10cSrcweir             if ( pszNameFromOutside[nInd] != pOwnName[nInd] )
67cdf0e10cSrcweir             {
68cdf0e10cSrcweir                 bResult = FALSE;
69cdf0e10cSrcweir                 break;
70cdf0e10cSrcweir             }
71cdf0e10cSrcweir         }
72cdf0e10cSrcweir     }
73cdf0e10cSrcweir     else if ( pszNameFromOutside || pOwnName )
74cdf0e10cSrcweir         bResult = FALSE;
75cdf0e10cSrcweir 
76cdf0e10cSrcweir     return bResult;
77cdf0e10cSrcweir }
78cdf0e10cSrcweir 
79cdf0e10cSrcweir //-------------------------------------------------------------------------------
Init()80cdf0e10cSrcweir HRESULT InprocEmbedDocument_Impl::Init()
81cdf0e10cSrcweir {
82cdf0e10cSrcweir 	return S_OK;
83cdf0e10cSrcweir }
84cdf0e10cSrcweir 
85cdf0e10cSrcweir //-------------------------------------------------------------------------------
SetName(LPCOLESTR pszNameFromOutside,wchar_t * & pOwnName)86cdf0e10cSrcweir void InprocEmbedDocument_Impl::SetName( LPCOLESTR pszNameFromOutside, wchar_t*& pOwnName )
87cdf0e10cSrcweir {
88cdf0e10cSrcweir     if ( !pszNameFromOutside )
89cdf0e10cSrcweir         return;
90cdf0e10cSrcweir 
91cdf0e10cSrcweir     // copy the string
92cdf0e10cSrcweir     size_t nLen = 0;
93cdf0e10cSrcweir     while( pszNameFromOutside[nLen] != 0 )
94cdf0e10cSrcweir         nLen++;
95cdf0e10cSrcweir 
96cdf0e10cSrcweir     if ( pOwnName )
97cdf0e10cSrcweir     {
98cdf0e10cSrcweir         delete[] pOwnName;
99cdf0e10cSrcweir         pOwnName = NULL;
100cdf0e10cSrcweir     }
101cdf0e10cSrcweir 
102cdf0e10cSrcweir     pOwnName = new wchar_t[nLen+1];
103cdf0e10cSrcweir     for ( size_t nInd = 0; nInd < nLen; nInd++ )
104cdf0e10cSrcweir         pOwnName[nInd] = pszNameFromOutside[nInd];
105cdf0e10cSrcweir     pOwnName[nLen] = 0;
106cdf0e10cSrcweir }
107cdf0e10cSrcweir 
108cdf0e10cSrcweir //-------------------------------------------------------------------------------
CheckDefHandler()109cdf0e10cSrcweir BOOL InprocEmbedDocument_Impl::CheckDefHandler()
110cdf0e10cSrcweir {
111cdf0e10cSrcweir     WRITEDEBUGINFO( "InprocEmbedDocument_Impl::CheckDefHandler()" );
112cdf0e10cSrcweir     // set the own listener
113cdf0e10cSrcweir     if ( m_pOleAdvises[0] == NULL )
114cdf0e10cSrcweir     {
115cdf0e10cSrcweir         WRITEDEBUGINFO( "InprocEmbedDocument_Impl::CheckDefHandler()" );
116cdf0e10cSrcweir         m_pOleAdvises[0] = new OleWrapperAdviseSink();
117cdf0e10cSrcweir     }
118cdf0e10cSrcweir     else
119cdf0e10cSrcweir     {
120cdf0e10cSrcweir         WRITEDEBUGINFO( "InprocEmbedDocument_Impl::CheckDefHandler()" );
121cdf0e10cSrcweir         if ( m_pOleAdvises[0]->IsClosed() )
122cdf0e10cSrcweir         {
123cdf0e10cSrcweir             WRITEDEBUGINFO( "InprocEmbedDocument_Impl::CheckDefHandler()" );
124cdf0e10cSrcweir             if ( m_pDefHandler )
125cdf0e10cSrcweir             {
126cdf0e10cSrcweir                 WRITEDEBUGINFO( "InprocEmbedDocument_Impl::CheckDefHandler()" );
127cdf0e10cSrcweir                 // deregister all the listeners
128cdf0e10cSrcweir 
129cdf0e10cSrcweir                 ComSmart< IOleObject > pOleObject;
130cdf0e10cSrcweir                 HRESULT hr = m_pDefHandler->QueryInterface( IID_IOleObject, (void**)&pOleObject );
131cdf0e10cSrcweir                 if ( SUCCEEDED( hr ) && pOleObject )
132cdf0e10cSrcweir                 {
133cdf0e10cSrcweir                     WRITEDEBUGINFO( "InprocEmbedDocument_Impl::CheckDefHandler()" );
134cdf0e10cSrcweir                     for ( DWORD nInd = 0; nInd < DEFAULT_ARRAY_LEN; nInd++ )
135cdf0e10cSrcweir                         if ( m_pOleAdvises[nInd] )
136cdf0e10cSrcweir                         {
137cdf0e10cSrcweir                             DWORD nID = m_pOleAdvises[nInd]->GetRegID();
138cdf0e10cSrcweir                             pOleObject->Unadvise( nID );
139cdf0e10cSrcweir                             m_pOleAdvises[nInd]->SetRegID( 0 );
140cdf0e10cSrcweir                         }
141cdf0e10cSrcweir 
142cdf0e10cSrcweir                     pOleObject->SetClientSite( NULL );
143cdf0e10cSrcweir                 }
144cdf0e10cSrcweir 
145cdf0e10cSrcweir                 WRITEDEBUGINFO( "InprocEmbedDocument_Impl::CheckDefHandler()" );
146cdf0e10cSrcweir                 ComSmart< IDataObject > pIDataObject;
147cdf0e10cSrcweir                 hr = m_pDefHandler->QueryInterface( IID_IDataObject, (void**)&pIDataObject );
148cdf0e10cSrcweir                 if ( SUCCEEDED( hr ) && pIDataObject )
149cdf0e10cSrcweir                 {
150cdf0e10cSrcweir                     WRITEDEBUGINFO( "InprocEmbedDocument_Impl::CheckDefHandler()" );
151cdf0e10cSrcweir                     for ( DWORD nInd = 0; nInd < DEFAULT_ARRAY_LEN; nInd++ )
152cdf0e10cSrcweir                         if ( m_pDataAdvises[nInd] )
153cdf0e10cSrcweir                         {
154cdf0e10cSrcweir                             DWORD nID = m_pDataAdvises[nInd]->GetRegID();
155cdf0e10cSrcweir                             pIDataObject->DUnadvise( nID );
156cdf0e10cSrcweir                             m_pDataAdvises[nInd]->SetRegID( 0 );
157cdf0e10cSrcweir                         }
158cdf0e10cSrcweir                 }
159cdf0e10cSrcweir 
160cdf0e10cSrcweir                 WRITEDEBUGINFO( "InprocEmbedDocument_Impl::CheckDefHandler()" );
161cdf0e10cSrcweir                 ComSmart< IViewObject > pIViewObject;
162cdf0e10cSrcweir                 hr = m_pDefHandler->QueryInterface( IID_IViewObject, (void**)&pIViewObject );
163cdf0e10cSrcweir                 if ( SUCCEEDED( hr ) && pIViewObject )
164cdf0e10cSrcweir                 {
165cdf0e10cSrcweir                     WRITEDEBUGINFO( "InprocEmbedDocument_Impl::CheckDefHandler()" );
166cdf0e10cSrcweir                     if ( m_pViewAdvise )
167cdf0e10cSrcweir                         pIViewObject->SetAdvise( m_pViewAdvise->GetAspect(), m_pViewAdvise->GetViewAdviseFlag(), NULL );
168cdf0e10cSrcweir                     WRITEDEBUGINFO( "InprocEmbedDocument_Impl::CheckDefHandler()" );
169cdf0e10cSrcweir                 }
170cdf0e10cSrcweir                 WRITEDEBUGINFO( "InprocEmbedDocument_Impl::CheckDefHandler()" );
171cdf0e10cSrcweir 
172cdf0e10cSrcweir                 ComSmart< IPersistStorage > pPersist;
173cdf0e10cSrcweir                 hr = m_pDefHandler->QueryInterface( IID_IPersistStorage, (void**)&pPersist );
174cdf0e10cSrcweir                 if ( SUCCEEDED( hr ) && pPersist )
175cdf0e10cSrcweir                 {
176cdf0e10cSrcweir                     WRITEDEBUGINFO( "InprocEmbedDocument_Impl::CheckDefHandler()" );
177cdf0e10cSrcweir                     // disconnect the old wrapper from the storage
178cdf0e10cSrcweir                     pPersist->HandsOffStorage();
179cdf0e10cSrcweir                 }
180cdf0e10cSrcweir 
181cdf0e10cSrcweir                 m_pDefHandler = NULL;
182cdf0e10cSrcweir             }
183cdf0e10cSrcweir 
184cdf0e10cSrcweir             WRITEDEBUGINFO( "InprocEmbedDocument_Impl::CheckDefHandler()" );
185cdf0e10cSrcweir             m_pOleAdvises[0]->UnsetClosed();
186cdf0e10cSrcweir         }
187cdf0e10cSrcweir     }
188cdf0e10cSrcweir 
189cdf0e10cSrcweir     if ( m_nCallsOnStack )
190cdf0e10cSrcweir         return FALSE;
191cdf0e10cSrcweir 
192cdf0e10cSrcweir     WRITEDEBUGINFO( "InprocEmbedDocument_Impl::CheckDefHandler()" );
193cdf0e10cSrcweir     if ( !m_pDefHandler )
194cdf0e10cSrcweir     {
195cdf0e10cSrcweir         WRITEDEBUGINFO( "InprocEmbedDocument_Impl::CheckDefHandler()" );
196cdf0e10cSrcweir         // create a new default inprocess handler
197cdf0e10cSrcweir         HRESULT hr = OleCreateDefaultHandler( m_guid, NULL, IID_IUnknown, (void**)&m_pDefHandler );
198cdf0e10cSrcweir         if ( SUCCEEDED( hr ) )
199cdf0e10cSrcweir         {
200cdf0e10cSrcweir             WRITEDEBUGINFO( "InprocEmbedDocument_Impl::CheckDefHandler()" );
201cdf0e10cSrcweir //            // reinit the handler
202cdf0e10cSrcweir //            ComSmart< IRunnableObject > pIRunObj;
203cdf0e10cSrcweir //            hr = m_pDefHandler->QueryInterface( IID_IRunnableObject, (void**)&pIRunObj );
204cdf0e10cSrcweir //
205cdf0e10cSrcweir //            if ( SUCCEEDED( hr ) && pIRunObj )
206cdf0e10cSrcweir             {
207cdf0e10cSrcweir //                {
208cdf0e10cSrcweir //                    ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
209cdf0e10cSrcweir //                    hr = pIRunObj->Run( NULL );
210cdf0e10cSrcweir //                }
211cdf0e10cSrcweir //
212cdf0e10cSrcweir //                if ( SUCCEEDED( hr ) )
213cdf0e10cSrcweir                 {
214cdf0e10cSrcweir                     if ( m_nInitMode == INIT_FROM_STORAGE )
215cdf0e10cSrcweir                     {
216cdf0e10cSrcweir                         WRITEDEBUGINFO( "InprocEmbedDocument_Impl::CheckDefHandler()" );
217cdf0e10cSrcweir                         ComSmart< IPersistStorage > pPersist;
218cdf0e10cSrcweir                         hr = m_pDefHandler->QueryInterface( IID_IPersistStorage, (void**)&pPersist );
219cdf0e10cSrcweir 
220cdf0e10cSrcweir                         ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
221cdf0e10cSrcweir                         if ( SUCCEEDED( hr ) && pPersist && m_pStorage )
222cdf0e10cSrcweir                             hr = pPersist->InitNew( m_pStorage );
223cdf0e10cSrcweir                     }
224cdf0e10cSrcweir                     else if ( m_nInitMode == LOAD_FROM_STORAGE )
225cdf0e10cSrcweir                     {
226cdf0e10cSrcweir                         WRITEDEBUGINFO( "InprocEmbedDocument_Impl::CheckDefHandler()" );
227cdf0e10cSrcweir                         ComSmart< IPersistStorage > pPersist;
228cdf0e10cSrcweir                         hr = m_pDefHandler->QueryInterface( IID_IPersistStorage, (void**)&pPersist );
229cdf0e10cSrcweir 
230cdf0e10cSrcweir                         ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
231cdf0e10cSrcweir                         if ( SUCCEEDED( hr ) && pPersist && m_pStorage )
232cdf0e10cSrcweir                             hr = pPersist->Load( m_pStorage );
233cdf0e10cSrcweir                     }
234cdf0e10cSrcweir                     else if ( m_nInitMode == LOAD_FROM_FILE )
235cdf0e10cSrcweir                     {
236cdf0e10cSrcweir                         WRITEDEBUGINFO( "InprocEmbedDocument_Impl::CheckDefHandler()" );
237cdf0e10cSrcweir                         ComSmart< IPersistFile > pPersistFile;
238cdf0e10cSrcweir                         hr = m_pDefHandler->QueryInterface( IID_IPersistFile, (void**)&pPersistFile );
239cdf0e10cSrcweir 
240cdf0e10cSrcweir                         ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
241cdf0e10cSrcweir                         if ( SUCCEEDED( hr ) && pPersistFile && m_pFileName )
242cdf0e10cSrcweir                             hr = pPersistFile->Load( m_pFileName, m_nFileOpenMode );
243cdf0e10cSrcweir                     }
244cdf0e10cSrcweir                     WRITEDEBUGINFO( "InprocEmbedDocument_Impl::CheckDefHandler()" );
245cdf0e10cSrcweir                 }
246cdf0e10cSrcweir             }
247cdf0e10cSrcweir         }
248cdf0e10cSrcweir 
249cdf0e10cSrcweir         WRITEDEBUGINFO( "InprocEmbedDocument_Impl::CheckDefHandler()" );
250cdf0e10cSrcweir         if ( !SUCCEEDED( hr ) || !m_pDefHandler )
251cdf0e10cSrcweir         {
252cdf0e10cSrcweir             WRITEDEBUGINFO( "InprocEmbedDocument_Impl::CheckDefHandler()" );
253cdf0e10cSrcweir             m_pDefHandler = NULL;
254cdf0e10cSrcweir             return FALSE;
255cdf0e10cSrcweir         }
256cdf0e10cSrcweir 
257cdf0e10cSrcweir         // register all the listeners new
258cdf0e10cSrcweir 
259cdf0e10cSrcweir         ComSmart< IOleObject > pOleObject;
260cdf0e10cSrcweir         hr = m_pDefHandler->QueryInterface( IID_IOleObject, (void**)&pOleObject );
261cdf0e10cSrcweir         if ( SUCCEEDED( hr ) && pOleObject )
262cdf0e10cSrcweir         {
263cdf0e10cSrcweir             WRITEDEBUGINFO( "InprocEmbedDocument_Impl::CheckDefHandler()" );
264cdf0e10cSrcweir             if ( m_pClientSite )
265cdf0e10cSrcweir                 pOleObject->SetClientSite( m_pClientSite );
266cdf0e10cSrcweir 
267cdf0e10cSrcweir             WRITEDEBUGINFO( "InprocEmbedDocument_Impl::CheckDefHandler()" );
268cdf0e10cSrcweir             for ( DWORD nInd = 0; nInd < DEFAULT_ARRAY_LEN; nInd++ )
269cdf0e10cSrcweir                 if ( m_pOleAdvises[nInd] )
270cdf0e10cSrcweir                 {
271cdf0e10cSrcweir                     DWORD nRegID = 0;
272cdf0e10cSrcweir                     if ( SUCCEEDED( pOleObject->Advise( m_pOleAdvises[nInd], &nRegID ) ) && nRegID > 0 )
273cdf0e10cSrcweir                         m_pOleAdvises[nInd]->SetRegID( nRegID );
274cdf0e10cSrcweir                 }
275cdf0e10cSrcweir         }
276cdf0e10cSrcweir 
277cdf0e10cSrcweir         WRITEDEBUGINFO( "InprocEmbedDocument_Impl::CheckDefHandler()" );
278cdf0e10cSrcweir         ComSmart< IDataObject > pIDataObject;
279cdf0e10cSrcweir         hr = m_pDefHandler->QueryInterface( IID_IDataObject, (void**)&pIDataObject );
280cdf0e10cSrcweir         if ( SUCCEEDED( hr ) && pIDataObject )
281cdf0e10cSrcweir         {
282cdf0e10cSrcweir             WRITEDEBUGINFO( "InprocEmbedDocument_Impl::CheckDefHandler()" );
283cdf0e10cSrcweir             for ( DWORD nInd = 0; nInd < DEFAULT_ARRAY_LEN; nInd++ )
284cdf0e10cSrcweir                 if ( m_pDataAdvises[nInd] )
285cdf0e10cSrcweir                 {
286cdf0e10cSrcweir                     WRITEDEBUGINFO( "InprocEmbedDocument_Impl::CheckDefHandler()" );
287cdf0e10cSrcweir                     DWORD nRegID = 0;
288cdf0e10cSrcweir                     if ( SUCCEEDED( pIDataObject->DAdvise( m_pDataAdvises[nInd]->GetFormatEtc(), m_pDataAdvises[nInd]->GetDataAdviseFlag(), m_pDataAdvises[nInd], &nRegID ) ) && nRegID > 0 )
289cdf0e10cSrcweir                         m_pDataAdvises[nInd]->SetRegID( nRegID );
290cdf0e10cSrcweir                     WRITEDEBUGINFO( "InprocEmbedDocument_Impl::CheckDefHandler()" );
291cdf0e10cSrcweir                 }
292cdf0e10cSrcweir         }
293cdf0e10cSrcweir 
294cdf0e10cSrcweir         WRITEDEBUGINFO( "InprocEmbedDocument_Impl::CheckDefHandler()" );
295cdf0e10cSrcweir         ComSmart< IViewObject > pIViewObject;
296cdf0e10cSrcweir         hr = m_pDefHandler->QueryInterface( IID_IViewObject, (void**)&pIViewObject );
297cdf0e10cSrcweir         if ( SUCCEEDED( hr ) && pIViewObject )
298cdf0e10cSrcweir         {
299cdf0e10cSrcweir             WRITEDEBUGINFO( "InprocEmbedDocument_Impl::CheckDefHandler()" );
300cdf0e10cSrcweir             if ( m_pViewAdvise )
301cdf0e10cSrcweir                 pIViewObject->SetAdvise( m_pViewAdvise->GetAspect(), m_pViewAdvise->GetViewAdviseFlag(), m_pViewAdvise );
302cdf0e10cSrcweir             WRITEDEBUGINFO( "InprocEmbedDocument_Impl::CheckDefHandler()" );
303cdf0e10cSrcweir         }
304cdf0e10cSrcweir     }
305cdf0e10cSrcweir 
306cdf0e10cSrcweir     WRITEDEBUGINFO( "InprocEmbedDocument_Impl::CheckDefHandler()" );
307cdf0e10cSrcweir 
308cdf0e10cSrcweir     return TRUE;
309cdf0e10cSrcweir }
310cdf0e10cSrcweir 
311cdf0e10cSrcweir //-------------------------------------------------------------------------------
InsertAdviseLinkToList(const ComSmart<OleWrapperAdviseSink> & pOwnAdvise,ComSmart<OleWrapperAdviseSink> pAdvises[])312cdf0e10cSrcweir DWORD InprocEmbedDocument_Impl::InsertAdviseLinkToList( const ComSmart<OleWrapperAdviseSink>& pOwnAdvise, ComSmart< OleWrapperAdviseSink > pAdvises[] )
313cdf0e10cSrcweir {
314cdf0e10cSrcweir     // the result should start from 1 in case of success, the element 0 can be used for own needs
315cdf0e10cSrcweir     DWORD nResult = 0;
316cdf0e10cSrcweir 
317cdf0e10cSrcweir     if ( pOwnAdvise )
318cdf0e10cSrcweir     {
319cdf0e10cSrcweir         for ( DWORD nInd = 1; nInd < DEFAULT_ARRAY_LEN && nResult == 0; nInd++ )
320cdf0e10cSrcweir         {
321cdf0e10cSrcweir             if ( pAdvises[nInd] == pOwnAdvise )
322cdf0e10cSrcweir             {
323cdf0e10cSrcweir                 nResult = nInd;
324cdf0e10cSrcweir             }
325cdf0e10cSrcweir             else if ( pAdvises[nInd] == NULL )
326cdf0e10cSrcweir             {
327cdf0e10cSrcweir                 pAdvises[nInd] = pOwnAdvise;
328cdf0e10cSrcweir                 nResult = nInd;
329cdf0e10cSrcweir             }
330cdf0e10cSrcweir         }
331cdf0e10cSrcweir     }
332cdf0e10cSrcweir 
333cdf0e10cSrcweir     return nResult;
334cdf0e10cSrcweir }
335cdf0e10cSrcweir 
336cdf0e10cSrcweir //-------------------------------------------------------------------------------
Clean()337cdf0e10cSrcweir void InprocEmbedDocument_Impl::Clean()
338cdf0e10cSrcweir {
339cdf0e10cSrcweir     m_pDefHandler = (IUnknown*)NULL;
340cdf0e10cSrcweir 
341cdf0e10cSrcweir     // no DisconnectOrigAdvise() call here, since it is no explicit disconnection
342cdf0e10cSrcweir     for ( DWORD nInd = 0; nInd < DEFAULT_ARRAY_LEN; nInd++ )
343cdf0e10cSrcweir     {
344cdf0e10cSrcweir         if ( m_pOleAdvises[nInd] )
345cdf0e10cSrcweir         {
346cdf0e10cSrcweir             ComSmart< OleWrapperAdviseSink > pAdvise = m_pOleAdvises[nInd];
347cdf0e10cSrcweir             m_pOleAdvises[nInd] = NULL;
348cdf0e10cSrcweir         }
349cdf0e10cSrcweir 
350cdf0e10cSrcweir         if ( m_pDataAdvises[nInd] )
351cdf0e10cSrcweir         {
352cdf0e10cSrcweir             ComSmart< OleWrapperAdviseSink > pAdvise = m_pDataAdvises[nInd];
353cdf0e10cSrcweir             m_pDataAdvises[nInd] = NULL;
354cdf0e10cSrcweir         }
355cdf0e10cSrcweir     }
356cdf0e10cSrcweir 
357cdf0e10cSrcweir     m_pViewAdvise = NULL;
358cdf0e10cSrcweir 
359cdf0e10cSrcweir     m_nInitMode = NOINIT;
360cdf0e10cSrcweir     m_pStorage = NULL;
361cdf0e10cSrcweir 
362cdf0e10cSrcweir     if ( m_pOleContainer )
363cdf0e10cSrcweir     {
364cdf0e10cSrcweir         m_pOleContainer->LockContainer( FALSE );
365cdf0e10cSrcweir         m_pOleContainer = NULL;
366cdf0e10cSrcweir     }
367cdf0e10cSrcweir 
368cdf0e10cSrcweir     m_pClientSite = NULL;
369cdf0e10cSrcweir 
370cdf0e10cSrcweir     m_nFileOpenMode = 0;
371cdf0e10cSrcweir     if ( m_pFileName )
372cdf0e10cSrcweir     {
373cdf0e10cSrcweir         delete m_pFileName;
374cdf0e10cSrcweir         m_pFileName = NULL;
375cdf0e10cSrcweir     }
376cdf0e10cSrcweir }
377cdf0e10cSrcweir 
378cdf0e10cSrcweir // IUnknown
379cdf0e10cSrcweir //-------------------------------------------------------------------------------
QueryInterface(REFIID riid,void FAR * FAR * ppv)380cdf0e10cSrcweir STDMETHODIMP InprocEmbedDocument_Impl::QueryInterface( REFIID riid, void FAR* FAR* ppv )
381cdf0e10cSrcweir {
382cdf0e10cSrcweir     if(IsEqualIID(riid, IID_IUnknown))
383cdf0e10cSrcweir 	{
384cdf0e10cSrcweir 		AddRef();
385cdf0e10cSrcweir 		*ppv = (IUnknown*) (IPersistStorage*) this;
386cdf0e10cSrcweir 		return S_OK;
387cdf0e10cSrcweir     }
388cdf0e10cSrcweir     else if (IsEqualIID(riid, IID_IPersist))
389cdf0e10cSrcweir 	{
390cdf0e10cSrcweir 		AddRef();
391cdf0e10cSrcweir 		*ppv = (IPersist*) (IPersistStorage*) this;
392cdf0e10cSrcweir 		return S_OK;
393cdf0e10cSrcweir 	}
394cdf0e10cSrcweir     else if (IsEqualIID(riid, IID_IPersistStorage))
395cdf0e10cSrcweir 	{
396cdf0e10cSrcweir 		AddRef();
397cdf0e10cSrcweir 		*ppv = (IPersistStorage*) this;
398cdf0e10cSrcweir 		return S_OK;
399cdf0e10cSrcweir 	}
400cdf0e10cSrcweir     else if (IsEqualIID(riid, IID_IDataObject))
401cdf0e10cSrcweir 	{
402cdf0e10cSrcweir 		AddRef();
403cdf0e10cSrcweir 		*ppv = (IDataObject*) this;
404cdf0e10cSrcweir 		return S_OK;
405cdf0e10cSrcweir 	}
406cdf0e10cSrcweir     else if (IsEqualIID(riid, IID_IOleObject))
407cdf0e10cSrcweir 	{
408cdf0e10cSrcweir 		AddRef();
409cdf0e10cSrcweir 		*ppv = (IOleObject*) this;
410cdf0e10cSrcweir 		return S_OK;
411cdf0e10cSrcweir 	}
412cdf0e10cSrcweir     else if (IsEqualIID(riid, IID_IPersistFile))
413cdf0e10cSrcweir 	{
414cdf0e10cSrcweir 		AddRef();
415cdf0e10cSrcweir 		*ppv = (IPersistFile*) this;
416cdf0e10cSrcweir 		return S_OK;
417cdf0e10cSrcweir 	}
418cdf0e10cSrcweir     else if (IsEqualIID(riid, IID_IRunnableObject))
419cdf0e10cSrcweir 	{
420cdf0e10cSrcweir 		AddRef();
421cdf0e10cSrcweir 		*ppv = (IRunnableObject*) this;
422cdf0e10cSrcweir 		return S_OK;
423cdf0e10cSrcweir 	}
424cdf0e10cSrcweir     else if (IsEqualIID(riid, IID_IViewObject))
425cdf0e10cSrcweir     {
426cdf0e10cSrcweir         AddRef();
427cdf0e10cSrcweir         *ppv = (IViewObject*) this;
428cdf0e10cSrcweir         return S_OK;
429cdf0e10cSrcweir     }
430cdf0e10cSrcweir     else if (IsEqualIID(riid, IID_IViewObject2))
431cdf0e10cSrcweir     {
432cdf0e10cSrcweir         AddRef();
433cdf0e10cSrcweir         *ppv = (IViewObject2*) this;
434cdf0e10cSrcweir         return S_OK;
435cdf0e10cSrcweir     }
436cdf0e10cSrcweir     else if (IsEqualIID(riid, IID_IOleCache))
437cdf0e10cSrcweir     {
438cdf0e10cSrcweir         AddRef();
439cdf0e10cSrcweir         *ppv = (IOleCache*) &m_aInternalCache;
440cdf0e10cSrcweir         return S_OK;
441cdf0e10cSrcweir     }
442cdf0e10cSrcweir     else if (IsEqualIID(riid, IID_IOleCache2))
443cdf0e10cSrcweir     {
444cdf0e10cSrcweir         AddRef();
445cdf0e10cSrcweir         *ppv = (IOleCache2*) &m_aInternalCache;
446cdf0e10cSrcweir         return S_OK;
447cdf0e10cSrcweir     }
448cdf0e10cSrcweir     else if (IsEqualIID(riid, IID_IOleWindow))
449cdf0e10cSrcweir     {
450cdf0e10cSrcweir         AddRef();
451cdf0e10cSrcweir         *ppv = (IOleWindow*) this;
452cdf0e10cSrcweir         return S_OK;
453cdf0e10cSrcweir     }
454cdf0e10cSrcweir     else if (IsEqualIID(riid, IID_IOleInPlaceObject))
455cdf0e10cSrcweir     {
456cdf0e10cSrcweir         AddRef();
457cdf0e10cSrcweir         *ppv = (IOleInPlaceObject*) this;
458cdf0e10cSrcweir         return S_OK;
459cdf0e10cSrcweir     }
460cdf0e10cSrcweir     else if (IsEqualIID(riid, IID_IDispatch))
461cdf0e10cSrcweir     {
462cdf0e10cSrcweir         AddRef();
463cdf0e10cSrcweir         *ppv = (IDispatch*) this;
464cdf0e10cSrcweir         return S_OK;
465cdf0e10cSrcweir     }
466cdf0e10cSrcweir 
467cdf0e10cSrcweir     *ppv = NULL;
468cdf0e10cSrcweir     return ResultFromScode(E_NOINTERFACE);
469cdf0e10cSrcweir }
470cdf0e10cSrcweir 
471cdf0e10cSrcweir //-------------------------------------------------------------------------------
STDMETHODIMP_(ULONG)472cdf0e10cSrcweir STDMETHODIMP_(ULONG) InprocEmbedDocument_Impl::AddRef()
473cdf0e10cSrcweir {
474cdf0e10cSrcweir 	return ++m_refCount;
475cdf0e10cSrcweir }
476cdf0e10cSrcweir 
477cdf0e10cSrcweir //-------------------------------------------------------------------------------
STDMETHODIMP_(ULONG)478cdf0e10cSrcweir STDMETHODIMP_(ULONG) InprocEmbedDocument_Impl::Release()
479cdf0e10cSrcweir {
480cdf0e10cSrcweir     // unfortunately there are reentrance problems in mfc that have to be workarounded
481cdf0e10cSrcweir 	sal_Int32 nCount = m_refCount > 0 ? --m_refCount : 0;
482cdf0e10cSrcweir 	if ( nCount == 0 && !m_bDeleted )
483cdf0e10cSrcweir 	{
484cdf0e10cSrcweir         // deleting of this object can trigger deleting of mfc objects that will try to delete this object one more time
485cdf0e10cSrcweir         m_bDeleted = TRUE;
486cdf0e10cSrcweir 
487cdf0e10cSrcweir         Clean();
488cdf0e10cSrcweir 		delete this;
489cdf0e10cSrcweir 	}
490cdf0e10cSrcweir     return nCount;
491cdf0e10cSrcweir }
492cdf0e10cSrcweir 
493cdf0e10cSrcweir // IPersist
494cdf0e10cSrcweir //-------------------------------------------------------------------------------
GetClassID(CLSID * pClassId)495cdf0e10cSrcweir STDMETHODIMP InprocEmbedDocument_Impl::GetClassID( CLSID* pClassId )
496cdf0e10cSrcweir {
497cdf0e10cSrcweir 	*pClassId = *&m_guid;
498cdf0e10cSrcweir 	return S_OK;
499cdf0e10cSrcweir }
500cdf0e10cSrcweir 
501cdf0e10cSrcweir // IPersistStorage
502cdf0e10cSrcweir //-------------------------------------------------------------------------------
IsDirty()503cdf0e10cSrcweir STDMETHODIMP InprocEmbedDocument_Impl::IsDirty()
504cdf0e10cSrcweir {
505cdf0e10cSrcweir     WRITEDEBUGINFO( "InprocEmbedDocument_Impl::IsDirty()1" );
506cdf0e10cSrcweir     if ( m_pDefHandler == NULL || m_pOleAdvises[0] == NULL || m_pOleAdvises[0]->IsClosed() )
507cdf0e10cSrcweir         return S_FALSE;
508cdf0e10cSrcweir 
509cdf0e10cSrcweir     WRITEDEBUGINFO( "InprocEmbedDocument_Impl::IsDirty()2" );
510cdf0e10cSrcweir     if ( CheckDefHandler() )
511cdf0e10cSrcweir     {
512cdf0e10cSrcweir         ComSmart< IPersistStorage > pPersist;
513cdf0e10cSrcweir         HRESULT hr = m_pDefHandler->QueryInterface( IID_IPersistStorage, (void**)&pPersist );
514cdf0e10cSrcweir 
515cdf0e10cSrcweir         ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
516cdf0e10cSrcweir         if ( SUCCEEDED( hr ) && pPersist )
517cdf0e10cSrcweir             return pPersist->IsDirty();
518cdf0e10cSrcweir     }
519cdf0e10cSrcweir 
520cdf0e10cSrcweir     return E_FAIL;
521cdf0e10cSrcweir }
522cdf0e10cSrcweir 
523cdf0e10cSrcweir //-------------------------------------------------------------------------------
InitNew(IStorage * pStg)524cdf0e10cSrcweir STDMETHODIMP InprocEmbedDocument_Impl::InitNew( IStorage *pStg )
525cdf0e10cSrcweir {
526cdf0e10cSrcweir     WRITEDEBUGINFO( "InprocEmbedDocument_Impl::InitNew( IStorage *pStg )" );
527cdf0e10cSrcweir     if ( CheckDefHandler() )
528cdf0e10cSrcweir     {
529cdf0e10cSrcweir         ComSmart< IPersistStorage > pPersist;
530cdf0e10cSrcweir         HRESULT hr = m_pDefHandler->QueryInterface( IID_IPersistStorage, (void**)&pPersist );
531cdf0e10cSrcweir 
532cdf0e10cSrcweir         ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
533cdf0e10cSrcweir         if ( SUCCEEDED( hr ) && pPersist )
534cdf0e10cSrcweir         {
535cdf0e10cSrcweir             hr = pPersist->InitNew( pStg );
536cdf0e10cSrcweir             if ( SUCCEEDED( hr ) )
537cdf0e10cSrcweir             {
538cdf0e10cSrcweir                 m_nInitMode = INIT_FROM_STORAGE;
539cdf0e10cSrcweir                 m_pStorage = pStg;
540cdf0e10cSrcweir 
541cdf0e10cSrcweir                 m_nFileOpenMode = 0;
542cdf0e10cSrcweir                 if ( m_pFileName )
543cdf0e10cSrcweir                 {
544cdf0e10cSrcweir                     delete[] m_pFileName;
545cdf0e10cSrcweir                     m_pFileName = NULL;
546cdf0e10cSrcweir                 }
547cdf0e10cSrcweir             }
548cdf0e10cSrcweir 
549cdf0e10cSrcweir             return hr;
550cdf0e10cSrcweir         }
551cdf0e10cSrcweir     }
552cdf0e10cSrcweir 
553cdf0e10cSrcweir     return E_FAIL;
554cdf0e10cSrcweir }
555cdf0e10cSrcweir 
556cdf0e10cSrcweir //-------------------------------------------------------------------------------
Load(IStorage * pStg)557cdf0e10cSrcweir STDMETHODIMP InprocEmbedDocument_Impl::Load( IStorage *pStg )
558cdf0e10cSrcweir {
559cdf0e10cSrcweir     WRITEDEBUGINFO( "InprocEmbedDocument_Impl::Load( IStorage *pStg )" );
560cdf0e10cSrcweir     if ( CheckDefHandler() )
561cdf0e10cSrcweir     {
562cdf0e10cSrcweir         WRITEDEBUGINFO( "InprocEmbedDocument_Impl::Load( IStorage *pStg )" );
563cdf0e10cSrcweir         ComSmart< IPersistStorage > pPersist;
564cdf0e10cSrcweir         HRESULT hr = m_pDefHandler->QueryInterface( IID_IPersistStorage, (void**)&pPersist );
565cdf0e10cSrcweir 
566cdf0e10cSrcweir         ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
567cdf0e10cSrcweir         if ( SUCCEEDED( hr ) && pPersist )
568cdf0e10cSrcweir         {
569cdf0e10cSrcweir             WRITEDEBUGINFO( "InprocEmbedDocument_Impl::Load( IStorage *pStg )" );
570cdf0e10cSrcweir             hr = pPersist->Load( pStg );
571cdf0e10cSrcweir             if ( SUCCEEDED( hr ) )
572cdf0e10cSrcweir             {
573cdf0e10cSrcweir                 WRITEDEBUGINFO( "InprocEmbedDocument_Impl::Load( IStorage *pStg )" );
574cdf0e10cSrcweir                 m_nInitMode = LOAD_FROM_STORAGE;
575cdf0e10cSrcweir                 m_pStorage = pStg;
576cdf0e10cSrcweir 
577cdf0e10cSrcweir                 m_nFileOpenMode = 0;
578cdf0e10cSrcweir                 if ( m_pFileName )
579cdf0e10cSrcweir                 {
580cdf0e10cSrcweir                     WRITEDEBUGINFO( "InprocEmbedDocument_Impl::Load( IStorage *pStg )" );
581cdf0e10cSrcweir                     delete[] m_pFileName;
582cdf0e10cSrcweir                     m_pFileName = NULL;
583cdf0e10cSrcweir                 }
584cdf0e10cSrcweir             }
585cdf0e10cSrcweir 
586cdf0e10cSrcweir             return hr;
587cdf0e10cSrcweir         }
588cdf0e10cSrcweir     }
589cdf0e10cSrcweir 
590cdf0e10cSrcweir     return E_FAIL;
591cdf0e10cSrcweir }
592cdf0e10cSrcweir 
593cdf0e10cSrcweir //-------------------------------------------------------------------------------
Save(IStorage * pStgSave,BOOL fSameAsLoad)594cdf0e10cSrcweir STDMETHODIMP InprocEmbedDocument_Impl::Save( IStorage *pStgSave, BOOL fSameAsLoad )
595cdf0e10cSrcweir {
596cdf0e10cSrcweir     WRITEDEBUGINFO( "InprocEmbedDocument_Impl::Save( IStorage *pStgSave, BOOL fSameAsLoad )" );
597cdf0e10cSrcweir     if ( fSameAsLoad && ( m_pDefHandler == NULL || m_pOleAdvises[0] == NULL || m_pOleAdvises[0]->IsClosed() ) )
598cdf0e10cSrcweir         return S_OK;
599cdf0e10cSrcweir 
600cdf0e10cSrcweir     WRITEDEBUGINFO( "InprocEmbedDocument_Impl::Save( IStorage *pStgSave, BOOL fSameAsLoad )" );
601cdf0e10cSrcweir     if ( CheckDefHandler() )
602cdf0e10cSrcweir     {
603cdf0e10cSrcweir         ComSmart< IPersistStorage > pPersist;
604cdf0e10cSrcweir         HRESULT hr = m_pDefHandler->QueryInterface( IID_IPersistStorage, (void**)&pPersist );
605cdf0e10cSrcweir 
606cdf0e10cSrcweir         ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
607cdf0e10cSrcweir         if ( SUCCEEDED( hr ) && pPersist )
608cdf0e10cSrcweir             return pPersist->Save( pStgSave, fSameAsLoad );
609cdf0e10cSrcweir     }
610cdf0e10cSrcweir 
611cdf0e10cSrcweir     return E_FAIL;
612cdf0e10cSrcweir }
613cdf0e10cSrcweir 
614cdf0e10cSrcweir //-------------------------------------------------------------------------------
SaveCompleted(IStorage * pStgNew)615cdf0e10cSrcweir STDMETHODIMP InprocEmbedDocument_Impl::SaveCompleted( IStorage *pStgNew )
616cdf0e10cSrcweir {
617cdf0e10cSrcweir     WRITEDEBUGINFO( "InprocEmbedDocument_Impl::SaveCompleted( IStorage *pStgNew )" );
618cdf0e10cSrcweir     if ( m_pDefHandler == NULL || m_pOleAdvises[0] == NULL || m_pOleAdvises[0]->IsClosed() )
619cdf0e10cSrcweir     {
620cdf0e10cSrcweir         if ( pStgNew )
621cdf0e10cSrcweir             m_pStorage = pStgNew;
622cdf0e10cSrcweir 
623cdf0e10cSrcweir         return S_OK;
624cdf0e10cSrcweir     }
625cdf0e10cSrcweir 
626cdf0e10cSrcweir     WRITEDEBUGINFO( "InprocEmbedDocument_Impl::SaveCompleted( IStorage *pStgNew )" );
627cdf0e10cSrcweir     if ( CheckDefHandler() )
628cdf0e10cSrcweir     {
629cdf0e10cSrcweir         ComSmart< IPersistStorage > pPersist;
630cdf0e10cSrcweir         HRESULT hr = m_pDefHandler->QueryInterface( IID_IPersistStorage, (void**)&pPersist );
631cdf0e10cSrcweir 
632cdf0e10cSrcweir         ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
633cdf0e10cSrcweir         if ( SUCCEEDED( hr ) && pPersist )
634cdf0e10cSrcweir         {
635cdf0e10cSrcweir             hr = pPersist->SaveCompleted( pStgNew );
636cdf0e10cSrcweir             if ( SUCCEEDED( hr ) )
637cdf0e10cSrcweir             {
638cdf0e10cSrcweir                 WRITEDEBUGINFO( "InprocEmbedDocument_Impl::SaveCompleted( IStorage *pStgNew )" );
639cdf0e10cSrcweir                 m_nInitMode = LOAD_FROM_STORAGE;
640cdf0e10cSrcweir                 if ( pStgNew )
641cdf0e10cSrcweir                 {
642cdf0e10cSrcweir                     WRITEDEBUGINFO( "InprocEmbedDocument_Impl::SaveCompleted( IStorage *pStgNew )" );
643cdf0e10cSrcweir                     m_pStorage = pStgNew;
644cdf0e10cSrcweir                 }
645cdf0e10cSrcweir 
646cdf0e10cSrcweir                 m_nFileOpenMode = 0;
647cdf0e10cSrcweir                 if ( m_pFileName )
648cdf0e10cSrcweir                 {
649cdf0e10cSrcweir                     delete[] m_pFileName;
650cdf0e10cSrcweir                     m_pFileName = NULL;
651cdf0e10cSrcweir                 }
652cdf0e10cSrcweir             }
653cdf0e10cSrcweir 
654cdf0e10cSrcweir             return hr;
655cdf0e10cSrcweir         }
656cdf0e10cSrcweir     }
657cdf0e10cSrcweir 
658cdf0e10cSrcweir     return E_FAIL;
659cdf0e10cSrcweir }
660cdf0e10cSrcweir 
661cdf0e10cSrcweir //-------------------------------------------------------------------------------
HandsOffStorage()662cdf0e10cSrcweir STDMETHODIMP InprocEmbedDocument_Impl::HandsOffStorage()
663cdf0e10cSrcweir {
664cdf0e10cSrcweir     WRITEDEBUGINFO( "InprocEmbedDocument_Impl::HandsOffStorage()" );
665cdf0e10cSrcweir     if ( CheckDefHandler() )
666cdf0e10cSrcweir     {
667cdf0e10cSrcweir         ComSmart< IPersistStorage > pPersist;
668cdf0e10cSrcweir         HRESULT hr = m_pDefHandler->QueryInterface( IID_IPersistStorage, (void**)&pPersist );
669cdf0e10cSrcweir 
670cdf0e10cSrcweir         ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
671cdf0e10cSrcweir         if ( SUCCEEDED( hr ) && pPersist )
672cdf0e10cSrcweir         {
673cdf0e10cSrcweir             hr = pPersist->HandsOffStorage();
674cdf0e10cSrcweir             if ( SUCCEEDED( hr ) )
675cdf0e10cSrcweir             {
676cdf0e10cSrcweir                 m_pStorage = NULL;
677cdf0e10cSrcweir                 WRITEDEBUGINFO( "InprocEmbedDocument_Impl::HandsOffStorage()" );
678cdf0e10cSrcweir             }
679cdf0e10cSrcweir 
680cdf0e10cSrcweir             return hr;
681cdf0e10cSrcweir         }
682cdf0e10cSrcweir     }
683cdf0e10cSrcweir 
684cdf0e10cSrcweir     return E_FAIL;
685cdf0e10cSrcweir }
686cdf0e10cSrcweir 
687cdf0e10cSrcweir // IPersistFile
688cdf0e10cSrcweir //-------------------------------------------------------------------------------
Load(LPCOLESTR pszFileName,DWORD dwMode)689cdf0e10cSrcweir STDMETHODIMP InprocEmbedDocument_Impl::Load( LPCOLESTR pszFileName, DWORD dwMode )
690cdf0e10cSrcweir {
691cdf0e10cSrcweir     WRITEDEBUGINFO( "InprocEmbedDocument_Impl::Load( LPCOLESTR pszFileName, DWORD dwMode )" );
692cdf0e10cSrcweir     if ( CheckDefHandler() && pszFileName )
693cdf0e10cSrcweir     {
694cdf0e10cSrcweir         ComSmart< IPersistFile > pPersist;
695cdf0e10cSrcweir         HRESULT hr = m_pDefHandler->QueryInterface( IID_IPersistFile, (void**)&pPersist );
696cdf0e10cSrcweir 
697cdf0e10cSrcweir         ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
698cdf0e10cSrcweir         if ( SUCCEEDED( hr ) && pPersist )
699cdf0e10cSrcweir         {
700cdf0e10cSrcweir             hr = pPersist->Load( pszFileName, dwMode );
701cdf0e10cSrcweir             if ( SUCCEEDED( hr ) )
702cdf0e10cSrcweir             {
703cdf0e10cSrcweir                 m_nInitMode = LOAD_FROM_FILE;
704cdf0e10cSrcweir                 if ( m_pStorage )
705cdf0e10cSrcweir                     m_pStorage = NULL;
706cdf0e10cSrcweir 
707cdf0e10cSrcweir                 m_nFileOpenMode = dwMode;
708cdf0e10cSrcweir                 // copy the string
709cdf0e10cSrcweir                 SetName( pszFileName, m_pFileName );
710cdf0e10cSrcweir             }
711cdf0e10cSrcweir 
712cdf0e10cSrcweir             return hr;
713cdf0e10cSrcweir         }
714cdf0e10cSrcweir     }
715cdf0e10cSrcweir 
716cdf0e10cSrcweir     return E_FAIL;
717cdf0e10cSrcweir }
718cdf0e10cSrcweir 
719cdf0e10cSrcweir //-------------------------------------------------------------------------------
Save(LPCOLESTR pszFileName,BOOL fRemember)720cdf0e10cSrcweir STDMETHODIMP InprocEmbedDocument_Impl::Save( LPCOLESTR pszFileName, BOOL fRemember )
721cdf0e10cSrcweir {
722cdf0e10cSrcweir     WRITEDEBUGINFO( "InprocEmbedDocument_Impl::Save( LPCOLESTR pszFileName, BOOL fRemember )" );
723cdf0e10cSrcweir     if ( CheckDefHandler() )
724cdf0e10cSrcweir     {
725cdf0e10cSrcweir         ComSmart< IPersistFile > pPersist;
726cdf0e10cSrcweir         HRESULT hr = m_pDefHandler->QueryInterface( IID_IPersistFile, (void**)&pPersist );
727cdf0e10cSrcweir 
728cdf0e10cSrcweir         ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
729cdf0e10cSrcweir         if ( SUCCEEDED( hr ) && pPersist )
730cdf0e10cSrcweir             return pPersist->Save( pszFileName, fRemember );
731cdf0e10cSrcweir     }
732cdf0e10cSrcweir 
733cdf0e10cSrcweir     return E_FAIL;
734cdf0e10cSrcweir }
735cdf0e10cSrcweir 
736cdf0e10cSrcweir //-------------------------------------------------------------------------------
SaveCompleted(LPCOLESTR pszFileName)737cdf0e10cSrcweir STDMETHODIMP InprocEmbedDocument_Impl::SaveCompleted( LPCOLESTR pszFileName )
738cdf0e10cSrcweir {
739cdf0e10cSrcweir     WRITEDEBUGINFO( "InprocEmbedDocument_Impl::SaveCompleted( LPCOLESTR pszFileName )" );
740cdf0e10cSrcweir     if ( CheckDefHandler() )
741cdf0e10cSrcweir     {
742cdf0e10cSrcweir         ComSmart< IPersistFile > pPersist;
743cdf0e10cSrcweir         HRESULT hr = m_pDefHandler->QueryInterface( IID_IPersistFile, (void**)&pPersist );
744cdf0e10cSrcweir 
745cdf0e10cSrcweir         ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
746cdf0e10cSrcweir         if ( SUCCEEDED( hr ) && pPersist )
747cdf0e10cSrcweir         {
748cdf0e10cSrcweir             hr = pPersist->SaveCompleted( pszFileName );
749cdf0e10cSrcweir             if ( SUCCEEDED( hr ) )
750cdf0e10cSrcweir             {
751cdf0e10cSrcweir                 m_nInitMode = LOAD_FROM_STORAGE;
752cdf0e10cSrcweir                 if ( m_pStorage )
753cdf0e10cSrcweir                     m_pStorage = NULL;
754cdf0e10cSrcweir 
755cdf0e10cSrcweir                 m_nFileOpenMode = STGM_READWRITE; // was just written
756cdf0e10cSrcweir                 // copy the string
757cdf0e10cSrcweir                 SetName( pszFileName, m_pFileName );
758cdf0e10cSrcweir             }
759cdf0e10cSrcweir         }
760cdf0e10cSrcweir 
761cdf0e10cSrcweir     }
762cdf0e10cSrcweir 
763cdf0e10cSrcweir     return E_FAIL;
764cdf0e10cSrcweir }
765cdf0e10cSrcweir 
766cdf0e10cSrcweir //-------------------------------------------------------------------------------
GetCurFile(LPOLESTR * ppszFileName)767cdf0e10cSrcweir STDMETHODIMP InprocEmbedDocument_Impl::GetCurFile( LPOLESTR *ppszFileName )
768cdf0e10cSrcweir {
769cdf0e10cSrcweir     WRITEDEBUGINFO( "InprocEmbedDocument_Impl::GetCurFile( LPOLESTR *ppszFileName )" );
770cdf0e10cSrcweir     if ( CheckDefHandler() )
771cdf0e10cSrcweir     {
772cdf0e10cSrcweir         ComSmart< IPersistFile > pPersist;
773cdf0e10cSrcweir         HRESULT hr = m_pDefHandler->QueryInterface( IID_IPersistFile, (void**)&pPersist );
774cdf0e10cSrcweir 
775cdf0e10cSrcweir         ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
776cdf0e10cSrcweir         if ( SUCCEEDED( hr ) && pPersist )
777cdf0e10cSrcweir             return pPersist->GetCurFile( ppszFileName );
778cdf0e10cSrcweir     }
779cdf0e10cSrcweir 
780cdf0e10cSrcweir     return E_FAIL;
781cdf0e10cSrcweir }
782cdf0e10cSrcweir 
783cdf0e10cSrcweir // IOleObject
784cdf0e10cSrcweir //-------------------------------------------------------------------------------
SetClientSite(IOleClientSite * pSite)785cdf0e10cSrcweir STDMETHODIMP InprocEmbedDocument_Impl::SetClientSite( IOleClientSite* pSite )
786cdf0e10cSrcweir {
787cdf0e10cSrcweir     WRITEDEBUGINFO( "InprocEmbedDocument_Impl::SetClientSite( IOleClientSite* pSite )" );
788cdf0e10cSrcweir     if ( pSite == m_pClientSite )
789cdf0e10cSrcweir         return S_OK;
790cdf0e10cSrcweir 
791cdf0e10cSrcweir     if ( !pSite )
792cdf0e10cSrcweir     {
793cdf0e10cSrcweir         m_pClientSite = NULL;
794cdf0e10cSrcweir         if ( m_pOleContainer )
795cdf0e10cSrcweir         {
796cdf0e10cSrcweir             m_pOleContainer->LockContainer( FALSE );
797cdf0e10cSrcweir             m_pOleContainer = NULL;
798cdf0e10cSrcweir         }
799cdf0e10cSrcweir     }
800cdf0e10cSrcweir 
801cdf0e10cSrcweir     if ( CheckDefHandler() )
802cdf0e10cSrcweir     {
803cdf0e10cSrcweir         ComSmart< IOleObject > pOleObject;
804cdf0e10cSrcweir         HRESULT hr = m_pDefHandler->QueryInterface( IID_IOleObject, (void**)&pOleObject );
805cdf0e10cSrcweir 
806cdf0e10cSrcweir         ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
807cdf0e10cSrcweir         if ( SUCCEEDED( hr ) && pOleObject )
808cdf0e10cSrcweir         {
809cdf0e10cSrcweir             HRESULT hr = pOleObject->SetClientSite( pSite );
810cdf0e10cSrcweir             if ( SUCCEEDED( hr ) )
811cdf0e10cSrcweir             {
812cdf0e10cSrcweir                 m_pClientSite = pSite;
813cdf0e10cSrcweir 
814cdf0e10cSrcweir                 if ( m_pOleContainer )
815cdf0e10cSrcweir                 {
816cdf0e10cSrcweir                     m_pOleContainer->LockContainer( FALSE );
817cdf0e10cSrcweir                     m_pOleContainer = NULL;
818cdf0e10cSrcweir                 }
819cdf0e10cSrcweir 
820cdf0e10cSrcweir                 m_pClientSite->GetContainer( &m_pOleContainer );
821cdf0e10cSrcweir                 if ( m_pOleContainer )
822cdf0e10cSrcweir                     m_pOleContainer->LockContainer( TRUE );
823cdf0e10cSrcweir             }
824cdf0e10cSrcweir 
825cdf0e10cSrcweir             return hr;
826cdf0e10cSrcweir         }
827cdf0e10cSrcweir     }
828cdf0e10cSrcweir 
829cdf0e10cSrcweir     return E_FAIL;
830cdf0e10cSrcweir }
831cdf0e10cSrcweir 
832cdf0e10cSrcweir //-------------------------------------------------------------------------------
GetClientSite(IOleClientSite ** pSite)833cdf0e10cSrcweir STDMETHODIMP InprocEmbedDocument_Impl::GetClientSite( IOleClientSite** pSite )
834cdf0e10cSrcweir {
835cdf0e10cSrcweir     WRITEDEBUGINFO( "InprocEmbedDocument_Impl::GetClientSite( IOleClientSite** pSite )" );
836cdf0e10cSrcweir     if ( CheckDefHandler() )
837cdf0e10cSrcweir     {
838cdf0e10cSrcweir         ComSmart< IOleObject > pOleObject;
839cdf0e10cSrcweir         HRESULT hr = m_pDefHandler->QueryInterface( IID_IOleObject, (void**)&pOleObject );
840cdf0e10cSrcweir 
841cdf0e10cSrcweir         ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
842cdf0e10cSrcweir         if ( SUCCEEDED( hr ) && pOleObject )
843cdf0e10cSrcweir             return pOleObject->GetClientSite( pSite );
844cdf0e10cSrcweir     }
845cdf0e10cSrcweir 
846cdf0e10cSrcweir     return E_FAIL;
847cdf0e10cSrcweir }
848cdf0e10cSrcweir 
849cdf0e10cSrcweir //-------------------------------------------------------------------------------
SetHostNames(LPCOLESTR szContainerApp,LPCOLESTR szContainerObj)850cdf0e10cSrcweir STDMETHODIMP InprocEmbedDocument_Impl::SetHostNames( LPCOLESTR szContainerApp, LPCOLESTR szContainerObj )
851cdf0e10cSrcweir {
852cdf0e10cSrcweir     WRITEDEBUGINFO( "InprocEmbedDocument_Impl::SetHostNames( LPCOLESTR szContainerApp, LPCOLESTR szContainerObj )" );
853cdf0e10cSrcweir 
854cdf0e10cSrcweir     if ( CheckDefHandler() )
855cdf0e10cSrcweir     {
856cdf0e10cSrcweir         ComSmart< IOleObject > pOleObject;
857cdf0e10cSrcweir         HRESULT hr = m_pDefHandler->QueryInterface( IID_IOleObject, (void**)&pOleObject );
858cdf0e10cSrcweir 
859cdf0e10cSrcweir         ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
860cdf0e10cSrcweir         if ( SUCCEEDED( hr ) && pOleObject )
861cdf0e10cSrcweir         {
862cdf0e10cSrcweir             WRITEDEBUGINFO( "InprocEmbedDocument_Impl::SetHostNames( LPCOLESTR szContainerApp, LPCOLESTR szContainerObj )" );
863cdf0e10cSrcweir             hr = pOleObject->SetHostNames( szContainerApp, szContainerObj );
864cdf0e10cSrcweir         }
865cdf0e10cSrcweir     }
866cdf0e10cSrcweir 
867cdf0e10cSrcweir     return S_OK;
868cdf0e10cSrcweir }
869cdf0e10cSrcweir 
870cdf0e10cSrcweir //-------------------------------------------------------------------------------
Close(DWORD dwSaveOption)871cdf0e10cSrcweir STDMETHODIMP InprocEmbedDocument_Impl::Close( DWORD dwSaveOption )
872cdf0e10cSrcweir {
873cdf0e10cSrcweir     WRITEDEBUGINFO( "InprocEmbedDocument_Impl::Close( DWORD dwSaveOption )" );
874cdf0e10cSrcweir     if ( m_pDefHandler && CheckDefHandler() )
875cdf0e10cSrcweir     {
876cdf0e10cSrcweir         // no need to close if there is no default handler.
877cdf0e10cSrcweir         ComSmart< IOleObject > pOleObject;
878cdf0e10cSrcweir         HRESULT hr = m_pDefHandler->QueryInterface( IID_IOleObject, (void**)&pOleObject );
879cdf0e10cSrcweir 
880cdf0e10cSrcweir         ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
881cdf0e10cSrcweir         if ( SUCCEEDED( hr ) && pOleObject )
882cdf0e10cSrcweir 		{
883cdf0e10cSrcweir             hr = pOleObject->Close( dwSaveOption );
884cdf0e10cSrcweir 			hr = CoDisconnectObject( (IUnknown*)(IPersistStorage*)this, 0 );
885cdf0e10cSrcweir 		}
886cdf0e10cSrcweir     }
887cdf0e10cSrcweir 
888cdf0e10cSrcweir     // if the object is closed from outside that means that it should go to uninitialized state
889cdf0e10cSrcweir     Clean();
890cdf0e10cSrcweir 
891cdf0e10cSrcweir     return S_OK;
892cdf0e10cSrcweir }
893cdf0e10cSrcweir 
894cdf0e10cSrcweir //-------------------------------------------------------------------------------
SetMoniker(DWORD dwWhichMoniker,IMoniker * pmk)895cdf0e10cSrcweir STDMETHODIMP InprocEmbedDocument_Impl::SetMoniker( DWORD dwWhichMoniker, IMoniker * pmk )
896cdf0e10cSrcweir {
897cdf0e10cSrcweir     WRITEDEBUGINFO( "InprocEmbedDocument_Impl::SetMoniker( DWORD dwWhichMoniker, IMoniker * pmk )" );
898cdf0e10cSrcweir     if ( CheckDefHandler() )
899cdf0e10cSrcweir     {
900cdf0e10cSrcweir         ComSmart< IOleObject > pOleObject;
901cdf0e10cSrcweir         HRESULT hr = m_pDefHandler->QueryInterface( IID_IOleObject, (void**)&pOleObject );
902cdf0e10cSrcweir 
903cdf0e10cSrcweir         ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
904cdf0e10cSrcweir         if ( SUCCEEDED( hr ) && pOleObject )
905cdf0e10cSrcweir             return pOleObject->SetMoniker( dwWhichMoniker, pmk );
906cdf0e10cSrcweir     }
907cdf0e10cSrcweir 
908cdf0e10cSrcweir     return E_FAIL;
909cdf0e10cSrcweir }
910cdf0e10cSrcweir 
911cdf0e10cSrcweir //-------------------------------------------------------------------------------
GetMoniker(DWORD dwAssign,DWORD dwWhichMoniker,IMoniker ** ppmk)912cdf0e10cSrcweir STDMETHODIMP InprocEmbedDocument_Impl::GetMoniker( DWORD dwAssign, DWORD dwWhichMoniker, IMoniker ** ppmk )
913cdf0e10cSrcweir {
914cdf0e10cSrcweir     WRITEDEBUGINFO( "InprocEmbedDocument_Impl::GetMoniker( DWORD dwAssign, DWORD dwWhichMoniker, IMoniker ** ppmk )" );
915cdf0e10cSrcweir     if ( CheckDefHandler() )
916cdf0e10cSrcweir     {
917cdf0e10cSrcweir         ComSmart< IOleObject > pOleObject;
918cdf0e10cSrcweir         HRESULT hr = m_pDefHandler->QueryInterface( IID_IOleObject, (void**)&pOleObject );
919cdf0e10cSrcweir 
920cdf0e10cSrcweir         ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
921cdf0e10cSrcweir         if ( SUCCEEDED( hr ) && pOleObject )
922cdf0e10cSrcweir             return pOleObject->GetMoniker( dwAssign, dwWhichMoniker, ppmk );
923cdf0e10cSrcweir     }
924cdf0e10cSrcweir 
925cdf0e10cSrcweir     return E_FAIL;
926cdf0e10cSrcweir }
927cdf0e10cSrcweir 
928cdf0e10cSrcweir //-------------------------------------------------------------------------------
InitFromData(IDataObject * pDataObject,BOOL fCreation,DWORD dwReserved)929cdf0e10cSrcweir STDMETHODIMP InprocEmbedDocument_Impl::InitFromData( IDataObject * pDataObject, BOOL fCreation, DWORD dwReserved )
930cdf0e10cSrcweir {
931cdf0e10cSrcweir     WRITEDEBUGINFO( "InprocEmbedDocument_Impl::InitFromData( IDataObject * pDataObject, BOOL fCreation, DWORD dwReserved )" );
932cdf0e10cSrcweir     if ( CheckDefHandler() )
933cdf0e10cSrcweir     {
934cdf0e10cSrcweir         ComSmart< IOleObject > pOleObject;
935cdf0e10cSrcweir         HRESULT hr = m_pDefHandler->QueryInterface( IID_IOleObject, (void**)&pOleObject );
936cdf0e10cSrcweir 
937cdf0e10cSrcweir         ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
938cdf0e10cSrcweir         if ( SUCCEEDED( hr ) && pOleObject )
939cdf0e10cSrcweir             return pOleObject->InitFromData( pDataObject, fCreation, dwReserved );
940cdf0e10cSrcweir     }
941cdf0e10cSrcweir 
942cdf0e10cSrcweir     return E_FAIL;
943cdf0e10cSrcweir }
944cdf0e10cSrcweir 
945cdf0e10cSrcweir //-------------------------------------------------------------------------------
GetClipboardData(DWORD dwReserved,IDataObject ** ppDataObject)946cdf0e10cSrcweir STDMETHODIMP InprocEmbedDocument_Impl::GetClipboardData( DWORD dwReserved, IDataObject ** ppDataObject )
947cdf0e10cSrcweir {
948cdf0e10cSrcweir     WRITEDEBUGINFO( "InprocEmbedDocument_Impl::GetClipboardData( DWORD dwReserved, IDataObject ** ppDataObject )" );
949cdf0e10cSrcweir     if ( CheckDefHandler() )
950cdf0e10cSrcweir     {
951cdf0e10cSrcweir         ComSmart< IOleObject > pOleObject;
952cdf0e10cSrcweir         HRESULT hr = m_pDefHandler->QueryInterface( IID_IOleObject, (void**)&pOleObject );
953cdf0e10cSrcweir 
954cdf0e10cSrcweir         ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
955cdf0e10cSrcweir         if ( SUCCEEDED( hr ) && pOleObject )
956cdf0e10cSrcweir             return pOleObject->GetClipboardData( dwReserved, ppDataObject );
957cdf0e10cSrcweir     }
958cdf0e10cSrcweir 
959cdf0e10cSrcweir     return E_FAIL;
960cdf0e10cSrcweir }
961cdf0e10cSrcweir 
962cdf0e10cSrcweir //-------------------------------------------------------------------------------
DoVerb(LONG iVerb,LPMSG pMsg,IOleClientSite * pActiveSite,LONG nLong,HWND hWin,LPCRECT pRect)963cdf0e10cSrcweir STDMETHODIMP InprocEmbedDocument_Impl::DoVerb(
964cdf0e10cSrcweir 	LONG iVerb,
965cdf0e10cSrcweir 	LPMSG pMsg,
966cdf0e10cSrcweir 	IOleClientSite *pActiveSite,
967cdf0e10cSrcweir 	LONG nLong,
968cdf0e10cSrcweir 	HWND hWin,
969cdf0e10cSrcweir 	LPCRECT pRect )
970cdf0e10cSrcweir {
971cdf0e10cSrcweir     WRITEDEBUGINFO( "DoVerb" );
972cdf0e10cSrcweir     if ( CheckDefHandler() )
973cdf0e10cSrcweir     {
974cdf0e10cSrcweir         WRITEDEBUGINFO( "DoVerb" MY_STRING_LINE "n" );
975cdf0e10cSrcweir         ComSmart< IOleObject > pOleObject;
976cdf0e10cSrcweir         HRESULT hr = m_pDefHandler->QueryInterface( IID_IOleObject, (void**)&pOleObject );
977cdf0e10cSrcweir 
978cdf0e10cSrcweir         WRITEDEBUGINFO( "DoVerb" );
979cdf0e10cSrcweir         ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
980cdf0e10cSrcweir         WRITEDEBUGINFO( "DoVerb" );
981cdf0e10cSrcweir         if ( SUCCEEDED( hr ) && pOleObject )
982cdf0e10cSrcweir         {
983cdf0e10cSrcweir             WRITEDEBUGINFO( "DoVerb" );
984cdf0e10cSrcweir             hr = pOleObject->DoVerb( iVerb, pMsg, pActiveSite, nLong, hWin, pRect );
985cdf0e10cSrcweir             if ( SUCCEEDED( hr ) )
986cdf0e10cSrcweir             {
987cdf0e10cSrcweir                 WRITEDEBUGINFO( "DoVerb" );
988cdf0e10cSrcweir             }
989cdf0e10cSrcweir 
990cdf0e10cSrcweir             return hr;
991cdf0e10cSrcweir         }
992cdf0e10cSrcweir 
993cdf0e10cSrcweir         WRITEDEBUGINFO( "DoVerb" );
994cdf0e10cSrcweir     }
995cdf0e10cSrcweir 
996cdf0e10cSrcweir     return E_FAIL;
997cdf0e10cSrcweir }
998cdf0e10cSrcweir 
999cdf0e10cSrcweir //-------------------------------------------------------------------------------
EnumVerbs(IEnumOLEVERB ** ppEnumOleVerb)1000cdf0e10cSrcweir STDMETHODIMP InprocEmbedDocument_Impl::EnumVerbs( IEnumOLEVERB ** ppEnumOleVerb )
1001cdf0e10cSrcweir {
1002cdf0e10cSrcweir     WRITEDEBUGINFO( "InprocEmbedDocument_Impl::EnumVerbs( IEnumOLEVERB ** ppEnumOleVerb )" );
1003cdf0e10cSrcweir     if ( CheckDefHandler() )
1004cdf0e10cSrcweir     {
1005cdf0e10cSrcweir         ComSmart< IOleObject > pOleObject;
1006cdf0e10cSrcweir         HRESULT hr = m_pDefHandler->QueryInterface( IID_IOleObject, (void**)&pOleObject );
1007cdf0e10cSrcweir 
1008cdf0e10cSrcweir         ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
1009cdf0e10cSrcweir         if ( SUCCEEDED( hr ) && pOleObject )
1010cdf0e10cSrcweir             return pOleObject->EnumVerbs( ppEnumOleVerb );
1011cdf0e10cSrcweir     }
1012cdf0e10cSrcweir 
1013cdf0e10cSrcweir     return E_FAIL;
1014cdf0e10cSrcweir }
1015cdf0e10cSrcweir 
1016cdf0e10cSrcweir //-------------------------------------------------------------------------------
Update()1017cdf0e10cSrcweir STDMETHODIMP InprocEmbedDocument_Impl::Update()
1018cdf0e10cSrcweir {
1019cdf0e10cSrcweir     WRITEDEBUGINFO( "InprocEmbedDocument_Impl::Update()" );
1020cdf0e10cSrcweir 
1021cdf0e10cSrcweir     if ( m_pDefHandler && CheckDefHandler() )
1022cdf0e10cSrcweir     {
1023cdf0e10cSrcweir         ComSmart< IOleObject > pOleObject;
1024cdf0e10cSrcweir         HRESULT hr = m_pDefHandler->QueryInterface( IID_IOleObject, (void**)&pOleObject );
1025cdf0e10cSrcweir 
1026cdf0e10cSrcweir         ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
1027cdf0e10cSrcweir         if ( SUCCEEDED( hr ) && pOleObject )
1028cdf0e10cSrcweir             return pOleObject->Update();
1029cdf0e10cSrcweir     }
1030cdf0e10cSrcweir 
1031cdf0e10cSrcweir     return S_OK;
1032cdf0e10cSrcweir }
1033cdf0e10cSrcweir 
1034cdf0e10cSrcweir //-------------------------------------------------------------------------------
IsUpToDate()1035cdf0e10cSrcweir STDMETHODIMP InprocEmbedDocument_Impl::IsUpToDate()
1036cdf0e10cSrcweir {
1037cdf0e10cSrcweir     WRITEDEBUGINFO( "InprocEmbedDocument_Impl::IsUpToDate()" );
1038cdf0e10cSrcweir     if ( CheckDefHandler() )
1039cdf0e10cSrcweir     {
1040cdf0e10cSrcweir         ComSmart< IOleObject > pOleObject;
1041cdf0e10cSrcweir         HRESULT hr = m_pDefHandler->QueryInterface( IID_IOleObject, (void**)&pOleObject );
1042cdf0e10cSrcweir 
1043cdf0e10cSrcweir         ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
1044cdf0e10cSrcweir         if ( SUCCEEDED( hr ) && pOleObject )
1045cdf0e10cSrcweir             return pOleObject->IsUpToDate();
1046cdf0e10cSrcweir     }
1047cdf0e10cSrcweir 
1048cdf0e10cSrcweir     return E_FAIL;
1049cdf0e10cSrcweir }
1050cdf0e10cSrcweir 
1051cdf0e10cSrcweir //-------------------------------------------------------------------------------
GetUserClassID(CLSID * pClsid)1052cdf0e10cSrcweir STDMETHODIMP InprocEmbedDocument_Impl::GetUserClassID( CLSID *pClsid )
1053cdf0e10cSrcweir {
1054cdf0e10cSrcweir     WRITEDEBUGINFO( "InprocEmbedDocument_Impl::GetUserClassID( CLSID *pClsid )" );
1055cdf0e10cSrcweir     if ( pClsid )
1056cdf0e10cSrcweir         *pClsid = m_guid;
1057cdf0e10cSrcweir 
1058cdf0e10cSrcweir     return S_OK;
1059cdf0e10cSrcweir }
1060cdf0e10cSrcweir 
1061cdf0e10cSrcweir //-------------------------------------------------------------------------------
GetUserType(DWORD dwFormOfType,LPOLESTR * pszUserType)1062cdf0e10cSrcweir STDMETHODIMP InprocEmbedDocument_Impl::GetUserType( DWORD dwFormOfType, LPOLESTR * pszUserType )
1063cdf0e10cSrcweir {
1064cdf0e10cSrcweir     WRITEDEBUGINFO( "InprocEmbedDocument_Impl::GetUserType( DWORD dwFormOfType, LPOLESTR * pszUserType )" );
1065cdf0e10cSrcweir     if ( CheckDefHandler() )
1066cdf0e10cSrcweir     {
1067cdf0e10cSrcweir         ComSmart< IOleObject > pOleObject;
1068cdf0e10cSrcweir         HRESULT hr = m_pDefHandler->QueryInterface( IID_IOleObject, (void**)&pOleObject );
1069cdf0e10cSrcweir 
1070cdf0e10cSrcweir         ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
1071cdf0e10cSrcweir         if ( SUCCEEDED( hr ) && pOleObject )
1072cdf0e10cSrcweir             return pOleObject->GetUserType( dwFormOfType, pszUserType );
1073cdf0e10cSrcweir     }
1074cdf0e10cSrcweir 
1075cdf0e10cSrcweir     return E_FAIL;
1076cdf0e10cSrcweir }
1077cdf0e10cSrcweir 
1078cdf0e10cSrcweir //-------------------------------------------------------------------------------
SetExtent(DWORD dwDrawAspect,SIZEL * psizel)1079cdf0e10cSrcweir STDMETHODIMP InprocEmbedDocument_Impl::SetExtent( DWORD dwDrawAspect, SIZEL *psizel )
1080cdf0e10cSrcweir {
1081cdf0e10cSrcweir     WRITEDEBUGINFO( "InprocEmbedDocument_Impl::SetExtent( DWORD dwDrawAspect, SIZEL *psizel )" );
1082cdf0e10cSrcweir     if ( CheckDefHandler() )
1083cdf0e10cSrcweir     {
1084cdf0e10cSrcweir         ComSmart< IOleObject > pOleObject;
1085cdf0e10cSrcweir         HRESULT hr = m_pDefHandler->QueryInterface( IID_IOleObject, (void**)&pOleObject );
1086cdf0e10cSrcweir 
1087cdf0e10cSrcweir         ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
1088cdf0e10cSrcweir         if ( SUCCEEDED( hr ) && pOleObject )
1089cdf0e10cSrcweir             return pOleObject->SetExtent( dwDrawAspect, psizel );
1090cdf0e10cSrcweir     }
1091cdf0e10cSrcweir 
1092cdf0e10cSrcweir     return E_FAIL;
1093cdf0e10cSrcweir }
1094cdf0e10cSrcweir 
1095cdf0e10cSrcweir //-------------------------------------------------------------------------------
GetExtent(DWORD dwDrawAspect,SIZEL * psizel)1096cdf0e10cSrcweir STDMETHODIMP InprocEmbedDocument_Impl::GetExtent( DWORD dwDrawAspect, SIZEL * psizel )
1097cdf0e10cSrcweir {
1098cdf0e10cSrcweir     WRITEDEBUGINFO( "InprocEmbedDocument_Impl::GetExtent( DWORD dwDrawAspect, SIZEL * psizel )" );
1099cdf0e10cSrcweir     if ( CheckDefHandler() )
1100cdf0e10cSrcweir     {
1101cdf0e10cSrcweir         ComSmart< IOleObject > pOleObject;
1102cdf0e10cSrcweir         HRESULT hr = m_pDefHandler->QueryInterface( IID_IOleObject, (void**)&pOleObject );
1103cdf0e10cSrcweir 
1104cdf0e10cSrcweir         ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
1105cdf0e10cSrcweir         if ( SUCCEEDED( hr ) && pOleObject )
1106cdf0e10cSrcweir             return pOleObject->GetExtent( dwDrawAspect, psizel );
1107cdf0e10cSrcweir     }
1108cdf0e10cSrcweir 
1109cdf0e10cSrcweir     return E_FAIL;
1110cdf0e10cSrcweir }
1111cdf0e10cSrcweir 
1112cdf0e10cSrcweir //-------------------------------------------------------------------------------
Advise(IAdviseSink * pAdvSink,DWORD * pdwConnection)1113cdf0e10cSrcweir STDMETHODIMP InprocEmbedDocument_Impl::Advise( IAdviseSink *pAdvSink, DWORD *pdwConnection )
1114cdf0e10cSrcweir {
1115cdf0e10cSrcweir     WRITEDEBUGINFO( "InprocEmbedDocument_Impl::Advise( IAdviseSink *pAdvSink, DWORD *pdwConnection )" );
1116cdf0e10cSrcweir 
1117cdf0e10cSrcweir     if ( !pdwConnection )
1118cdf0e10cSrcweir         return E_FAIL;
1119cdf0e10cSrcweir 
1120cdf0e10cSrcweir 	// CheckDefHandler will set the listener, avoid reusing of old listener
1121cdf0e10cSrcweir     if ( DEFAULT_ARRAY_LEN > *pdwConnection && *pdwConnection > 0 && m_pOleAdvises[*pdwConnection] )
1122cdf0e10cSrcweir     {
1123cdf0e10cSrcweir         m_pOleAdvises[*pdwConnection]->DisconnectOrigAdvise();
1124cdf0e10cSrcweir         m_pOleAdvises[*pdwConnection] = NULL;
1125cdf0e10cSrcweir     }
1126cdf0e10cSrcweir 
1127cdf0e10cSrcweir     if ( pAdvSink && CheckDefHandler() )
1128cdf0e10cSrcweir     {
1129cdf0e10cSrcweir         ComSmart< IOleObject > pOleObject;
1130cdf0e10cSrcweir         HRESULT hr = m_pDefHandler->QueryInterface( IID_IOleObject, (void**)&pOleObject );
1131cdf0e10cSrcweir 
1132cdf0e10cSrcweir         ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
1133cdf0e10cSrcweir         if ( SUCCEEDED( hr ) && pOleObject )
1134cdf0e10cSrcweir         {
1135cdf0e10cSrcweir             ComSmart< OleWrapperAdviseSink > pOwnAdvise( new OleWrapperAdviseSink( pAdvSink ) );
1136cdf0e10cSrcweir             DWORD nRegID = 0;
1137cdf0e10cSrcweir 
1138cdf0e10cSrcweir             if ( SUCCEEDED( pOleObject->Advise( pOwnAdvise, &nRegID ) ) && nRegID > 0 )
1139cdf0e10cSrcweir             {
1140cdf0e10cSrcweir                 pOwnAdvise->SetRegID( nRegID );
1141cdf0e10cSrcweir                 *pdwConnection = InsertAdviseLinkToList( pOwnAdvise, m_pOleAdvises );
1142cdf0e10cSrcweir                 if ( *pdwConnection )
1143cdf0e10cSrcweir                     return S_OK;
1144cdf0e10cSrcweir                 else
1145cdf0e10cSrcweir                     pOleObject->Unadvise( nRegID );
1146cdf0e10cSrcweir             }
1147cdf0e10cSrcweir         }
1148cdf0e10cSrcweir     }
1149cdf0e10cSrcweir 
1150cdf0e10cSrcweir     // return success always for now
1151cdf0e10cSrcweir     return S_OK;
1152cdf0e10cSrcweir }
1153cdf0e10cSrcweir 
1154cdf0e10cSrcweir //-------------------------------------------------------------------------------
Unadvise(DWORD dwConnection)1155cdf0e10cSrcweir STDMETHODIMP InprocEmbedDocument_Impl::Unadvise( DWORD dwConnection )
1156cdf0e10cSrcweir {
1157cdf0e10cSrcweir     if ( DEFAULT_ARRAY_LEN > dwConnection && dwConnection > 0 && m_pOleAdvises[dwConnection] )
1158cdf0e10cSrcweir     {
1159cdf0e10cSrcweir         if ( m_pDefHandler )
1160cdf0e10cSrcweir         {
1161cdf0e10cSrcweir             ComSmart< IOleObject > pOleObject;
1162cdf0e10cSrcweir             HRESULT hr = m_pDefHandler->QueryInterface( IID_IOleObject, (void**)&pOleObject );
1163cdf0e10cSrcweir 
1164cdf0e10cSrcweir             ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
1165cdf0e10cSrcweir             if ( SUCCEEDED( hr ) && pOleObject )
1166cdf0e10cSrcweir             {
1167cdf0e10cSrcweir                 DWORD nID = m_pOleAdvises[dwConnection]->GetRegID();
1168cdf0e10cSrcweir                 pOleObject->Unadvise( nID );
1169cdf0e10cSrcweir             }
1170cdf0e10cSrcweir         }
1171cdf0e10cSrcweir 
1172cdf0e10cSrcweir         m_pOleAdvises[dwConnection]->DisconnectOrigAdvise();
1173cdf0e10cSrcweir         m_pOleAdvises[dwConnection] = NULL;
1174cdf0e10cSrcweir 
1175cdf0e10cSrcweir         return S_OK;
1176cdf0e10cSrcweir     }
1177cdf0e10cSrcweir 
1178cdf0e10cSrcweir     return E_FAIL;
1179cdf0e10cSrcweir }
1180cdf0e10cSrcweir 
1181cdf0e10cSrcweir //-------------------------------------------------------------------------------
EnumAdvise(IEnumSTATDATA **)1182cdf0e10cSrcweir STDMETHODIMP InprocEmbedDocument_Impl::EnumAdvise( IEnumSTATDATA ** /*ppenumAdvise*/ )
1183cdf0e10cSrcweir {
1184cdf0e10cSrcweir     return E_NOTIMPL;
1185cdf0e10cSrcweir 
1186cdf0e10cSrcweir //    if ( CheckDefHandler() )
1187cdf0e10cSrcweir //    {
1188cdf0e10cSrcweir //        ComSmart< IOleObject > pOleObject;
1189cdf0e10cSrcweir //        HRESULT hr = m_pDefHandler->QueryInterface( IID_IOleObject, (void**)&pOleObject );
1190cdf0e10cSrcweir //
1191cdf0e10cSrcweir //        ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
1192cdf0e10cSrcweir //        if ( SUCCEEDED( hr ) && pOleObject )
1193cdf0e10cSrcweir //            return pOleObject->EnumAdvise( ppenumAdvise );
1194cdf0e10cSrcweir //    }
1195cdf0e10cSrcweir //
1196cdf0e10cSrcweir //    return E_FAIL;
1197cdf0e10cSrcweir }
1198cdf0e10cSrcweir 
1199cdf0e10cSrcweir //-------------------------------------------------------------------------------
GetMiscStatus(DWORD dwAspect,DWORD * pdwStatus)1200cdf0e10cSrcweir STDMETHODIMP InprocEmbedDocument_Impl::GetMiscStatus( DWORD dwAspect, DWORD * pdwStatus )
1201cdf0e10cSrcweir {
1202cdf0e10cSrcweir     WRITEDEBUGINFO( "InprocEmbedDocument_Impl::GetMiscStatus( DWORD dwAspect, DWORD * pdwStatus )" );
1203cdf0e10cSrcweir     if ( CheckDefHandler() )
1204cdf0e10cSrcweir     {
1205cdf0e10cSrcweir         ComSmart< IOleObject > pOleObject;
1206cdf0e10cSrcweir         HRESULT hr = m_pDefHandler->QueryInterface( IID_IOleObject, (void**)&pOleObject );
1207cdf0e10cSrcweir 
1208cdf0e10cSrcweir         ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
1209cdf0e10cSrcweir         if ( SUCCEEDED( hr ) && pOleObject )
1210cdf0e10cSrcweir             return pOleObject->GetMiscStatus( dwAspect, pdwStatus );
1211cdf0e10cSrcweir     }
1212cdf0e10cSrcweir 
1213cdf0e10cSrcweir     return E_FAIL;
1214cdf0e10cSrcweir }
1215cdf0e10cSrcweir 
1216cdf0e10cSrcweir //-------------------------------------------------------------------------------
SetColorScheme(LOGPALETTE * pLogpal)1217cdf0e10cSrcweir STDMETHODIMP InprocEmbedDocument_Impl::SetColorScheme( LOGPALETTE * pLogpal )
1218cdf0e10cSrcweir {
1219cdf0e10cSrcweir     WRITEDEBUGINFO( "InprocEmbedDocument_Impl::SetColorScheme( LOGPALETTE * pLogpal )" );
1220cdf0e10cSrcweir     if ( CheckDefHandler() )
1221cdf0e10cSrcweir     {
1222cdf0e10cSrcweir         ComSmart< IOleObject > pOleObject;
1223cdf0e10cSrcweir         HRESULT hr = m_pDefHandler->QueryInterface( IID_IOleObject, (void**)&pOleObject );
1224cdf0e10cSrcweir 
1225cdf0e10cSrcweir         ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
1226cdf0e10cSrcweir         if ( SUCCEEDED( hr ) && pOleObject )
1227cdf0e10cSrcweir             return pOleObject->SetColorScheme( pLogpal );
1228cdf0e10cSrcweir     }
1229cdf0e10cSrcweir 
1230cdf0e10cSrcweir     return E_FAIL;
1231cdf0e10cSrcweir }
1232cdf0e10cSrcweir 
1233cdf0e10cSrcweir //IDataObject
1234cdf0e10cSrcweir //-------------------------------------------------------------------------------
GetData(FORMATETC * pFormatetc,STGMEDIUM * pMedium)1235cdf0e10cSrcweir STDMETHODIMP InprocEmbedDocument_Impl::GetData( FORMATETC * pFormatetc, STGMEDIUM * pMedium )
1236cdf0e10cSrcweir {
1237cdf0e10cSrcweir     WRITEDEBUGINFO( "InprocEmbedDocument_Impl::GetData( FORMATETC * pFormatetc, STGMEDIUM * pMedium )" );
1238cdf0e10cSrcweir     if ( CheckDefHandler() )
1239cdf0e10cSrcweir     {
1240cdf0e10cSrcweir         ComSmart< IDataObject > pIDataObject;
1241cdf0e10cSrcweir         HRESULT hr = m_pDefHandler->QueryInterface( IID_IDataObject, (void**)&pIDataObject );
1242cdf0e10cSrcweir 
1243cdf0e10cSrcweir         ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
1244cdf0e10cSrcweir         if ( SUCCEEDED( hr ) && pIDataObject )
1245cdf0e10cSrcweir             return pIDataObject->GetData( pFormatetc, pMedium );
1246cdf0e10cSrcweir     }
1247cdf0e10cSrcweir 
1248cdf0e10cSrcweir     return E_FAIL;
1249cdf0e10cSrcweir }
1250cdf0e10cSrcweir 
1251cdf0e10cSrcweir //-------------------------------------------------------------------------------
GetDataHere(FORMATETC * pFormatetc,STGMEDIUM * pMedium)1252cdf0e10cSrcweir STDMETHODIMP InprocEmbedDocument_Impl::GetDataHere( FORMATETC * pFormatetc, STGMEDIUM * pMedium )
1253cdf0e10cSrcweir {
1254cdf0e10cSrcweir     WRITEDEBUGINFO( "InprocEmbedDocument_Impl::GetDataHere( FORMATETC * pFormatetc, STGMEDIUM * pMedium )" );
1255cdf0e10cSrcweir     if ( CheckDefHandler() )
1256cdf0e10cSrcweir     {
1257cdf0e10cSrcweir         ComSmart< IDataObject > pIDataObject;
1258cdf0e10cSrcweir         HRESULT hr = m_pDefHandler->QueryInterface( IID_IDataObject, (void**)&pIDataObject );
1259cdf0e10cSrcweir 
1260cdf0e10cSrcweir         ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
1261cdf0e10cSrcweir         if ( SUCCEEDED( hr ) && pIDataObject )
1262cdf0e10cSrcweir             return pIDataObject->GetDataHere( pFormatetc, pMedium );
1263cdf0e10cSrcweir     }
1264cdf0e10cSrcweir 
1265cdf0e10cSrcweir     return E_FAIL;
1266cdf0e10cSrcweir }
1267cdf0e10cSrcweir 
1268cdf0e10cSrcweir //-------------------------------------------------------------------------------
QueryGetData(FORMATETC * pFormatetc)1269cdf0e10cSrcweir STDMETHODIMP InprocEmbedDocument_Impl::QueryGetData( FORMATETC * pFormatetc )
1270cdf0e10cSrcweir {
1271cdf0e10cSrcweir     WRITEDEBUGINFO( "InprocEmbedDocument_Impl::QueryGetData( FORMATETC * pFormatetc )" );
1272cdf0e10cSrcweir     if ( CheckDefHandler() )
1273cdf0e10cSrcweir     {
1274cdf0e10cSrcweir         ComSmart< IDataObject > pIDataObject;
1275cdf0e10cSrcweir         HRESULT hr = m_pDefHandler->QueryInterface( IID_IDataObject, (void**)&pIDataObject );
1276cdf0e10cSrcweir 
1277cdf0e10cSrcweir         ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
1278cdf0e10cSrcweir         if ( SUCCEEDED( hr ) && pIDataObject )
1279cdf0e10cSrcweir             return pIDataObject->QueryGetData( pFormatetc );
1280cdf0e10cSrcweir     }
1281cdf0e10cSrcweir 
1282cdf0e10cSrcweir     return E_FAIL;
1283cdf0e10cSrcweir }
1284cdf0e10cSrcweir 
1285cdf0e10cSrcweir //-------------------------------------------------------------------------------
GetCanonicalFormatEtc(FORMATETC * pFormatetcIn,FORMATETC * pFormatetcOut)1286cdf0e10cSrcweir STDMETHODIMP InprocEmbedDocument_Impl::GetCanonicalFormatEtc( FORMATETC * pFormatetcIn, FORMATETC * pFormatetcOut )
1287cdf0e10cSrcweir {
1288cdf0e10cSrcweir     WRITEDEBUGINFO( "InprocEmbedDocument_Impl::GetCanonicalFormatEtc( FORMATETC * pFormatetcIn, FORMATETC * pFormatetcOut )" );
1289cdf0e10cSrcweir     if ( CheckDefHandler() )
1290cdf0e10cSrcweir     {
1291cdf0e10cSrcweir         ComSmart< IDataObject > pIDataObject;
1292cdf0e10cSrcweir         HRESULT hr = m_pDefHandler->QueryInterface( IID_IDataObject, (void**)&pIDataObject );
1293cdf0e10cSrcweir 
1294cdf0e10cSrcweir         ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
1295cdf0e10cSrcweir         if ( SUCCEEDED( hr ) && pIDataObject )
1296cdf0e10cSrcweir             return pIDataObject->GetCanonicalFormatEtc( pFormatetcIn, pFormatetcOut );
1297cdf0e10cSrcweir     }
1298cdf0e10cSrcweir 
1299cdf0e10cSrcweir     return E_FAIL;
1300cdf0e10cSrcweir }
1301cdf0e10cSrcweir 
1302cdf0e10cSrcweir //-------------------------------------------------------------------------------
SetData(FORMATETC * pFormatetc,STGMEDIUM * pMedium,BOOL fRelease)1303cdf0e10cSrcweir STDMETHODIMP InprocEmbedDocument_Impl::SetData( FORMATETC * pFormatetc, STGMEDIUM * pMedium, BOOL fRelease )
1304cdf0e10cSrcweir {
1305cdf0e10cSrcweir     WRITEDEBUGINFO( "InprocEmbedDocument_Impl::SetData( FORMATETC * pFormatetc, STGMEDIUM * pMedium, BOOL fRelease )" );
1306cdf0e10cSrcweir     if ( CheckDefHandler() )
1307cdf0e10cSrcweir     {
1308cdf0e10cSrcweir         ComSmart< IDataObject > pIDataObject;
1309cdf0e10cSrcweir         HRESULT hr = m_pDefHandler->QueryInterface( IID_IDataObject, (void**)&pIDataObject );
1310cdf0e10cSrcweir 
1311cdf0e10cSrcweir         ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
1312cdf0e10cSrcweir         if ( SUCCEEDED( hr ) && pIDataObject )
1313cdf0e10cSrcweir             return pIDataObject->SetData( pFormatetc, pMedium, fRelease );
1314cdf0e10cSrcweir     }
1315cdf0e10cSrcweir 
1316cdf0e10cSrcweir     return E_FAIL;
1317cdf0e10cSrcweir }
1318cdf0e10cSrcweir 
1319cdf0e10cSrcweir //-------------------------------------------------------------------------------
EnumFormatEtc(DWORD dwDirection,IEnumFORMATETC ** ppFormatetc)1320cdf0e10cSrcweir STDMETHODIMP InprocEmbedDocument_Impl::EnumFormatEtc( DWORD dwDirection, IEnumFORMATETC ** ppFormatetc )
1321cdf0e10cSrcweir {
1322cdf0e10cSrcweir     WRITEDEBUGINFO( "InprocEmbedDocument_Impl::EnumFormatEtc( DWORD dwDirection, IEnumFORMATETC ** ppFormatetc )" );
1323cdf0e10cSrcweir     if ( CheckDefHandler() )
1324cdf0e10cSrcweir     {
1325cdf0e10cSrcweir         ComSmart< IDataObject > pIDataObject;
1326cdf0e10cSrcweir         HRESULT hr = m_pDefHandler->QueryInterface( IID_IDataObject, (void**)&pIDataObject );
1327cdf0e10cSrcweir 
1328cdf0e10cSrcweir         ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
1329cdf0e10cSrcweir         if ( SUCCEEDED( hr ) && pIDataObject )
1330cdf0e10cSrcweir             return pIDataObject->EnumFormatEtc( dwDirection, ppFormatetc );
1331cdf0e10cSrcweir     }
1332cdf0e10cSrcweir 
1333cdf0e10cSrcweir     return E_FAIL;
1334cdf0e10cSrcweir }
1335cdf0e10cSrcweir 
1336cdf0e10cSrcweir //-------------------------------------------------------------------------------
DAdvise(FORMATETC * pFormatetc,DWORD advf,IAdviseSink * pAdvSink,DWORD * pdwConnection)1337cdf0e10cSrcweir STDMETHODIMP InprocEmbedDocument_Impl::DAdvise( FORMATETC * pFormatetc, DWORD advf, IAdviseSink * pAdvSink, DWORD * pdwConnection )
1338cdf0e10cSrcweir {
1339cdf0e10cSrcweir     WRITEDEBUGINFO( "InprocEmbedDocument_Impl::DAdvise( FORMATETC * pFormatetc, DWORD advf, IAdviseSink * pAdvSink, DWORD * pdwConnection )" );
1340cdf0e10cSrcweir 
1341cdf0e10cSrcweir     if ( !pdwConnection )
1342cdf0e10cSrcweir         return E_FAIL;
1343cdf0e10cSrcweir 
1344cdf0e10cSrcweir 	// avoid reusing of the old listener
1345cdf0e10cSrcweir 	if ( m_pDefHandler && DEFAULT_ARRAY_LEN > *pdwConnection && *pdwConnection > 0 && m_pDataAdvises[*pdwConnection] )
1346cdf0e10cSrcweir     {
1347cdf0e10cSrcweir         m_pDataAdvises[*pdwConnection]->DisconnectOrigAdvise();
1348cdf0e10cSrcweir         m_pDataAdvises[*pdwConnection] = NULL;
1349cdf0e10cSrcweir     }
1350cdf0e10cSrcweir 
1351cdf0e10cSrcweir 	if ( pAdvSink && CheckDefHandler() )
1352cdf0e10cSrcweir     {
1353cdf0e10cSrcweir         ComSmart< IDataObject > pIDataObject;
1354cdf0e10cSrcweir         HRESULT hr = m_pDefHandler->QueryInterface( IID_IDataObject, (void**)&pIDataObject );
1355cdf0e10cSrcweir 
1356cdf0e10cSrcweir         ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
1357cdf0e10cSrcweir         if ( SUCCEEDED( hr ) && pIDataObject )
1358cdf0e10cSrcweir         {
1359cdf0e10cSrcweir             ComSmart< OleWrapperAdviseSink > pOwnAdvise( new OleWrapperAdviseSink( ComSmart<IAdviseSink>( pAdvSink ), pFormatetc, advf ) );
1360cdf0e10cSrcweir             DWORD nRegID = 0;
1361cdf0e10cSrcweir 
1362cdf0e10cSrcweir             if ( SUCCEEDED( pIDataObject->DAdvise( pFormatetc, advf, pOwnAdvise, &nRegID ) ) && nRegID > 0 )
1363cdf0e10cSrcweir             {
1364cdf0e10cSrcweir                 pOwnAdvise->SetRegID( nRegID );
1365cdf0e10cSrcweir                 *pdwConnection = InsertAdviseLinkToList( pOwnAdvise, m_pDataAdvises );
1366cdf0e10cSrcweir                 if ( *pdwConnection )
1367cdf0e10cSrcweir                     return S_OK;
1368cdf0e10cSrcweir                 else
1369cdf0e10cSrcweir                     pIDataObject->DUnadvise( nRegID );
1370cdf0e10cSrcweir             }
1371cdf0e10cSrcweir         }
1372cdf0e10cSrcweir     }
1373cdf0e10cSrcweir 
1374cdf0e10cSrcweir     // return success always for now
1375cdf0e10cSrcweir     return S_OK;
1376cdf0e10cSrcweir }
1377cdf0e10cSrcweir 
1378cdf0e10cSrcweir //-------------------------------------------------------------------------------
DUnadvise(DWORD dwConnection)1379cdf0e10cSrcweir STDMETHODIMP InprocEmbedDocument_Impl::DUnadvise( DWORD dwConnection )
1380cdf0e10cSrcweir {
1381cdf0e10cSrcweir     WRITEDEBUGINFO( "InprocEmbedDocument_Impl::DUnadvise( DWORD dwConnection )" );
1382cdf0e10cSrcweir     if ( m_pDefHandler && DEFAULT_ARRAY_LEN > dwConnection && dwConnection > 0 && m_pDataAdvises[dwConnection] )
1383cdf0e10cSrcweir     {
1384cdf0e10cSrcweir         if ( CheckDefHandler() )
1385cdf0e10cSrcweir         {
1386cdf0e10cSrcweir             ComSmart< IDataObject > pIDataObject;
1387cdf0e10cSrcweir             HRESULT hr = m_pDefHandler->QueryInterface( IID_IDataObject, (void**)&pIDataObject );
1388cdf0e10cSrcweir 
1389cdf0e10cSrcweir             ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
1390cdf0e10cSrcweir             if ( SUCCEEDED( hr ) && pIDataObject )
1391cdf0e10cSrcweir             {
1392cdf0e10cSrcweir                 DWORD nID = m_pDataAdvises[dwConnection]->GetRegID();
1393cdf0e10cSrcweir                 pIDataObject->DUnadvise( nID );
1394cdf0e10cSrcweir             }
1395cdf0e10cSrcweir         }
1396cdf0e10cSrcweir 
1397cdf0e10cSrcweir         m_pDataAdvises[dwConnection]->DisconnectOrigAdvise();
1398cdf0e10cSrcweir         m_pDataAdvises[dwConnection] = NULL;
1399cdf0e10cSrcweir 
1400cdf0e10cSrcweir         return S_OK;
1401cdf0e10cSrcweir     }
1402cdf0e10cSrcweir 
1403cdf0e10cSrcweir     return E_FAIL;
1404cdf0e10cSrcweir }
1405cdf0e10cSrcweir 
1406cdf0e10cSrcweir //-------------------------------------------------------------------------------
EnumDAdvise(IEnumSTATDATA ** ppenumAdvise)1407cdf0e10cSrcweir STDMETHODIMP InprocEmbedDocument_Impl::EnumDAdvise( IEnumSTATDATA ** ppenumAdvise )
1408cdf0e10cSrcweir {
1409cdf0e10cSrcweir     WRITEDEBUGINFO( "InprocEmbedDocument_Impl::EnumDAdvise( IEnumSTATDATA ** ppenumAdvise )" );
1410cdf0e10cSrcweir     if ( CheckDefHandler() )
1411cdf0e10cSrcweir     {
1412cdf0e10cSrcweir         ComSmart< IDataObject > pIDataObject;
1413cdf0e10cSrcweir         HRESULT hr = m_pDefHandler->QueryInterface( IID_IDataObject, (void**)&pIDataObject );
1414cdf0e10cSrcweir 
1415cdf0e10cSrcweir         ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
1416cdf0e10cSrcweir         if ( SUCCEEDED( hr ) && pIDataObject )
1417cdf0e10cSrcweir             return pIDataObject->EnumDAdvise( ppenumAdvise );
1418cdf0e10cSrcweir     }
1419cdf0e10cSrcweir 
1420cdf0e10cSrcweir     return E_FAIL;
1421cdf0e10cSrcweir }
1422cdf0e10cSrcweir 
1423cdf0e10cSrcweir // IRunnableObject
1424cdf0e10cSrcweir //-------------------------------------------------------------------------------
GetRunningClass(LPCLSID lpClsid)1425cdf0e10cSrcweir STDMETHODIMP InprocEmbedDocument_Impl::GetRunningClass( LPCLSID lpClsid )
1426cdf0e10cSrcweir {
1427cdf0e10cSrcweir     WRITEDEBUGINFO( "InprocEmbedDocument_Impl::GetRunningClass( LPCLSID lpClsid )" );
1428cdf0e10cSrcweir     if ( CheckDefHandler() )
1429cdf0e10cSrcweir     {
1430cdf0e10cSrcweir         ComSmart< IRunnableObject > pIRunObj;
1431cdf0e10cSrcweir         HRESULT hr = m_pDefHandler->QueryInterface( IID_IRunnableObject, (void**)&pIRunObj );
1432cdf0e10cSrcweir 
1433cdf0e10cSrcweir         ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
1434cdf0e10cSrcweir         if ( SUCCEEDED( hr ) && pIRunObj )
1435cdf0e10cSrcweir             return pIRunObj->GetRunningClass( lpClsid );
1436cdf0e10cSrcweir     }
1437cdf0e10cSrcweir 
1438cdf0e10cSrcweir     return E_FAIL;
1439cdf0e10cSrcweir }
1440cdf0e10cSrcweir 
1441cdf0e10cSrcweir //-------------------------------------------------------------------------------
Run(LPBINDCTX pbc)1442cdf0e10cSrcweir STDMETHODIMP InprocEmbedDocument_Impl::Run( LPBINDCTX pbc )
1443cdf0e10cSrcweir {
1444cdf0e10cSrcweir     WRITEDEBUGINFO( "InprocEmbedDocument_Impl::Run( LPBINDCTX pbc )" );
1445cdf0e10cSrcweir     if ( CheckDefHandler() )
1446cdf0e10cSrcweir     {
1447cdf0e10cSrcweir         ComSmart< IRunnableObject > pIRunObj;
1448cdf0e10cSrcweir         HRESULT hr = m_pDefHandler->QueryInterface( IID_IRunnableObject, (void**)&pIRunObj );
1449cdf0e10cSrcweir 
1450cdf0e10cSrcweir         ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
1451cdf0e10cSrcweir         if ( SUCCEEDED( hr ) && pIRunObj )
1452cdf0e10cSrcweir             return pIRunObj->Run( pbc );
1453cdf0e10cSrcweir     }
1454cdf0e10cSrcweir 
1455cdf0e10cSrcweir     return E_FAIL;
1456cdf0e10cSrcweir }
1457cdf0e10cSrcweir 
1458cdf0e10cSrcweir //-------------------------------------------------------------------------------
IsRunning()1459cdf0e10cSrcweir BOOL STDMETHODCALLTYPE InprocEmbedDocument_Impl::IsRunning()
1460cdf0e10cSrcweir {
1461cdf0e10cSrcweir     WRITEDEBUGINFO( "InprocEmbedDocument_Impl::IsRunning()" );
1462cdf0e10cSrcweir    if ( CheckDefHandler() )
1463cdf0e10cSrcweir     {
1464cdf0e10cSrcweir         ComSmart< IRunnableObject > pIRunObj;
1465cdf0e10cSrcweir         HRESULT hr = m_pDefHandler->QueryInterface( IID_IRunnableObject, (void**)&pIRunObj );
1466cdf0e10cSrcweir 
1467cdf0e10cSrcweir         ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
1468cdf0e10cSrcweir         if ( SUCCEEDED( hr ) && pIRunObj )
1469cdf0e10cSrcweir             return pIRunObj->IsRunning();
1470cdf0e10cSrcweir     }
1471cdf0e10cSrcweir 
1472cdf0e10cSrcweir     return E_FAIL;
1473cdf0e10cSrcweir 
1474cdf0e10cSrcweir }
1475cdf0e10cSrcweir 
1476cdf0e10cSrcweir //-------------------------------------------------------------------------------
LockRunning(BOOL fLock,BOOL fLastUnlockCloses)1477cdf0e10cSrcweir STDMETHODIMP InprocEmbedDocument_Impl::LockRunning( BOOL fLock, BOOL fLastUnlockCloses )
1478cdf0e10cSrcweir {
1479cdf0e10cSrcweir     WRITEDEBUGINFO( "InprocEmbedDocument_Impl::LockRunning( BOOL fLock, BOOL fLastUnlockCloses )" );
1480cdf0e10cSrcweir    if ( CheckDefHandler() )
1481cdf0e10cSrcweir     {
1482cdf0e10cSrcweir         ComSmart< IRunnableObject > pIRunObj;
1483cdf0e10cSrcweir         HRESULT hr = m_pDefHandler->QueryInterface( IID_IRunnableObject, (void**)&pIRunObj );
1484cdf0e10cSrcweir 
1485cdf0e10cSrcweir         ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
1486cdf0e10cSrcweir         if ( SUCCEEDED( hr ) && pIRunObj )
1487cdf0e10cSrcweir             return pIRunObj->LockRunning( fLock, fLastUnlockCloses );
1488cdf0e10cSrcweir     }
1489cdf0e10cSrcweir 
1490cdf0e10cSrcweir     return E_FAIL;
1491cdf0e10cSrcweir }
1492cdf0e10cSrcweir 
1493cdf0e10cSrcweir //-------------------------------------------------------------------------------
SetContainedObject(BOOL fContained)1494cdf0e10cSrcweir STDMETHODIMP InprocEmbedDocument_Impl::SetContainedObject( BOOL fContained)
1495cdf0e10cSrcweir {
1496cdf0e10cSrcweir     WRITEDEBUGINFO( "InprocEmbedDocument_Impl::SetContainedObject( BOOL fContained)" );
1497cdf0e10cSrcweir    if ( CheckDefHandler() )
1498cdf0e10cSrcweir     {
1499cdf0e10cSrcweir         ComSmart< IRunnableObject > pIRunObj;
1500cdf0e10cSrcweir         HRESULT hr = m_pDefHandler->QueryInterface( IID_IRunnableObject, (void**)&pIRunObj );
1501cdf0e10cSrcweir 
1502cdf0e10cSrcweir         ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
1503cdf0e10cSrcweir         if ( SUCCEEDED( hr ) && pIRunObj )
1504cdf0e10cSrcweir             return pIRunObj->SetContainedObject( fContained );
1505cdf0e10cSrcweir     }
1506cdf0e10cSrcweir 
1507cdf0e10cSrcweir     return E_FAIL;
1508cdf0e10cSrcweir }
1509cdf0e10cSrcweir 
1510cdf0e10cSrcweir 
1511cdf0e10cSrcweir // IViewObject methods
1512cdf0e10cSrcweir //-------------------------------------------------------------------------------
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)1513cdf0e10cSrcweir 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 )
1514cdf0e10cSrcweir {
1515cdf0e10cSrcweir     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 )" );
1516cdf0e10cSrcweir     if ( CheckDefHandler() )
1517cdf0e10cSrcweir     {
1518cdf0e10cSrcweir         ComSmart< IViewObject > pIViewObject;
1519cdf0e10cSrcweir         HRESULT hr = m_pDefHandler->QueryInterface( IID_IViewObject, (void**)&pIViewObject );
1520cdf0e10cSrcweir 
1521cdf0e10cSrcweir         ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
1522cdf0e10cSrcweir         if ( SUCCEEDED( hr ) && pIViewObject )
1523cdf0e10cSrcweir             return pIViewObject->Draw( dwDrawAspect, lindex, pvAspect, ptd, hdcTargetDev, hdcDraw, lprcBounds, lprcWBounds, pfnContinue, dwContinue );
1524cdf0e10cSrcweir     }
1525cdf0e10cSrcweir 
1526cdf0e10cSrcweir     return E_FAIL;
1527cdf0e10cSrcweir }
1528cdf0e10cSrcweir 
1529cdf0e10cSrcweir //-------------------------------------------------------------------------------
GetColorSet(DWORD dwDrawAspect,LONG lindex,void * pvAspect,DVTARGETDEVICE * ptd,HDC hicTargetDev,LOGPALETTE ** ppColorSet)1530cdf0e10cSrcweir STDMETHODIMP InprocEmbedDocument_Impl::GetColorSet( DWORD dwDrawAspect, LONG lindex, void *pvAspect, DVTARGETDEVICE *ptd, HDC hicTargetDev, LOGPALETTE **ppColorSet )
1531cdf0e10cSrcweir {
1532cdf0e10cSrcweir     WRITEDEBUGINFO( "InprocEmbedDocument_Impl::GetColorSet( DWORD dwDrawAspect, LONG lindex, void *pvAspect, DVTARGETDEVICE *ptd, HDC hicTargetDev, LOGPALETTE **ppColorSet )" );
1533cdf0e10cSrcweir     if ( CheckDefHandler() )
1534cdf0e10cSrcweir     {
1535cdf0e10cSrcweir         ComSmart< IViewObject > pIViewObject;
1536cdf0e10cSrcweir         HRESULT hr = m_pDefHandler->QueryInterface( IID_IViewObject, (void**)&pIViewObject );
1537cdf0e10cSrcweir 
1538cdf0e10cSrcweir         ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
1539cdf0e10cSrcweir         if ( SUCCEEDED( hr ) && pIViewObject )
1540cdf0e10cSrcweir             return pIViewObject->GetColorSet( dwDrawAspect, lindex, pvAspect, ptd, hicTargetDev, ppColorSet );
1541cdf0e10cSrcweir     }
1542cdf0e10cSrcweir 
1543cdf0e10cSrcweir     return E_FAIL;
1544cdf0e10cSrcweir }
1545cdf0e10cSrcweir 
1546cdf0e10cSrcweir //-------------------------------------------------------------------------------
Freeze(DWORD dwDrawAspect,LONG lindex,void * pvAspect,DWORD * pdwFreeze)1547cdf0e10cSrcweir STDMETHODIMP InprocEmbedDocument_Impl::Freeze( DWORD dwDrawAspect, LONG lindex, void *pvAspect, DWORD *pdwFreeze )
1548cdf0e10cSrcweir {
1549cdf0e10cSrcweir     WRITEDEBUGINFO( "InprocEmbedDocument_Impl::Freeze( DWORD dwDrawAspect, LONG lindex, void *pvAspect, DWORD *pdwFreeze )" );
1550cdf0e10cSrcweir     if ( CheckDefHandler() )
1551cdf0e10cSrcweir     {
1552cdf0e10cSrcweir         ComSmart< IViewObject > pIViewObject;
1553cdf0e10cSrcweir         HRESULT hr = m_pDefHandler->QueryInterface( IID_IViewObject, (void**)&pIViewObject );
1554cdf0e10cSrcweir 
1555cdf0e10cSrcweir         ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
1556cdf0e10cSrcweir         if ( SUCCEEDED( hr ) && pIViewObject )
1557cdf0e10cSrcweir             return pIViewObject->Freeze( dwDrawAspect, lindex, pvAspect, pdwFreeze );
1558cdf0e10cSrcweir     }
1559cdf0e10cSrcweir 
1560cdf0e10cSrcweir     return E_FAIL;
1561cdf0e10cSrcweir }
1562cdf0e10cSrcweir 
1563cdf0e10cSrcweir //-------------------------------------------------------------------------------
Unfreeze(DWORD dwFreeze)1564cdf0e10cSrcweir STDMETHODIMP InprocEmbedDocument_Impl::Unfreeze( DWORD dwFreeze )
1565cdf0e10cSrcweir {
1566cdf0e10cSrcweir     WRITEDEBUGINFO( "InprocEmbedDocument_Impl::Unfreeze( DWORD dwFreeze )" );
1567cdf0e10cSrcweir     if ( CheckDefHandler() )
1568cdf0e10cSrcweir     {
1569cdf0e10cSrcweir         ComSmart< IViewObject > pIViewObject;
1570cdf0e10cSrcweir         HRESULT hr = m_pDefHandler->QueryInterface( IID_IViewObject, (void**)&pIViewObject );
1571cdf0e10cSrcweir 
1572cdf0e10cSrcweir         ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
1573cdf0e10cSrcweir         if ( SUCCEEDED( hr ) && pIViewObject )
1574cdf0e10cSrcweir             return pIViewObject->Unfreeze( dwFreeze );
1575cdf0e10cSrcweir     }
1576cdf0e10cSrcweir 
1577cdf0e10cSrcweir     return E_FAIL;
1578cdf0e10cSrcweir }
1579cdf0e10cSrcweir 
1580cdf0e10cSrcweir //-------------------------------------------------------------------------------
SetAdvise(DWORD aspects,DWORD advf,IAdviseSink * pAdvSink)1581cdf0e10cSrcweir STDMETHODIMP InprocEmbedDocument_Impl::SetAdvise( DWORD aspects, DWORD advf, IAdviseSink *pAdvSink )
1582cdf0e10cSrcweir {
1583cdf0e10cSrcweir     WRITEDEBUGINFO( "InprocEmbedDocument_Impl::SetAdvise( DWORD aspects, DWORD advf, IAdviseSink *pAdvSink )" );
1584cdf0e10cSrcweir 
1585cdf0e10cSrcweir 	// CheckDefHandler will set the listener, avoid reusing of old listener
1586cdf0e10cSrcweir     if ( m_pViewAdvise )
1587cdf0e10cSrcweir     {
1588cdf0e10cSrcweir         m_pViewAdvise->DisconnectOrigAdvise();
1589cdf0e10cSrcweir 	    m_pViewAdvise = NULL;
1590cdf0e10cSrcweir     }
1591cdf0e10cSrcweir 
1592cdf0e10cSrcweir     if ( pAdvSink && CheckDefHandler() )
1593cdf0e10cSrcweir     {
1594cdf0e10cSrcweir         ComSmart< IViewObject > pIViewObject;
1595cdf0e10cSrcweir         HRESULT hr = m_pDefHandler->QueryInterface( IID_IViewObject, (void**)&pIViewObject );
1596cdf0e10cSrcweir 
1597cdf0e10cSrcweir         ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
1598cdf0e10cSrcweir         if ( SUCCEEDED( hr ) && pIViewObject )
1599cdf0e10cSrcweir         {
1600cdf0e10cSrcweir             ComSmart< OleWrapperAdviseSink > pOwnAdvise( new OleWrapperAdviseSink( pAdvSink, aspects, advf ) );
1601cdf0e10cSrcweir 
1602cdf0e10cSrcweir             if ( SUCCEEDED( pIViewObject->SetAdvise( aspects, advf, pOwnAdvise ) ) )
1603cdf0e10cSrcweir             {
1604cdf0e10cSrcweir                 m_pViewAdvise = pOwnAdvise;
1605cdf0e10cSrcweir                 return S_OK;
1606cdf0e10cSrcweir             }
1607cdf0e10cSrcweir         }
1608cdf0e10cSrcweir     }
1609cdf0e10cSrcweir 
1610cdf0e10cSrcweir     return S_OK;
1611cdf0e10cSrcweir }
1612cdf0e10cSrcweir 
1613cdf0e10cSrcweir //-------------------------------------------------------------------------------
GetAdvise(DWORD * pAspects,DWORD * pAdvf,IAdviseSink ** ppAdvSink)1614cdf0e10cSrcweir STDMETHODIMP InprocEmbedDocument_Impl::GetAdvise( DWORD *pAspects, DWORD *pAdvf, IAdviseSink **ppAdvSink )
1615cdf0e10cSrcweir {
1616cdf0e10cSrcweir     if ( !ppAdvSink )
1617cdf0e10cSrcweir         return E_INVALIDARG;
1618cdf0e10cSrcweir 
1619cdf0e10cSrcweir     if ( m_pViewAdvise )
1620cdf0e10cSrcweir     {
1621cdf0e10cSrcweir         if ( pAspects )
1622cdf0e10cSrcweir             *pAspects = m_pViewAdvise->GetAspect();
1623cdf0e10cSrcweir 
1624cdf0e10cSrcweir         if ( pAdvf )
1625cdf0e10cSrcweir             *pAdvf = m_pViewAdvise->GetViewAdviseFlag();
1626cdf0e10cSrcweir 
1627cdf0e10cSrcweir         *ppAdvSink = m_pViewAdvise->GetOrigAdvise();
1628cdf0e10cSrcweir         if ( *ppAdvSink )
1629cdf0e10cSrcweir             (*ppAdvSink)->AddRef();
1630cdf0e10cSrcweir     }
1631cdf0e10cSrcweir     else
1632cdf0e10cSrcweir         *ppAdvSink = NULL;
1633cdf0e10cSrcweir 
1634cdf0e10cSrcweir     return S_OK;
1635cdf0e10cSrcweir }
1636cdf0e10cSrcweir 
1637cdf0e10cSrcweir // IViewObject2 methods
1638cdf0e10cSrcweir //-------------------------------------------------------------------------------
GetExtent(DWORD dwDrawAspect,LONG lindex,DVTARGETDEVICE * ptd,LPSIZEL lpsizel)1639cdf0e10cSrcweir STDMETHODIMP InprocEmbedDocument_Impl::GetExtent( DWORD dwDrawAspect, LONG lindex, DVTARGETDEVICE *ptd, LPSIZEL lpsizel )
1640cdf0e10cSrcweir {
1641cdf0e10cSrcweir     WRITEDEBUGINFO( "InprocEmbedDocument_Impl::GetExtent( DWORD dwDrawAspect, LONG lindex, DVTARGETDEVICE *ptd, LPSIZEL lpsizel )" );
1642cdf0e10cSrcweir     if ( CheckDefHandler() )
1643cdf0e10cSrcweir     {
1644cdf0e10cSrcweir         ComSmart< IViewObject2 > pIViewObject2;
1645cdf0e10cSrcweir         HRESULT hr = m_pDefHandler->QueryInterface( IID_IViewObject2, (void**)&pIViewObject2 );
1646cdf0e10cSrcweir 
1647cdf0e10cSrcweir         ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
1648cdf0e10cSrcweir         if ( SUCCEEDED( hr ) && pIViewObject2 )
1649cdf0e10cSrcweir             return pIViewObject2->GetExtent( dwDrawAspect, lindex, ptd, lpsizel );
1650cdf0e10cSrcweir     }
1651cdf0e10cSrcweir 
1652cdf0e10cSrcweir     return E_FAIL;
1653cdf0e10cSrcweir }
1654cdf0e10cSrcweir 
1655cdf0e10cSrcweir 
1656cdf0e10cSrcweir 
1657cdf0e10cSrcweir // IOleWindow methods
1658cdf0e10cSrcweir //-------------------------------------------------------------------------------
GetWindow(HWND * phwnd)1659cdf0e10cSrcweir STDMETHODIMP InprocEmbedDocument_Impl::GetWindow( HWND *phwnd )
1660cdf0e10cSrcweir {
1661cdf0e10cSrcweir     WRITEDEBUGINFO( "InprocEmbedDocument_Impl::GetWindow( HWND *phwnd )" );
1662cdf0e10cSrcweir     if ( CheckDefHandler() )
1663cdf0e10cSrcweir     {
1664cdf0e10cSrcweir         ComSmart< IOleWindow > pIOleWindow;
1665cdf0e10cSrcweir         HRESULT hr = m_pDefHandler->QueryInterface( IID_IOleWindow, (void**)&pIOleWindow );
1666cdf0e10cSrcweir 
1667cdf0e10cSrcweir         ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
1668cdf0e10cSrcweir         if ( SUCCEEDED( hr ) && pIOleWindow )
1669cdf0e10cSrcweir             return pIOleWindow->GetWindow( phwnd );
1670cdf0e10cSrcweir     }
1671cdf0e10cSrcweir 
1672cdf0e10cSrcweir     return E_FAIL;
1673cdf0e10cSrcweir }
1674cdf0e10cSrcweir 
1675cdf0e10cSrcweir //-------------------------------------------------------------------------------
ContextSensitiveHelp(BOOL fEnterMode)1676cdf0e10cSrcweir STDMETHODIMP InprocEmbedDocument_Impl::ContextSensitiveHelp( BOOL fEnterMode )
1677cdf0e10cSrcweir {
1678cdf0e10cSrcweir     WRITEDEBUGINFO( "InprocEmbedDocument_Impl::ContextSensitiveHelp( BOOL fEnterMode )" );
1679cdf0e10cSrcweir     if ( CheckDefHandler() )
1680cdf0e10cSrcweir     {
1681cdf0e10cSrcweir         ComSmart< IOleWindow > pIOleWindow;
1682cdf0e10cSrcweir         HRESULT hr = m_pDefHandler->QueryInterface( IID_IOleWindow, (void**)&pIOleWindow );
1683cdf0e10cSrcweir 
1684cdf0e10cSrcweir         ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
1685cdf0e10cSrcweir         if ( SUCCEEDED( hr ) && pIOleWindow )
1686cdf0e10cSrcweir             return pIOleWindow->ContextSensitiveHelp( fEnterMode );
1687cdf0e10cSrcweir     }
1688cdf0e10cSrcweir 
1689cdf0e10cSrcweir     return E_FAIL;
1690cdf0e10cSrcweir }
1691cdf0e10cSrcweir 
1692cdf0e10cSrcweir 
1693cdf0e10cSrcweir // IOleInPlaceObject methods
1694cdf0e10cSrcweir //-------------------------------------------------------------------------------
InPlaceDeactivate(void)1695cdf0e10cSrcweir STDMETHODIMP InprocEmbedDocument_Impl::InPlaceDeactivate( void )
1696cdf0e10cSrcweir {
1697cdf0e10cSrcweir     WRITEDEBUGINFO( "InprocEmbedDocument_Impl::InPlaceDeactivate( void )" );
1698cdf0e10cSrcweir     if ( CheckDefHandler() )
1699cdf0e10cSrcweir     {
1700cdf0e10cSrcweir         ComSmart< IOleInPlaceObject > pIOleInPlaceObject;
1701cdf0e10cSrcweir         HRESULT hr = m_pDefHandler->QueryInterface( IID_IOleInPlaceObject, (void**)&pIOleInPlaceObject );
1702cdf0e10cSrcweir 
1703cdf0e10cSrcweir         ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
1704cdf0e10cSrcweir         if ( SUCCEEDED( hr ) && pIOleInPlaceObject )
1705cdf0e10cSrcweir             return pIOleInPlaceObject->InPlaceDeactivate();
1706cdf0e10cSrcweir     }
1707cdf0e10cSrcweir 
1708cdf0e10cSrcweir     return E_FAIL;
1709cdf0e10cSrcweir }
1710cdf0e10cSrcweir 
1711cdf0e10cSrcweir //-------------------------------------------------------------------------------
UIDeactivate(void)1712cdf0e10cSrcweir STDMETHODIMP InprocEmbedDocument_Impl::UIDeactivate( void )
1713cdf0e10cSrcweir {
1714cdf0e10cSrcweir     WRITEDEBUGINFO( "InprocEmbedDocument_Impl::UIDeactivate( void )" );
1715cdf0e10cSrcweir     if ( CheckDefHandler() )
1716cdf0e10cSrcweir     {
1717cdf0e10cSrcweir         ComSmart< IOleInPlaceObject > pIOleInPlaceObject;
1718cdf0e10cSrcweir         HRESULT hr = m_pDefHandler->QueryInterface( IID_IOleInPlaceObject, (void**)&pIOleInPlaceObject );
1719cdf0e10cSrcweir 
1720cdf0e10cSrcweir         ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
1721cdf0e10cSrcweir         if ( SUCCEEDED( hr ) && pIOleInPlaceObject )
1722cdf0e10cSrcweir             return pIOleInPlaceObject->UIDeactivate();
1723cdf0e10cSrcweir     }
1724cdf0e10cSrcweir 
1725cdf0e10cSrcweir     return E_FAIL;
1726cdf0e10cSrcweir }
1727cdf0e10cSrcweir 
1728cdf0e10cSrcweir //-------------------------------------------------------------------------------
SetObjectRects(LPCRECT lprcPosRect,LPCRECT lprcClipRect)1729cdf0e10cSrcweir STDMETHODIMP InprocEmbedDocument_Impl::SetObjectRects( LPCRECT lprcPosRect, LPCRECT lprcClipRect )
1730cdf0e10cSrcweir {
1731cdf0e10cSrcweir     WRITEDEBUGINFO( "InprocEmbedDocument_Impl::SetObjectRects( LPCRECT lprcPosRect, LPCRECT lprcClipRect )" );
1732cdf0e10cSrcweir     if ( CheckDefHandler() )
1733cdf0e10cSrcweir     {
1734cdf0e10cSrcweir         ComSmart< IOleInPlaceObject > pIOleInPlaceObject;
1735cdf0e10cSrcweir         HRESULT hr = m_pDefHandler->QueryInterface( IID_IOleInPlaceObject, (void**)&pIOleInPlaceObject );
1736cdf0e10cSrcweir 
1737cdf0e10cSrcweir         ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
1738cdf0e10cSrcweir         if ( SUCCEEDED( hr ) && pIOleInPlaceObject )
1739cdf0e10cSrcweir             return pIOleInPlaceObject->SetObjectRects( lprcPosRect, lprcClipRect );
1740cdf0e10cSrcweir     }
1741cdf0e10cSrcweir 
1742cdf0e10cSrcweir     return E_FAIL;
1743cdf0e10cSrcweir }
1744cdf0e10cSrcweir 
1745cdf0e10cSrcweir //-------------------------------------------------------------------------------
ReactivateAndUndo(void)1746cdf0e10cSrcweir STDMETHODIMP InprocEmbedDocument_Impl::ReactivateAndUndo( void )
1747cdf0e10cSrcweir {
1748cdf0e10cSrcweir     WRITEDEBUGINFO( "InprocEmbedDocument_Impl::ReactivateAndUndo( void )" );
1749cdf0e10cSrcweir     if ( CheckDefHandler() )
1750cdf0e10cSrcweir     {
1751cdf0e10cSrcweir         ComSmart< IOleInPlaceObject > pIOleInPlaceObject;
1752cdf0e10cSrcweir         HRESULT hr = m_pDefHandler->QueryInterface( IID_IOleInPlaceObject, (void**)&pIOleInPlaceObject );
1753cdf0e10cSrcweir 
1754cdf0e10cSrcweir         ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
1755cdf0e10cSrcweir         if ( SUCCEEDED( hr ) && pIOleInPlaceObject )
1756cdf0e10cSrcweir             return pIOleInPlaceObject->ReactivateAndUndo();
1757cdf0e10cSrcweir     }
1758cdf0e10cSrcweir 
1759cdf0e10cSrcweir     return E_FAIL;
1760cdf0e10cSrcweir }
1761cdf0e10cSrcweir 
1762cdf0e10cSrcweir 
1763cdf0e10cSrcweir // IDispatch methods
1764cdf0e10cSrcweir //-------------------------------------------------------------------------------
GetTypeInfoCount(UINT * pctinfo)1765cdf0e10cSrcweir STDMETHODIMP InprocEmbedDocument_Impl::GetTypeInfoCount( UINT *pctinfo )
1766cdf0e10cSrcweir {
1767cdf0e10cSrcweir     WRITEDEBUGINFO( "InprocEmbedDocument_Impl::GetTypeInfoCount( UINT *pctinfo )" );
1768cdf0e10cSrcweir     if ( CheckDefHandler() )
1769cdf0e10cSrcweir     {
1770cdf0e10cSrcweir         ComSmart< IDispatch > pIDispatch;
1771cdf0e10cSrcweir         HRESULT hr = m_pDefHandler->QueryInterface( IID_IDispatch, (void**)&pIDispatch );
1772cdf0e10cSrcweir 
1773cdf0e10cSrcweir         ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
1774cdf0e10cSrcweir         if ( SUCCEEDED( hr ) && pIDispatch )
1775cdf0e10cSrcweir             return pIDispatch->GetTypeInfoCount( pctinfo );
1776cdf0e10cSrcweir     }
1777cdf0e10cSrcweir 
1778cdf0e10cSrcweir     return E_FAIL;
1779cdf0e10cSrcweir }
1780cdf0e10cSrcweir 
1781cdf0e10cSrcweir //-------------------------------------------------------------------------------
GetTypeInfo(UINT iTInfo,LCID lcid,ITypeInfo ** ppTInfo)1782cdf0e10cSrcweir STDMETHODIMP InprocEmbedDocument_Impl::GetTypeInfo( UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo )
1783cdf0e10cSrcweir {
1784cdf0e10cSrcweir     WRITEDEBUGINFO( "InprocEmbedDocument_Impl::GetTypeInfo( UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo )" );
1785cdf0e10cSrcweir     if ( CheckDefHandler() )
1786cdf0e10cSrcweir     {
1787cdf0e10cSrcweir         ComSmart< IDispatch > pIDispatch;
1788cdf0e10cSrcweir         HRESULT hr = m_pDefHandler->QueryInterface( IID_IDispatch, (void**)&pIDispatch );
1789cdf0e10cSrcweir 
1790cdf0e10cSrcweir         ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
1791cdf0e10cSrcweir         if ( SUCCEEDED( hr ) && pIDispatch )
1792cdf0e10cSrcweir             return pIDispatch->GetTypeInfo( iTInfo, lcid, ppTInfo );
1793cdf0e10cSrcweir     }
1794cdf0e10cSrcweir 
1795cdf0e10cSrcweir     return E_FAIL;
1796cdf0e10cSrcweir }
1797cdf0e10cSrcweir 
1798cdf0e10cSrcweir //-------------------------------------------------------------------------------
GetIDsOfNames(REFIID riid,LPOLESTR * rgszNames,UINT cNames,LCID lcid,DISPID * rgDispId)1799cdf0e10cSrcweir STDMETHODIMP InprocEmbedDocument_Impl::GetIDsOfNames( REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId )
1800cdf0e10cSrcweir {
1801cdf0e10cSrcweir     WRITEDEBUGINFO( "InprocEmbedDocument_Impl::GetIDsOfNames( REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId )" );
1802cdf0e10cSrcweir     if ( CheckDefHandler() )
1803cdf0e10cSrcweir     {
1804cdf0e10cSrcweir         ComSmart< IDispatch > pIDispatch;
1805cdf0e10cSrcweir         HRESULT hr = m_pDefHandler->QueryInterface( IID_IDispatch, (void**)&pIDispatch );
1806cdf0e10cSrcweir 
1807cdf0e10cSrcweir         ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
1808cdf0e10cSrcweir         if ( SUCCEEDED( hr ) && pIDispatch )
1809cdf0e10cSrcweir             return pIDispatch->GetIDsOfNames( riid, rgszNames, cNames, lcid, rgDispId );
1810cdf0e10cSrcweir     }
1811cdf0e10cSrcweir 
1812cdf0e10cSrcweir     return E_FAIL;
1813cdf0e10cSrcweir }
1814cdf0e10cSrcweir 
1815cdf0e10cSrcweir //-------------------------------------------------------------------------------
Invoke(DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS * pDispParams,VARIANT * pVarResult,EXCEPINFO * pExcepInfo,UINT * puArgErr)1816cdf0e10cSrcweir STDMETHODIMP InprocEmbedDocument_Impl::Invoke( DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr )
1817cdf0e10cSrcweir {
1818cdf0e10cSrcweir     WRITEDEBUGINFO( "InprocEmbedDocument_Impl::Invoke( DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr )" );
1819cdf0e10cSrcweir     if ( CheckDefHandler() )
1820cdf0e10cSrcweir     {
1821cdf0e10cSrcweir         ComSmart< IDispatch > pIDispatch;
1822cdf0e10cSrcweir         HRESULT hr = m_pDefHandler->QueryInterface( IID_IDispatch, (void**)&pIDispatch );
1823cdf0e10cSrcweir 
1824cdf0e10cSrcweir         ULONGGuard aGuard( &m_nCallsOnStack ); // avoid reentrance problem
1825cdf0e10cSrcweir         if ( SUCCEEDED( hr ) && pIDispatch )
1826cdf0e10cSrcweir             return pIDispatch->Invoke( dispIdMember, riid, lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr );
1827cdf0e10cSrcweir     }
1828cdf0e10cSrcweir 
1829cdf0e10cSrcweir     return E_FAIL;
1830cdf0e10cSrcweir }
1831cdf0e10cSrcweir 
1832cdf0e10cSrcweir 
1833cdf0e10cSrcweir // ====
1834cdf0e10cSrcweir // InternalCacheWrapper
1835cdf0e10cSrcweir // ====
1836cdf0e10cSrcweir 
1837cdf0e10cSrcweir // IUnknown
1838cdf0e10cSrcweir //-------------------------------------------------------------------------------
QueryInterface(REFIID riid,void FAR * FAR * ppv)1839cdf0e10cSrcweir STDMETHODIMP InprocEmbedDocument_Impl::InternalCacheWrapper::QueryInterface( REFIID riid, void FAR* FAR* ppv )
1840cdf0e10cSrcweir {
1841cdf0e10cSrcweir     return m_rOwnDocument.QueryInterface( riid, ppv );
1842cdf0e10cSrcweir }
1843cdf0e10cSrcweir 
1844cdf0e10cSrcweir //-------------------------------------------------------------------------------
STDMETHODIMP_(ULONG)1845cdf0e10cSrcweir STDMETHODIMP_(ULONG) InprocEmbedDocument_Impl::InternalCacheWrapper::AddRef()
1846cdf0e10cSrcweir {
1847cdf0e10cSrcweir 	return m_rOwnDocument.AddRef();
1848cdf0e10cSrcweir }
1849cdf0e10cSrcweir 
1850cdf0e10cSrcweir //-------------------------------------------------------------------------------
STDMETHODIMP_(ULONG)1851cdf0e10cSrcweir STDMETHODIMP_(ULONG) InprocEmbedDocument_Impl::InternalCacheWrapper::Release()
1852cdf0e10cSrcweir {
1853cdf0e10cSrcweir     return m_rOwnDocument.Release();
1854cdf0e10cSrcweir }
1855cdf0e10cSrcweir 
1856cdf0e10cSrcweir // IOleCache methods
1857cdf0e10cSrcweir //-------------------------------------------------------------------------------
Cache(FORMATETC * pformatetc,DWORD advf,DWORD * pdwConnection)1858cdf0e10cSrcweir STDMETHODIMP InprocEmbedDocument_Impl::InternalCacheWrapper::Cache( FORMATETC *pformatetc, DWORD advf, DWORD *pdwConnection )
1859cdf0e10cSrcweir {
1860cdf0e10cSrcweir     WRITEDEBUGINFO( "InprocEmbedDocument_Impl::InternalCacheWrapper::Cache( FORMATETC *pformatetc, DWORD advf, DWORD *pdwConnection )" );
1861cdf0e10cSrcweir     if ( m_rOwnDocument.CheckDefHandler() )
1862cdf0e10cSrcweir     {
1863cdf0e10cSrcweir         ComSmart< IOleCache > pIOleCache;
1864cdf0e10cSrcweir         HRESULT hr = m_rOwnDocument.GetDefHandler()->QueryInterface( IID_IOleCache, (void**)&pIOleCache );
1865cdf0e10cSrcweir 
1866cdf0e10cSrcweir         ULONGGuard aGuard( &m_rOwnDocument.m_nCallsOnStack ); // avoid reentrance problem
1867cdf0e10cSrcweir         if ( SUCCEEDED( hr ) && pIOleCache )
1868cdf0e10cSrcweir             return pIOleCache->Cache( pformatetc, advf, pdwConnection );
1869cdf0e10cSrcweir     }
1870cdf0e10cSrcweir 
1871cdf0e10cSrcweir     return E_FAIL;
1872cdf0e10cSrcweir }
1873cdf0e10cSrcweir 
1874cdf0e10cSrcweir //-------------------------------------------------------------------------------
Uncache(DWORD dwConnection)1875cdf0e10cSrcweir STDMETHODIMP InprocEmbedDocument_Impl::InternalCacheWrapper::Uncache( DWORD dwConnection )
1876cdf0e10cSrcweir {
1877cdf0e10cSrcweir     WRITEDEBUGINFO( "InprocEmbedDocument_Impl::InternalCacheWrapper::Uncache( DWORD dwConnection )" );
1878cdf0e10cSrcweir     if ( m_rOwnDocument.CheckDefHandler() )
1879cdf0e10cSrcweir     {
1880cdf0e10cSrcweir         ComSmart< IOleCache > pIOleCache;
1881cdf0e10cSrcweir         HRESULT hr = m_rOwnDocument.GetDefHandler()->QueryInterface( IID_IOleCache, (void**)&pIOleCache );
1882cdf0e10cSrcweir 
1883cdf0e10cSrcweir         ULONGGuard aGuard( &m_rOwnDocument.m_nCallsOnStack ); // avoid reentrance problem
1884cdf0e10cSrcweir         if ( SUCCEEDED( hr ) && pIOleCache )
1885cdf0e10cSrcweir             return pIOleCache->Uncache( dwConnection );
1886cdf0e10cSrcweir     }
1887cdf0e10cSrcweir 
1888cdf0e10cSrcweir     return E_FAIL;
1889cdf0e10cSrcweir }
1890cdf0e10cSrcweir 
1891cdf0e10cSrcweir //-------------------------------------------------------------------------------
EnumCache(IEnumSTATDATA ** ppenumSTATDATA)1892cdf0e10cSrcweir STDMETHODIMP InprocEmbedDocument_Impl::InternalCacheWrapper::EnumCache( IEnumSTATDATA **ppenumSTATDATA )
1893cdf0e10cSrcweir {
1894cdf0e10cSrcweir     WRITEDEBUGINFO( "InprocEmbedDocument_Impl::InternalCacheWrapper::EnumCache( IEnumSTATDATA **ppenumSTATDATA )" );
1895cdf0e10cSrcweir     if ( m_rOwnDocument.CheckDefHandler() )
1896cdf0e10cSrcweir     {
1897cdf0e10cSrcweir         ComSmart< IOleCache > pIOleCache;
1898cdf0e10cSrcweir         HRESULT hr = m_rOwnDocument.GetDefHandler()->QueryInterface( IID_IOleCache, (void**)&pIOleCache );
1899cdf0e10cSrcweir 
1900cdf0e10cSrcweir         ULONGGuard aGuard( &m_rOwnDocument.m_nCallsOnStack ); // avoid reentrance problem
1901cdf0e10cSrcweir         if ( SUCCEEDED( hr ) && pIOleCache )
1902cdf0e10cSrcweir             return pIOleCache->EnumCache( ppenumSTATDATA );
1903cdf0e10cSrcweir     }
1904cdf0e10cSrcweir 
1905cdf0e10cSrcweir     return E_FAIL;
1906cdf0e10cSrcweir }
1907cdf0e10cSrcweir 
1908cdf0e10cSrcweir //-------------------------------------------------------------------------------
InitCache(IDataObject * pDataObject)1909cdf0e10cSrcweir STDMETHODIMP InprocEmbedDocument_Impl::InternalCacheWrapper::InitCache( IDataObject *pDataObject )
1910cdf0e10cSrcweir {
1911cdf0e10cSrcweir     WRITEDEBUGINFO( "InprocEmbedDocument_Impl::InternalCacheWrapper::InitCache( IDataObject *pDataObject )" );
1912cdf0e10cSrcweir     if ( m_rOwnDocument.CheckDefHandler() )
1913cdf0e10cSrcweir     {
1914cdf0e10cSrcweir         ComSmart< IOleCache > pIOleCache;
1915cdf0e10cSrcweir         HRESULT hr = m_rOwnDocument.GetDefHandler()->QueryInterface( IID_IOleCache, (void**)&pIOleCache );
1916cdf0e10cSrcweir 
1917cdf0e10cSrcweir         ULONGGuard aGuard( &m_rOwnDocument.m_nCallsOnStack ); // avoid reentrance problem
1918cdf0e10cSrcweir         if ( SUCCEEDED( hr ) && pIOleCache )
1919cdf0e10cSrcweir             return pIOleCache->InitCache( pDataObject );
1920cdf0e10cSrcweir     }
1921cdf0e10cSrcweir 
1922cdf0e10cSrcweir     return E_FAIL;
1923cdf0e10cSrcweir }
1924cdf0e10cSrcweir 
1925cdf0e10cSrcweir //-------------------------------------------------------------------------------
SetData(FORMATETC * pformatetc,STGMEDIUM * pmedium,BOOL fRelease)1926cdf0e10cSrcweir STDMETHODIMP InprocEmbedDocument_Impl::InternalCacheWrapper::SetData( FORMATETC *pformatetc, STGMEDIUM *pmedium, BOOL fRelease )
1927cdf0e10cSrcweir {
1928cdf0e10cSrcweir     WRITEDEBUGINFO( "InprocEmbedDocument_Impl::InternalCacheWrapper::SetData( FORMATETC *pformatetc, STGMEDIUM *pmedium, BOOL fRelease )" );
1929cdf0e10cSrcweir     if ( m_rOwnDocument.CheckDefHandler() )
1930cdf0e10cSrcweir     {
1931cdf0e10cSrcweir         ComSmart< IOleCache > pIOleCache;
1932cdf0e10cSrcweir         HRESULT hr = m_rOwnDocument.GetDefHandler()->QueryInterface( IID_IOleCache, (void**)&pIOleCache );
1933cdf0e10cSrcweir 
1934cdf0e10cSrcweir         ULONGGuard aGuard( &m_rOwnDocument.m_nCallsOnStack ); // avoid reentrance problem
1935cdf0e10cSrcweir         if ( SUCCEEDED( hr ) && pIOleCache )
1936cdf0e10cSrcweir             return pIOleCache->SetData( pformatetc, pmedium, fRelease );
1937cdf0e10cSrcweir     }
1938cdf0e10cSrcweir 
1939cdf0e10cSrcweir     return E_FAIL;
1940cdf0e10cSrcweir }
1941cdf0e10cSrcweir 
1942cdf0e10cSrcweir // IOleCache2 methods
1943cdf0e10cSrcweir //-------------------------------------------------------------------------------
UpdateCache(LPDATAOBJECT pDataObject,DWORD grfUpdf,LPVOID pReserved)1944cdf0e10cSrcweir STDMETHODIMP InprocEmbedDocument_Impl::InternalCacheWrapper::UpdateCache( LPDATAOBJECT pDataObject, DWORD grfUpdf, LPVOID pReserved )
1945cdf0e10cSrcweir {
1946cdf0e10cSrcweir     WRITEDEBUGINFO( "InprocEmbedDocument_Impl::InternalCacheWrapper::UpdateCache( LPDATAOBJECT pDataObject, DWORD grfUpdf, LPVOID pReserved )" );
1947cdf0e10cSrcweir     if ( m_rOwnDocument.CheckDefHandler() )
1948cdf0e10cSrcweir     {
1949cdf0e10cSrcweir         ComSmart< IOleCache2 > pIOleCache2;
1950cdf0e10cSrcweir         HRESULT hr = m_rOwnDocument.GetDefHandler()->QueryInterface( IID_IOleCache2, (void**)&pIOleCache2 );
1951cdf0e10cSrcweir 
1952cdf0e10cSrcweir         ULONGGuard aGuard( &m_rOwnDocument.m_nCallsOnStack ); // avoid reentrance problem
1953cdf0e10cSrcweir         if ( SUCCEEDED( hr ) && pIOleCache2 )
1954cdf0e10cSrcweir             return pIOleCache2->UpdateCache( pDataObject, grfUpdf, pReserved );
1955cdf0e10cSrcweir     }
1956cdf0e10cSrcweir 
1957cdf0e10cSrcweir     return E_FAIL;
1958cdf0e10cSrcweir }
1959cdf0e10cSrcweir 
1960cdf0e10cSrcweir //-------------------------------------------------------------------------------
DiscardCache(DWORD dwDiscardOptions)1961cdf0e10cSrcweir STDMETHODIMP InprocEmbedDocument_Impl::InternalCacheWrapper::DiscardCache( DWORD dwDiscardOptions )
1962cdf0e10cSrcweir {
1963cdf0e10cSrcweir     WRITEDEBUGINFO( "InprocEmbedDocument_Impl::InternalCacheWrapper::DiscardCache( DWORD dwDiscardOptions )" );
1964cdf0e10cSrcweir     if ( m_rOwnDocument.CheckDefHandler() )
1965cdf0e10cSrcweir     {
1966cdf0e10cSrcweir         ComSmart< IOleCache2 > pIOleCache2;
1967cdf0e10cSrcweir         HRESULT hr = m_rOwnDocument.GetDefHandler()->QueryInterface( IID_IOleCache2, (void**)&pIOleCache2 );
1968cdf0e10cSrcweir 
1969cdf0e10cSrcweir         ULONGGuard aGuard( &m_rOwnDocument.m_nCallsOnStack ); // avoid reentrance problem
1970cdf0e10cSrcweir         if ( SUCCEEDED( hr ) && pIOleCache2 )
1971cdf0e10cSrcweir             return pIOleCache2->DiscardCache( dwDiscardOptions );
1972cdf0e10cSrcweir     }
1973cdf0e10cSrcweir 
1974cdf0e10cSrcweir     return E_FAIL;
1975cdf0e10cSrcweir }
1976cdf0e10cSrcweir 
1977cdf0e10cSrcweir }; // namespace inprocserv
1978cdf0e10cSrcweir 
1979