/*****************************************************************************
* oleobject.cpp: ActiveX control for VLC
*****************************************************************************
- * Copyright (C) 2005 VideoLAN
+ * Copyright (C) 2005 the VideoLAN team
*
* Authors: Damien Fouilleul <Damien.Fouilleul@laposte.net>
*
VLCOleObject::~VLCOleObject()
{
+ SetClientSite(NULL);
+ Close(OLECLOSE_NOSAVE);
_p_advise_holder->Release();
- SetClientSite(NULL);
};
STDMETHODIMP VLCOleObject::Advise(IAdviseSink *pAdvSink, DWORD *dwConnection)
STDMETHODIMP VLCOleObject::Close(DWORD dwSaveOption)
{
- _p_advise_holder->SendOnClose();
- OleFlushClipboard();
- return _p_instance->onClose(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,
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);
return S_OK;
default:
- return OLEOBJ_S_INVALIDVERB;
+ if( iVerb > 0 ) {
+ _p_instance->setVisible(TRUE);
+ doInPlaceActivate(lpMsg, pActiveSite, hwndParent, lprcPosRect);
+ return OLEOBJ_S_INVALIDVERB;
+ }
+ return E_NOTIMPL;
}
};
if( _p_instance->isInPlaceActive() )
{
// just attempt to show object then
- pActiveSite->ShowObject();
- _p_instance->setVisible(TRUE);
+ if( _p_instance->getVisible() )
+ pActiveSite->ShowObject();
return S_OK;
}
LPOLEINPLACEUIWINDOW p_inPlaceUIWindow;
OLEINPLACEFRAMEINFO oleFrameInfo;
+ oleFrameInfo.cb = sizeof(OLEINPLACEFRAMEINFO);
if( SUCCEEDED(p_inPlaceSite->GetWindowContext(&p_inPlaceFrame, &p_inPlaceUIWindow, &posRect, &clipRect, &oleFrameInfo)) )
{
lprcPosRect = &posRect;
STDMETHODIMP VLCOleObject::EnumVerbs(IEnumOleVerb **ppEnumOleVerb)
{
- return OLE_S_USEREG;
+ return OleRegEnumVerbs(_p_instance->getClassID(),
+ ppEnumOleVerb);
};
STDMETHODIMP VLCOleObject::GetClientSite(LPOLECLIENTSITE *ppClientSite)
STDMETHODIMP VLCOleObject::GetClipboardData(DWORD dwReserved, LPDATAOBJECT *ppDataObject)
{
- return E_NOTIMPL;
+ return _p_instance->pUnkOuter->QueryInterface(IID_IDataObject, (void **)ppDataObject);
};
STDMETHODIMP VLCOleObject::GetExtent(DWORD dwDrawAspect, SIZEL *pSizel)
STDMETHODIMP VLCOleObject::GetMiscStatus(DWORD dwAspect, DWORD *pdwStatus)
{
- if( NULL != pdwStatus )
+ if( NULL == pdwStatus )
return E_POINTER;
switch( dwAspect )
if( NULL == pClsid )
return E_POINTER;
- pClsid = const_cast<LPCLSID>(&_p_instance->getClassID());
+ *pClsid = _p_instance->getClassID();
return S_OK;
};
STDMETHODIMP VLCOleObject::GetUserType(DWORD dwFormOfType, LPOLESTR *pszUserType)
{
- return OLE_S_USEREG;
+ return OleRegGetUserType(_p_instance->getClassID(),
+ dwFormOfType, pszUserType);
};
STDMETHODIMP VLCOleObject::InitFromData(LPDATAOBJECT pDataObject, BOOL fCreation, DWORD dwReserved)
STDMETHODIMP VLCOleObject::SetClientSite(LPOLECLIENTSITE pClientSite)
{
-
- if( NULL != pClientSite )
- {
- pClientSite->AddRef();
-
- /*
- ** retrieve container ambient properties
- */
- VARIANT v;
- VariantInit(&v);
- V_VT(&v) = VT_I4;
- if( SUCCEEDED(GetObjectProperty(pClientSite, DISPID_AMBIENT_CODEPAGE, v)) )
- {
- _p_instance->setCodePage(V_I4(&v));
- VariantClear(&v);
- }
- }
-
if( NULL != _p_clientsite )
_p_clientsite->Release();
_p_clientsite = pClientSite;
- _p_instance->onClientSiteChanged(pClientSite);
+ if( NULL != pClientSite )
+ {
+ pClientSite->AddRef();
+ _p_instance->onAmbientChanged(pClientSite, DISPID_UNKNOWN);
+ }
return S_OK;
};