1010 lines
26 KiB
C
1010 lines
26 KiB
C
|
/*++
|
|||
|
|
|||
|
Copyright (c) 1997 Microsoft Corporation
|
|||
|
|
|||
|
Module Name:
|
|||
|
|
|||
|
debug.c
|
|||
|
|
|||
|
Abstract:
|
|||
|
|
|||
|
Routines for displaying debug messages.
|
|||
|
|
|||
|
Environment:
|
|||
|
|
|||
|
User Mode - Win32
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
#if DBG
|
|||
|
|
|||
|
///////////////////////////////////////////////////////////////////////////////
|
|||
|
// //
|
|||
|
// Include files //
|
|||
|
// //
|
|||
|
///////////////////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
#include "globals.h"
|
|||
|
#include "provider.h"
|
|||
|
#include "registry.h"
|
|||
|
#include <stdio.h>
|
|||
|
#include <stdarg.h>
|
|||
|
#include <crtdbg.h>
|
|||
|
|
|||
|
///////////////////////////////////////////////////////////////////////////////
|
|||
|
// //
|
|||
|
// Private definitions //
|
|||
|
// //
|
|||
|
///////////////////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
#define DEBUG_FORMAT_HEADER "H323 "
|
|||
|
#define DEBUG_FORMAT_TIMESTAMP "[%02u:%02u:%02u.%03u"
|
|||
|
#define DEBUG_FORMAT_THREADID ",tid=%x] "
|
|||
|
|
|||
|
#define MAX_DEBUG_STRLEN 512
|
|||
|
|
|||
|
#define STATUS_MASK_ERROR 0x0000FFFF
|
|||
|
#define STATUS_MASK_FACILITY 0x0FFF0000
|
|||
|
|
|||
|
|
|||
|
///////////////////////////////////////////////////////////////////////////////
|
|||
|
// //
|
|||
|
// Private procedures //
|
|||
|
// //
|
|||
|
///////////////////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
VOID
|
|||
|
OutputDebugMessage(
|
|||
|
LPSTR pszDebugMessage
|
|||
|
)
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Writes debug message to specified log(s).
|
|||
|
|
|||
|
Args:
|
|||
|
|
|||
|
pszDebugMessage - zero-terminated string containing debug message.
|
|||
|
|
|||
|
Return Values:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
// initialize descriptor
|
|||
|
static FILE * fd = NULL;
|
|||
|
|
|||
|
// check if logfile output specified
|
|||
|
if (g_RegistrySettings.dwLogType & DEBUG_OUTPUT_FILE) {
|
|||
|
|
|||
|
// validate
|
|||
|
if (fd == NULL) {
|
|||
|
|
|||
|
// attempt to open log file
|
|||
|
fd = fopen(g_RegistrySettings.szLogFile, "w");
|
|||
|
}
|
|||
|
|
|||
|
// validate
|
|||
|
if (fd != NULL) {
|
|||
|
|
|||
|
// output entry to stream
|
|||
|
fprintf(fd, "%s", pszDebugMessage);
|
|||
|
|
|||
|
// flush stream
|
|||
|
fflush(fd);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// check if debugger output specified
|
|||
|
if (g_RegistrySettings.dwLogType & DEBUG_OUTPUT_DEBUGGER) {
|
|||
|
|
|||
|
// output entry to debugger
|
|||
|
OutputDebugStringA(pszDebugMessage);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
///////////////////////////////////////////////////////////////////////////////
|
|||
|
// //
|
|||
|
// Public procedures //
|
|||
|
// //
|
|||
|
///////////////////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
VOID
|
|||
|
H323DbgPrint(
|
|||
|
DWORD dwLevel,
|
|||
|
LPSTR szFormat,
|
|||
|
...
|
|||
|
)
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Debug output routine for service provider.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
Same as printf.
|
|||
|
|
|||
|
Return Values:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
va_list Args;
|
|||
|
SYSTEMTIME SystemTime;
|
|||
|
char szDebugMessage[MAX_DEBUG_STRLEN+1];
|
|||
|
int nLengthRemaining;
|
|||
|
int nLength = 0;
|
|||
|
|
|||
|
// see if level enabled
|
|||
|
if (dwLevel <= g_RegistrySettings.dwLogLevel) {
|
|||
|
|
|||
|
// 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()
|
|||
|
);
|
|||
|
|
|||
|
// point at first argument
|
|||
|
va_start(Args, szFormat);
|
|||
|
|
|||
|
// determine number of bytes left in buffer
|
|||
|
nLengthRemaining = sizeof(szDebugMessage) - nLength;
|
|||
|
|
|||
|
// add user specified debug message
|
|||
|
_vsnprintf(&szDebugMessage[nLength],
|
|||
|
nLengthRemaining,
|
|||
|
szFormat,
|
|||
|
Args
|
|||
|
);
|
|||
|
|
|||
|
// release pointer
|
|||
|
va_end(Args);
|
|||
|
|
|||
|
// output message to specified sink
|
|||
|
OutputDebugMessage(szDebugMessage);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
PSTR
|
|||
|
H323IndicationToString(
|
|||
|
BYTE bIndication
|
|||
|
)
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Converts indication from call control module to string.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
bIndication - Specifies value to convert.
|
|||
|
|
|||
|
Return Values:
|
|||
|
|
|||
|
Returns string describing value.
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
static PSTR apszIndicationStrings[] = {
|
|||
|
NULL,
|
|||
|
"CC_RINGING_INDICATION",
|
|||
|
"CC_CONNECT_INDICATION",
|
|||
|
"CC_TX_CHANNEL_OPEN_INDICATION",
|
|||
|
"CC_RX_CHANNEL_REQUEST_INDICATION",
|
|||
|
"CC_RX_CHANNEL_CLOSE_INDICATION",
|
|||
|
"CC_MUTE_INDICATION",
|
|||
|
"CC_UNMUTE_INDICATION",
|
|||
|
"CC_PEER_ADD_INDICATION",
|
|||
|
"CC_PEER_DROP_INDICATION",
|
|||
|
"CC_PEER_CHANGE_CAP_INDICATION",
|
|||
|
"CC_CONFERENCE_TERMINATION_INDICATION",
|
|||
|
"CC_HANGUP_INDICATION",
|
|||
|
"CC_RX_NONSTANDARD_MESSAGE_INDICATION",
|
|||
|
"CC_MULTIPOINT_INDICATION",
|
|||
|
"CC_PEER_UPDATE_INDICATION",
|
|||
|
"CC_H245_MISCELLANEOUS_COMMAND_INDICATION",
|
|||
|
"CC_H245_MISCELLANEOUS_INDICATION_INDICATION",
|
|||
|
"CC_H245_CONFERENCE_REQUEST_INDICATION",
|
|||
|
"CC_H245_CONFERENCE_RESPONSE_INDICATION",
|
|||
|
"CC_H245_CONFERENCE_COMMAND_INDICATION",
|
|||
|
"CC_H245_CONFERENCE_INDICATION_INDICATION",
|
|||
|
"CC_FLOW_CONTROL_INDICATION",
|
|||
|
"CC_TX_CHANNEL_CLOSE_REQUEST_INDICATION",
|
|||
|
"CC_REQUEST_MODE_INDICATION",
|
|||
|
"CC_REQUEST_MODE_RESPONSE_INDICATION",
|
|||
|
"CC_VENDOR_ID_INDICATION",
|
|||
|
"CC_MAXIMUM_AUDIO_VIDEO_SKEW_INDICATION",
|
|||
|
"CC_T120_CHANNEL_REQUEST_INDICATION",
|
|||
|
"CC_T120_CHANNEL_OPEN_INDICATION",
|
|||
|
"CC_BANDWIDTH_CHANGED_INDICATION",
|
|||
|
"CC_ACCEPT_CHANNEL_INDICATION",
|
|||
|
"CC_TERMINAL_ID_REQUEST_INDICATION"
|
|||
|
};
|
|||
|
|
|||
|
// make sure index value within bounds
|
|||
|
return (bIndication < H323GetNumStrings(apszIndicationStrings))
|
|||
|
? apszIndicationStrings[bIndication]
|
|||
|
: NULL
|
|||
|
;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
PSTR
|
|||
|
CCStatusToString(
|
|||
|
DWORD dwStatus
|
|||
|
)
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Converts call control status to string.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
dwStatus - Specifies value to convert.
|
|||
|
|
|||
|
Return Values:
|
|||
|
|
|||
|
Returns string describing value.
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
static PSTR apszCCStatusStrings[] = {
|
|||
|
NULL,
|
|||
|
"CC_PEER_REJECT",
|
|||
|
"CC_BAD_PARAM",
|
|||
|
"CC_BAD_SIZE",
|
|||
|
"CC_ACTIVE_CONNECTIONS",
|
|||
|
"CC_INTERNAL_ERROR",
|
|||
|
"CC_NOT_IMPLEMENTED",
|
|||
|
"CC_DUPLICATE_CONFERENCE_ID",
|
|||
|
"CC_ILLEGAL_IN_MULTIPOINT",
|
|||
|
"CC_NOT_MULTIPOINT_CAPABLE",
|
|||
|
"CC_PEER_CANCEL",
|
|||
|
NULL,
|
|||
|
NULL,
|
|||
|
NULL,
|
|||
|
"CC_NO_MEMORY",
|
|||
|
NULL,
|
|||
|
NULL,
|
|||
|
NULL,
|
|||
|
NULL,
|
|||
|
NULL,
|
|||
|
NULL,
|
|||
|
"CC_GKI_STATE",
|
|||
|
"CC_GKI_CALL_STATE",
|
|||
|
"CC_GKI_LISTEN_NOT_FOUND",
|
|||
|
"CC_GATEKEEPER_REFUSED",
|
|||
|
"CC_INVALID_WITHOUT_GATEKEEPER",
|
|||
|
"CC_GKI_IP_ADDRESS",
|
|||
|
"CC_GKI_LOAD"
|
|||
|
};
|
|||
|
|
|||
|
// adjust code within bounds
|
|||
|
dwStatus -= ERROR_LOCAL_BASE_ID;
|
|||
|
|
|||
|
// make sure index value within bounds
|
|||
|
return (dwStatus < H323GetNumStrings(apszCCStatusStrings))
|
|||
|
? apszCCStatusStrings[dwStatus]
|
|||
|
: NULL
|
|||
|
;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
PSTR
|
|||
|
CCRejectReasonToString(
|
|||
|
DWORD dwReason
|
|||
|
)
|
|||
|
{
|
|||
|
static PSTR apszCCRejectReasonStrings[] = {
|
|||
|
NULL,
|
|||
|
"CC_REJECT_NO_BANDWIDTH",
|
|||
|
"CC_REJECT_GATEKEEPER_RESOURCES",
|
|||
|
"CC_REJECT_UNREACHABLE_DESTINATION",
|
|||
|
"CC_REJECT_DESTINATION_REJECTION",
|
|||
|
"CC_REJECT_INVALID_REVISION",
|
|||
|
"CC_REJECT_NO_PERMISSION",
|
|||
|
"CC_REJECT_UNREACHABLE_GATEKEEPER",
|
|||
|
"CC_REJECT_GATEWAY_RESOURCES",
|
|||
|
"CC_REJECT_BAD_FORMAT_ADDRESS",
|
|||
|
"CC_REJECT_ADAPTIVE_BUSY",
|
|||
|
"CC_REJECT_IN_CONF",
|
|||
|
"CC_REJECT_ROUTE_TO_GATEKEEPER",
|
|||
|
"CC_REJECT_CALL_FORWARDED",
|
|||
|
"CC_REJECT_ROUTE_TO_MC",
|
|||
|
"CC_REJECT_UNDEFINED_REASON",
|
|||
|
"CC_REJECT_INTERNAL_ERROR",
|
|||
|
"CC_REJECT_NORMAL_CALL_CLEARING",
|
|||
|
"CC_REJECT_USER_BUSY",
|
|||
|
"CC_REJECT_NO_ANSWER",
|
|||
|
"CC_REJECT_NOT_IMPLEMENTED",
|
|||
|
"CC_REJECT_MANDATORY_IE_MISSING",
|
|||
|
"CC_REJECT_INVALID_IE_CONTENTS",
|
|||
|
"CC_REJECT_TIMER_EXPIRED",
|
|||
|
"CC_REJECT_CALL_DEFLECTION",
|
|||
|
"CC_REJECT_GATEKEEPER_TERMINATED"
|
|||
|
};
|
|||
|
|
|||
|
// make sure index value within bounds
|
|||
|
return (dwReason < H323GetNumStrings(apszCCRejectReasonStrings))
|
|||
|
? apszCCRejectReasonStrings[dwReason]
|
|||
|
: NULL
|
|||
|
;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
PSTR
|
|||
|
Q931StatusToString(
|
|||
|
DWORD dwStatus
|
|||
|
)
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Converts Q.931 status to string.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
dwStatus - Specifies value to convert.
|
|||
|
|
|||
|
Return Values:
|
|||
|
|
|||
|
Returns string describing value.
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
static PSTR apszQ931StatusStrings[] = {
|
|||
|
NULL,
|
|||
|
"Q931_BAD_PARAM",
|
|||
|
"Q931_DUPLICATE_LISTEN",
|
|||
|
"Q931_INTERNAL_ERROR",
|
|||
|
"Q931_BAD_SIZE",
|
|||
|
"Q931_NO_MEMORY",
|
|||
|
"Q931_NOT_IMPLEMENTED",
|
|||
|
"Q931_NOT_INITIALIZED",
|
|||
|
"Q931_DUPLICATE_INITIALIZE",
|
|||
|
"Q931_SUBSYSTEM_FAILURE",
|
|||
|
"Q931_OUT_OF_SEQUENCE",
|
|||
|
"Q931_PEER_UNREACHABLE",
|
|||
|
"Q931_SETUP_TIMER_EXPIRED",
|
|||
|
"Q931_RINGING_TIMER_EXPIRED",
|
|||
|
"Q931_INCOMPATIBLE_VERSION",
|
|||
|
"Q931_OPTION_NOT_IMPLEMENTED",
|
|||
|
"Q931_ENDOFINPUT",
|
|||
|
"Q931_INVALID_FIELD",
|
|||
|
"Q931_NO_FIELD_DATA",
|
|||
|
"Q931_INVALID_PROTOCOL",
|
|||
|
"Q931_INVALID_MESSAGE_TYPE",
|
|||
|
"Q931_MANDATORY_IE_MISSING",
|
|||
|
"Q931_BAD_IE_CONTENT"
|
|||
|
};
|
|||
|
|
|||
|
// adjust code within bounds
|
|||
|
dwStatus -= ERROR_LOCAL_BASE_ID;
|
|||
|
|
|||
|
// make sure index value within bounds
|
|||
|
return (dwStatus < H323GetNumStrings(apszQ931StatusStrings))
|
|||
|
? apszQ931StatusStrings[dwStatus]
|
|||
|
: NULL
|
|||
|
;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
PSTR
|
|||
|
H245StatusToString(
|
|||
|
DWORD dwStatus
|
|||
|
)
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Converts H.245 status to string.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
dwStatus - Specifies value to convert.
|
|||
|
|
|||
|
Return Values:
|
|||
|
|
|||
|
Returns string describing value.
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
static PSTR apszH245StatusStrings[] = {
|
|||
|
NULL,
|
|||
|
"H245_ERROR_INVALID_DATA_FORMAT",
|
|||
|
"H245_ERROR_NOMEM",
|
|||
|
"H245_ERROR_NOSUP",
|
|||
|
"H245_ERROR_PARAM",
|
|||
|
"H245_ERROR_ALREADY_INIT",
|
|||
|
"H245_ERROR_NOT_CONNECTED",
|
|||
|
NULL,
|
|||
|
NULL,
|
|||
|
NULL,
|
|||
|
NULL,
|
|||
|
NULL,
|
|||
|
NULL,
|
|||
|
NULL,
|
|||
|
NULL,
|
|||
|
NULL,
|
|||
|
"H245_ERROR_NORESOURCE",
|
|||
|
"H245_ERROR_NOTIMP",
|
|||
|
"H245_ERROR_SUBSYS",
|
|||
|
"H245_ERROR_FATAL",
|
|||
|
"H245_ERROR_MAXTBL",
|
|||
|
"H245_ERROR_CHANNEL_INUSE",
|
|||
|
"H245_ERROR_INVALID_CAPID",
|
|||
|
"H245_ERROR_INVALID_OP",
|
|||
|
"H245_ERROR_UNKNOWN",
|
|||
|
"H245_ERROR_NOBANDWIDTH",
|
|||
|
"H245_ERROR_LOSTCON",
|
|||
|
"H245_ERROR_INVALID_MUXTBLENTRY",
|
|||
|
"H245_ERROR_INVALID_INST",
|
|||
|
"H245_ERROR_INPROCESS",
|
|||
|
"H245_ERROR_INVALID_STATE",
|
|||
|
"H245_ERROR_TIMEOUT",
|
|||
|
"H245_ERROR_INVALID_CHANNEL",
|
|||
|
"H245_ERROR_INVALID_CAPDESCID",
|
|||
|
"H245_ERROR_CANCELED",
|
|||
|
"H245_ERROR_MUXELEMENT_DEPTH",
|
|||
|
"H245_ERROR_MUXELEMENT_WIDTH",
|
|||
|
"H245_ERROR_ASN1",
|
|||
|
"H245_ERROR_NO_MUX_CAPS",
|
|||
|
"H245_ERROR_NO_CAPDESC"
|
|||
|
};
|
|||
|
|
|||
|
// remove error base id
|
|||
|
dwStatus -= ERROR_BASE_ID;
|
|||
|
|
|||
|
// make sure index value within bounds
|
|||
|
return (dwStatus < H323GetNumStrings(apszH245StatusStrings))
|
|||
|
? apszH245StatusStrings[dwStatus]
|
|||
|
: NULL
|
|||
|
;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
PSTR
|
|||
|
WinsockStatusToString(
|
|||
|
DWORD dwStatus
|
|||
|
)
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Converts winsock status to string.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
dwStatus - Specifies value to convert.
|
|||
|
|
|||
|
Return Values:
|
|||
|
|
|||
|
Returns string describing value.
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
static PSTR apszWinsockStatusStrings[] = {
|
|||
|
NULL,
|
|||
|
NULL,
|
|||
|
NULL,
|
|||
|
NULL,
|
|||
|
"WSAEINTR",
|
|||
|
NULL,
|
|||
|
NULL,
|
|||
|
NULL,
|
|||
|
NULL,
|
|||
|
"WSAEBADF",
|
|||
|
NULL,
|
|||
|
NULL,
|
|||
|
NULL,
|
|||
|
"WSAEACCES",
|
|||
|
"WSAEFAULT",
|
|||
|
NULL,
|
|||
|
NULL,
|
|||
|
NULL,
|
|||
|
NULL,
|
|||
|
NULL,
|
|||
|
NULL,
|
|||
|
NULL,
|
|||
|
"WSAEINVAL",
|
|||
|
NULL,
|
|||
|
"WSAEMFILE",
|
|||
|
NULL,
|
|||
|
NULL,
|
|||
|
NULL,
|
|||
|
NULL,
|
|||
|
NULL,
|
|||
|
NULL,
|
|||
|
NULL,
|
|||
|
NULL,
|
|||
|
NULL,
|
|||
|
NULL,
|
|||
|
"WSAEWOULDBLOCK",
|
|||
|
"WSAEINPROGRESS",
|
|||
|
"WSAEALREADY",
|
|||
|
"WSAENOTSOCK",
|
|||
|
"WSAEDESTADDRREQ",
|
|||
|
"WSAEMSGSIZE",
|
|||
|
"WSAEPROTOTYPE",
|
|||
|
"WSAENOPROTOOPT",
|
|||
|
"WSAEPROTONOSUPPORT",
|
|||
|
"WSAESOCKTNOSUPPORT",
|
|||
|
"WSAEOPNOTSUPP",
|
|||
|
"WSAEPFNOSUPPORT",
|
|||
|
"WSAEAFNOSUPPORT",
|
|||
|
"WSAEADDRINUSE",
|
|||
|
"WSAEADDRNOTAVAIL",
|
|||
|
"WSAENETDOWN",
|
|||
|
"WSAENETUNREACH",
|
|||
|
"WSAENETRESET",
|
|||
|
"WSAECONNABORTED",
|
|||
|
"WSAECONNRESET",
|
|||
|
"WSAENOBUFS",
|
|||
|
"WSAEISCONN",
|
|||
|
"WSAENOTCONN",
|
|||
|
"WSAESHUTDOWN",
|
|||
|
"WSAETOOMANYREFS",
|
|||
|
"WSAETIMEDOUT",
|
|||
|
"WSAECONNREFUSED",
|
|||
|
"WSAELOOP",
|
|||
|
"WSAENAMETOOLONG",
|
|||
|
"WSAEHOSTDOWN",
|
|||
|
"WSAEHOSTUNREACH",
|
|||
|
"WSAENOTEMPTY",
|
|||
|
"WSAEPROCLIM",
|
|||
|
"WSAEUSERS",
|
|||
|
"WSAEDQUOT",
|
|||
|
"WSAESTALE",
|
|||
|
"WSAEREMOTE"
|
|||
|
};
|
|||
|
|
|||
|
// validate status
|
|||
|
if (dwStatus < WSABASEERR) {
|
|||
|
return NULL;
|
|||
|
}
|
|||
|
|
|||
|
// adjust error code
|
|||
|
dwStatus -= WSABASEERR;
|
|||
|
|
|||
|
// make sure index value within bounds
|
|||
|
return (dwStatus < H323GetNumStrings(apszWinsockStatusStrings))
|
|||
|
? apszWinsockStatusStrings[dwStatus]
|
|||
|
: NULL
|
|||
|
;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
PSTR
|
|||
|
H323StatusToString(
|
|||
|
DWORD dwStatus
|
|||
|
)
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Converts status to string.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
dwStatus - Specifies value to convert.
|
|||
|
|
|||
|
Return Values:
|
|||
|
|
|||
|
Returns string describing value.
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
DWORD dwFacility;
|
|||
|
|
|||
|
static PSTR pszDefaultString = "ERROR";
|
|||
|
static PSTR pszNoErrorString = "NOERROR";
|
|||
|
|
|||
|
// retrieve facility code from statuse code
|
|||
|
dwFacility = ((dwStatus & STATUS_MASK_FACILITY) >> 16);
|
|||
|
|
|||
|
// check for success
|
|||
|
if (dwStatus == NOERROR) {
|
|||
|
|
|||
|
// return success string
|
|||
|
return pszNoErrorString;
|
|||
|
|
|||
|
} else if (dwFacility == FACILITY_CALLCONTROL) {
|
|||
|
|
|||
|
// return call control status string
|
|||
|
return CCStatusToString(dwStatus & STATUS_MASK_ERROR);
|
|||
|
|
|||
|
} else if (dwFacility == FACILITY_Q931) {
|
|||
|
|
|||
|
// return Q931 status string
|
|||
|
return Q931StatusToString(dwStatus & STATUS_MASK_ERROR);
|
|||
|
|
|||
|
} else if (dwFacility == FACILITY_H245) {
|
|||
|
|
|||
|
// return H245 status string
|
|||
|
return H245StatusToString(dwStatus & STATUS_MASK_ERROR);
|
|||
|
|
|||
|
} else if (dwFacility == FACILITY_WINSOCK) {
|
|||
|
|
|||
|
// return H245 status string
|
|||
|
return WinsockStatusToString(dwStatus & STATUS_MASK_ERROR);
|
|||
|
|
|||
|
} else {
|
|||
|
|
|||
|
// return default string
|
|||
|
return pszDefaultString;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
PSTR
|
|||
|
H323CallStateToString(
|
|||
|
DWORD dwCallState
|
|||
|
)
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Converts tapi call state to string.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
dwCallState - Specifies value to convert.
|
|||
|
|
|||
|
Return Values:
|
|||
|
|
|||
|
Returns string describing value.
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
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
|
|||
|
H323DirToString(
|
|||
|
DWORD dwDir
|
|||
|
)
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Converts H.245 direction to string.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
dwDir - Specifies value to convert.
|
|||
|
|
|||
|
Return Values:
|
|||
|
|
|||
|
Returns string describing value.
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
static PSTR apszH245DirStrings[] = {
|
|||
|
"H245_CAPDIR_DONTCARE",
|
|||
|
"H245_CAPDIR_RMTRX",
|
|||
|
"H245_CAPDIR_RMTTX",
|
|||
|
"H245_CAPDIR_RMTRXTX",
|
|||
|
"H245_CAPDIR_LCLRX",
|
|||
|
"H245_CAPDIR_LCLTX",
|
|||
|
"H245_CAPDIR_LCLRXTX"
|
|||
|
};
|
|||
|
|
|||
|
// make sure index value within bounds
|
|||
|
return (dwDir < H323GetNumStrings(apszH245DirStrings))
|
|||
|
? apszH245DirStrings[dwDir]
|
|||
|
: NULL
|
|||
|
;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
PSTR
|
|||
|
H323DataTypeToString(
|
|||
|
DWORD dwDataType
|
|||
|
)
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Converts H.245 data type to string.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
dwDataType - Specifies value to convert.
|
|||
|
|
|||
|
Return Values:
|
|||
|
|
|||
|
Returns string describing value.
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
static PSTR apszH245DataTypeStrings[] = {
|
|||
|
"H245_DATA_DONTCARE",
|
|||
|
"H245_DATA_NONSTD",
|
|||
|
"H245_DATA_NULL",
|
|||
|
"H245_DATA_VIDEO",
|
|||
|
"H245_DATA_AUDIO",
|
|||
|
"H245_DATA_DATA",
|
|||
|
"H245_DATA_ENCRYPT_D",
|
|||
|
"H245_DATA_CONFERENCE",
|
|||
|
"H245_DATA_MUX"
|
|||
|
};
|
|||
|
|
|||
|
// make sure index value within bounds
|
|||
|
return (dwDataType < H323GetNumStrings(apszH245DataTypeStrings))
|
|||
|
? apszH245DataTypeStrings[dwDataType]
|
|||
|
: NULL
|
|||
|
;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
PSTR
|
|||
|
H323ClientTypeToString(
|
|||
|
DWORD dwClientType
|
|||
|
)
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Converts H.245 client type to string.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
dwClientType - Specifies value to convert.
|
|||
|
|
|||
|
Return Values:
|
|||
|
|
|||
|
Returns string describing value.
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
static PSTR apszH245ClientTypeStrings[] = {
|
|||
|
"H245_CLIENT_DONTCARE",
|
|||
|
"H245_CLIENT_NONSTD",
|
|||
|
"H245_CLIENT_VID_NONSTD",
|
|||
|
"H245_CLIENT_VID_H261",
|
|||
|
"H245_CLIENT_VID_H262",
|
|||
|
"H245_CLIENT_VID_H263",
|
|||
|
"H245_CLIENT_VID_IS11172",
|
|||
|
"H245_CLIENT_AUD_NONSTD",
|
|||
|
"H245_CLIENT_AUD_G711_ALAW64",
|
|||
|
"H245_CLIENT_AUD_G711_ALAW56",
|
|||
|
"H245_CLIENT_AUD_G711_ULAW64",
|
|||
|
"H245_CLIENT_AUD_G711_ULAW56",
|
|||
|
"H245_CLIENT_AUD_G722_64",
|
|||
|
"H245_CLIENT_AUD_G722_56",
|
|||
|
"H245_CLIENT_AUD_G722_48",
|
|||
|
"H245_CLIENT_AUD_G723",
|
|||
|
"H245_CLIENT_AUD_G728",
|
|||
|
"H245_CLIENT_AUD_G729",
|
|||
|
"H245_CLIENT_AUD_GDSVD",
|
|||
|
"H245_CLIENT_AUD_IS11172",
|
|||
|
"H245_CLIENT_AUD_IS13818",
|
|||
|
"H245_CLIENT_DAT_NONSTD",
|
|||
|
"H245_CLIENT_DAT_T120",
|
|||
|
"H245_CLIENT_DAT_DSMCC",
|
|||
|
"H245_CLIENT_DAT_USERDATA",
|
|||
|
"H245_CLIENT_DAT_T84",
|
|||
|
"H245_CLIENT_DAT_T434",
|
|||
|
"H245_CLIENT_DAT_H224",
|
|||
|
"H245_CLIENT_DAT_NLPID",
|
|||
|
"H245_CLIENT_DAT_DSVD",
|
|||
|
"H245_CLIENT_DAT_H222",
|
|||
|
"H245_CLIENT_ENCRYPTION_TX",
|
|||
|
"H245_CLIENT_ENCRYPTION_RX",
|
|||
|
"H245_CLIENT_CONFERENCE",
|
|||
|
"H245_CLIENT_MUX_NONSTD",
|
|||
|
"H245_CLIENT_MUX_H222",
|
|||
|
"H245_CLIENT_MUX_H223",
|
|||
|
"H245_CLIENT_MUX_VGMUX",
|
|||
|
"H245_CLIENT_MUX_H2250",
|
|||
|
"H245_CLIENT_MUX_H223_ANNEX_A"
|
|||
|
};
|
|||
|
|
|||
|
// make sure index value within bounds
|
|||
|
return (dwClientType < H323GetNumStrings(apszH245ClientTypeStrings))
|
|||
|
? apszH245ClientTypeStrings[dwClientType]
|
|||
|
: NULL
|
|||
|
;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
PSTR
|
|||
|
H323MiscCommandToString(
|
|||
|
DWORD dwMiscCommand
|
|||
|
)
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Converts H.245 command to string.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
dwMiscCommand - Miscellaneous H.245 command.
|
|||
|
|
|||
|
Return Values:
|
|||
|
|
|||
|
Returns string describing value.
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
static PSTR apszH245MiscCommandStrings[] = {
|
|||
|
"equaliseDelay",
|
|||
|
"zeroDelay",
|
|||
|
"multipointModeCommand",
|
|||
|
"cnclMltpntMdCmmnd",
|
|||
|
"videoFreezePicture",
|
|||
|
"videoFastUpdatePicture",
|
|||
|
"videoFastUpdateGOB",
|
|||
|
"MCd_tp_vdTmprlSptlTrdOff",
|
|||
|
"videoSendSyncEveryGOB",
|
|||
|
"vdSndSyncEvryGOBCncl",
|
|||
|
"videoFastUpdateMB"
|
|||
|
};
|
|||
|
|
|||
|
// make sure index value within bounds
|
|||
|
return (dwMiscCommand < H323GetNumStrings(apszH245MiscCommandStrings))
|
|||
|
? apszH245MiscCommandStrings[dwMiscCommand]
|
|||
|
: "Unknown"
|
|||
|
;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
PSTR
|
|||
|
H323MSPCommandToString(
|
|||
|
DWORD dwCommand
|
|||
|
)
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Converts MSP command to string.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
Command - Type of MSP command.
|
|||
|
|
|||
|
Return Values:
|
|||
|
|
|||
|
Returns string describing value.
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
static PSTR apszMSPCommandStrings[] = {
|
|||
|
"CMD_CHANNEL_OPEN",
|
|||
|
"CMD_CHANNEL_OPEN_REPLY",
|
|||
|
"CMD_CHANNEL_CLOSE",
|
|||
|
"CMD_CALL_CONNECT",
|
|||
|
"CMD_CALL_DISCONNECT",
|
|||
|
"CMD_KEYFRAME"
|
|||
|
};
|
|||
|
|
|||
|
// make sure index value within bounds
|
|||
|
return (dwCommand < H323GetNumStrings(apszMSPCommandStrings))
|
|||
|
? apszMSPCommandStrings[dwCommand]
|
|||
|
: NULL
|
|||
|
;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
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";
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
#endif // DBG
|