windows-nt/Source/XPSP1/NT/multimedia/dshow/mfvideo/mswebdvd/wmp.h
2020-09-26 16:20:57 +08:00

293 lines
6.8 KiB
C++

//************************************************************
//
// Copyright (C) Microsoft Corporation, 1999
//
// FileName: wmp.h
//
// Description: Modified template for wmp pluging
//************************************************************
#ifndef _WMPPLUGINIMPL_H_
#define _WMPPLUGINIMPL_H_
#pragma once
//#include "wmputil.h"
#include "c:\wmp\private\wmp\dev\idl\plugin.h"
//#include "c:\wmp\private\wmp\dev\include\wmpcore.h"
//#include "color.h"
#include "c:\wmp\private\wmp\dev\include\dynarray.h"
#include "atlbase.h"
// Example usage:
// class CMyNodeActiveX :
// public IWMPUIPluginImpl<CMyNodeActiveX>
// {
// DECLARE_WMP_NODE( IWMPSpectrumAnalyzer )
// }
//
#define DECLARE_WMP_NODE( NODE ) \
CComPtr<NODE> m_spNode; \
STDMETHODIMP GetPrimaryIID( IID * pMainIID ) \
{ \
E_POINTER_RETURN( pMainIID ); \
*pMainIID = IID_##NODE; \
return S_OK; \
} \
STDMETHODIMP ConnectNode( IUnknown * pBaseNode ) \
{ \
E_POINTER_RETURN( pBaseNode ); \
HRESULT hr = pBaseNode->QueryInterface( IID_##NODE, reinterpret_cast<LPVOID *>(&m_spNode) ); \
if (SUCCEEDED(hr)) \
{ \
hr = OnConnectNode(); \
if (FAILED(hr)) \
{ \
DPF( 3, A, "OnConnectNode() Failed (%s)", #NODE ); \
m_spNode.Release(); \
} \
} \
else \
{ \
DPF( 3, A, "The node given to this ActiveX control failed a QI for: %s", #NODE ); \
} \
return hr; \
} \
STDMETHODIMP DisconnectNode() \
{ \
HRESULT hr = OnDisconnectNode(); \
if (FAILED(hr)) \
{ \
DPF( 3, A, "OnDisconnectNode() Failure: %s", #NODE ); \
} \
m_spNode.Release(); \
return hr; \
} \
//************************************************************
class ATL_NO_VTABLE IWMPUIPluginEventsImpl :
public IWMPUIPluginEvents
{
public:
#ifdef DEBUG
~IWMPUIPluginEventsImpl(){};
#endif
// IWMPUIPluginEvents
STDMETHOD(FireStateChange)( DISPID dispid ){return E_NOTIMPL;};
STDMETHOD(WMPAdvise)( IUnknown * pUnknown, DWORD * pdwCookie ){return E_NOTIMPL;};
STDMETHOD(WMPUnadvise)( DWORD dwCookie ){return E_NOTIMPL;};
// Helper functions for the derriving object
void DoNotify( int nType, DISPID dspidProperty, const VARIANT varParam );
void DoPropertyChange( DISPID dispid );
void DoStateChange( DISPID dispid, bool fEnabled );
void DoRegionChange();
protected:
DynamicArray<IWMPUIPluginNotify *> m_EventSites;
};
//************************************************************
template <class T>
class ATL_NO_VTABLE IWMPUIPluginImpl :
public IWMPUIPlugin2
{
public:
IWMPUIPluginImpl();
STDMETHOD(OnConnectNode)();
STDMETHOD(OnDisconnectNode)();
STDMETHOD(SetTransparencyColor)( WCHAR * pwszColor );
STDMETHOD(GetTransparencyColor)( BSTR * pbstrColor );
// IWMPUIPlugin
STDMETHOD(SetCore)(IUnknown *pMediaPlayer);
STDMETHOD(GetPrimaryIID)(IID *pMainIID);
STDMETHOD(ConnectNode)(IUnknown *pBaseNode);
STDMETHOD(DisconnectNode)();
// IWMPUIPlugin2
STDMETHOD(CreateInstance)( BSTR bstrObjectType, IDispatch ** ppDispatch );
STDMETHOD(GetTransparencyColor)( OLE_COLOR * pColor );
protected:
//CComPtr<IWMPCore> m_spCore;
COLORREF m_crTransparent;
bool m_fTransparent;
};
//************************************************************
// IWMPUIPluginImpl
//************************************************************
template <class T>
IWMPUIPluginImpl<T>::IWMPUIPluginImpl() :
m_crTransparent(0x00000000),
m_fTransparent(false)
{
}
//************************************************************
template <class T>
STDMETHODIMP IWMPUIPluginImpl<T>::OnConnectNode()
{
return S_OK;
}
//************************************************************
template <class T>
STDMETHODIMP IWMPUIPluginImpl<T>::OnDisconnectNode()
{
return S_OK;
}
//************************************************************
template <class T>
STDMETHODIMP IWMPUIPluginImpl<T>::SetTransparencyColor( WCHAR * pwszColor )
{
#if 1
return E_NOTIMPL;
#else
E_POINTER_RETURN( pwszColor );
bool fTransparent = m_fTransparent;
COLORREF crTransparent = m_crTransparent;
HRESULT hr = StringToColor( pwszColor, &m_crTransparent, &m_fTransparent );
DPF_HR( hr, L, "StringToColor" );
if (SUCCEEDED(hr))
{
m_fTransparent = !m_fTransparent;
}
if (SUCCEEDED(hr) && ((fTransparent != m_fTransparent) || (crTransparent != m_crTransparent)))
{
T* pT = static_cast<T*>(this);
hr = pT->FireViewChange();
DPF_HR( hr, L, "pT->FireViewChange" );
}
return hr;
#endif
}
//************************************************************
template <class T>
STDMETHODIMP IWMPUIPluginImpl<T>::GetTransparencyColor( BSTR * pbstrColor )
{
#if 1
return E_NOTIMPL;
#else
WString wsz;
WCHAR * pwsz = wsz;
HRESULT hr = ColorToString( &pwsz, m_crTransparent, m_fTransparent );
DPF_HR( hr, L, "ColorToString" );
if (SUCCEEDED(hr))
{
m_fTransparent = !m_fTransparent;
*pbstrColor = wsz.CopyToBSTR();
HRMEMCHECK( hr, *pbstrColor );
}
return hr;
#endif
}
//************************************************************
// IWMPUIPlugin
//************************************************************
template <class T>
STDMETHODIMP IWMPUIPluginImpl<T>::SetCore( IUnknown * pMediaPlayer )
{
#if 1
return E_NOTIMPL;
#else
m_spCore.Release();
if (pMediaPlayer)
{
return pMediaPlayer->QueryInterface( IID_IWMPCore, reinterpret_cast<LPVOID *>(&m_spCore) );
}
return S_OK;
#endif
}
//************************************************************
template <class T>
STDMETHODIMP IWMPUIPluginImpl<T>::GetPrimaryIID( IID * pMainIID )
{
return E_NOTIMPL;
}
//************************************************************
template <class T>
STDMETHODIMP IWMPUIPluginImpl<T>::ConnectNode( IUnknown * pBaseNode )
{
return E_NOTIMPL;
}
//************************************************************
template <class T>
STDMETHODIMP IWMPUIPluginImpl<T>::DisconnectNode()
{
return E_NOTIMPL;
}
//************************************************************
template <class T>
STDMETHODIMP IWMPUIPluginImpl<T>::CreateInstance( BSTR bstrObjectType, IDispatch ** ppDispatch )
{
// E_POINTER_RETURN( bstrObjectType );
// E_POINTER_RETURN( ppDispatch );
return E_NOTIMPL;
}
//************************************************************
template <class T>
STDMETHODIMP IWMPUIPluginImpl<T>::GetTransparencyColor( OLE_COLOR * pColor )
{
*pColor = static_cast<OLE_COLOR>(m_crTransparent);
return S_OK;
}
//************************************************************
#endif // _WMPPLUGINIMPL_H_