windows-nt/Source/XPSP1/NT/shell/browseui/mbbehave.h
2020-09-26 16:20:57 +08:00

324 lines
12 KiB
C++

//------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 2001
//
// File: mbBehave.h
//
// Contents: mediaBar player behavior
//
// Classes: CMediaBehavior
//
//------------------------------------------------------------------------
#ifndef _MB_BEHAVE_H_
#define _MB_BEHAVE_H_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include "dpa.h"
#include "dspsprt.h"
class CMediaBand;
class CMediaBehavior;
interface IMediaBehaviorContentProxy : public IUnknown
{
STDMETHOD(IsDisableUIRequested)(BOOL *pfRequested) PURE;
STDMETHOD(OnUserOverrideDisableUI)(void) PURE;
STDMETHOD(IsNextEnabled)(BOOL *pfEnabled) PURE;
};
// {F4C74D34-AB35-4d67-A7CF-7845548F45A8}
DEFINE_GUID(IID_IMediaBehaviorContentProxy, 0xf4c74d34, 0xab35, 0x4d67, 0xa7, 0xcf, 0x78, 0x45, 0x54, 0x8f, 0x45, 0xa8);
/*
interface IMediaHost2 : public IMediaHost
{
virtual STDMETHOD(DetachBehavior)(void) PURE;
virtual STDMETHOD(OnDisableUIChanged)(BOOL fDisabled) PURE;
};
// {895EBF7E-ECA0-4ba8-B0F2-89DEBF70DE65}
DEFINE_GUID(IID_IMediaHost2, 0x895ebf7e, 0xeca0, 0x4ba8, 0xb0, 0xf2, 0x89, 0xde, 0xbf, 0x70, 0xde, 0x65);
*/
//------------------------------------------------------------------------
//------------------------------------------------------------------------
// need an additional operator to easily assign from VARIANTs
class CComDispatchDriverEx : public CComDispatchDriver
{
public:
IDispatch* operator=(VARIANT vt)
{
IDispatch *pThis = NULL;
ASSERT((V_VT(&vt) == VT_UNKNOWN) || (V_VT(&vt) == VT_DISPATCH));
if (V_VT(&vt) == VT_UNKNOWN)
{
pThis = (IDispatch*) AtlComQIPtrAssign((IUnknown**)&p, V_UNKNOWN(&vt), IID_IDispatch);
}
else if (V_VT(&vt) == VT_DISPATCH)
{
pThis = (IDispatch*)AtlComPtrAssign((IUnknown**)&p, V_DISPATCH(&vt));
}
// ISSUE could make more efforts to accept REF variants too
return pThis;
}
// get a property by name with a single parameter
HRESULT GetPropertyByName1(LPCOLESTR lpsz, VARIANT* pvarParam1, VARIANT* pVar)
{
DISPID dwDispID;
HRESULT hr = GetIDOfName(lpsz, &dwDispID);
if (SUCCEEDED(hr))
{
DISPPARAMS dispparams = { pvarParam1, NULL, 1, 0};
return p->Invoke(dwDispID, IID_NULL,
LOCALE_USER_DEFAULT, DISPATCH_PROPERTYGET,
&dispparams, pVar, NULL, NULL);
}
return hr;
}
};
//------------------------------------------------------------------------
//------------------------------------------------------------------------
class CWMPWrapper
{
public:
HRESULT AttachToWMP();
protected:
virtual HRESULT FetchWmpObject(IDispatch *pdispWmpPlayer, OUT VARIANT *pvtWrapperObj) = 0;
STDMETHODIMP_(ULONG) _AddRef(void)
{
_cRef++;
return _cRef;
}
STDMETHODIMP_(ULONG) _Release(void)
{
ASSERT(_cRef > 0);
_cRef--;
if (_cRef > 0) return _cRef;
delete this;
return 0;
}
HRESULT _getVariantProp(LPCOLESTR pwszPropName, VARIANT *pvtParam, VARIANT *pvtValue, BOOL fCallMethod = FALSE);
HRESULT _getStringProp(LPCOLESTR pwszPropName, VARIANT *pvtParam, OUT BSTR *pbstrValue, BOOL fCallMethod = FALSE);
protected:
CWMPWrapper(CMediaBehavior* pHost);
virtual ~CWMPWrapper();
protected:
CMediaBehavior * _pHost;
CComDispatchDriverEx _pwmpWrapper;
BOOL _fStale;
private:
ULONG _cRef;
};
//------------------------------------------------------------------------
//------------------------------------------------------------------------
class CMediaItem : public CWMPWrapper,
public IMediaItem,
protected CImpIDispatch
{
typedef CWMPWrapper super;
public:
// *** IUnknown ***
STDMETHOD(QueryInterface)(REFIID riid, LPVOID * ppvObj);
STDMETHODIMP_(ULONG) AddRef(void) { return _AddRef(); }
STDMETHODIMP_(ULONG) Release(void) { return _Release(); }
// *** IDispatch ***
virtual STDMETHODIMP GetTypeInfoCount(UINT * pctinfo)
{ return CImpIDispatch::GetTypeInfoCount(pctinfo); }
virtual STDMETHODIMP GetTypeInfo(UINT itinfo, LCID lcid, ITypeInfo **pptinfo)
{ return CImpIDispatch::GetTypeInfo(itinfo, lcid, pptinfo); }
virtual STDMETHODIMP GetIDsOfNames(REFIID riid, OLECHAR **rgszNames, UINT cNames, LCID lcid, DISPID * rgdispid)
{ return CImpIDispatch::GetIDsOfNames(riid, rgszNames, cNames, lcid, rgdispid); }
virtual STDMETHODIMP Invoke(DISPID dispidMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS * pdispparams, VARIANT * pvarResult, EXCEPINFO * pexcepinfo, UINT * puArgErr)
{ return CImpIDispatch::Invoke(dispidMember, riid, lcid, wFlags, pdispparams, pvarResult, pexcepinfo, puArgErr); }
// *** IMediaItem
STDMETHOD(get_sourceURL)(BSTR *pbstrSourceURL);
STDMETHOD(get_name)(BSTR *pbstrName);
STDMETHOD(get_duration)(double * pDuration);
STDMETHOD(get_attributeCount)(long *plCount);
STDMETHOD(getAttributeName)(long lIndex, BSTR *pbstrItemName);
STDMETHOD(getItemInfo)(BSTR bstrItemName, BSTR *pbstrVal);
protected:
virtual HRESULT FetchWmpObject(IDispatch *pdispWmpPlayer, OUT VARIANT *pvtWrapperObj);
friend CMediaItem* CMediaItem_CreateInstance(CMediaBehavior* pHost);
CMediaItem(CMediaBehavior* pHost);
virtual ~CMediaItem();
private:
};
//------------------------------------------------------------------------
//------------------------------------------------------------------------
class CMediaItemNext : public CMediaItem
{
public:
protected:
virtual HRESULT FetchWmpObject(IDispatch *pdispWmpPlayer, OUT VARIANT *pvtWrapperObj);
friend CMediaItemNext* CMediaItemNext_CreateInstance(CMediaBehavior* pHost);
CMediaItemNext(CMediaBehavior* pHost);
virtual ~CMediaItemNext();
private:
};
//------------------------------------------------------------------------
//------------------------------------------------------------------------
class CPlaylistInfo : public CWMPWrapper,
public IPlaylistInfo,
protected CImpIDispatch
{
typedef CWMPWrapper super;
public:
// *** IUnknown ***
STDMETHOD(QueryInterface)(REFIID riid, LPVOID * ppvObj);
STDMETHODIMP_(ULONG) AddRef(void) { return _AddRef(); }
STDMETHODIMP_(ULONG) Release(void) { return _Release(); }
// *** IDispatch ***
virtual STDMETHODIMP GetTypeInfoCount(UINT * pctinfo)
{ return CImpIDispatch::GetTypeInfoCount(pctinfo); }
virtual STDMETHODIMP GetTypeInfo(UINT itinfo, LCID lcid, ITypeInfo **pptinfo)
{ return CImpIDispatch::GetTypeInfo(itinfo, lcid, pptinfo); }
virtual STDMETHODIMP GetIDsOfNames(REFIID riid, OLECHAR **rgszNames, UINT cNames, LCID lcid, DISPID * rgdispid)
{ return CImpIDispatch::GetIDsOfNames(riid, rgszNames, cNames, lcid, rgdispid); }
virtual STDMETHODIMP Invoke(DISPID dispidMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS * pdispparams, VARIANT * pvarResult, EXCEPINFO * pexcepinfo, UINT * puArgErr)
{ return CImpIDispatch::Invoke(dispidMember, riid, lcid, wFlags, pdispparams, pvarResult, pexcepinfo, puArgErr); }
// *** IPlaylistInfo
STDMETHOD(get_name)(BSTR *pbstrName);
STDMETHOD(get_attributeCount)(long *plCount);
STDMETHOD(getAttributeName)(long lIndex, BSTR *pbstrItemName);
STDMETHOD(getItemInfo)(BSTR bstrItemName, BSTR *pbstrVal);
protected:
virtual HRESULT FetchWmpObject(IDispatch *pdispWmpPlayer, OUT VARIANT *pvtWrapperObj);
friend CPlaylistInfo* CPlaylistInfo_CreateInstance(CMediaBehavior* pHost);
CPlaylistInfo(CMediaBehavior* pHost);
private:
virtual ~CPlaylistInfo();
private:
};
//------------------------------------------------------------------------
//------------------------------------------------------------------------
class CMediaBehavior : public IMediaBehavior,
public IElementBehavior,
public IContentProxy,
public IMediaBehaviorContentProxy,
protected CImpIDispatch
{
public:
// *** IUnknown ***
STDMETHOD(QueryInterface)(REFIID riid, LPVOID * ppvObj);
STDMETHODIMP_(ULONG) AddRef(void)
{
_cRef++;
return _cRef;
}
STDMETHODIMP_(ULONG) Release(void)
{
ASSERT(_cRef > 0);
_cRef--;
if (_cRef > 0) return _cRef;
delete this;
return 0;
}
// *** IDispatch ***
virtual STDMETHODIMP GetTypeInfoCount(UINT * pctinfo)
{ return CImpIDispatch::GetTypeInfoCount(pctinfo); }
virtual STDMETHODIMP GetTypeInfo(UINT itinfo, LCID lcid, ITypeInfo **pptinfo)
{ return CImpIDispatch::GetTypeInfo(itinfo, lcid, pptinfo); }
virtual STDMETHODIMP GetIDsOfNames(REFIID riid, OLECHAR **rgszNames, UINT cNames, LCID lcid, DISPID * rgdispid)
{ return CImpIDispatch::GetIDsOfNames(riid, rgszNames, cNames, lcid, rgdispid); }
virtual STDMETHODIMP Invoke(DISPID dispidMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS * pdispparams, VARIANT * pvarResult, EXCEPINFO * pexcepinfo, UINT * puArgErr);
// *** IElementBehavior ***
STDMETHOD(Detach)(void);
STDMETHOD(Init)(IElementBehaviorSite* pBehaviorSite);
STDMETHOD(Notify)(LONG lEvent, VARIANT* pVar);
// *** IMediaBehavior ***
STDMETHOD(playURL)(BSTR bstrURL, BSTR bstrMIME);
STDMETHOD(stop)();
STDMETHOD(playNext)();
STDMETHOD(get_currentItem)(IMediaItem **ppMediaItem);
STDMETHOD(get_nextItem)(IMediaItem **ppMediaItem);
STDMETHOD(get_playlistInfo)(IPlaylistInfo **ppPlaylistInfo);
STDMETHOD(get_hasNextItem)(VARIANT_BOOL *pfhasNext);
STDMETHOD(get_playState)(mbPlayState *pps);
STDMETHOD(get_openState)(mbOpenState *pos);
STDMETHOD(get_enabled)(VARIANT_BOOL *pbEnabled);
STDMETHOD(put_enabled)(VARIANT_BOOL bEnabled);
STDMETHOD(get_disabledUI)(VARIANT_BOOL *pbDisabled);
STDMETHOD(put_disabledUI)(VARIANT_BOOL bDisable);
// *** IContentProxy **
STDMETHOD(fireEvent)(enum contentProxyEvent event);
STDMETHOD(OnCreatedPlayer)(void);
STDMETHOD(detachPlayer)(void);
// *** IMediaBehaviorContentProxy **
STDMETHOD(IsDisableUIRequested)(BOOL *pfRequested);
STDMETHOD(OnUserOverrideDisableUI)(void);
STDMETHOD(IsNextEnabled)(BOOL *pfEnabled);
HRESULT getWMP(IDispatch **ppPlayer);
HRESULT getPlayListIndex(LONG *plIndex, LONG *plCount);
protected:
friend CMediaBehavior* CMediaBehavior_CreateInstance(CMediaBand* pHost);
CMediaBehavior(CMediaBand* pHost);
private:
virtual ~CMediaBehavior();
private:
HRESULT _ConnectToWmpEvents(BOOL fConnect);
BOOL _ProcessEvent(DISPID dispid, long lCount, VARIANT varParams[]);
private:
ULONG _cRef;
CMediaBand * _pHost;
CComPtr<IElementBehaviorSite> _pBehaviorSite;
CComPtr<IElementBehaviorSiteOM> _pBehaviorSiteOM;
DWORD _dwcpCookie;
BOOL _fDisabledUI;
CDPA<CMediaItem> _apMediaItems;
BOOL _fPlaying;
};
//------------------------------------------------------------------------
#endif // _MB_BEHAVE_H_