Patch by Anton Yarotsky:
authorSir Richard <sir_richard@svn.reactos.org>
Thu, 7 Jul 2011 12:03:56 +0000 (12:03 +0000)
committerSir Richard <sir_richard@svn.reactos.org>
Thu, 7 Jul 2011 12:03:56 +0000 (12:03 +0000)
[SACDRV]: Implement the SAC Channel Input/Output Interface and Getters/Setters.

svn path=/trunk/; revision=52555

reactos/drivers/sac/driver/channel.c

index 7159458..154097e 100644 (file)
@@ -19,7 +19,7 @@ ChannelIsValidType(
        IN SAC_CHANNEL_TYPE ChannelType
        )
 {
-       return FALSE;
+       return ((ChannelType >= VtUtf8) && (ChannelType <= Raw));
 }
 
 BOOLEAN
@@ -28,7 +28,9 @@ ChannelIsEqual(
        IN PSAC_CHANNEL_ID ChannelId
        )
 {
-       return FALSE;
+       return IsEqualGUIDAligned(
+               &Channel->ChannelId.ChannelGuid,
+               &ChannelId->ChannelGuid);
 }
 
 NTSTATUS
@@ -52,7 +54,9 @@ ChannelDestroy(
        IN PSAC_CHANNEL Channel
        )
 {
-       return STATUS_NOT_IMPLEMENTED;
+       CHECK_PARAMETER(Channel);
+       
+       return ChannelDereferenceHandles(Channel);
 }
 
 NTSTATUS
@@ -62,7 +66,17 @@ ChannelOWrite(
        IN ULONG BufferSize
        )
 {
-       return STATUS_NOT_IMPLEMENTED;
+       NTSTATUS Status;
+       
+       CHECK_PARAMETER3(BufferSize < SAC_OBUFFER_SIZE);
+
+       ChannelLockOBuffer(Channel);
+
+       Status = Channel->OBufferWrite(Channel, Buffer, BufferSize);
+       
+       ChannelUnlockOBuffer(Channel);
+       
+       return Status;
 }
 
 NTSTATUS
@@ -70,7 +84,15 @@ ChannelOFlush(
        IN PSAC_CHANNEL Channel
        )
 {
-       return STATUS_NOT_IMPLEMENTED;
+       NTSTATUS Status;
+       
+       ChannelLockOBuffer(Channel);
+
+       Status = Channel->OBufferFlush(Channel);
+       
+       ChannelUnlockOBuffer(Channel);
+       
+       return Status;
 }
 
 NTSTATUS
@@ -80,7 +102,15 @@ ChannelIWrite(
        IN ULONG BufferSize
        )
 {
-       return STATUS_NOT_IMPLEMENTED;
+       NTSTATUS Status;
+
+       ChannelLockIBuffer(Channel);
+
+       Status = Channel->IBufferWrite(Channel, Buffer, BufferSize);
+       
+       ChannelUnlockIBuffer(Channel);
+       
+       return Status;
 }
 
 ULONG 
@@ -91,7 +121,15 @@ ChannelIRead(
        OUT PULONG ResultBufferSize
        )
 {
-       return STATUS_NOT_IMPLEMENTED;
+       NTSTATUS Status;
+       
+       ChannelLockIBuffer(Channel);
+
+       Status = Channel->IBufferRead(Channel, Buffer, BufferSize, ResultBufferSize);
+       
+       ChannelUnlockIBuffer(Channel);
+       
+       return Status;
 }
 
 NTSTATUS
@@ -99,7 +137,15 @@ ChannelIReadLast(
        IN PSAC_CHANNEL Channel
        )
 {
-       return STATUS_NOT_IMPLEMENTED;
+       NTSTATUS Status;
+
+       ChannelLockIBuffer(Channel);
+
+       Status = Channel->IBufferReadLast(Channel);
+       
+       ChannelUnlockIBuffer(Channel);
+       
+       return Status;
 }
 
 ULONG
@@ -107,7 +153,15 @@ ChannelIBufferLength(
        IN PSAC_CHANNEL Channel
        )
 {
-       return STATUS_NOT_IMPLEMENTED;
+       NTSTATUS Length;
+
+       ChannelLockOBuffer(Channel);
+
+       Length = Channel->IBufferLength(Channel);
+       
+       ChannelUnlockOBuffer(Channel);
+       
+       return Length;
 }
 
 NTSTATUS
@@ -179,7 +233,11 @@ ChannelSetLockEvent(
        IN PSAC_CHANNEL Channel
        )
 {
-       return STATUS_NOT_IMPLEMENTED;
+       NTSTATUS Status;
+       
+       ChannelSetEvent(Channel, LockEvent);
+       
+       return Status;
 }
 
 NTSTATUS
@@ -188,7 +246,11 @@ ChannelSetRedrawEvent(
        IN PSAC_CHANNEL Channel
        )
 {
-       return STATUS_NOT_IMPLEMENTED;
+       NTSTATUS Status;
+
+       ChannelSetEvent(Channel, RedrawEvent);
+
+       return Status;
 }
 
 NTSTATUS
@@ -196,7 +258,11 @@ ChannelClearRedrawEvent(
        IN PSAC_CHANNEL Channel
        )
 {
-       return STATUS_NOT_IMPLEMENTED;
+       NTSTATUS Status;
+       
+       ChannelClearEvent(Channel, RedrawEvent);
+       
+       return Status;
 }
 
 NTSTATUS
@@ -205,7 +271,12 @@ ChannelHasRedrawEvent(
        OUT PBOOLEAN Present
        )
 {
-       return STATUS_NOT_IMPLEMENTED;
+       CHECK_PARAMETER1(Channel);
+       CHECK_PARAMETER2(Present);
+       
+       *Present = Channel->Flags & SAC_CHANNEL_FLAG_REDRAW_EVENT;
+       
+       return STATUS_SUCCESS;
 }
 
 BOOLEAN
@@ -213,7 +284,11 @@ ChannelIsActive(
        IN PSAC_CHANNEL Channel
        )
 {
-       return FALSE;
+       SAC_CHANNEL_STATUS ChannelStatus;
+
+       if (!NT_SUCCESS(ChannelGetStatus(Channel, &ChannelStatus))) return FALSE;
+
+       return (ChannelStatus == Active);
 }
 
 BOOLEAN