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