/*++

Copyright (c) 1998-1999 Microsoft Corporation
All rights reserved.

Module Name:

    dbgdbg.cxx

Abstract:

    Debug Device Debugger device

Author:

    Steve Kiraly (SteveKi)  5-Dec-1995

Revision History:

--*/
#include "precomp.hxx"
#pragma hdrstop

#include "dbgdbg.hxx"

/*++

Routine Name:

    DebugDeviceDebugger constructor

Routine Description:

    Initializes the debug device

Arguments:

    Pointer to object defined configuration string

Return Value:

    Nothing

--*/
TDebugDeviceDebugger::
TDebugDeviceDebugger(
    IN LPCTSTR      pszConfiguration,
    IN EDebugType   eDebugType
    ) : TDebugDevice( pszConfiguration, eDebugType ),
        _bAnsi( FALSE )
{
    _bAnsi = eGetCharType() == TDebugDevice::kAnsi;
}

/*++

Routine Name:

    DebugDevice Destructor

Routine Description:

    Removes access to the debug device

Arguments:

    None

Return Value:

    Nothing

--*/
TDebugDeviceDebugger::
~TDebugDeviceDebugger(
        VOID
    )
{
}

/*++

Routine Name:

    Valid Object indicator

Routine Description:


Arguments:


Return Value:


--*/
BOOL
TDebugDeviceDebugger::
bValid(
    VOID
    ) const
{
    return TRUE;
}

/*++

Routine Name:

    DebugDevice output

Routine Description:

    Output the string to the debug device.

Arguments:

    Number of bytes to output, including the null.
    Pointer to zero terminated debug string

Return Value:

    TRUE string output out, FALSE on failure

--*/
BOOL
TDebugDeviceDebugger::
bOutput (
    IN UINT     cbSize,
    IN LPBYTE   pBuffer
    )
{
    BYTE pTemp[256];
    UINT uIndex;

    //
    // OutputDebugString cannot handle strings large then
    // 4k so we do it in chunks.
    //
    for (uIndex = 0; cbSize; cbSize = cbSize - uIndex)
    {
        //
        // The current index is the small of the two either
        // the remaining data or the size of the temp buffer,
        // less the null terminator.
        //
        uIndex = min(sizeof(pTemp) - sizeof(WCHAR), cbSize);

        //
        // Copy the memory, we know it is not overlapping.
        //
        memcpy(pTemp, pBuffer, uIndex);

        //
        // Update the buffer count, and place the null.
        //
        pBuffer = pBuffer + uIndex;
        *(pTemp + uIndex + 0) = 0;
        *(pTemp + uIndex + 1) = 0;

        if (_bAnsi)
        {
            OutputDebugStringA( (LPSTR)pTemp );
        }
        else
        {
            OutputDebugStringW( (LPWSTR)pTemp );
        }
    }

    return TRUE;
}