Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

608 lines
8.1 KiB

/*++
Copyright (c) 1998-1999 Microsoft Corporation
All rights reserved.
Module Name:
dbgdev.cxx
Abstract:
Debug Device Interface class
Author:
Steve Kiraly (SteveKi) 10-Dec-1995
Revision History:
--*/
#include "precomp.hxx"
#pragma hdrstop
#include "dbgdev.hxx"
/*++
Routine Name:
TDebugDevice
Routine Description:
Constructor
Arguments:
pszConfiguration - pointer to colon separated configuration string.
Return Value:
Nothing
--*/
TDebugDevice::
TDebugDevice(
IN LPCTSTR pszConfiguration,
IN EDebugType eDebugType
) : _pszConfiguration( NULL ),
_eCharType( kUnknown ),
_eDebugType( eDebugType ),
TDebugNodeDouble()
{
//
// If configuration data was provided.
//
if( pszConfiguration && _tcslen( pszConfiguration ) )
{
_pszConfiguration = INTERNAL_NEW TCHAR [ _tcslen( pszConfiguration ) + 1];
//
// Copy the configuration data.
//
if( _pszConfiguration )
{
_tcscpy( _pszConfiguration, pszConfiguration );
//
// Get the character type.
//
TIterator i( this );
for( i.First(); !i.IsDone(); i.Next() )
{
//
// The first item is defined as the character type.
//
if( i.Index() == 1 )
{
//
// Look for the ansi specifier.
//
_eCharType = !_tcsicmp( i.Current(), kstrAnsi ) ? kAnsi : kUnicode;
break;
}
}
}
}
}
/*++
Routine Name:
TDebugDevice
Routine Description:
Destructor releases the configuration string.
Arguments:
None.
Return Value:
Nothing
--*/
TDebugDevice::
~TDebugDevice(
VOID
)
{
INTERNAL_DELETE [] _pszConfiguration;
}
/*++
Routine Name:
bValid
Routine Description:
Valid object indicator.
Arguments:
None.
Return Value:
Nothing
--*/
BOOL
TDebugDevice::
bValid(
VOID
) const
{
return TRUE;
}
/*++
Routine Name:
eGetCharType
Routine Description:
Retrives the devices character type.
Arguments:
None.
Return Value:
Devices character type
--*/
TDebugDevice::ECharType
TDebugDevice::
eGetCharType(
VOID
) const
{
return _eCharType;
}
/*++
Routine Name:
eGetDeviceType
Routine Description:
Retrives the device type.
Arguments:
None.
Return Value:
Debug Device Type
--*/
EDebugType
TDebugDevice::
eGetDebugType(
VOID
) const
{
return _eDebugType;
}
/*++
Routine Name:
pszGetConfigurationString
Routine Description:
Retrives the raw devices configuration string.
Arguments:
None.
Return Value:
Pointer to device configuration string.
--*/
LPCTSTR
TDebugDevice::
pszGetConfigurationString(
VOID
) const
{
return _pszConfiguration;
}
/*++
Routine Name:
MapStringTypeToDevice
Routine Description:
Map the device string to a device enumeration.
Arguments:
pszDeviceString - pointer to device type string.
Return Value:
Device type enumeration
--*/
UINT
TDebugDevice::
MapStringTypeToDevice(
IN LPCTSTR pszDeviceString
) const
{
DeviceMap aDeviceMap [] = { { kDbgNull, kstrDeviceNull},
{ kDbgConsole, kstrConsole },
{ kDbgDebugger, kstrDebugger },
{ kDbgFile, kstrFile },
{ kDbgBackTrace, kstrBacktrace } };
for( UINT i = 0; i < COUNTOF( aDeviceMap ); i++ )
{
if( !_tcsicmp( aDeviceMap[i].Name, pszDeviceString ) )
{
return aDeviceMap[i].Id;
}
}
return kDbgNull;
}
/********************************************************************
Debug Iterator device class.
********************************************************************/
/*++
Routine Name:
TIterator
Routine Description:
Constructor
Arguments:
pszConfiguration - pointer to colon separated configuration string.
Return Value:
Nothing
--*/
TDebugDevice::TIterator::
TIterator(
IN TDebugDevice *DbgDevice
) : _pStr( NULL ),
_pCurrent( NULL ),
_pEnd( NULL ),
_bValid( FALSE ),
_uIndex( 0 )
{
//
// Make a copy of the configuration string for iteration.
// The configuration string is defined as a colon delimited
// string, the iterator needs a copy because it replaces the
// colons with nulls for isolating its pieces.
//
if( DbgDevice->_pszConfiguration && _tcslen( DbgDevice->_pszConfiguration ) )
{
_pStr = INTERNAL_NEW TCHAR [ _tcslen(DbgDevice->_pszConfiguration) + 1 ];
if( _pStr )
{
_tcscpy( _pStr, DbgDevice->_pszConfiguration );
_bValid = TRUE;
}
}
}
/*++
Routine Name:
TIterator
Routine Description:
Destructor
Arguments:
None.
Return Value:
Nothing
--*/
TDebugDevice::TIterator::
~TIterator(
VOID
)
{
INTERNAL_DELETE [] _pStr;
}
/*++
Routine Name:
bValid
Routine Description:
Indicates if this class is valid.
Arguments:
None.
Return Value:
TRUE valid, FALSE invalid.
--*/
BOOL
TDebugDevice::TIterator::
bValid(
VOID
) const
{
return _bValid;
}
/*++
Routine Name:
First
Routine Description:
Starts the interator.
Arguments:
None.
Return Value:
Nothing
--*/
VOID
TDebugDevice::TIterator::
First(
VOID
)
{
if( !_bValid )
return;
//
// If running iteration was reset with a first call
// Put back the colon.
//
if( _pEnd )
*_pEnd = _T(':');
//
// Reset index.
//
_uIndex = 1;
//
// Skip leading colons
//
for( _pCurrent = _pStr; *_pCurrent && *_pCurrent == _T(':'); _pCurrent++);
//
// Search for next colon.
//
for( _pEnd = _pCurrent; *_pEnd && *_pEnd != _T(':'); _pEnd++);
//
// Place the null to complete the string.
//
if( *_pEnd )
*_pEnd = NULL;
else
_pEnd = NULL;
}
/*++
Routine Name:
Next
Routine Description:
Advance to the next item.
Arguments:
None.
Return Value:
Nothing
--*/
VOID
TDebugDevice::TIterator::
Next(
VOID
)
{
if( !_bValid )
return;
//
// If iteration is pending put back the colon and advance
// to the next character.
//
if( _pEnd )
{
*_pEnd = _T(':');
_pEnd++;
}
else
{
//
// End iteration, defined as _pCurrent == _pEnd == NULL
//
_pCurrent = _pEnd;
return;
}
//
// Update current.
//
_pCurrent = _pEnd;
//
// Skip leading colons
//
for( ; *_pCurrent && *_pCurrent == _T(':'); _pCurrent++);
//
// Advance to the end of the current item.
//
for( _pEnd = _pCurrent; *_pEnd && *_pEnd != _T(':'); _pEnd++);
//
// Replace colon with a null
//
if( *_pEnd )
*_pEnd = NULL;
else
_pEnd = NULL;
_uIndex++;
}
/*++
Routine Name:
IsDone
Routine Description:
Indicates if there are any more items.
Arguments:
None.
Return Value:
TRUE no mote items, FALSE more items availabe.
--*/
BOOL
TDebugDevice::TIterator::
IsDone(
VOID
) const
{
if( !_bValid )
return TRUE;
if( _pCurrent == NULL && _pEnd == NULL )
return TRUE;
return FALSE;
}
/*++
Routine Name:
Current
Routine Description:
Returns pointer to current item.
Arguments:
None.
Return Value:
Pointer to item. NULL if no more items, or error.
--*/
LPCTSTR
TDebugDevice::TIterator::
Current(
VOID
) const
{
if( !_bValid )
return NULL;
return _pCurrent;
}
/*++
Routine Name:
Index
Routine Description:
Returns current item index.
Arguments:
None.
Return Value:
Index starting with 1 to N
--*/
UINT
TDebugDevice::TIterator::
Index(
VOID
) const
{
if( !_bValid )
return 0;
return _uIndex;
}