diff --git a/reactos/dll/directx/msdvbnp/ethernetfilter.cpp b/reactos/dll/directx/msdvbnp/ethernetfilter.cpp new file mode 100644 index 00000000000..16f6122cc20 --- /dev/null +++ b/reactos/dll/directx/msdvbnp/ethernetfilter.cpp @@ -0,0 +1,169 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS BDA Proxy + * FILE: dll/directx/msdvbnp/ethernetfilter.cpp + * PURPOSE: IBDA_EthernetFilter interface + * + * PROGRAMMERS: Johannes Anderwald (janderwald@reactos.org) + */ +#include "precomp.h" + +class CEthernetFilter : public IBDA_EthernetFilter +{ +public: + STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface); + + STDMETHODIMP_(ULONG) AddRef(); + STDMETHODIMP_(ULONG) Release(); + + //IBDA_EthernetFilter + HRESULT STDMETHODCALLTYPE GetMulticastListSize(ULONG *pulcbAddresses); + HRESULT STDMETHODCALLTYPE PutMulticastList(ULONG ulcbAddresses, BYTE * pAddressList); + HRESULT STDMETHODCALLTYPE GetMulticastList(ULONG *pulcbAddresses, BYTE *pAddressList); + HRESULT STDMETHODCALLTYPE PutMulticastMode(ULONG ulModeMask); + HRESULT STDMETHODCALLTYPE GetMulticastMode(ULONG *pulModeMask); + + + CEthernetFilter(IBDA_NetworkProvider * pNetworkProvider); + virtual ~CEthernetFilter(); + +protected: + IBDA_NetworkProvider * m_pNetworkProvider; + ULONG m_ulcbAddresses; + BYTE * m_pAddressList; + ULONG m_ulModeMask; +}; + +CEthernetFilter::CEthernetFilter( + IBDA_NetworkProvider * pNetworkProvider) : m_pNetworkProvider(pNetworkProvider), + m_ulcbAddresses(0), + m_pAddressList(0), + m_ulModeMask(0) +{ +} + +CEthernetFilter::~CEthernetFilter() +{ + if (m_pAddressList) + CoTaskMemFree(m_pAddressList); +} + +HRESULT +STDMETHODCALLTYPE +CEthernetFilter::QueryInterface( + REFIID InterfaceId, + PVOID* Interface) +{ + assert(m_pNetworkProvider); + return m_pNetworkProvider->QueryInterface(InterfaceId, Interface); +} + +ULONG +STDMETHODCALLTYPE +CEthernetFilter::AddRef() +{ + assert(m_pNetworkProvider); + return m_pNetworkProvider->AddRef(); +} + +ULONG +STDMETHODCALLTYPE +CEthernetFilter::Release() +{ + assert(m_pNetworkProvider); + return m_pNetworkProvider->Release(); +} + +//------------------------------------------------------------------- +//IBDA_EthernetFilter +// + +HRESULT +STDMETHODCALLTYPE +CEthernetFilter::PutMulticastList( + ULONG ulcbAddresses, + BYTE * pAddressList) +{ + if (!ulcbAddresses || !pAddressList) + return E_POINTER; + + if (m_pAddressList) + CoTaskMemFree(m_pAddressList); + + m_pAddressList = (BYTE*)CoTaskMemAlloc(ulcbAddresses); + if (!m_pAddressList) + return E_OUTOFMEMORY; + + CopyMemory(m_pAddressList, pAddressList, ulcbAddresses); + m_ulcbAddresses = ulcbAddresses; + return NOERROR; +} + +HRESULT +STDMETHODCALLTYPE +CEthernetFilter::GetMulticastList( + ULONG *pulcbAddresses, + BYTE *pAddressList) +{ + if (!pulcbAddresses || !pAddressList) + return E_POINTER; + + if (*pulcbAddresses < m_ulcbAddresses) + return E_OUTOFMEMORY; + + CopyMemory(pAddressList, m_pAddressList, m_ulcbAddresses); + *pulcbAddresses = m_ulcbAddresses; + return NOERROR; +} + +HRESULT +STDMETHODCALLTYPE +CEthernetFilter::GetMulticastListSize( + ULONG *pulcbAddresses) +{ + if (!pulcbAddresses) + return E_POINTER; + + *pulcbAddresses = m_ulcbAddresses; + return NOERROR; +} + +HRESULT +STDMETHODCALLTYPE +CEthernetFilter::PutMulticastMode( + ULONG ulModeMask) +{ + m_ulModeMask = ulModeMask; + return NOERROR; +} + +HRESULT +STDMETHODCALLTYPE +CEthernetFilter::GetMulticastMode( + ULONG *pulModeMask) +{ + *pulModeMask = m_ulModeMask; + return NOERROR; +} + +HRESULT +WINAPI +CEthernetFilter_fnConstructor( + IBDA_NetworkProvider * pNetworkProvider, + REFIID riid, + LPVOID * ppv) +{ + CEthernetFilter * filter = new CEthernetFilter(pNetworkProvider); + + if (!filter) + return E_OUTOFMEMORY; + + if (FAILED(filter->QueryInterface(riid, ppv))) + { + /* not supported */ + delete filter; + return E_NOINTERFACE; + } + + return NOERROR; +} diff --git a/reactos/dll/directx/msdvbnp/ipv4.cpp b/reactos/dll/directx/msdvbnp/ipv4.cpp new file mode 100644 index 00000000000..6647558dcf2 --- /dev/null +++ b/reactos/dll/directx/msdvbnp/ipv4.cpp @@ -0,0 +1,170 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS BDA Proxy + * FILE: dll/directx/msdvbnp/ipv4.cpp + * PURPOSE: IBDA_IPV4Filter interface + * + * PROGRAMMERS: Johannes Anderwald (janderwald@reactos.org) + */ +#include "precomp.h" + +class CIPV4Filter : public IBDA_IPV4Filter +{ +public: + STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface); + STDMETHODIMP_(ULONG) AddRef(); + STDMETHODIMP_(ULONG) Release(); + + //IBDA_IPV4Filter + HRESULT STDMETHODCALLTYPE GetMulticastListSize(ULONG *pulcbAddresses); + HRESULT STDMETHODCALLTYPE PutMulticastList(ULONG ulcbAddresses, BYTE * pAddressList); + HRESULT STDMETHODCALLTYPE GetMulticastList(ULONG *pulcbAddresses, BYTE *pAddressList); + HRESULT STDMETHODCALLTYPE PutMulticastMode(ULONG ulModeMask); + HRESULT STDMETHODCALLTYPE GetMulticastMode(ULONG *pulModeMask); + + + CIPV4Filter(IBDA_NetworkProvider * pNetworkProvider); + virtual ~CIPV4Filter(); + +protected: + IBDA_NetworkProvider * m_pNetworkProvider; + ULONG m_ulcbAddresses; + BYTE * m_pAddressList; + ULONG m_ulModeMask; +}; + +CIPV4Filter::CIPV4Filter( + IBDA_NetworkProvider * pNetworkProvider) : m_pNetworkProvider(pNetworkProvider), + m_ulcbAddresses(0), + m_pAddressList(0), + m_ulModeMask(0) +{ +} + +CIPV4Filter::~CIPV4Filter() +{ + if (m_pAddressList) + CoTaskMemFree(m_pAddressList); +} + + +HRESULT +STDMETHODCALLTYPE +CIPV4Filter::QueryInterface( + REFIID InterfaceId, + PVOID* Interface) +{ + assert(m_pNetworkProvider); + return m_pNetworkProvider->QueryInterface(InterfaceId, Interface); +} + +ULONG +STDMETHODCALLTYPE +CIPV4Filter::AddRef() +{ + assert(m_pNetworkProvider); + return m_pNetworkProvider->AddRef(); +} + +ULONG +STDMETHODCALLTYPE +CIPV4Filter::Release() +{ + assert(m_pNetworkProvider); + return m_pNetworkProvider->Release(); +} + +//------------------------------------------------------------------- +//IBDA_IPV4Filter +// + + +HRESULT +STDMETHODCALLTYPE +CIPV4Filter::GetMulticastListSize( + ULONG *pulcbAddresses) +{ + if (!pulcbAddresses) + return E_POINTER; + + *pulcbAddresses = 0; + return NOERROR; +} + +HRESULT +STDMETHODCALLTYPE +CIPV4Filter::PutMulticastList( + ULONG ulcbAddresses, + BYTE * pAddressList) +{ + if (!ulcbAddresses || !pAddressList) + return E_POINTER; + + if (m_pAddressList) + CoTaskMemFree(m_pAddressList); + + m_pAddressList = (BYTE*)CoTaskMemAlloc(ulcbAddresses); + if (!m_pAddressList) + return E_OUTOFMEMORY; + + CopyMemory(m_pAddressList, pAddressList, ulcbAddresses); + m_ulcbAddresses = ulcbAddresses; + return NOERROR; +} + +HRESULT +STDMETHODCALLTYPE +CIPV4Filter::GetMulticastList( + ULONG *pulcbAddresses, + BYTE *pAddressList) +{ + if (!pulcbAddresses || !pAddressList) + return E_POINTER; + + if (*pulcbAddresses < m_ulcbAddresses) + return E_OUTOFMEMORY; + + CopyMemory(pAddressList, m_pAddressList, m_ulcbAddresses); + *pulcbAddresses = m_ulcbAddresses; + return NOERROR; +} + +HRESULT +STDMETHODCALLTYPE +CIPV4Filter::PutMulticastMode( + ULONG ulModeMask) +{ + m_ulModeMask = ulModeMask; + return NOERROR; +} + +HRESULT +STDMETHODCALLTYPE +CIPV4Filter::GetMulticastMode( + ULONG *pulModeMask) +{ + *pulModeMask = m_ulModeMask; + return NOERROR; +} + +HRESULT +WINAPI +CIPV4Filter_fnConstructor( + IBDA_NetworkProvider * pNetworkProvider, + REFIID riid, + LPVOID * ppv) +{ + CIPV4Filter * filter = new CIPV4Filter(pNetworkProvider); + + if (!filter) + return E_OUTOFMEMORY; + + if (FAILED(filter->QueryInterface(riid, ppv))) + { + /* not supported */ + delete filter; + return E_NOINTERFACE; + } + + return NOERROR; +} diff --git a/reactos/dll/directx/msdvbnp/ipv6.cpp b/reactos/dll/directx/msdvbnp/ipv6.cpp new file mode 100644 index 00000000000..6017443a450 --- /dev/null +++ b/reactos/dll/directx/msdvbnp/ipv6.cpp @@ -0,0 +1,167 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS BDA Proxy + * FILE: dll/directx/msdvbnp/ipv6.cpp + * PURPOSE: IBDA_IPV6Filter interface + * + * PROGRAMMERS: Johannes Anderwald (janderwald@reactos.org) + */ +#include "precomp.h" + +class CIPV6Filter : public IBDA_IPV6Filter +{ +public: + STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface); + STDMETHODIMP_(ULONG) AddRef(); + STDMETHODIMP_(ULONG) Release(); + + //IBDA_IPV6Filter + HRESULT STDMETHODCALLTYPE GetMulticastListSize(ULONG *pulcbAddresses); + HRESULT STDMETHODCALLTYPE PutMulticastList(ULONG ulcbAddresses, BYTE * pAddressList); + HRESULT STDMETHODCALLTYPE GetMulticastList(ULONG *pulcbAddresses, BYTE *pAddressList); + HRESULT STDMETHODCALLTYPE PutMulticastMode(ULONG ulModeMask); + HRESULT STDMETHODCALLTYPE GetMulticastMode(ULONG *pulModeMask); + + CIPV6Filter(IBDA_NetworkProvider * pNetworkProvider); + virtual ~CIPV6Filter(); + +protected: + IBDA_NetworkProvider * m_pNetworkProvider; + ULONG m_ulcbAddresses; + BYTE * m_pAddressList; + ULONG m_ulModeMask; +}; + +CIPV6Filter::CIPV6Filter( + IBDA_NetworkProvider * pNetworkProvider) : m_pNetworkProvider(pNetworkProvider), + m_ulcbAddresses(0), + m_pAddressList(0), + m_ulModeMask(0) +{ +} + +CIPV6Filter::~CIPV6Filter() +{ + if (m_pAddressList) + CoTaskMemFree(m_pAddressList); +} + +HRESULT +STDMETHODCALLTYPE +CIPV6Filter::QueryInterface( + REFIID InterfaceId, + PVOID* Interface) +{ + assert(m_pNetworkProvider); + return m_pNetworkProvider->QueryInterface(InterfaceId, Interface); +} + +ULONG +STDMETHODCALLTYPE +CIPV6Filter::AddRef() +{ + assert(m_pNetworkProvider); + return m_pNetworkProvider->AddRef(); +} + +ULONG +STDMETHODCALLTYPE +CIPV6Filter::Release() +{ + assert(m_pNetworkProvider); + return m_pNetworkProvider->Release(); +} + +//------------------------------------------------------------------- +//IBDA_IPV6Filter +// + +HRESULT +STDMETHODCALLTYPE +CIPV6Filter::GetMulticastListSize( + ULONG *pulcbAddresses) +{ + if (!pulcbAddresses) + return E_POINTER; + + *pulcbAddresses = 0; + return NOERROR; +} + +HRESULT +STDMETHODCALLTYPE +CIPV6Filter::GetMulticastList( + ULONG *pulcbAddresses, + BYTE *pAddressList) +{ + if (!pulcbAddresses || !pAddressList) + return E_POINTER; + + if (*pulcbAddresses < m_ulcbAddresses) + return E_OUTOFMEMORY; + + CopyMemory(pAddressList, m_pAddressList, m_ulcbAddresses); + *pulcbAddresses = m_ulcbAddresses; + return NOERROR; +} + +HRESULT +STDMETHODCALLTYPE +CIPV6Filter::PutMulticastList( + ULONG ulcbAddresses, + BYTE * pAddressList) +{ + if (!ulcbAddresses || !pAddressList) + return E_POINTER; + + if (m_pAddressList) + CoTaskMemFree(m_pAddressList); + + m_pAddressList = (BYTE*)CoTaskMemAlloc(ulcbAddresses); + if (!m_pAddressList) + return E_OUTOFMEMORY; + + CopyMemory(m_pAddressList, pAddressList, ulcbAddresses); + m_ulcbAddresses = ulcbAddresses; + return NOERROR; +} + +HRESULT +STDMETHODCALLTYPE +CIPV6Filter::PutMulticastMode( + ULONG ulModeMask) +{ + m_ulModeMask = ulModeMask; + return NOERROR; +} + +HRESULT +STDMETHODCALLTYPE +CIPV6Filter::GetMulticastMode( + ULONG *pulModeMask) +{ + *pulModeMask = m_ulModeMask; + return NOERROR; +} + +HRESULT +WINAPI +CIPV6Filter_fnConstructor( + IBDA_NetworkProvider * pNetworkProvider, + REFIID riid, + LPVOID * ppv) +{ + CIPV6Filter * filter = new CIPV6Filter(pNetworkProvider); + + if (!filter) + return E_OUTOFMEMORY; + + if (FAILED(filter->QueryInterface(riid, ppv))) + { + /* not supported */ + delete filter; + return E_NOINTERFACE; + } + + return NOERROR; +} diff --git a/reactos/dll/directx/msdvbnp/msdvbnp.rbuild b/reactos/dll/directx/msdvbnp/msdvbnp.rbuild index 6213d7d8f37..a1cf02ac4f7 100644 --- a/reactos/dll/directx/msdvbnp/msdvbnp.rbuild +++ b/reactos/dll/directx/msdvbnp/msdvbnp.rbuild @@ -22,8 +22,11 @@ classfactory.cpp enum_mediatypes.cpp enumpins.cpp + ethernetfilter.cpp msdvbnp.cpp msdvbnp.rc + ipv4.cpp + ipv6.cpp networkprovider.cpp pin.cpp scanningtuner.cpp diff --git a/reactos/dll/directx/msdvbnp/networkprovider.cpp b/reactos/dll/directx/msdvbnp/networkprovider.cpp index be7fee28cc5..7dea3667142 100644 --- a/reactos/dll/directx/msdvbnp/networkprovider.cpp +++ b/reactos/dll/directx/msdvbnp/networkprovider.cpp @@ -74,6 +74,9 @@ protected: GUID m_ClassID; DeviceFilterStack m_DeviceFilters; IScanningTuner * m_Tuner; + IBDA_IPV6Filter * m_IPV6Filter; + IBDA_IPV4Filter * m_IPV4Filter; + IBDA_EthernetFilter * m_EthernetFilter; }; HRESULT @@ -116,6 +119,51 @@ CNetworkProvider::QueryInterface( return NOERROR; } + if (IsEqualGUID(refiid, IID_IBDA_IPV6Filter)) + { + // construct scanning tuner + if (!m_IPV6Filter) + { + HRESULT hr = CIPV6Filter_fnConstructor((IBDA_NetworkProvider*)this, refiid, (void**)&m_IPV6Filter); + if (FAILED(hr)) + return hr; + } + m_IPV6Filter->AddRef(); + *Output = (IUnknown*)m_IPV6Filter; + + return NOERROR; + } + + if (IsEqualGUID(refiid, IID_IBDA_IPV4Filter)) + { + // construct scanning tuner + if (!m_IPV4Filter) + { + HRESULT hr = CIPV4Filter_fnConstructor((IBDA_NetworkProvider*)this, refiid, (void**)&m_IPV4Filter); + if (FAILED(hr)) + return hr; + } + m_IPV4Filter->AddRef(); + *Output = (IUnknown*)m_IPV4Filter; + + return NOERROR; + } + + if (IsEqualGUID(refiid, IID_IBDA_EthernetFilter)) + { + // construct scanning tuner + if (!m_EthernetFilter) + { + HRESULT hr = CIPV4Filter_fnConstructor((IBDA_NetworkProvider*)this, refiid, (void**)&m_EthernetFilter); + if (FAILED(hr)) + return hr; + } + m_EthernetFilter->AddRef(); + *Output = (IUnknown*)m_EthernetFilter; + + return NOERROR; + } + if (IsEqualGUID(refiid, IID_IBDA_NetworkProvider)) { *Output = (IBDA_NetworkProvider*)(this); @@ -163,7 +211,10 @@ CNetworkProvider::CNetworkProvider(LPCGUID ClassID) : m_Ref(0), m_ReferenceClock(0), m_FilterState(State_Stopped), m_DeviceFilters(), - m_Tuner(0) + m_Tuner(0), + m_IPV6Filter(0), + m_IPV4Filter(0), + m_EthernetFilter(0) { m_Pins[0] = 0; diff --git a/reactos/dll/directx/msdvbnp/precomp.h b/reactos/dll/directx/msdvbnp/precomp.h index 4294d42d198..c9abe7ac000 100644 --- a/reactos/dll/directx/msdvbnp/precomp.h +++ b/reactos/dll/directx/msdvbnp/precomp.h @@ -82,6 +82,30 @@ CEnumMediaTypes_fnConstructor( REFIID riid, LPVOID * ppv); +/* ethernetfilter.cpp */ +HRESULT +WINAPI +CEthernetFilter_fnConstructor( + IBDA_NetworkProvider * pNetworkProvider, + REFIID riid, + LPVOID * ppv); + +/* ipv6.cpp */ +HRESULT +WINAPI +CIPV6Filter_fnConstructor( + IBDA_NetworkProvider * pNetworkProvider, + REFIID riid, + LPVOID * ppv); + +/* ipv4.cpp */ +HRESULT +WINAPI +CIPV4Filter_fnConstructor( + IBDA_NetworkProvider * pNetworkProvider, + REFIID riid, + LPVOID * ppv); + #ifndef _MSC_VER extern const GUID CLSID_DVBTNetworkProvider; #endif