1*cdf0e10cSrcweir /*************************************************************************
2*cdf0e10cSrcweir  *
3*cdf0e10cSrcweir  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4*cdf0e10cSrcweir  *
5*cdf0e10cSrcweir  * Copyright 2000, 2010 Oracle and/or its affiliates.
6*cdf0e10cSrcweir  *
7*cdf0e10cSrcweir  * OpenOffice.org - a multi-platform office productivity suite
8*cdf0e10cSrcweir  *
9*cdf0e10cSrcweir  * This file is part of OpenOffice.org.
10*cdf0e10cSrcweir  *
11*cdf0e10cSrcweir  * OpenOffice.org is free software: you can redistribute it and/or modify
12*cdf0e10cSrcweir  * it under the terms of the GNU Lesser General Public License version 3
13*cdf0e10cSrcweir  * only, as published by the Free Software Foundation.
14*cdf0e10cSrcweir  *
15*cdf0e10cSrcweir  * OpenOffice.org is distributed in the hope that it will be useful,
16*cdf0e10cSrcweir  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17*cdf0e10cSrcweir  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18*cdf0e10cSrcweir  * GNU Lesser General Public License version 3 for more details
19*cdf0e10cSrcweir  * (a copy is included in the LICENSE file that accompanied this code).
20*cdf0e10cSrcweir  *
21*cdf0e10cSrcweir  * You should have received a copy of the GNU Lesser General Public License
22*cdf0e10cSrcweir  * version 3 along with OpenOffice.org.  If not, see
23*cdf0e10cSrcweir  * <http://www.openoffice.org/license.html>
24*cdf0e10cSrcweir  * for a copy of the LGPLv3 License.
25*cdf0e10cSrcweir  *
26*cdf0e10cSrcweir  ************************************************************************/
27*cdf0e10cSrcweir 
28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
29*cdf0e10cSrcweir #include "precompiled_embeddedobj.hxx"
30*cdf0e10cSrcweir 
31*cdf0e10cSrcweir #include <osl/diagnose.h>
32*cdf0e10cSrcweir 
33*cdf0e10cSrcweir #include "olewrapclient.hxx"
34*cdf0e10cSrcweir #include "olecomponent.hxx"
35*cdf0e10cSrcweir 
36*cdf0e10cSrcweir // TODO: May be a mutex must be introduced
37*cdf0e10cSrcweir 
38*cdf0e10cSrcweir OleWrapperClientSite::OleWrapperClientSite( OleComponent* pOleComp )
39*cdf0e10cSrcweir : m_nRefCount( 0 )
40*cdf0e10cSrcweir , m_pOleComp( pOleComp )
41*cdf0e10cSrcweir {
42*cdf0e10cSrcweir 	OSL_ENSURE( m_pOleComp, "No ole component is provided!\n" );
43*cdf0e10cSrcweir }
44*cdf0e10cSrcweir 
45*cdf0e10cSrcweir OleWrapperClientSite::~OleWrapperClientSite()
46*cdf0e10cSrcweir {
47*cdf0e10cSrcweir }
48*cdf0e10cSrcweir 
49*cdf0e10cSrcweir STDMETHODIMP OleWrapperClientSite::QueryInterface( REFIID riid , void** ppv )
50*cdf0e10cSrcweir {
51*cdf0e10cSrcweir 	*ppv=NULL;
52*cdf0e10cSrcweir 
53*cdf0e10cSrcweir 	if ( riid == IID_IUnknown )
54*cdf0e10cSrcweir 		*ppv = (IUnknown*)this;
55*cdf0e10cSrcweir 
56*cdf0e10cSrcweir 	if ( riid == IID_IOleClientSite )
57*cdf0e10cSrcweir 		*ppv = (IOleClientSite*)this;
58*cdf0e10cSrcweir 
59*cdf0e10cSrcweir 	if ( *ppv != NULL )
60*cdf0e10cSrcweir 	{
61*cdf0e10cSrcweir 		((IUnknown*)*ppv)->AddRef();
62*cdf0e10cSrcweir 		return S_OK;
63*cdf0e10cSrcweir 	}
64*cdf0e10cSrcweir 
65*cdf0e10cSrcweir 	return E_NOINTERFACE;
66*cdf0e10cSrcweir }
67*cdf0e10cSrcweir 
68*cdf0e10cSrcweir STDMETHODIMP_(ULONG) OleWrapperClientSite::AddRef()
69*cdf0e10cSrcweir {
70*cdf0e10cSrcweir 	return osl_incrementInterlockedCount( &m_nRefCount);
71*cdf0e10cSrcweir }
72*cdf0e10cSrcweir 
73*cdf0e10cSrcweir STDMETHODIMP_(ULONG) OleWrapperClientSite::Release()
74*cdf0e10cSrcweir {
75*cdf0e10cSrcweir 	ULONG nReturn = --m_nRefCount;
76*cdf0e10cSrcweir 	if ( m_nRefCount == 0 )
77*cdf0e10cSrcweir 		delete this;
78*cdf0e10cSrcweir 
79*cdf0e10cSrcweir     return nReturn;
80*cdf0e10cSrcweir }
81*cdf0e10cSrcweir 
82*cdf0e10cSrcweir void OleWrapperClientSite::disconnectOleComponent()
83*cdf0e10cSrcweir {
84*cdf0e10cSrcweir 	// must not be called from the descructor of OleComponent!!!
85*cdf0e10cSrcweir 	osl::MutexGuard aGuard( m_aMutex );
86*cdf0e10cSrcweir 	m_pOleComp = NULL;
87*cdf0e10cSrcweir }
88*cdf0e10cSrcweir 
89*cdf0e10cSrcweir STDMETHODIMP OleWrapperClientSite::SaveObject()
90*cdf0e10cSrcweir {
91*cdf0e10cSrcweir 	OleComponent* pLockComponent = NULL;
92*cdf0e10cSrcweir 	HRESULT hResult = E_FAIL;
93*cdf0e10cSrcweir 
94*cdf0e10cSrcweir 	{
95*cdf0e10cSrcweir 		osl::MutexGuard aGuard( m_aMutex );
96*cdf0e10cSrcweir 		if ( m_pOleComp )
97*cdf0e10cSrcweir 		{
98*cdf0e10cSrcweir 			pLockComponent = m_pOleComp;
99*cdf0e10cSrcweir 			pLockComponent->acquire();
100*cdf0e10cSrcweir 		}
101*cdf0e10cSrcweir 	}
102*cdf0e10cSrcweir 
103*cdf0e10cSrcweir 	if ( pLockComponent )
104*cdf0e10cSrcweir 	{
105*cdf0e10cSrcweir 		if ( pLockComponent->SaveObject_Impl() )
106*cdf0e10cSrcweir 			hResult = S_OK;
107*cdf0e10cSrcweir 
108*cdf0e10cSrcweir 		pLockComponent->release();
109*cdf0e10cSrcweir 	}
110*cdf0e10cSrcweir 
111*cdf0e10cSrcweir 	return hResult;
112*cdf0e10cSrcweir }
113*cdf0e10cSrcweir 
114*cdf0e10cSrcweir STDMETHODIMP OleWrapperClientSite::GetMoniker( DWORD, DWORD, LPMONIKER *ppmk )
115*cdf0e10cSrcweir {
116*cdf0e10cSrcweir 	*ppmk = NULL;
117*cdf0e10cSrcweir 	return E_NOTIMPL;
118*cdf0e10cSrcweir }
119*cdf0e10cSrcweir 
120*cdf0e10cSrcweir STDMETHODIMP OleWrapperClientSite::GetContainer( LPOLECONTAINER* ppContainer )
121*cdf0e10cSrcweir {
122*cdf0e10cSrcweir 	*ppContainer = NULL;
123*cdf0e10cSrcweir 	return E_NOTIMPL;
124*cdf0e10cSrcweir }
125*cdf0e10cSrcweir 
126*cdf0e10cSrcweir STDMETHODIMP OleWrapperClientSite::ShowObject(void)
127*cdf0e10cSrcweir {
128*cdf0e10cSrcweir 	return S_OK;
129*cdf0e10cSrcweir }
130*cdf0e10cSrcweir 
131*cdf0e10cSrcweir STDMETHODIMP OleWrapperClientSite::OnShowWindow( BOOL bShow )
132*cdf0e10cSrcweir {
133*cdf0e10cSrcweir 	OleComponent* pLockComponent = NULL;
134*cdf0e10cSrcweir 
135*cdf0e10cSrcweir 	// TODO/LATER: redirect the notification to the main thread so that SolarMutex can be locked
136*cdf0e10cSrcweir 	{
137*cdf0e10cSrcweir 		osl::MutexGuard aGuard( m_aMutex );
138*cdf0e10cSrcweir 		if ( m_pOleComp )
139*cdf0e10cSrcweir 		{
140*cdf0e10cSrcweir 			pLockComponent = m_pOleComp;
141*cdf0e10cSrcweir 			pLockComponent->acquire();
142*cdf0e10cSrcweir 		}
143*cdf0e10cSrcweir 	}
144*cdf0e10cSrcweir 
145*cdf0e10cSrcweir 	if ( pLockComponent )
146*cdf0e10cSrcweir 	{
147*cdf0e10cSrcweir 		pLockComponent->OnShowWindow_Impl( bShow ); // the result is not interesting
148*cdf0e10cSrcweir 		pLockComponent->release();
149*cdf0e10cSrcweir 	}
150*cdf0e10cSrcweir 
151*cdf0e10cSrcweir 	return S_OK;
152*cdf0e10cSrcweir }
153*cdf0e10cSrcweir 
154*cdf0e10cSrcweir STDMETHODIMP OleWrapperClientSite::RequestNewObjectLayout(void)
155*cdf0e10cSrcweir {
156*cdf0e10cSrcweir 	return E_NOTIMPL;
157*cdf0e10cSrcweir }
158*cdf0e10cSrcweir 
159