windows-nt/Source/XPSP1/NT/net/tapi/skywalker/h323/tsp/debug.cpp
2020-09-26 16:20:57 +08:00

519 lines
12 KiB
C++

/*++
Copyright (c) 1999 Microsoft Corporation
Module Name:
debug.cpp
Abstract:
Routines for displaying debug messages.
Author:
Nikhil Bobde (NikhilB)
Revision History:
--*/
//
// Include files
//
#include "globals.h"
#define DEBUG_FORMAT_HEADER "H323 "
#define DEBUG_FORMAT_TIMESTAMP "[%02u:%02u:%02u.%03u"
#define DEBUG_FORMAT_THREADID ",tid=%x] "
#define DEBUG_FORMAT_END "\r\n"
HANDLE
H323CreateEvent(
LPSECURITY_ATTRIBUTES lpEventAttributes, // SD
BOOL bManualReset, // reset type
BOOL bInitialState, // initial state
LPCTSTR lpName // object name
)
{
#if DBG
return CreateEvent( lpEventAttributes, bManualReset, bInitialState, lpName );
#else
return CreateEvent( lpEventAttributes, bManualReset, bInitialState, NULL );
#endif
}
#if DBG
DWORD g_dwTraceID = INVALID_TRACEID;
static TCHAR g_szTraceName[100]; // saves name of dll
//
// Private definitions
//
#define MAX_DEBUG_STRLEN 800
#define STATUS_MASK_ERROR 0x0000FFFF
#define STATUS_MASK_FACILITY 0x0FFF0000
void H323DUMPBUFFER( IN BYTE * pEncoded, IN DWORD cbEncodedSize )
{
DWORD indexI, indexJ=0;
char ch;
char szDebugMessage[MAX_DEBUG_STRLEN];
szDebugMessage[0] = '\0';
H323DBG(( DEBUG_LEVEL_ERROR, "ASN buffer start." ));
for( indexI=0; indexI<cbEncodedSize; indexI++ )
{
ch = (pEncoded[indexI]>>4);
if( (ch>=0)&&(ch<=9) )
{
ch+='0';
}
else
{
ch=ch+'A'-10;
}
szDebugMessage[indexJ++]=ch;
ch = (pEncoded[indexI]& 0x0F);
if( (ch>=0)&&(ch<=9) )
{
ch+='0';
}
else
{
ch= ch+'A'-10;
}
szDebugMessage[indexJ++]=ch;
if( indexJ >= 700 )
{
szDebugMessage[indexJ]= '\0';
H323DBG((DEBUG_LEVEL_ERROR, szDebugMessage ));
indexJ = 0;
}
}
szDebugMessage[indexJ]= '\0';
H323DBG((DEBUG_LEVEL_ERROR, szDebugMessage ));
H323DBG(( DEBUG_LEVEL_ERROR, "ASN buffer end." ));
return;
}
//
// Public procedures
//
/*++
Routine Description:
Debug output routine for service provider.
Arguments:
Same as printf.
Return Values:
None.
--*/
VOID
H323DbgPrint(
DWORD dwLevel,
LPSTR szFormat,
...
)
{
va_list Args;
SYSTEMTIME SystemTime;
char szDebugMessage[MAX_DEBUG_STRLEN+1];
int nLengthRemaining;
int nLength = 0;
// point at first argument
va_start(Args, szFormat);
// see if level enabled
if( dwLevel <= g_RegistrySettings.dwLogLevel )
{
// always emit messages at DEBUG_LEVEL_FORCE
// retrieve local time
GetLocalTime(&SystemTime);
// add component header to the debug message
nLength += sprintf(&szDebugMessage[nLength],
DEBUG_FORMAT_HEADER
);
// add timestamp to the debug message
nLength += sprintf(&szDebugMessage[nLength],
DEBUG_FORMAT_TIMESTAMP,
SystemTime.wHour,
SystemTime.wMinute,
SystemTime.wSecond,
SystemTime.wMilliseconds
);
// add thread id to the debug message
nLength += sprintf(&szDebugMessage[nLength],
DEBUG_FORMAT_THREADID,
GetCurrentThreadId()
);
// determine number of bytes left in buffer
nLengthRemaining = sizeof(szDebugMessage) - nLength -
strlen(DEBUG_FORMAT_END);
// add user specified debug message
nLength += _vsnprintf(&szDebugMessage[nLength],
nLengthRemaining,
szFormat,
Args
);
nLength += sprintf(&szDebugMessage[nLength], DEBUG_FORMAT_END );
// output message to specified sink
OutputDebugStringA(szDebugMessage);
}
TraceVprintfExA( g_dwTraceID, (dwLevel | TRACE_USE_MASK), szFormat, Args );
// release pointer
va_end(Args);
}
void DumpError(
IN DWORD ErrorCode )
{
CHAR ErrorText [0x100];
DWORD Length;
Length = FormatMessageA( FORMAT_MESSAGE_FROM_SYSTEM, NULL,
ErrorCode, LANG_NEUTRAL, ErrorText, 0x100, NULL );
if( Length == 0 )
{
_snprintf( ErrorText, 0x100, "<unknown error %08XH %d>",
ErrorCode, ErrorCode);
}
H323DBG ((DEBUG_LEVEL_ERROR, "\t%s", ErrorText));
}
BOOL TRACELogRegister(LPCTSTR szName)
{
#ifdef UNICODE
wsprintf(g_szTraceName, _T("%ls"), szName);
#else
wsprintfA(g_szTraceName, "%s", szName);
#endif
g_dwTraceID = TraceRegister(g_szTraceName);
return( g_dwTraceID != INVALID_TRACEID );
}
void TRACELogDeRegister()
{
if( g_dwTraceID != INVALID_TRACEID )
{
TraceDeregister(g_dwTraceID);
g_dwTraceID = INVALID_TRACEID;
}
}
#else
HANDLE g_hLogFile;
VOID
OpenLogFile()
{
g_hLogFile = INVALID_HANDLE_VALUE;
g_hLogFile = CreateFile( _T("h323log.txt"),
GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ,
NULL,
OPEN_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL );
}
VOID
CloseLogFile()
{
if( g_hLogFile != INVALID_HANDLE_VALUE )
{
CloseHandle(g_hLogFile);
}
}
VOID
H323DbgPrintFre(
DWORD dwLevel,
LPSTR szFormat,
...
)
{
va_list Args;
SYSTEMTIME SystemTime;
char szDebugMessage[800];
DWORD NumberOfBytesWritten=0;
int nLengthRemaining;
int nLength = 0;
// see if level enabled
if( dwLevel <= g_RegistrySettings.dwLogLevel )
{
// point at first argument
va_start(Args, szFormat);
// always emit messages at DEBUG_LEVEL_FORCE
// retrieve local time
GetLocalTime(&SystemTime);
// add component header to the debug message
nLength += sprintf(&szDebugMessage[nLength],
DEBUG_FORMAT_HEADER
);
// add timestamp to the debug message
nLength += sprintf(&szDebugMessage[nLength],
DEBUG_FORMAT_TIMESTAMP,
SystemTime.wHour,
SystemTime.wMinute,
SystemTime.wSecond,
SystemTime.wMilliseconds
);
// add thread id to the debug message
nLength += sprintf(&szDebugMessage[nLength],
DEBUG_FORMAT_THREADID,
GetCurrentThreadId()
);
// determine number of bytes left in buffer
nLengthRemaining = sizeof(szDebugMessage) - nLength -
strlen(DEBUG_FORMAT_END);
// add user specified debug message
nLength += _vsnprintf(&szDebugMessage[nLength],
nLengthRemaining,
szFormat,
Args
);
nLength += sprintf(&szDebugMessage[nLength], DEBUG_FORMAT_END );
// output message to specified sink
//OutputDebugStringA(szDebugMessage);
if( g_hLogFile != INVALID_HANDLE_VALUE )
{
WriteFile( g_hLogFile,
szDebugMessage,
nLength,
&NumberOfBytesWritten,
NULL );
}
// release pointer
va_end(Args);
}
}
#endif // DBG
PSTR
EventIDToString(
DWORD eventID
)
{
static PSTR apszEventNameStrings[] = {
"TSPI_NO_EVENT",
"TSPI_MAKE_CALL",
"TSPI_ANSWER_CALL",
"TSPI_DROP_CALL",
"TSPI_CLOSE_CALL",
"TSPI_RELEASE_U2U",
"TSPI_SEND_U2U",
"TSPI_COMPLETE_TRANSFER",
"TSPI_LINEFORWARD_SPECIFIC",
"TSPI_LINEFORWARD_NOSPECIFIC",
"TSPI_DIAL_TRNASFEREDCALL",
"TSPI_CALL_UNHOLD",
"TSPI_CALL_HOLD",
"TSPI_DELETE_CALL",
"TSPI_CALL_DIVERT",
"H450_PLACE_DIVERTEDCALL",
"SWAP_REPLACEMENT_CALL",
"DELETE_PRIMARY_CALL",
"STOP_CTIDENTIFYRR_TIMER",
"SEND_CTINITIATE_MESSAGE"
};
// return corresponding string
return apszEventNameStrings[eventID];
}
PSTR
H323TSPMessageToString(
DWORD dwMessageType
)
{
static PSTR msgstrings[] =
{
"SP_MSG_InitiateCall",
"SP_MSG_AnswerCall",
"SP_MSG_PrepareToAnswer",
"SP_MSG_ProceedWithAnswer",
"SP_MSG_ReadyToInitiate",
"SP_MSG_ReadyToAnswer",
"SP_MSG_FastConnectResponse",
"SP_MSG_StartH245",
"SP_MSG_ConnectComplete",
"SP_MSG_H245PDU",
"SP_MSG_MCLocationIdentify",
"SP_MSG_Hold",
"SP_MSG_H245Hold",
"SP_MSG_ConferenceList",
"SP_MSG_SendDTMFDigits",
"SP_MSG_ReleaseCall",
"SP_MSG_CallShutdown",
"SP_MSG_H245Terminated",
"SP_MSG_RASRegistration",
"SP_MSG_RASRegistrationEvent",
"SP_MSG_RASLocationRequest",
"SP_MSG_RASLocationConfirm",
"SP_MSG_RASBandwidthRequest",
"SP_MSG_RASBandwidthConfirm"
};
return msgstrings[dwMessageType];
}
/*++
Routine Description:
Converts tapi call state to string.
Arguments:
dwCallState - Specifies value to convert.
Return Values:
Returns string describing value.
--*/
PSTR
H323CallStateToString(
DWORD dwCallState
)
{
DWORD i;
DWORD dwBitMask;
static PSTR apszCallStateStrings[] = {
"IDLE",
"OFFERING",
"ACCEPTED",
"DIALTONE",
"DIALING",
"RINGBACK",
"BUSY",
"SPECIALINFO",
"CONNECTED",
"PROCEEDING",
"ONHOLD",
"CONFERENCED",
"ONHOLDPENDCONF",
"ONHOLDPENDTRANSFER",
"DISCONNECTED",
"UNKNOWN"
};
// keep shifting bit until the call state matchs the one specified
for(i = 0, dwBitMask = 1; dwCallState != dwBitMask; i++, dwBitMask <<= 1)
;
// return corresponding string
return apszCallStateStrings[i];
}
PSTR
H323AddressTypeToString(
DWORD dwAddressType
)
/*++
Routine Description:
Converts TAPI address type to string.
Arguments:
dwAddressType - TAPI address type.
Return Values:
Returns string describing value.
--*/
{
switch (dwAddressType) {
case LINEADDRESSTYPE_PHONENUMBER:
return "PHONENUMBER";
case LINEADDRESSTYPE_SDP:
return "SDP";
case LINEADDRESSTYPE_EMAILNAME:
return "EMAILNAME";
case LINEADDRESSTYPE_DOMAINNAME:
return "DOMAINNAME";
case LINEADDRESSTYPE_IPADDRESS:
return "IPADDRESS";
default:
return "unknown";
}
}