[MSDVBNP]
authorJohannes Anderwald <johannes.anderwald@reactos.org>
Mon, 29 Mar 2010 13:12:16 +0000 (13:12 +0000)
committerJohannes Anderwald <johannes.anderwald@reactos.org>
Mon, 29 Mar 2010 13:12:16 +0000 (13:12 +0000)
- Implement IBDA_EthernetFilter, IBDA_IPV4Filter, IBDA_IPV6Filter

svn path=/trunk/; revision=46569

reactos/dll/directx/msdvbnp/ethernetfilter.cpp [new file with mode: 0644]
reactos/dll/directx/msdvbnp/ipv4.cpp [new file with mode: 0644]
reactos/dll/directx/msdvbnp/ipv6.cpp [new file with mode: 0644]
reactos/dll/directx/msdvbnp/msdvbnp.rbuild
reactos/dll/directx/msdvbnp/networkprovider.cpp
reactos/dll/directx/msdvbnp/precomp.h

diff --git a/reactos/dll/directx/msdvbnp/ethernetfilter.cpp b/reactos/dll/directx/msdvbnp/ethernetfilter.cpp
new file mode 100644 (file)
index 0000000..16f6122
--- /dev/null
@@ -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 (file)
index 0000000..6647558
--- /dev/null
@@ -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 (file)
index 0000000..6017443
--- /dev/null
@@ -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;
+}
index 6213d7d..a1cf02a 100644 (file)
        <file>classfactory.cpp</file>
        <file>enum_mediatypes.cpp</file>
        <file>enumpins.cpp</file>
+       <file>ethernetfilter.cpp</file>
        <file>msdvbnp.cpp</file>
        <file>msdvbnp.rc</file>
+       <file>ipv4.cpp</file>
+       <file>ipv6.cpp</file>
        <file>networkprovider.cpp</file>
        <file>pin.cpp</file>
        <file>scanningtuner.cpp</file>
index be7fee2..7dea366 100644 (file)
@@ -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;
 
index 4294d42..c9abe7a 100644 (file)
@@ -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