/*
 * COPYRIGHT:        See COPYING in the top level directory
 * PROJECT:          ReactOS kernel
 * PURPOSE:          Native driver for dxg implementation
 * FILE:             win32ss/reactx/dxapi/main.c
 * PROGRAMER:        Magnus olsen (magnus@greatlord.com)
 * REVISION HISTORY:
 *       15/10-2007   Magnus Olsen
 */


#include "dxapi_driver.h"

#define NDEBU /* debug prints are enabled, add a G at the end to disable it ;-) */
#include <debug.h>

NTSTATUS NTAPI
DriverEntry(IN PVOID Context1,
            IN PVOID Context2)
{
    /*
     * NOTE this driver will never be load, it only contain export list
     * to win32k eng functions
     */
    return STATUS_SUCCESS;
}

/*++
* @name DxApiGetVersion
* @implemented
*
* The function DxApiGetVersion return the dsound version, and it always return 4.02
*
* @return
* Always return 4.02
*
* @remarks.
* none
*
*--*/
ULONG
NTAPI
DxApiGetVersion(VOID)
{
    /* MSDN say this always return Direct Sound version 4.02 */
    return 0x402;
}



/*++
* @name DxApi
* @implemented
*
* The function DxApi calls to diffent functions, follow functions
* are supported
* DxGetVersionNumber, DxCloseHandle, DxOpenDirectDraw, DxOpenSurface,
* DxOpenVideoPort, DxGetKernelCaps, DxGetFieldNumber, DxSetFieldNumber,
* DxSetSkipPattern, DxGetSurfaceState, DxSetSurfaceState, DxLock,
* DxFlipOverlay, DxFlipVideoPort, DxGetCurrentAutoflip, DxGetPreviousAutoflip,
* DxRegisterEvent, DxUnregisterEvent, DxGetPolarity, DxOpenVpCatureDevice,
* DxAddVpCaptureBuffer, DxFlushVpCaptureBuffs
*
* See ddkmapi.h as well

*
* @param ULONG dwFunctionNum
* The function id we want call on in the dxapi.sys see ddkmapi.h for the id
*
* @param PVOID lpvInBuffer
* Our input buffer to the functions we call to, This param can be NULL
*
* @param ULONG cbInBuffer
* Our size in bytes of the input buffer, rember wrong size will result in the function
* does not being call.
*
* @param PVOID lpvOutBuffer
* Our Output buffer, there the function fill in the info, this param can not
* be null. if it null the functions we trying call on will not be call
*
* @param ULONG cbOutBuffer
* Our size in bytes of the output buffer, rember wrong size will result in the function
* does not being call.
*
* @return
* Return Always 0.
*
* @remarks.
* before call to any of this functions, do not forget set lpvOutBuffer->ddRVal = DDERR_GEN*,
* if that member exists in the outbuffer ;
*
*--*/

DWORD
NTAPI
DxApi(IN DWORD dwFunctionNum,
      IN LPVOID lpvInBuffer,
      IN DWORD cbInBuffer,
      OUT LPVOID lpvOutBuffer,
      OUT DWORD cbOutBuffer)
{

    dwFunctionNum -= DD_FIRST_DXAPI;

    if ((lpvOutBuffer == NULL) ||
       /*(dwFunctionNum < (DD_FIRST_DXAPI - DD_FIRST_DXAPI)) ||*/
       (dwFunctionNum > (DD_DXAPI_FLUSHVPCAPTUREBUFFERS - DD_FIRST_DXAPI)) ||
       (gDxApiEntryPoint[dwFunctionNum].pfn == NULL) ||
       (cbInBuffer != tblCheckInBuffer[dwFunctionNum]) ||
       (cbOutBuffer != tblCheckOutBuffer[dwFunctionNum]))

    {
        return 0;
    }

    gDxApiEntryPoint[dwFunctionNum].pfn(lpvInBuffer, lpvOutBuffer);
    return 0;
}

VOID
NTAPI
DxApiInitialize (
    PVOID p1,
    PVOID p2,
    PVOID p3,
    PVOID p4,
    PVOID p5,
    PVOID p6,
    PVOID p7,
    PVOID p8)
{
    UNIMPLEMENTED;
}

VOID
NTAPI
DxAutoflipUpdate (
    PVOID p1,
    PVOID p2,
    PVOID p3,
    PVOID p4,
    PVOID p5)
{
    UNIMPLEMENTED;
}

