--- /dev/null
+/*
+ * COPYRIGHT: See COPYING in the top level directory
+ * PROJECT: ReactOS Kernel Streaming
+ * FILE: drivers/wdm/audio/backpln/portcls/filter_topology.c
+ * PURPOSE: portcls topology filter
+ * PROGRAMMER: Johannes Anderwald
+ */
+
+#include "private.hpp"
+
+#ifndef YDEBUG
+#define NDEBUG
+#endif
+
+#include <debug.h>
+
+class CPortFilterTopology : public IPortFilterTopology
+{
+public:
+ STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface);
+
+ STDMETHODIMP_(ULONG) AddRef()
+ {
+ InterlockedIncrement(&m_Ref);
+ return m_Ref;
+ }
+ STDMETHODIMP_(ULONG) Release()
+ {
+ InterlockedDecrement(&m_Ref);
+
+ if (!m_Ref)
+ {
+ delete this;
+ return 0;
+ }
+ return m_Ref;
+ }
+ IMP_IPortFilterTopology;
+ CPortFilterTopology(IUnknown *OuterUnknown){}
+ virtual ~CPortFilterTopology(){}
+
+protected:
+ IPortTopology * m_Port;
+ SUBDEVICE_DESCRIPTOR * m_Descriptor;
+ ISubdevice * m_SubDevice;
+ LONG m_Ref;
+};
+
+
+NTSTATUS
+NTAPI
+CPortFilterTopology::QueryInterface(
+ IN REFIID refiid,
+ OUT PVOID* Output)
+{
+
+ if (IsEqualGUIDAligned(refiid, IID_IIrpTarget) ||
+ IsEqualGUIDAligned(refiid, IID_IUnknown))
+ {
+ *Output = PVOID(PUNKNOWN(this));
+ PUNKNOWN(*Output)->AddRef();
+ return STATUS_SUCCESS;
+ }
+ else if (IsEqualGUIDAligned(refiid, IID_IPort))
+ {
+ *Output = PVOID(PUNKNOWN(m_Port));
+ PUNKNOWN(*Output)->AddRef();
+ return STATUS_SUCCESS;
+ }
+
+ return STATUS_UNSUCCESSFUL;
+}
+
+NTSTATUS
+NTAPI
+CPortFilterTopology::NewIrpTarget(
+ OUT struct IIrpTarget **OutTarget,
+ IN PCWSTR Name,
+ IN PUNKNOWN Unknown,
+ IN POOL_TYPE PoolType,
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp,
+ IN KSOBJECT_CREATE *CreateObject)
+{
+ DPRINT("CPortFilterTopology::NewIrpTarget entered\n");
+
+ return STATUS_NOT_SUPPORTED;
+}
+
+
+NTSTATUS
+NTAPI
+CPortFilterTopology::DeviceIoControl(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp)
+{
+ PIO_STACK_LOCATION IoStack;
+ NTSTATUS Status;
+
+ IoStack = IoGetCurrentIrpStackLocation(Irp);
+
+ if (IoStack->Parameters.DeviceIoControl.IoControlCode != IOCTL_KS_PROPERTY)
+ {
+ DPRINT("Unhandled function %lx Length %x\n", IoStack->Parameters.DeviceIoControl.IoControlCode, IoStack->Parameters.DeviceIoControl.InputBufferLength);
+
+ Irp->IoStatus.Status = STATUS_SUCCESS;
+
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+ return STATUS_SUCCESS;
+ }
+
+ Status = PcHandlePropertyWithTable(Irp, m_Descriptor->FilterPropertySetCount, m_Descriptor->FilterPropertySet, m_Descriptor);
+ if (Status != STATUS_PENDING)
+ {
+ Irp->IoStatus.Status = Status;
+ DPRINT("Result %x Length %u\n", Status, Irp->IoStatus.Information);
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+ }
+ return Status;
+
+}
+
+NTSTATUS
+NTAPI
+CPortFilterTopology::Read(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp)
+{
+ return KsDispatchInvalidDeviceRequest(DeviceObject, Irp);
+}
+
+NTSTATUS
+NTAPI
+CPortFilterTopology::Write(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp)
+{
+ return KsDispatchInvalidDeviceRequest(DeviceObject, Irp);
+}
+
+NTSTATUS
+NTAPI
+CPortFilterTopology::Flush(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp)
+{
+ return KsDispatchInvalidDeviceRequest(DeviceObject, Irp);
+}
+
+NTSTATUS
+NTAPI
+CPortFilterTopology::Close(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp)
+{
+ NTSTATUS Status = STATUS_SUCCESS;
+
+ // FIXME handle DirectSound
+
+#if 0
+//FIXME
+ if (m_ref == 1)
+ {
+ // release reference to port
+ This->SubDevice->lpVtbl->Release(This->SubDevice);
+
+ // time to shutdown the audio system
+ Status = This->SubDevice->lpVtbl->ReleaseChildren(This->SubDevice);
+ }
+#endif
+
+ Irp->IoStatus.Status = Status;
+ Irp->IoStatus.Information = 0;
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+
+ return STATUS_SUCCESS;
+}
+
+NTSTATUS
+NTAPI
+CPortFilterTopology::QuerySecurity(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp)
+{
+ return KsDispatchInvalidDeviceRequest(DeviceObject, Irp);
+}
+
+NTSTATUS
+NTAPI
+CPortFilterTopology::SetSecurity(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp)
+{
+ return KsDispatchInvalidDeviceRequest(DeviceObject, Irp);
+}
+
+BOOLEAN
+NTAPI
+CPortFilterTopology::FastDeviceIoControl(
+ IN PFILE_OBJECT FileObject,
+ IN BOOLEAN Wait,
+ IN PVOID InputBuffer,
+ IN ULONG InputBufferLength,
+ OUT PVOID OutputBuffer,
+ IN ULONG OutputBufferLength,
+ IN ULONG IoControlCode,
+ OUT PIO_STATUS_BLOCK StatusBlock,
+ IN PDEVICE_OBJECT DeviceObject)
+{
+ return FALSE;
+}
+
+BOOLEAN
+NTAPI
+CPortFilterTopology::FastRead(
+ IN PFILE_OBJECT FileObject,
+ IN PLARGE_INTEGER FileOffset,
+ IN ULONG Length,
+ IN BOOLEAN Wait,
+ IN ULONG LockKey,
+ IN PVOID Buffer,
+ OUT PIO_STATUS_BLOCK StatusBlock,
+ IN PDEVICE_OBJECT DeviceObject)
+{
+ return FALSE;
+}
+
+BOOLEAN
+NTAPI
+CPortFilterTopology::FastWrite(
+ IN PFILE_OBJECT FileObject,
+ IN PLARGE_INTEGER FileOffset,
+ IN ULONG Length,
+ IN BOOLEAN Wait,
+ IN ULONG LockKey,
+ IN PVOID Buffer,
+ OUT PIO_STATUS_BLOCK StatusBlock,
+ IN PDEVICE_OBJECT DeviceObject)
+{
+ return FALSE;
+}
+
+NTSTATUS
+NTAPI
+CPortFilterTopology::Init(
+ IN IPortTopology* Port)
+{
+ ISubdevice * ISubDevice;
+ SUBDEVICE_DESCRIPTOR * Descriptor;
+ NTSTATUS Status;
+
+
+ // get our private interface
+ Status = Port->QueryInterface(IID_ISubdevice, (PVOID*)&ISubDevice);
+ if (!NT_SUCCESS(Status))
+ return STATUS_UNSUCCESSFUL;
+
+ // get the subdevice descriptor
+ Status = ISubDevice->GetDescriptor(&Descriptor);
+
+ // store subdevice interface
+ m_SubDevice = ISubDevice;
+
+ if (!NT_SUCCESS(Status))
+ return STATUS_UNSUCCESSFUL;
+
+ // save descriptor
+ m_Descriptor = Descriptor;
+
+ // store port object
+ m_Port = Port;
+
+ return STATUS_SUCCESS;
+}
+
+NTSTATUS
+NewPortFilterTopology(
+ OUT IPortFilterTopology ** OutFilter)
+{
+ CPortFilterTopology * This;
+
+ This = new(NonPagedPool, TAG_PORTCLASS)CPortFilterTopology(NULL);
+ if (!This)
+ return STATUS_INSUFFICIENT_RESOURCES;
+
+ This->AddRef();
+
+ // return result
+ *OutFilter = (CPortFilterTopology*)This;
+
+ return STATUS_SUCCESS;
+}