1 /*****************************************************************************
2 * oleobject.cpp: ActiveX control for VLC
3 *****************************************************************************
4 * Copyright (C) 2005 VideoLAN
6 * Authors: Damien Fouilleul <Damien.Fouilleul@laposte.net>
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
21 *****************************************************************************/
24 #include "oleobject.h"
32 VLCOleObject::VLCOleObject(VLCPlugin *p_instance) :
33 _p_clientsite(NULL), _p_instance(p_instance)
35 CreateOleAdviseHolder(&_p_advise_holder);
38 VLCOleObject::~VLCOleObject()
40 _p_advise_holder->Release();
44 STDMETHODIMP VLCOleObject::Advise(IAdviseSink *pAdvSink, DWORD *dwConnection)
46 return _p_advise_holder->Advise(pAdvSink, dwConnection);
49 STDMETHODIMP VLCOleObject::Close(DWORD dwSaveOption)
51 _p_advise_holder->SendOnClose();
53 return _p_instance->onClose(dwSaveOption);
56 STDMETHODIMP VLCOleObject::DoVerb(LONG iVerb, LPMSG lpMsg, LPOLECLIENTSITE pActiveSite,
57 LONG lIndex, HWND hwndParent, LPCRECT lprcPosRect)
64 case OLEIVERB_PRIMARY:
67 case OLEIVERB_INPLACEACTIVATE:
68 return doInPlaceActivate(lpMsg, pActiveSite, hwndParent, lprcPosRect);
71 _p_instance->setVisible(FALSE);
74 case OLEIVERB_UIACTIVATE:
75 return doUIActivate(lpMsg, pActiveSite, hwndParent, lprcPosRect);
77 case OLEIVERB_DISCARDUNDOSTATE:
81 return OLEOBJ_S_INVALIDVERB;
85 HRESULT VLCOleObject::doInPlaceActivate(LPMSG lpMsg, LPOLECLIENTSITE pActiveSite, HWND hwndParent, LPCRECT lprcPosRect)
89 LPCRECT lprcClipRect = lprcPosRect;
91 if( NULL != pActiveSite )
93 // check if already activated
94 if( _p_instance->isInPlaceActive() )
96 // just attempt to show object then
97 pActiveSite->ShowObject();
98 _p_instance->setVisible(TRUE);
102 LPOLEINPLACESITE p_inPlaceSite;
104 if( SUCCEEDED(pActiveSite->QueryInterface(IID_IOleInPlaceSite, (void**)&p_inPlaceSite)) )
106 if( S_OK != p_inPlaceSite->CanInPlaceActivate() )
107 return OLEOBJ_S_CANNOT_DOVERB_NOW;
109 LPOLEINPLACEFRAME p_inPlaceFrame;
110 LPOLEINPLACEUIWINDOW p_inPlaceUIWindow;
111 OLEINPLACEFRAMEINFO oleFrameInfo;
113 if( SUCCEEDED(p_inPlaceSite->GetWindowContext(&p_inPlaceFrame, &p_inPlaceUIWindow, &posRect, &clipRect, &oleFrameInfo)) )
115 lprcPosRect = &posRect;
116 lprcClipRect = &clipRect;
118 if( NULL != p_inPlaceFrame )
119 p_inPlaceFrame->Release();
120 if( NULL != p_inPlaceUIWindow )
121 p_inPlaceUIWindow->Release();
124 if( (NULL == hwndParent) && FAILED(p_inPlaceSite->GetWindow(&hwndParent)) )
126 p_inPlaceSite->Release();
127 return OLEOBJ_S_INVALIDHWND;
130 else if( NULL == hwndParent )
131 return OLEOBJ_S_INVALIDHWND;
133 if( FAILED(_p_instance->onActivateInPlace(lpMsg, hwndParent, lprcPosRect, lprcClipRect)) )
135 if( NULL != p_inPlaceSite )
136 p_inPlaceSite->Release();
137 return OLEOBJ_S_CANNOT_DOVERB_NOW;
140 if( NULL != p_inPlaceSite )
141 p_inPlaceSite->OnPosRectChange(lprcPosRect);
143 pActiveSite->ShowObject();
144 _p_instance->setVisible(TRUE);
146 if( NULL != p_inPlaceSite )
148 p_inPlaceSite->OnInPlaceActivate();
149 p_inPlaceSite->Release();
154 switch( lpMsg->message )
157 case WM_LBUTTONDBLCLK:
158 doUIActivate(lpMsg, pActiveSite, hwndParent, lprcPosRect);
166 return OLEOBJ_S_CANNOT_DOVERB_NOW;
169 HRESULT VLCOleObject::doUIActivate(LPMSG lpMsg, LPOLECLIENTSITE pActiveSite, HWND hwndParent, LPCRECT lprcPosRect)
171 if( NULL != pActiveSite )
173 // check if already activated
174 if( ! _p_instance->isInPlaceActive() )
175 return OLE_E_NOT_INPLACEACTIVE;
177 LPOLEINPLACESITE p_inPlaceSite;
179 if( SUCCEEDED(pActiveSite->QueryInterface(IID_IOleInPlaceSite, (void**)&p_inPlaceSite)) )
181 p_inPlaceSite->OnUIActivate();
183 if( NULL != lprcPosRect )
185 p_inPlaceSite->OnPosRectChange(lprcPosRect);
187 p_inPlaceSite->Release();
190 pActiveSite->ShowObject();
191 _p_instance->setVisible(TRUE);
192 _p_instance->setFocus(TRUE);
199 STDMETHODIMP VLCOleObject::EnumAdvise(IEnumSTATDATA **ppEnumAdvise)
201 return _p_advise_holder->EnumAdvise(ppEnumAdvise);
204 STDMETHODIMP VLCOleObject::EnumVerbs(IEnumOleVerb **ppEnumOleVerb)
209 STDMETHODIMP VLCOleObject::GetClientSite(LPOLECLIENTSITE *ppClientSite)
211 if( NULL == ppClientSite )
214 if( NULL != _p_clientsite )
215 _p_clientsite->AddRef();
217 *ppClientSite = _p_clientsite;
221 STDMETHODIMP VLCOleObject::GetClipboardData(DWORD dwReserved, LPDATAOBJECT *ppDataObject)
226 STDMETHODIMP VLCOleObject::GetExtent(DWORD dwDrawAspect, SIZEL *pSizel)
231 STDMETHODIMP VLCOleObject::GetMiscStatus(DWORD dwAspect, DWORD *pdwStatus)
233 if( NULL != pdwStatus )
238 case DVASPECT_CONTENT:
239 *pdwStatus = OLEMISC_RECOMPOSEONRESIZE
240 | OLEMISC_CANTLINKINSIDE
242 | OLEMISC_ACTIVATEWHENVISIBLE
243 | OLEMISC_SETCLIENTSITEFIRST;
252 STDMETHODIMP VLCOleObject::GetMoniker(DWORD dwAssign, DWORD dwWhichMoniker, LPMONIKER *ppMoniker)
254 if( NULL != _p_clientsite )
255 return _p_clientsite->GetMoniker(dwAssign,dwWhichMoniker, ppMoniker);
260 STDMETHODIMP VLCOleObject::GetUserClassID(LPCLSID pClsid)
265 pClsid = const_cast<LPCLSID>(&_p_instance->getClassID());
269 STDMETHODIMP VLCOleObject::GetUserType(DWORD dwFormOfType, LPOLESTR *pszUserType)
274 STDMETHODIMP VLCOleObject::InitFromData(LPDATAOBJECT pDataObject, BOOL fCreation, DWORD dwReserved)
279 STDMETHODIMP VLCOleObject::IsUpToDate(void)
284 STDMETHODIMP VLCOleObject::SetClientSite(LPOLECLIENTSITE pClientSite)
286 if( NULL != _p_clientsite )
287 _p_clientsite->Release();
289 if( NULL != pClientSite )
291 pClientSite->AddRef();
294 ** retrieve container ambient properties
299 if( SUCCEEDED(GetObjectProperty(pClientSite, DISPID_AMBIENT_CODEPAGE, v)) )
301 _p_instance->setCodePage(V_I4(&v));
305 _p_clientsite = pClientSite;
306 _p_instance->onClientSiteChanged(pClientSite);
310 STDMETHODIMP VLCOleObject::SetColorScheme(LOGPALETTE *pLogpal)
315 STDMETHODIMP VLCOleObject::SetExtent(DWORD dwDrawAspect, SIZEL *pSizel)
320 STDMETHODIMP VLCOleObject::SetHostNames(LPCOLESTR szContainerApp, LPCOLESTR szContainerObj)
325 STDMETHODIMP VLCOleObject::SetMoniker(DWORD dwWhichMoniker, LPMONIKER pMoniker)
327 return _p_advise_holder->SendOnRename(pMoniker);
330 STDMETHODIMP VLCOleObject::Unadvise(DWORD dwConnection)
332 return _p_advise_holder->Unadvise(dwConnection);
335 STDMETHODIMP VLCOleObject::Update(void)