//------------------------------------------------------------------------ // // 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 _pBehaviorSite; CComPtr _pBehaviorSiteOM; DWORD _dwcpCookie; BOOL _fDisabledUI; CDPA _apMediaItems; BOOL _fPlaying; }; //------------------------------------------------------------------------ #endif // _MB_BEHAVE_H_