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