ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

filter_topology.cpp
Go to the documentation of this file.
00001 /*
00002  * COPYRIGHT:       See COPYING in the top level directory
00003  * PROJECT:         ReactOS Kernel Streaming
00004  * FILE:            drivers/wdm/audio/backpln/portcls/filter_topology.c
00005  * PURPOSE:         portcls topology filter
00006  * PROGRAMMER:      Johannes Anderwald
00007  */
00008 
00009 #include "private.hpp"
00010 
00011 class CPortFilterTopology : public IPortFilterTopology
00012 {
00013 public:
00014     STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface);
00015 
00016     STDMETHODIMP_(ULONG) AddRef()
00017     {
00018         InterlockedIncrement(&m_Ref);
00019         return m_Ref;
00020     }
00021     STDMETHODIMP_(ULONG) Release()
00022     {
00023         InterlockedDecrement(&m_Ref);
00024 
00025         if (!m_Ref)
00026         {
00027             delete this;
00028             return 0;
00029         }
00030         return m_Ref;
00031     }
00032     IMP_IPortFilterTopology;
00033     CPortFilterTopology(IUnknown *OuterUnknown){}
00034     virtual ~CPortFilterTopology(){}
00035 
00036 protected:
00037     IPortTopology * m_Port;
00038     SUBDEVICE_DESCRIPTOR * m_Descriptor;
00039     ISubdevice * m_SubDevice;
00040     LONG m_Ref;
00041 };
00042 
00043 
00044 NTSTATUS
00045 NTAPI
00046 CPortFilterTopology::QueryInterface(
00047     IN  REFIID refiid,
00048     OUT PVOID* Output)
00049 {
00050 
00051     if (IsEqualGUIDAligned(refiid, IID_IIrpTarget) ||
00052         IsEqualGUIDAligned(refiid, IID_IUnknown))
00053     {
00054         *Output = PVOID(PUNKNOWN(this));
00055         PUNKNOWN(*Output)->AddRef();
00056         return STATUS_SUCCESS;
00057     }
00058     else if (IsEqualGUIDAligned(refiid, IID_IPort))
00059     {
00060         *Output = PVOID(PUNKNOWN(m_Port));
00061         PUNKNOWN(*Output)->AddRef();
00062         return STATUS_SUCCESS;
00063     }
00064 
00065     return STATUS_UNSUCCESSFUL;
00066 }
00067 
00068 NTSTATUS
00069 NTAPI
00070 CPortFilterTopology::NewIrpTarget(
00071     OUT struct IIrpTarget **OutTarget,
00072     IN PCWSTR Name,
00073     IN PUNKNOWN Unknown,
00074     IN POOL_TYPE PoolType,
00075     IN PDEVICE_OBJECT DeviceObject,
00076     IN PIRP Irp,
00077     IN KSOBJECT_CREATE *CreateObject)
00078 {
00079     DPRINT("CPortFilterTopology::NewIrpTarget entered\n");
00080 
00081     return STATUS_NOT_SUPPORTED;
00082 }
00083 
00084 
00085 NTSTATUS
00086 NTAPI
00087 CPortFilterTopology::DeviceIoControl(
00088     IN PDEVICE_OBJECT DeviceObject,
00089     IN PIRP Irp)
00090 {
00091     PIO_STACK_LOCATION IoStack;
00092     NTSTATUS Status;
00093 
00094     IoStack = IoGetCurrentIrpStackLocation(Irp);
00095 
00096     if (IoStack->Parameters.DeviceIoControl.IoControlCode != IOCTL_KS_PROPERTY)
00097     {
00098         DPRINT("Unhandled function %lx Length %x\n", IoStack->Parameters.DeviceIoControl.IoControlCode, IoStack->Parameters.DeviceIoControl.InputBufferLength);
00099         
00100         Irp->IoStatus.Status = STATUS_SUCCESS;
00101 
00102         IoCompleteRequest(Irp, IO_NO_INCREMENT);
00103         return STATUS_SUCCESS;
00104     }
00105 
00106     Status = PcHandlePropertyWithTable(Irp, m_Descriptor->FilterPropertySetCount, m_Descriptor->FilterPropertySet, m_Descriptor);
00107     if (Status != STATUS_PENDING)
00108     {
00109         Irp->IoStatus.Status = Status;
00110         DPRINT("Result %x Length %u\n", Status, Irp->IoStatus.Information);
00111         IoCompleteRequest(Irp, IO_NO_INCREMENT);
00112     }
00113     return Status;
00114 
00115 }
00116 
00117 NTSTATUS
00118 NTAPI
00119 CPortFilterTopology::Read(
00120     IN PDEVICE_OBJECT DeviceObject,
00121     IN PIRP Irp)
00122 {
00123     return KsDispatchInvalidDeviceRequest(DeviceObject, Irp);
00124 }
00125 
00126 NTSTATUS
00127 NTAPI
00128 CPortFilterTopology::Write(
00129     IN PDEVICE_OBJECT DeviceObject,
00130     IN PIRP Irp)
00131 {
00132     return KsDispatchInvalidDeviceRequest(DeviceObject, Irp);
00133 }
00134 
00135 NTSTATUS
00136 NTAPI
00137 CPortFilterTopology::Flush(
00138     IN PDEVICE_OBJECT DeviceObject,
00139     IN PIRP Irp)
00140 {
00141     return KsDispatchInvalidDeviceRequest(DeviceObject, Irp);
00142 }
00143 
00144 NTSTATUS
00145 NTAPI
00146 CPortFilterTopology::Close(
00147     IN PDEVICE_OBJECT DeviceObject,
00148     IN PIRP Irp)
00149 {
00150     NTSTATUS Status = STATUS_SUCCESS;
00151 
00152     // FIXME handle DirectSound
00153 
00154 #if 0
00155 //FIXME
00156     if (m_ref == 1)
00157     {
00158         // release reference to port
00159         This->SubDevice->lpVtbl->Release(This->SubDevice);
00160 
00161         // time to shutdown the audio system
00162         Status = This->SubDevice->lpVtbl->ReleaseChildren(This->SubDevice);
00163     }
00164 #endif
00165 
00166     Irp->IoStatus.Status = Status;
00167     Irp->IoStatus.Information = 0;
00168     IoCompleteRequest(Irp, IO_NO_INCREMENT);
00169 
00170     return STATUS_SUCCESS;
00171 }
00172 
00173 NTSTATUS
00174 NTAPI
00175 CPortFilterTopology::QuerySecurity(
00176     IN PDEVICE_OBJECT DeviceObject,
00177     IN PIRP Irp)
00178 {
00179     return KsDispatchInvalidDeviceRequest(DeviceObject, Irp);
00180 }
00181 
00182 NTSTATUS
00183 NTAPI
00184 CPortFilterTopology::SetSecurity(
00185     IN PDEVICE_OBJECT DeviceObject,
00186     IN PIRP Irp)
00187 {
00188     return KsDispatchInvalidDeviceRequest(DeviceObject, Irp);
00189 }
00190 
00191 BOOLEAN
00192 NTAPI
00193 CPortFilterTopology::FastDeviceIoControl(
00194     IN PFILE_OBJECT FileObject,
00195     IN BOOLEAN Wait,
00196     IN PVOID InputBuffer,
00197     IN ULONG InputBufferLength,
00198     OUT PVOID OutputBuffer,
00199     IN ULONG OutputBufferLength,
00200     IN ULONG IoControlCode,
00201     OUT PIO_STATUS_BLOCK StatusBlock,
00202     IN PDEVICE_OBJECT DeviceObject)
00203 {
00204     return FALSE;
00205 }
00206 
00207 BOOLEAN
00208 NTAPI
00209 CPortFilterTopology::FastRead(
00210     IN PFILE_OBJECT FileObject,
00211     IN PLARGE_INTEGER FileOffset,
00212     IN ULONG Length,
00213     IN BOOLEAN Wait,
00214     IN ULONG LockKey,
00215     IN PVOID Buffer,
00216     OUT PIO_STATUS_BLOCK StatusBlock,
00217     IN PDEVICE_OBJECT DeviceObject)
00218 {
00219     return FALSE;
00220 }
00221 
00222 BOOLEAN
00223 NTAPI
00224 CPortFilterTopology::FastWrite(
00225     IN PFILE_OBJECT FileObject,
00226     IN PLARGE_INTEGER FileOffset,
00227     IN ULONG Length,
00228     IN BOOLEAN Wait,
00229     IN ULONG LockKey,
00230     IN PVOID Buffer,
00231     OUT PIO_STATUS_BLOCK StatusBlock,
00232     IN PDEVICE_OBJECT DeviceObject)
00233 {
00234     return FALSE;
00235 }
00236 
00237 NTSTATUS
00238 NTAPI
00239 CPortFilterTopology::Init(
00240     IN IPortTopology* Port)
00241 {
00242     ISubdevice * ISubDevice;
00243     SUBDEVICE_DESCRIPTOR * Descriptor;
00244     NTSTATUS Status;
00245 
00246 
00247     // get our private interface
00248     Status = Port->QueryInterface(IID_ISubdevice, (PVOID*)&ISubDevice);
00249     if (!NT_SUCCESS(Status))
00250         return STATUS_UNSUCCESSFUL;
00251 
00252     // get the subdevice descriptor
00253     Status = ISubDevice->GetDescriptor(&Descriptor);
00254 
00255     // store subdevice interface
00256     m_SubDevice = ISubDevice;
00257 
00258     if (!NT_SUCCESS(Status))
00259         return STATUS_UNSUCCESSFUL;
00260 
00261     // save descriptor
00262     m_Descriptor = Descriptor;
00263 
00264     // store port object
00265     m_Port = Port;
00266 
00267     return STATUS_SUCCESS;
00268 }
00269 
00270 NTSTATUS 
00271 NewPortFilterTopology(
00272     OUT IPortFilterTopology ** OutFilter)
00273 {
00274     CPortFilterTopology * This;
00275 
00276     This = new(NonPagedPool, TAG_PORTCLASS)CPortFilterTopology(NULL);
00277     if (!This)
00278         return STATUS_INSUFFICIENT_RESOURCES;
00279 
00280     This->AddRef();
00281 
00282     // return result
00283     *OutFilter = (CPortFilterTopology*)This;
00284 
00285     return STATUS_SUCCESS;
00286 }

Generated on Fri May 25 2012 04:26:49 for ReactOS by doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.