windows-nt/Source/XPSP1/NT/printscan/print/spooler/dbglib/dbgmsg.cxx
2020-09-26 16:20:57 +08:00

850 lines
16 KiB
C++

/*++
Copyright (c) 1998-1999 Microsoft Corporation
All rights reserved.
Module Name:
dbgmsg.cxx
Abstract:
Debug Library
Author:
Steve Kiraly (SteveKi) 10-Dec-1995
Revision History:
--*/
#include "precomp.hxx"
#pragma hdrstop
//
// Singleton instance.
//
namespace
{
TDebugMsg DebugMsg;
}
/*++
Title:
TDebugMsg_Register
Routine Description:
Registers the prefix, device, trace and break level with the
global debug messaging library.
Arguments:
pszPrefix - pointer to prefix string.
uDevice - debug device type.
eLevel - message trace level.
eBreak - debug break level.
Return Value:
TRUE device registered, FALSE error occurred.
--*/
extern "C"
BOOL
TDebugMsg_Register(
IN LPCTSTR pszPrefix,
IN UINT uDevice,
IN INT eLevel,
IN INT eBreak
)
{
//
// Initialize the debug library, it not already initialized.
//
DebugLibraryInitialize();
//
// Hold the critical section while we access the heap.
//
TDebugCriticalSection::TLock CS(GlobalCriticalSection);
//
// Don't re-initialize the message class.
//
if (!DebugMsg.Valid())
{
//
// Initialize the debug heap.
//
DebugMsg.Initialize(pszPrefix, uDevice, eLevel, eBreak);
//
// Expose the debug message class for the debug extension.
//
Globals.DebugMsgSingleton = &DebugMsg;
}
//
// Return the message class status.
//
return DebugMsg.Valid();
}
/*++
Title:
TDebugMsg_Release
Routine Description:
Arguments:
Return Value:
--*/
extern "C"
VOID
TDebugMsg_Release(
VOID
)
{
//
// Initialize the debug library, it not already initialized.
//
DebugLibraryInitialize();
//
// Hold the critical section while we access the heap.
//
TDebugCriticalSection::TLock CS(GlobalCriticalSection);
//
// Destroy the message class.
//
DebugMsg.Destroy();
//
// Remote the debug message class from the debug extension.
//
Globals.DebugMsgSingleton = NULL;
}
/*++
Title:
TDebugMsg_vEnable
Routine Description:
Enabled the debug messaging class, debug device will be called
when a message is asked to be sent.
Arguments:
None
Return Value:
None
--*/
extern "C"
VOID
TDebugMsg_Enable(
VOID
)
{
//
// Initialize the debug library, it not already initialized.
//
DebugLibraryInitialize();
//
// Hold the critical section while we access message class.
//
TDebugCriticalSection::TLock CS(GlobalCriticalSection);
//
// Only do the command if the message class is enabled.
//
if (DebugMsg.Valid())
{
DebugMsg.Enable();
}
}
/*++
Title:
TDebugMsg_Disable
Routine Description:
Disable the debug messaging class, debug device will not be called
when a message is asked to be sent.
Arguments:
None
Return Value:
None
--*/
extern "C"
VOID
TDebugMsg_Disable(
VOID
)
{
//
// Initialize the debug library, it not already initialized.
//
DebugLibraryInitialize();
//
// Hold the critical section while we access message class.
//
TDebugCriticalSection::TLock CS(GlobalCriticalSection);
//
// Only do the command if the message class is enabled.
//
if (DebugMsg.Valid())
{
DebugMsg.Disable();
}
}
/*++
Title:
TDebugMsg_Attach
Routine Description:
Attaches the output device specified by uDevice and pszConfiguration.
if this routing is successfull, the handle to the attached device
is returned in phDevice.
Arguments:
phDevice - pointer to device handle were to return newly created
add attached output device.
uDevice, - output device type to attached, see header file for
an enumeration of valid output device types.
pszConfiguration - pointer to output device specific configuration
string.
Return Value:
TRUE device was attached, FALSE error occurred.
--*/
extern "C"
BOOL
TDebugMsg_Attach(
IN HANDLE *phDevice,
IN UINT uDevice,
IN LPCTSTR pszConfiguration
)
{
//
// Initialize the debug library, it not already initialized.
//
DebugLibraryInitialize();
//
// Hold the critical section while we access message class.
//
TDebugCriticalSection::TLock CS(GlobalCriticalSection);
//
// Is the message class valid.
//
BOOL bRetval = DebugMsg.Valid();
//
// Only do the command if the message class is enabled.
//
if (bRetval)
{
bRetval = DebugMsg.Attach(phDevice, uDevice, pszConfiguration);
}
return bRetval;
}
/*++
Title:
TDebugMsg_Detach
Routine Description:
Removes the device specified by the handle from the
list of output devices.
Arguments:
phDevice - Pointer to debug device handle
Return Value:
None
--*/
extern "C"
VOID
TDebugMsg_Detach(
IN HANDLE *phDevice
)
{
//
// Initialize the debug library, it not already initialized.
//
DebugLibraryInitialize();
//
// Hold the critical section while we access message class.
//
TDebugCriticalSection::TLock CS(GlobalCriticalSection);
//
// Only do the command if the message class is enabled.
//
if (DebugMsg.Valid())
{
DebugMsg.Detach(phDevice);
}
}
/*++
Title:
TDebugMsg_MsgA
Routine Description:
This function outputs the specified message to the list
of output debug devices. Not this routine is not a general
purpose output routine, the pszMessage parameter must be
have been allocated from the internal debug heap.
Arguments:
uLevel - debug trace and break level
pszFile - pointer to file name
uLine - file line number
pszModulePrefix - pointe to module prefix, OPTIONAL
pszMessage - pointer to post formatted message string, that
was returned from a call to TDebugMsg_pszFmt,
if this pointer is non null then it relased
back to the internal debug heap before this
routine returns.
Return Value:
None
--*/
extern "C"
VOID
TDebugMsg_MsgA(
IN UINT uLevel,
IN LPCTSTR pszFile,
IN UINT uLine,
IN LPCTSTR pszModulePrefix,
IN LPSTR pszMessage
)
{
//
// Initialize the debug library, it not already initialized.
//
DebugLibraryInitialize();
//
// Hold the critical section while we access message class.
//
TDebugCriticalSection::TLock CS(GlobalCriticalSection);
//
// Only do the command if the message class is enabled.
//
if (DebugMsg.Valid())
{
DebugMsg.Msg(uLevel, pszFile, uLine, pszModulePrefix, pszMessage);
}
else
{
//
// Message class is not initialized, well lets do it now.
//
DebugMsg.Initialize(NULL, kDbgDebugger, kDbgTrace, kDbgNone);
//
// Only do the command if the message class is enabled.
//
if (DebugMsg.Valid())
{
DebugMsg.Msg(uLevel, pszFile, uLine, pszModulePrefix, pszMessage);
}
else
{
INTERNAL_DELETE [] pszMessage;
}
}
}
/*++
Title:
TDebugMsg_Msg
Routine Description:
This function outputs the specified message to the list
of output debug devices. Not this routine is not a general
purpose output routine, the pszMessage parameter must be
have been allocated from the internal debug heap.
Arguments:
uLevel - debug trace and break level
pszFile - pointer to file name
uLine - file line number
pszModulePrefix - pointe to module prefix, OPTIONAL
pszMessage - pointer to post formatted message string, that
was returned from a call to TDebugMsg_pszFmt,
if this pointer is non null then it relased
back to the internal debug heap before this
routine returns.
Return Value:
Pointer to allocated string, NULL if failure.
--*/
extern "C"
VOID
TDebugMsg_MsgW(
IN UINT uLevel,
IN LPCTSTR pszFile,
IN UINT uLine,
IN LPCTSTR pszModulePrefix,
IN LPWSTR pszMessage
)
{
//
// Initialize the debug library, it not already initialized.
//
DebugLibraryInitialize();
//
// Hold the critical section while we access message class.
//
TDebugCriticalSection::TLock CS(GlobalCriticalSection);
//
// Only do the command if the message class is enabled.
//
if (DebugMsg.Valid())
{
DebugMsg.Msg(uLevel, pszFile, uLine, pszModulePrefix, pszMessage);
}
else
{
//
// Message class is not initialized, well lets do it now.
//
DebugMsg.Initialize(NULL, kDbgDebugger, kDbgTrace, kDbgNone);
//
// Only do the command if the message class is enabled.
//
if (DebugMsg.Valid())
{
DebugMsg.Msg(uLevel, pszFile, uLine, pszModulePrefix, pszMessage);
}
else
{
INTERNAL_DELETE [] pszMessage;
}
}
}
/*++
Title:
TDebugMsg_Msg
Routine Description:
This function outputs the specified message to the list
of output debug devices. Not this routine is not a general
purpose output routine, the pszMessage parameter must be
have been allocated from the internal debug heap.
Arguments:
uLevel - debug trace and break level
pszFile - pointer to file name
uLine - file line number
pszModulePrefix - pointe to module prefix, OPTIONAL
pszMessage - pointer to post formatted message string, that
was returned from a call to TDebugMsg_pszFmt,
if this pointer is non null then it relased
back to the internal debug heap before this
routine returns.
Return Value:
None
--*/
VOID
TDebugMsg_Msg(
IN UINT uLevel,
IN LPCTSTR pszFile,
IN UINT uLine,
IN LPCTSTR pszModulePrefix,
IN LPSTR pszMessage
)
{
//
// Initialize the debug library, it not already initialized.
//
DebugLibraryInitialize();
//
// Hold the critical section while we access message class.
//
TDebugCriticalSection::TLock CS(GlobalCriticalSection);
//
// Only do the command if the message class is enabled.
//
if (DebugMsg.Valid())
{
DebugMsg.Msg(uLevel, pszFile, uLine, pszModulePrefix, pszMessage);
}
else
{
//
// Message class is not initialized, well lets do it now.
//
DebugMsg.Initialize(NULL, kDbgDebugger, kDbgTrace, kDbgNone);
//
// Only do the command if the message class is enabled.
//
if (DebugMsg.Valid())
{
DebugMsg.Msg(uLevel, pszFile, uLine, pszModulePrefix, pszMessage);
}
else
{
INTERNAL_DELETE [] pszMessage;
}
}
}
/*++
Title:
TDebugMsg_Msg
Routine Description:
This function outputs the specified message to the list
of output debug devices. Not this routine is not a general
purpose output routine, the pszMessage parameter must be
have been allocated from the internal debug heap.
Arguments:
uLevel - debug trace and break level
pszFile - pointer to file name
uLine - file line number
pszModulePrefix - pointe to module prefix, OPTIONAL
pszMessage - pointer to post formatted message string, that
was returned from a call to TDebugMsg_pszFmt,
if this pointer is non null then it relased
back to the internal debug heap before this
routine returns.
Return Value:
None
--*/
VOID
TDebugMsg_Msg(
IN UINT uLevel,
IN LPCTSTR pszFile,
IN UINT uLine,
IN LPCTSTR pszModulePrefix,
IN LPWSTR pszMessage
)
{
//
// Initialize the debug library, it not already initialized.
//
DebugLibraryInitialize();
//
// Hold the critical section while we access message class.
//
TDebugCriticalSection::TLock CS(GlobalCriticalSection);
//
// Only do the command if the message class is enabled.
//
if (DebugMsg.Valid())
{
DebugMsg.Msg(uLevel, pszFile, uLine, pszModulePrefix, pszMessage);
}
else
{
//
// Message class is not initialized, well lets do it now.
//
DebugMsg.Initialize(NULL, kDbgDebugger, kDbgTrace, kDbgNone);
//
// Only do the command if the message class is enabled.
//
if (DebugMsg.Valid())
{
DebugMsg.Msg(uLevel, pszFile, uLine, pszModulePrefix, pszMessage);
}
else
{
INTERNAL_DELETE [] pszMessage;
}
}
}
/*++
Title:
TDebugMsg_FmtA
Routine Description:
This function takes a format string and a list of arguments
and returns a allocated string that is formated, specified
by the format string.
Arguments:
pszFmt - pointer to format string.
... - varable number of arguments.
Return Value:
Pointer to allocated string, NULL if failure.
--*/
extern "C"
LPSTR
WINAPIV
TDebugMsg_FmtA(
IN LPCSTR pszFmt,
IN ...
)
{
va_list pArgs;
va_start(pArgs, pszFmt);
LPSTR pszResult = vFormatA(pszFmt, pArgs);
va_end(pArgs);
return pszResult;
}
/*++
Title:
TDebugMsg_FmtW
Routine Description:
This function takes a format string and a list of arguments
and returns a allocated string that is formated, specified
by the format string.
Arguments:
pszFmt - pointer to format string.
... - varable number of arguments.
Return Value:
Pointer to allocated string, NULL if failure.
--*/
extern "C"
LPWSTR
WINAPIV
TDebugMsg_FmtW(
IN LPCWSTR pszFmt,
IN ...
)
{
va_list pArgs;
va_start(pArgs, pszFmt);
LPWSTR pszResult = vFormatW(pszFmt, pArgs);
va_end(pArgs);
return pszResult;
}
/*++
Title:
TDebugMsg_Fmt
Routine Description:
This function takes a format string and a list of arguments
and returns a allocated string that is formated, specified
by the format string.
Arguments:
pszFmt - pointer to format string.
... - varable number of arguments.
Return Value:
Pointer to allocated string, NULL if failure.
--*/
LPSTR
WINAPIV
TDebugMsg_Fmt(
IN LPCSTR pszFmt,
IN ...
)
{
va_list pArgs;
va_start(pArgs, pszFmt);
LPSTR pszResult = vFormatA(pszFmt, pArgs);
va_end(pArgs);
return pszResult;
}
/*++
Title:
TDebugMsg_Fmt
Routine Description:
This function takes a format string and a list of arguments
and returns a allocated string that is formated, specified
by the format string.
Arguments:
pszFmt - pointer to format string.
... - varable number of arguments.
Return Value:
Pointer to allocated format string, NULL if failure.
--*/
LPWSTR
WINAPIV
TDebugMsg_Fmt(
IN LPCWSTR pszFmt,
IN ...
)
{
va_list pArgs;
va_start(pArgs, pszFmt);
LPWSTR pszResult = vFormatW(pszFmt, pArgs);
va_end(pArgs);
return pszResult;
}
/*++
Title:
TDebugMsg_SetMessageFieldFormat
Routine Description:
Arguments:
Return Value:
None.
--*/
VOID
TDebugMsg_SetMessageFieldFormat(
IN UINT eField,
IN LPTSTR pszFormat
)
{
//
// Initialize the debug library, it not already initialized.
//
DebugLibraryInitialize();
//
// Hold the critical section while we access message class.
//
TDebugCriticalSection::TLock CS(GlobalCriticalSection);
//
// Only do the command if the message class is enabled.
//
if (DebugMsg.Valid())
{
DebugMsg.SetMessageFieldFormat(eField, pszFormat);
}
}