-/*****************************************************************************\r
- * oleobject.cpp: ActiveX control for VLC\r
- *****************************************************************************\r
- * Copyright (C) 2005 VideoLAN\r
- *\r
- * Authors: Damien Fouilleul <Damien.Fouilleul@laposte.net>\r
- *\r
- * This program is free software; you can redistribute it and/or modify\r
- * it under the terms of the GNU General Public License as published by\r
- * the Free Software Foundation; either version 2 of the License, or\r
- * (at your option) any later version.\r
- *\r
- * This program is distributed in the hope that it will be useful,\r
- * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r
- * GNU General Public License for more details.\r
- *\r
- * You should have received a copy of the GNU General Public License\r
- * along with this program; if not, write to the Free Software\r
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA.\r
- *****************************************************************************/\r
-\r
-#include "plugin.h"\r
-#include "oleobject.h"\r
-\r
-#include "utils.h"\r
-\r
-#include <docobj.h>\r
-\r
-using namespace std;\r
-\r
-VLCOleObject::VLCOleObject(VLCPlugin *p_instance) :\r
-_p_clientsite(NULL), _p_instance(p_instance) \r
-{\r
- CreateOleAdviseHolder(&_p_advise_holder);\r
-};\r
-\r
-VLCOleObject::~VLCOleObject()\r
-{\r
- _p_advise_holder->Release();\r
- SetClientSite(NULL); \r
-};\r
-\r
-STDMETHODIMP VLCOleObject::Advise(IAdviseSink *pAdvSink, DWORD *dwConnection)\r
-{\r
- return _p_advise_holder->Advise(pAdvSink, dwConnection);\r
-};\r
-\r
-STDMETHODIMP VLCOleObject::Close(DWORD dwSaveOption)\r
-{\r
- _p_advise_holder->SendOnClose();\r
- OleFlushClipboard();\r
- return _p_instance->onClose(dwSaveOption);\r
-};\r
-\r
-STDMETHODIMP VLCOleObject::DoVerb(LONG iVerb, LPMSG lpMsg, LPOLECLIENTSITE pActiveSite,\r
- LONG lIndex, HWND hwndParent, LPCRECT lprcPosRect)\r
-{\r
- if( 0 != lIndex )\r
- return DV_E_LINDEX;\r
-\r
- switch( iVerb )\r
- {\r
- case OLEIVERB_PRIMARY:\r
- case OLEIVERB_SHOW:\r
- case OLEIVERB_OPEN:\r
- case OLEIVERB_INPLACEACTIVATE:\r
- if( NULL == hwndParent )\r
- return OLEOBJ_S_INVALIDHWND;\r
-\r
- if( SUCCEEDED(doInPlaceActivate(lpMsg, pActiveSite, hwndParent, lprcPosRect)) )\r
- return S_OK;\r
-\r
- return OLEOBJ_S_CANNOT_DOVERB_NOW;\r
-\r
- case OLEIVERB_HIDE:\r
- _p_instance->setVisible(FALSE);\r
- return S_OK;\r
-\r
- case OLEIVERB_UIACTIVATE:\r
- return doUIActivate(lpMsg, pActiveSite, hwndParent, lprcPosRect);\r
-\r
- case OLEIVERB_DISCARDUNDOSTATE:\r
- return S_OK;\r
-\r
- default:\r
- if( NULL == hwndParent )\r
- return OLEOBJ_S_INVALIDHWND;\r
-\r
- if( SUCCEEDED(doInPlaceActivate(lpMsg, pActiveSite, hwndParent, lprcPosRect)) )\r
- return OLEOBJ_S_INVALIDVERB;\r
-\r
- return OLEOBJ_S_CANNOT_DOVERB_NOW;\r
- }\r
-};\r
-\r
-HRESULT VLCOleObject::doInPlaceActivate(LPMSG lpMsg, LPOLECLIENTSITE pActiveSite, HWND hwndParent, LPCRECT lprcPosRect)\r
-{\r
- RECT posRect;\r
- RECT clipRect;\r
- LPCRECT lprcClipRect = lprcPosRect;\r
-\r
- if( NULL != pActiveSite )\r
- {\r
- // check if already activated\r
- if( _p_instance->isInPlaceActive() )\r
- {\r
- // just attempt to show object then\r
- pActiveSite->ShowObject();\r
- _p_instance->setVisible(TRUE);\r
- return S_OK;\r
- }\r
-\r
- LPOLEINPLACESITE p_inPlaceSite;\r
-\r
- if( SUCCEEDED(pActiveSite->QueryInterface(IID_IOleInPlaceSite, (void**)&p_inPlaceSite)) )\r
- {\r
- if( S_OK != p_inPlaceSite->CanInPlaceActivate() )\r
- return E_FAIL;\r
-\r
- LPOLEINPLACEFRAME p_inPlaceFrame;\r
- LPOLEINPLACEUIWINDOW p_inPlaceUIWindow;\r
- OLEINPLACEFRAMEINFO oleFrameInfo;\r
-\r
- if( SUCCEEDED(p_inPlaceSite->GetWindowContext(&p_inPlaceFrame, &p_inPlaceUIWindow, &posRect, &clipRect, &oleFrameInfo)) )\r
- {\r
- lprcPosRect = &posRect;\r
- lprcClipRect = &clipRect;\r
-\r
- if( NULL != p_inPlaceFrame )\r
- p_inPlaceFrame->Release();\r
- if( NULL != p_inPlaceUIWindow )\r
- p_inPlaceUIWindow->Release();\r
- }\r
- }\r
-\r
- if( FAILED(_p_instance->onActivateInPlace(lpMsg, hwndParent, lprcPosRect, lprcClipRect)) )\r
- return E_FAIL;\r
-\r
- if( NULL != p_inPlaceSite )\r
- p_inPlaceSite->OnPosRectChange(lprcPosRect);\r
-\r
- pActiveSite->ShowObject();\r
- _p_instance->setVisible(TRUE);\r
-\r
- if( NULL != p_inPlaceSite )\r
- {\r
- p_inPlaceSite->OnInPlaceActivate();\r
- p_inPlaceSite->Release();\r
- }\r
-\r
- if( NULL != lpMsg )\r
- {\r
- switch( lpMsg->message )\r
- {\r
- case WM_LBUTTONDOWN:\r
- case WM_LBUTTONDBLCLK:\r
- doUIActivate(lpMsg, pActiveSite, hwndParent, lprcPosRect);\r
- break;\r
- default:\r
- break;\r
- }\r
- }\r
- return S_OK;\r
- }\r
- return E_FAIL;\r
-};\r
-\r
-HRESULT VLCOleObject::doUIActivate(LPMSG lpMsg, LPOLECLIENTSITE pActiveSite, HWND hwndParent, LPCRECT lprcPosRect)\r
-{\r
- if( NULL != pActiveSite )\r
- {\r
- // check if already activated\r
- if( ! _p_instance->isInPlaceActive() )\r
- return OLE_E_NOT_INPLACEACTIVE;\r
-\r
- LPOLEINPLACESITE p_inPlaceSite;\r
-\r
- if( SUCCEEDED(pActiveSite->QueryInterface(IID_IOleInPlaceSite, (void**)&p_inPlaceSite)) )\r
- {\r
- p_inPlaceSite->OnUIActivate();\r
-\r
- if( NULL != lprcPosRect )\r
- {\r
- p_inPlaceSite->OnPosRectChange(lprcPosRect);\r
- }\r
- p_inPlaceSite->Release();\r
- }\r
-\r
- pActiveSite->ShowObject();\r
- _p_instance->setVisible(TRUE);\r
- _p_instance->setFocus(TRUE);\r
-\r
- return S_OK;\r
- }\r
- return E_FAIL;\r
-};\r
-\r
-STDMETHODIMP VLCOleObject::EnumAdvise(IEnumSTATDATA **ppEnumAdvise)\r
-{\r
- return _p_advise_holder->EnumAdvise(ppEnumAdvise);\r
-};\r
-\r
-STDMETHODIMP VLCOleObject::EnumVerbs(IEnumOleVerb **ppEnumOleVerb)\r
-{\r
- return OLE_S_USEREG;\r
-};\r
-\r
-STDMETHODIMP VLCOleObject::GetClientSite(LPOLECLIENTSITE *ppClientSite)\r
-{\r
- if( NULL == ppClientSite )\r
- return E_POINTER;\r
- \r
- if( NULL != _p_clientsite )\r
- _p_clientsite->AddRef(); \r
-\r
- *ppClientSite= _p_clientsite;\r
- return S_OK;\r
-};\r
-\r
-STDMETHODIMP VLCOleObject::GetClipboardData(DWORD dwReserved, LPDATAOBJECT *ppDataObject)\r
-{\r
- return E_NOTIMPL;\r
-};\r
-\r
-STDMETHODIMP VLCOleObject::GetExtent(DWORD dwDrawAspect, SIZEL *pSizel)\r
-{\r
- return E_NOTIMPL;\r
-};\r
-\r
-STDMETHODIMP VLCOleObject::GetMiscStatus(DWORD dwAspect, DWORD *pdwStatus)\r
-{\r
- if( NULL != pdwStatus )\r
- return E_POINTER;\r
-\r
- switch( dwAspect )\r
- {\r
- case DVASPECT_CONTENT:\r
- *pdwStatus = OLEMISC_RECOMPOSEONRESIZE\r
- | OLEMISC_CANTLINKINSIDE\r
- | OLEMISC_INSIDEOUT\r
- | OLEMISC_ACTIVATEWHENVISIBLE\r
- | OLEMISC_SETCLIENTSITEFIRST;\r
- break;\r
- default:\r
- *pdwStatus = 0;\r
- }\r
-\r
- return S_OK;\r
-};\r
-\r
-STDMETHODIMP VLCOleObject::GetMoniker(DWORD dwAssign, DWORD dwWhichMoniker, LPMONIKER *ppMoniker)\r
-{\r
- if( NULL != _p_clientsite )\r
- return _p_clientsite->GetMoniker(dwAssign,dwWhichMoniker, ppMoniker);\r
- \r
- return E_UNEXPECTED;\r
-};\r
-\r
-STDMETHODIMP VLCOleObject::GetUserClassID(LPCLSID pClsid)\r
-{\r
- if( NULL == pClsid )\r
- return E_POINTER;\r
- \r
- pClsid = const_cast<LPCLSID>(&_p_instance->getClassID()); \r
- return S_OK;\r
-};\r
-\r
-STDMETHODIMP VLCOleObject::GetUserType(DWORD dwFormOfType, LPOLESTR *pszUserType)\r
-{\r
- return OLE_S_USEREG;\r
-};\r
-\r
-STDMETHODIMP VLCOleObject::InitFromData(LPDATAOBJECT pDataObject, BOOL fCreation, DWORD dwReserved)\r
-{\r
- return E_NOTIMPL;\r
-};\r
-\r
-STDMETHODIMP VLCOleObject::IsUpToDate(void)\r
-{\r
- return S_OK;\r
-};\r
-\r
-STDMETHODIMP VLCOleObject::SetClientSite(LPOLECLIENTSITE pClientSite)\r
-{\r
- if( NULL != _p_clientsite )\r
- _p_clientsite->Release(); \r
- \r
- if( NULL != pClientSite )\r
- {\r
- pClientSite->AddRef();\r
-\r
- /*\r
- ** retrieve container ambient properties\r
- */\r
- VARIANT v;\r
- VariantInit(&v);\r
- V_VT(&v) = VT_I4;\r
- if( SUCCEEDED(GetObjectProperty(pClientSite, DISPID_AMBIENT_CODEPAGE, v)) )\r
- {\r
- _p_instance->setCodePage(V_I4(&v));\r
- VariantClear(&v);\r
- }\r
- }\r
-\r
- _p_clientsite = pClientSite;\r
- return S_OK;\r
-};\r
-\r
-STDMETHODIMP VLCOleObject::SetColorScheme(LOGPALETTE *pLogpal)\r
-{\r
- return E_NOTIMPL;\r
-};\r
-\r
-STDMETHODIMP VLCOleObject::SetExtent(DWORD dwDrawAspect, SIZEL *pSizel)\r
-{\r
- return E_NOTIMPL;\r
-};\r
-\r
-STDMETHODIMP VLCOleObject::SetHostNames(LPCOLESTR szContainerApp, LPCOLESTR szContainerObj)\r
-{\r
- return S_OK;\r
-};\r
-\r
-STDMETHODIMP VLCOleObject::SetMoniker(DWORD dwWhichMoniker, LPMONIKER pMoniker)\r
-{\r
- return _p_advise_holder->SendOnRename(pMoniker);\r
-};\r
-\r
-STDMETHODIMP VLCOleObject::Unadvise(DWORD dwConnection)\r
-{\r
- return _p_advise_holder->Unadvise(dwConnection);\r
-};\r
-\r
-STDMETHODIMP VLCOleObject::Update(void)\r
-{\r
- return S_OK;\r
-};\r
-\r
+/*****************************************************************************
+ * oleobject.cpp: ActiveX control for VLC
+ *****************************************************************************
+ * Copyright (C) 2005 the VideoLAN team
+ *
+ * Authors: Damien Fouilleul <Damien.Fouilleul@laposte.net>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
+ *****************************************************************************/
+
+#include "plugin.h"
+#include "oleobject.h"
+
+#include "utils.h"
+
+#include <docobj.h>
+
+using namespace std;
+
+VLCOleObject::VLCOleObject(VLCPlugin *p_instance) :
+_p_clientsite(NULL), _p_instance(p_instance)
+{
+ CreateOleAdviseHolder(&_p_advise_holder);
+};
+
+VLCOleObject::~VLCOleObject()
+{
+ SetClientSite(NULL);
+ Close(OLECLOSE_NOSAVE);
+ _p_advise_holder->Release();
+};
+
+STDMETHODIMP VLCOleObject::Advise(IAdviseSink *pAdvSink, DWORD *dwConnection)
+{
+ return _p_advise_holder->Advise(pAdvSink, dwConnection);
+};
+
+STDMETHODIMP VLCOleObject::Close(DWORD dwSaveOption)
+{
+ if( _p_instance->isRunning() )
+ {
+ _p_advise_holder->SendOnClose();
+ return _p_instance->onClose(dwSaveOption);
+ }
+ return S_OK;
+};
+
+STDMETHODIMP VLCOleObject::DoVerb(LONG iVerb, LPMSG lpMsg, LPOLECLIENTSITE pActiveSite,
+ LONG lIndex, HWND hwndParent, LPCRECT lprcPosRect)
+{
+ switch( iVerb )
+ {
+ case OLEIVERB_PRIMARY:
+ case OLEIVERB_SHOW:
+ case OLEIVERB_OPEN:
+ // force control to be visible when activating in place
+ _p_instance->setVisible(TRUE);
+ case OLEIVERB_INPLACEACTIVATE:
+ return doInPlaceActivate(lpMsg, pActiveSite, hwndParent, lprcPosRect);
+
+ case OLEIVERB_HIDE:
+ _p_instance->setVisible(FALSE);
+ return S_OK;
+
+ case OLEIVERB_UIACTIVATE:
+ return doUIActivate(lpMsg, pActiveSite, hwndParent, lprcPosRect);
+
+ case OLEIVERB_DISCARDUNDOSTATE:
+ return S_OK;
+
+ default:
+ if( iVerb > 0 ) {
+ _p_instance->setVisible(TRUE);
+ doInPlaceActivate(lpMsg, pActiveSite, hwndParent, lprcPosRect);
+ return OLEOBJ_S_INVALIDVERB;
+ }
+ return E_NOTIMPL;
+ }
+};
+
+HRESULT VLCOleObject::doInPlaceActivate(LPMSG lpMsg, LPOLECLIENTSITE pActiveSite, HWND hwndParent, LPCRECT lprcPosRect)
+{
+ RECT posRect;
+ RECT clipRect;
+ LPCRECT lprcClipRect = lprcPosRect;
+
+ if( NULL != pActiveSite )
+ {
+ // check if already activated
+ if( _p_instance->isInPlaceActive() )
+ {
+ // just attempt to show object then
+ if( _p_instance->getVisible() )
+ pActiveSite->ShowObject();
+ return S_OK;
+ }
+
+ LPOLEINPLACESITE p_inPlaceSite;
+
+ if( SUCCEEDED(pActiveSite->QueryInterface(IID_IOleInPlaceSite, (void**)&p_inPlaceSite)) )
+ {
+ if( S_OK != p_inPlaceSite->CanInPlaceActivate() )
+ {
+ return OLEOBJ_S_CANNOT_DOVERB_NOW;
+ }
+
+ LPOLEINPLACEFRAME p_inPlaceFrame;
+ LPOLEINPLACEUIWINDOW p_inPlaceUIWindow;
+ OLEINPLACEFRAMEINFO oleFrameInfo;
+
+ oleFrameInfo.cb = sizeof(OLEINPLACEFRAMEINFO);
+ if( SUCCEEDED(p_inPlaceSite->GetWindowContext(&p_inPlaceFrame, &p_inPlaceUIWindow, &posRect, &clipRect, &oleFrameInfo)) )
+ {
+ lprcPosRect = &posRect;
+ lprcClipRect = &clipRect;
+
+ if( NULL != p_inPlaceFrame )
+ p_inPlaceFrame->Release();
+ if( NULL != p_inPlaceUIWindow )
+ p_inPlaceUIWindow->Release();
+ }
+
+ if( (NULL == hwndParent) && FAILED(p_inPlaceSite->GetWindow(&hwndParent)) )
+ {
+ p_inPlaceSite->Release();
+ return OLEOBJ_S_INVALIDHWND;
+ }
+ }
+ else if( NULL == hwndParent )
+ {
+ return OLEOBJ_S_INVALIDHWND;
+ }
+ else if( NULL == lprcPosRect )
+ {
+ SetRect(&posRect, 0, 0, 0, 0);
+ lprcPosRect = &posRect;
+ lprcClipRect = &posRect;
+ }
+
+ if( FAILED(_p_instance->onActivateInPlace(lpMsg, hwndParent, lprcPosRect, lprcClipRect)) )
+ {
+ if( NULL != p_inPlaceSite )
+ p_inPlaceSite->Release();
+ return OLEOBJ_S_CANNOT_DOVERB_NOW;
+ }
+
+ if( NULL != p_inPlaceSite )
+ {
+ p_inPlaceSite->OnInPlaceActivate();
+ p_inPlaceSite->OnPosRectChange(lprcPosRect);
+ p_inPlaceSite->Release();
+ }
+
+ pActiveSite->ShowObject();
+ _p_instance->setVisible(TRUE);
+
+ if( NULL != lpMsg )
+ {
+ switch( lpMsg->message )
+ {
+ case WM_LBUTTONDOWN:
+ case WM_LBUTTONDBLCLK:
+ doUIActivate(lpMsg, pActiveSite, hwndParent, lprcPosRect);
+ break;
+ default:
+ break;
+ }
+ }
+ return S_OK;
+ }
+ return OLEOBJ_S_CANNOT_DOVERB_NOW;
+};
+
+HRESULT VLCOleObject::doUIActivate(LPMSG lpMsg, LPOLECLIENTSITE pActiveSite, HWND hwndParent, LPCRECT lprcPosRect)
+{
+ if( NULL != pActiveSite )
+ {
+ // check if already activated
+ if( ! _p_instance->isInPlaceActive() )
+ return OLE_E_NOT_INPLACEACTIVE;
+
+ LPOLEINPLACESITE p_inPlaceSite;
+
+ if( SUCCEEDED(pActiveSite->QueryInterface(IID_IOleInPlaceSite, (void**)&p_inPlaceSite)) )
+ {
+ p_inPlaceSite->OnUIActivate();
+
+ if( NULL != lprcPosRect )
+ {
+ p_inPlaceSite->OnPosRectChange(lprcPosRect);
+ }
+ p_inPlaceSite->Release();
+ }
+
+ pActiveSite->ShowObject();
+ _p_instance->setVisible(TRUE);
+ _p_instance->setFocus(TRUE);
+
+ return S_OK;
+ }
+ return E_FAIL;
+};
+
+STDMETHODIMP VLCOleObject::EnumAdvise(IEnumSTATDATA **ppEnumAdvise)
+{
+ return _p_advise_holder->EnumAdvise(ppEnumAdvise);
+};
+
+STDMETHODIMP VLCOleObject::EnumVerbs(IEnumOleVerb **ppEnumOleVerb)
+{
+ return OleRegEnumVerbs(_p_instance->getClassID(),
+ ppEnumOleVerb);
+};
+
+STDMETHODIMP VLCOleObject::GetClientSite(LPOLECLIENTSITE *ppClientSite)
+{
+ if( NULL == ppClientSite )
+ return E_POINTER;
+
+ if( NULL != _p_clientsite )
+ _p_clientsite->AddRef();
+
+ *ppClientSite = _p_clientsite;
+ return S_OK;
+};
+
+STDMETHODIMP VLCOleObject::GetClipboardData(DWORD dwReserved, LPDATAOBJECT *ppDataObject)
+{
+ return _p_instance->pUnkOuter->QueryInterface(IID_IDataObject, (void **)ppDataObject);
+};
+
+STDMETHODIMP VLCOleObject::GetExtent(DWORD dwDrawAspect, SIZEL *pSizel)
+{
+ if( NULL == pSizel )
+ return E_POINTER;
+
+ if( dwDrawAspect & DVASPECT_CONTENT )
+ {
+ *pSizel = _p_instance->getExtent();
+ return S_OK;
+ }
+ pSizel->cx= 0L;
+ pSizel->cy= 0L;
+ return E_NOTIMPL;
+};
+
+STDMETHODIMP VLCOleObject::GetMiscStatus(DWORD dwAspect, DWORD *pdwStatus)
+{
+ if( NULL == pdwStatus )
+ return E_POINTER;
+
+ switch( dwAspect )
+ {
+ case DVASPECT_CONTENT:
+ *pdwStatus = OLEMISC_RECOMPOSEONRESIZE
+ | OLEMISC_CANTLINKINSIDE
+ | OLEMISC_INSIDEOUT
+ | OLEMISC_ACTIVATEWHENVISIBLE
+ | OLEMISC_SETCLIENTSITEFIRST;
+ break;
+ default:
+ *pdwStatus = 0;
+ }
+
+ return S_OK;
+};
+
+STDMETHODIMP VLCOleObject::GetMoniker(DWORD dwAssign, DWORD dwWhichMoniker, LPMONIKER *ppMoniker)
+{
+ if( NULL != _p_clientsite )
+ return _p_clientsite->GetMoniker(dwAssign,dwWhichMoniker, ppMoniker);
+
+ return E_UNEXPECTED;
+};
+
+STDMETHODIMP VLCOleObject::GetUserClassID(LPCLSID pClsid)
+{
+ if( NULL == pClsid )
+ return E_POINTER;
+
+ *pClsid = _p_instance->getClassID();
+ return S_OK;
+};
+
+STDMETHODIMP VLCOleObject::GetUserType(DWORD dwFormOfType, LPOLESTR *pszUserType)
+{
+ return OleRegGetUserType(_p_instance->getClassID(),
+ dwFormOfType, pszUserType);
+};
+
+STDMETHODIMP VLCOleObject::InitFromData(LPDATAOBJECT pDataObject, BOOL fCreation, DWORD dwReserved)
+{
+ return E_NOTIMPL;
+};
+
+STDMETHODIMP VLCOleObject::IsUpToDate(void)
+{
+ return S_OK;
+};
+
+STDMETHODIMP VLCOleObject::SetClientSite(LPOLECLIENTSITE pClientSite)
+{
+ if( NULL != _p_clientsite )
+ _p_clientsite->Release();
+
+ _p_clientsite = pClientSite;
+
+ if( NULL != pClientSite )
+ {
+ pClientSite->AddRef();
+ _p_instance->onAmbientChanged(pClientSite, DISPID_UNKNOWN);
+ }
+ return S_OK;
+};
+
+STDMETHODIMP VLCOleObject::SetColorScheme(LOGPALETTE *pLogpal)
+{
+ return E_NOTIMPL;
+};
+
+STDMETHODIMP VLCOleObject::SetExtent(DWORD dwDrawAspect, SIZEL *pSizel)
+{
+ if( NULL == pSizel )
+ return E_POINTER;
+
+
+ if( dwDrawAspect & DVASPECT_CONTENT )
+ {
+ _p_instance->setExtent(*pSizel);
+
+ if( _p_instance->isInPlaceActive() )
+ {
+ LPOLEINPLACESITE p_inPlaceSite;
+
+ if( SUCCEEDED(_p_clientsite->QueryInterface(IID_IOleInPlaceSite, (void**)&p_inPlaceSite)) )
+ {
+ HWND hwnd;
+
+ if( SUCCEEDED(p_inPlaceSite->GetWindow(&hwnd)) )
+ {
+ // use HIMETRIC to pixel transform
+ RECT posRect = _p_instance->getPosRect();
+ HDC hDC = GetDC(hwnd);
+ posRect.right = (pSizel->cx*GetDeviceCaps(hDC, LOGPIXELSX)/2540L)+posRect.left;
+ posRect.bottom = (pSizel->cy*GetDeviceCaps(hDC, LOGPIXELSY)/2540L)+posRect.top;
+ DeleteDC(hDC);
+ p_inPlaceSite->OnPosRectChange(&posRect);
+ }
+ p_inPlaceSite->Release();
+ }
+ }
+ return S_OK;
+ }
+ return E_NOTIMPL;
+};
+
+STDMETHODIMP VLCOleObject::SetHostNames(LPCOLESTR szContainerApp, LPCOLESTR szContainerObj)
+{
+ return S_OK;
+};
+
+STDMETHODIMP VLCOleObject::SetMoniker(DWORD dwWhichMoniker, LPMONIKER pMoniker)
+{
+ return _p_advise_holder->SendOnRename(pMoniker);
+};
+
+STDMETHODIMP VLCOleObject::Unadvise(DWORD dwConnection)
+{
+ return _p_advise_holder->Unadvise(dwConnection);
+};
+
+STDMETHODIMP VLCOleObject::Update(void)
+{
+ return S_OK;
+};
+