VOID
NTAPI
DxEnableIRQ (
    PVOID p1,
    PVOID p2)
{
    UNIMPLEMENTED;
}

VOID
NTAPI
DxLoseObject (
    PVOID p1,
    PVOID p2)
{
    UNIMPLEMENTED;
}

VOID
NTAPI
DxUpdateCapture (
    PVOID p1,
    PVOID p2,
    PVOID p3)
{
    UNIMPLEMENTED;
}


/*++
* @name DxGetVersionNumber
* @implemented
*
* The function DxGetVersionNumber return dxapi interface version, that is 1.0
*
* @return
* Always return 1.0
*
* @remarks.
* none
*
*--*/
VOID
DxGetVersionNumber(PVOID lpvInBuffer, LPDDGETVERSIONNUMBER lpvOutBuffer)
{
    lpvOutBuffer->ddRVal = DD_OK;
    lpvOutBuffer->dwMajorVersion = 1;
    lpvOutBuffer->dwMinorVersion = 0;
}

VOID
DxCloseHandle(PVOID lpvInBuffer, PVOID lpvOutBuffer)
{
    /* FIXME Unimplement */
}

VOID
DxOpenDirectDraw(PVOID lpvInBuffer, PVOID lpvOutBuffer)
{
    /* FIXME Unimplement */
}

VOID
DxOpenSurface(PVOID lpvInBuffer, PVOID lpvOutBuffer)
{
    /* FIXME Unimplement */
}

VOID
DxOpenVideoPort(PVOID lpvInBuffer, PVOID lpvOutBuffer)
{
    /* FIXME Unimplement */
}

VOID
DxGetKernelCaps(PVOID lpvInBuffer, PVOID lpvOutBuffer)
{
    /* FIXME Unimplement */
}

VOID
DxGetFieldNumber(PVOID lpvInBuffer, PVOID lpvOutBuffer)
{
    /* FIXME Unimplement */
}

VOID
DxSetFieldNumber(PVOID lpvInBuffer, PVOID lpvOutBuffer)
{
    /* FIXME Unimplement */
}

VOID
DxSetSkipPattern(PVOID lpvInBuffer, PVOID lpvOutBuffer)
{
    /* FIXME Unimplement */
}

VOID
DxGetSurfaceState(PVOID lpvInBuffer, PVOID lpvOutBuffer)
{
    /* FIXME Unimplement */
}

VOID
DxSetSurfaceState(PVOID lpvInBuffer, PVOID lpvOutBuffer)
{
    /* FIXME Unimplement */
}

VOID
DxLock(PVOID lpvInBuffer, PVOID lpvOutBuffer)
{
    /* FIXME Unimplement */
}

VOID
DxFlipOverlay(PVOID lpvInBuffer, PVOID lpvOutBuffer)
{
    /* FIXME Unimplement */
}

VOID
DxFlipVideoPort(PVOID lpvInBuffer, PVOID lpvOutBuffer)
{
    /* FIXME Unimplement */
}

VOID
DxGetCurrentAutoflip(PVOID lpvInBuffer, PVOID lpvOutBuffer)
{
    /* FIXME Unimplement */
}

VOID
DxGetPreviousAutoflip(PVOID lpvInBuffer, PVOID lpvOutBuffer)
{
    /* FIXME Unimplement */
}

VOID
DxRegisterEvent(PVOID lpvInBuffer, PVOID lpvOutBuffer)
{
    /* FIXME Unimplement */
}

VOID
DxUnregisterEvent(PVOID lpvInBuffer, PVOID lpvOutBuffer)
{
    /* FIXME Unimplement */
}

VOID
DxGetPolarity(PVOID lpvInBuffer, PVOID lpvOutBuffer)
{
    /* FIXME Unimplement */
}

VOID
DxOpenVpCatureDevice(PVOID lpvInBuffer, PVOID lpvOutBuffer)
{
    /* FIXME Unimplement */
}

VOID
DxAddVpCaptureBuffer(PVOID lpvInBuffer, PVOID lpvOutBuffer)
{
    /* FIXME Unimplement */
}

VOID
DxFlushVpCaptureBuffs(PVOID lpvInBuffer, PVOID lpvOutBuffer)
{
    /* FIXME Unimplement */
}