windows-nt/Source/XPSP1/NT/com/oleutest/stgbvt/comtools/log/log.cxx
2020-09-26 16:20:57 +08:00

1458 lines
42 KiB
C++

//+-------------------------------------------------------------------
//
// File: log.cxx
//
// Contents: The code for the logging servers client logging methods
//
// Functions: Log::Log()
// Log::Log(int, char *[])
// Log::Log(PCHAR, PCHAR, PCHAR, PCHAR, PCHAR)
// Log::Log(LPWSTR, LPWSTR, LPWSTR, LPWSTR, LPWSTR)
// Log::~Log()
// Log::Info(inc, char *[])
// Log::WriteVar(PCHAR, USHORT, PCHAR, ...)
// Log::WriteVar(LPWSTR, USHORT, LPWSTR, ...)
// Log::WriteVar(PCHAR, USHORT, USHORT, PVOID, PCHAR, ...)
// Log::WriteVar(LPWSTR, USHORT, USHORT, PVOID, LPWSTR, ...)
// Log::WriteVarList(PCHAR, USHORT, PCHAR, va_list)
// Log::WriteVarList(LPWSTR, USHORT, LPWSTR, va_list)
// Log::WriteVarList(PCHAR, USHORT, USHORT, PVOID, PCHAR, va_list)
// Log::WriteVarList(LPWSTR, USHORT, USHORT, PVOID,
// LPWSTR, va_list)
// Log::WriteData(PCHAR, ...)
// Log::WriteData(LPWSTR, ...)
// Log::WriteData(USHORT, PVOID, PCHAR, ...)
// Log::WriteData(USHORT, PVOID, LPWSTR, ...)
// Log::WriteDataList(PCHAR, va_list)
// Log::WriteDataList(LPWSTR, va_list)
// Log::WriteDataList(USHORT, PVOID, PCHAR, va_list)
// Log::WriteDataList(USHORT, PVOID, LPWSTR, va_list)
//
// History: 24-Sep-90 DaveWi Initial Coding
// 15-Aug-91 AliceSe set local logging if error binding
// 25-Sep-91 BryanT Converted to C 7.0
// 17-Oct-91 SarahJ DCR 525 - changed status parm of
// WriteVar methods to USHORT and validated
// parm to be in expected range
// 31-Oct-91 SarahJ Now takes /L or /mL for server parm
// 10-Feb-92 BryanT Win32 work and cleanup
// 3-Jul-92 DeanE Added WriteVarList, WriteDataList, and
// changed existing WriteVar and WriteData
// methods to call them
// 1-Aug-92 DwightKr Renamed CPCHAR as CPPSZ. CPCHAR
// conflicted with the 297 version of
// windows.h
// 31-Oct-92 SarahJ Removed references to tester name
//
//--------------------------------------------------------------------
#include <pch.cxx>
// BUGBUG Precompiled header does not work on Alpha for some unknown reason and
// so we temporarily remove it.
// #pragma hdrstop
// Set up a table of the status text values
const char * aStatus[] = { LOG_PASS_TXT,
LOG_FAIL_TXT,
LOG_WARN_TXT,
LOG_ABORT_TXT,
LOG_INFO_TXT,
LOG_START_TXT,
LOG_DONE_TXT };
LPWSTR waStatus[] = { wLOG_PASS_TXT,
wLOG_FAIL_TXT,
wLOG_WARN_TXT,
wLOG_ABORT_TXT,
wLOG_INFO_TXT,
wLOG_START_TXT,
wLOG_DONE_TXT };
//+----------------------------------------------------------------------------
//
// Function: IncLogStats(), static
//
// Synopsis: Increments the appropriate member of the passed-in LogStats
// struct based on value of the usStatus passed in.
//
// Effects: Maintains correct status of the LogStats struct so we can
// keep a running count of the log records written.
//
// Arguments: [out] LogStats& stStats - structure to modify
// [in] ULONG usStat - code tells which field to increment
//
// Returns: nothing
//
// Modifies: stStats
//
// History: 11-Jun-92 DonCl first version
//
// Notes: Used by different overloaded versions of WriteVar()
//
//-----------------------------------------------------------------------------
static VOID IncLogStats(LogStats& stStats, USHORT usStats)
{
switch(usStats)
{
case LOG_PASS:
stStats.ulPass++;
break;
case LOG_FAIL:
stStats.ulFail++;
break;
case LOG_WARN:
stStats.ulWarn++;
break;
case LOG_ABORT:
stStats.ulAbort++;
break;
case LOG_INFO:
stStats.ulInfo++;
break;
case LOG_START:
stStats.ulStart++;
break;
case LOG_DONE:
stStats.ulDone++;
break;
//
// No default, if code is unrecognized, there is no appropriate error
// action to take.
//
}
}
//+-------------------------------------------------------------------
//
// Member: Log::Log(DWORD)
//
// Synopsis: The log file is not opened if this constructor is used -
// the user must subsequently call the Info() method.
//
// Arguments: [fUseUnicode] - whether we should use WCHARs
//
// Modifies: fInfoSet
//
// History: ??-???-?? ???????? Created
//
//--------------------------------------------------------------------
Log :: Log(DWORD dwCharType) : fInfoSet(FALSE), ulLastError(NO_ERROR)
{
if(LOG_ANSI == dwCharType)
{
fIsUnicode = FALSE;
}
else if(LOG_UNICODE == dwCharType)
{
fIsUnicode = TRUE;
}
else
{
ulLastError = (ULONG) E_INVALIDARG;
return;
}
//
// zero out the _LogStats member
//
memset((VOID *)(&_stLogStats), 0, sizeof(LogStats));
}
//+-------------------------------------------------------------------
//
// Member: Log::Log(int, char *[], DWORD)
//
// Synopsis: Log constructor with command line data given
//
// Arguments: [argc] - Argument count
// [argv] - Argument array
// [fUseUnicode] - whether we should use WCHARs
//
// Returns: Results from Info()
//
// History: ??-???-?? ???????? Created
// Jun-11-92 DonCl added line to zero out LogStats struct
//
//--------------------------------------------------------------------
Log :: Log(int argc, char *argv[], DWORD dwCharType) :
fInfoSet(FALSE),
ulLastError(NO_ERROR)
{
if(LOG_ANSI == dwCharType)
{
fIsUnicode = FALSE;
}
else if(LOG_UNICODE == dwCharType)
{
fIsUnicode = TRUE;
}
else
{
ulLastError = (ULONG) E_INVALIDARG;
return;
}
//
// zero out the _LogStats member
//
memset((VOID *)(&_stLogStats), 0, sizeof(LogStats));
ulLastError = Info(argc, argv);
}
//+-------------------------------------------------------------------
//
// Member: Log::Log(PCHAR, PCHAR, PCHAR, PCHAR, PCHAR)
//
// Synopsis: Log constructor with internal data given
//
// Arguments: [pszSrvr] - Name of logging server
// [pszTest] - Name of this test
// [pszName] - Name of test runner
// [pszSubPath] - Users log file qualifer
// [pszObject] - Name of invoking object
//
// Returns:
//
// Modifies:
//
// History: ??-???-?? ???????? Created
// Jun-11-92 DonCl added line to zero out LogStats struct
//
// BUGBUG wszName unused - left until all components can co-ordinate
// with this. SarahJ
//--------------------------------------------------------------------
Log :: Log(PCHAR pszSrvr,
PCHAR pszTest,
PCHAR pszName,
PCHAR pszSubPath,
PCHAR pszObject) : fIsUnicode(FALSE), ulLastError(NO_ERROR)
{
memset((VOID *)(&_stLogStats), 0, sizeof(LogStats)); // zero out
InitLogging();
// Print warning if server name given
if(NULL != pszSrvr)
{
fprintf(stderr, "Remote server not supported with this version of "
"log.lib. Continuing.\n");
}
ulLastError = SetInfo(NULL, pszTest, pszSubPath, pszObject);
if(ulLastError == NO_ERROR)
{
ulLastError = LogOpen() || WriteVar((PCHAR) NULL, LOG_START);
}
}
//+-------------------------------------------------------------------
//
// Member: Log::Log(LPWSTR, LPWSTR, LPWSTR, LPWSTR, LPWSTR)
//
// Synopsis: Log constructor with internal data given
//
// Arguments: [wszSrvr] - Name of logging server
// [wszTest] - Name of this test
// [wszName] - Name of test runner
// [wszSubPath] - Users log file qualifer
// [wszObject] - Name of invoking object
//
// Returns:
//
// Modifies:
//
// History: ??-???-?? ???????? Created
// Jun-11-92 DonCl added line to zero out LogStats struct
//
// BUGBUG wszName unused - left until all components can co-ordinate
// with this. SarahJ
//--------------------------------------------------------------------
Log :: Log(LPWSTR wszSrvr,
LPWSTR wszTest,
LPWSTR wszName,
LPWSTR wszSubPath,
LPWSTR wszObject) : fIsUnicode(TRUE), ulLastError(NO_ERROR)
{
memset((VOID *)(&_stLogStats), 0, sizeof(LogStats)); // zero out
InitLogging();
// Print warning if server name given
if(NULL != wszSrvr)
{
fprintf(stderr, "Remote server not supported with this version of "
"log.lib. Continuing.\n");
}
ulLastError = SetInfo(NULL, wszTest, wszSubPath, wszObject);
if (ulLastError == NO_ERROR)
{
ulLastError = LogOpen() || WriteVar((LPWSTR) NULL, LOG_START);
}
}
//+-------------------------------------------------------------------
//
// Member: Log::~Log()
//
// Synopsis: Destroy the Log Object
//
// History: ??-???-?? ???????? Created
//
//--------------------------------------------------------------------
Log :: ~Log()
{
if(fInfoSet != FALSE)
{
if(FALSE == fIsUnicode)
{
if(WriteVar((PCHAR) NULL, LOG_DONE) != NO_ERROR)
{
LogPrintf(stderr, "ERROR: Failed to log \"%s\" status\n",
LOG_DONE_TXT);
}
}
else
{
if(WriteVar((LPWSTR) NULL, LOG_DONE) != NO_ERROR)
{
LogPrintf(stderr, "ERROR: Failed to log \"%ls\" status\n",
wLOG_DONE_TXT);
}
}
FreeLogging(); // Make sure memory is freed & file closed
}
}
//+-------------------------------------------------------------------
//
// Member: Log::Info(int, char *[])
//
// Synopsis: Parse the command line and set the appropriate member variables
//
// Arguments: [argc] - Argument count
// [argv] - Argument vector
//
// Returns:
//
// Modifies:
//
// History: ??-???-?? ???????? Created
// 30-Oct-92 SarahJ Updated parms to SetInfo
//
//--------------------------------------------------------------------
ULONG Log :: Info(int argc, char *argv[])
{
USHORT usNdx; // Index into cmnd line args
PCHAR pszTest = NULL; // Name of this test
PCHAR pszSubPath = NULL; // Users log file qualifer
PCHAR pszObject = NULL; // Name of invoking object
PCHAR pch; // Temporary pointer into a string
InitLogging();
// All the argv processing is still done in CHARs
if(ulLastError == NO_ERROR)
{
//
// For every command line switch, check its validity and parse its
// value. This version allows / or - for switches. If there are
// no command line switches, this loop is skipped. This is for the
// case when Log() is called with no messages.
//
for(usNdx = 1; usNdx < (unsigned short) argc; ++usNdx)
{
char *szArg = argv[ usNdx];
pch = szArg;
// check for / -
if(*szArg == '/' || *szArg == '-')
{
register int i = 1;
pch++;
//
// Check if next char is m, ie handed down from manager code.
// If so skip m
//
if (*pch == 'm' || *pch == 'M')
{
pch++;
i++;
}
++pch; // Skip next char and check for :
if(*pch++ == ':')
{
switch(toupper(szArg[i]))
{
case 'O': // Object name found
pszObject = (PCHAR)pch;
break;
case 'P': // Directory Path switch found
pszSubPath = (PCHAR)pch;
break;
case 'L': // Logging server name found
fprintf(stderr, "Logging server not supported with "
"this version of log.lib. Continuing.\n");
break;
case 'T': // Test name found
pszTest = (PCHAR)pch;
break;
default: // Skip this unknown argument
break;
}
}
}
}
// If no test name was given, set pszTest to the apps base name.
char szName[_MAX_FNAME];
if(pszTest == NULL || *pszTest == NULLTERM)
{
_splitpath(argv[0], NULL, NULL, szName, NULL);
pszTest = szName;
}
// Here is where the WCHAR additions are
if(FALSE == fIsUnicode)
{
ulLastError = SetInfo(NULL, pszTest, pszSubPath, pszObject);
}
else
{
// Convert the PCHARs to LPWSTRs
// This one is guaranteed to be set to something
LPWSTR wszTest = MbNameToWcs(pszTest);
LPWSTR wszSubPath = MbNameToWcs(pszSubPath);
LPWSTR wszObject = MbNameToWcs(pszObject);
if(NO_ERROR == ulLastError)
{
ulLastError = SetInfo(NULL, wszTest, wszSubPath, wszObject);
}
delete wszTest;
delete wszSubPath;
delete wszObject;
}
}
// This was not here before, but it seems the log should be opened by now
if(NO_ERROR == ulLastError)
{
ulLastError = LogOpen() || (FALSE == fIsUnicode) ?
WriteVar((PCHAR) NULL, LOG_START) :
WriteVar((LPWSTR) NULL, LOG_START);
}
return ulLastError;
}
//+-------------------------------------------------------------------
//
// Member: Log::WriteVarList(PCHAR, USHORT, PCHAR, va_list)
//
// Synopsis: The WriteVar and WriteData methods allow the user to log
// info in various forms.
//
// Arguments: [pszVar] - Variation
// [usStat] - Status
// [pszFormat] - Format string (like printf)
// [vaArgs] - Data for pszStrFmt
//
// Returns: NO_ERROR if successful or ERROR_INVALID_DATA otherwise
//
// Modifies: ulLastError
//
// History: ??-???-?? ???????? Created
// 17-Oct-91 SarahJ Added check for LOG_MAX_STATUS
// 11-Jun-92 DonCl Added call to IncLogStats()
// 3-Jul-92 DeanE Stolen from WriteVar method, renamed,
// made to operate on va_lists.
//
//--------------------------------------------------------------------
ULONG Log :: WriteVarList(PCHAR pszVar,
USHORT usStat,
PCHAR pszFormat,
va_list vaArgs)
{
CHK_UNICODE(FALSE);
#if defined(WIN32)
CTCLock clMemLock (hMtxSerialize); // Serialize access to this object
#endif
ulLastError = NO_ERROR;
IncLogStats(_stLogStats, usStat);
if(ulLastError == NO_ERROR)
{
if(fInfoSet)
{
// verify that the status is in allowed range
if(usStat > LOG_MAX_STATUS)
{
LogPrintf(stderr,
"ERROR: Illegal status parameter %u for "
"Variation %s\n",
usStat,
pszVar);
ulLastError = ERROR_INVALID_DATA;
return ulLastError;
}
ulLastError =
SetStrData(pszFormat, vaArgs) ||
SetVariation((const char *)pszVar) ||
SetStatus(aStatus[usStat]) ||
SetBinData(0, (PVOID)NULL);
if(ulLastError == NO_ERROR)
{
ulLastError = LogData(); // Send data to the log file
}
}
else
{
ulLastError = ERROR_INVALID_DATA;
}
}
return ulLastError;
}
//+-------------------------------------------------------------------
//
// Member: Log::WriteVarList(LPWSTR, USHORT, LPWSTR, va_list)
//
// Synopsis: The WriteVar and WriteData methods allow the user to log
// info in various forms.
//
// Arguments: [wszVar] - Variation
// [usStat] - Status
// [wszFormat] - Format string (like printf)
// [vaArgs] - Data for pszStrFmt
//
// Returns: NO_ERROR if successful or ERROR_INVALID_DATA otherwise
//
// Modifies: ulLastError
//
// History: ??-???-?? ???????? Created
// 17-Oct-91 SarahJ Added check for LOG_MAX_STATUS
// 11-Jun-92 DonCl Added call to IncLogStats()
// 3-Jul-92 DeanE Stolen from WriteVar method, renamed,
// made to operate on va_lists.
//
//--------------------------------------------------------------------
ULONG Log :: WriteVarList(LPWSTR wszVar,
USHORT usStat,
LPWSTR wszFormat,
va_list vaArgs)
{
CHK_UNICODE(TRUE);
#if defined(WIN32)
CTCLock clMemLock (hMtxSerialize); // Serialize access to this object
#endif
ulLastError = NO_ERROR;
IncLogStats(_stLogStats, usStat);
if(ulLastError == NO_ERROR)
{
if(fInfoSet)
{
// verify that the status is in allowed range
if(usStat > LOG_MAX_STATUS)
{
LogPrintf(stderr, L"ERROR: Illegal status parameter %u "
L"for Variation %ls\n",
usStat, wszVar);
ulLastError = ERROR_INVALID_DATA;
return ulLastError;
}
ulLastError = SetStrData(wszFormat, vaArgs)
|| SetVariation((LPCWSTR) wszVar)
|| SetStatus(waStatus[usStat])
|| SetBinData(0, (PVOID) NULL);
if(ulLastError == NO_ERROR)
{
ulLastError = LogData(); // Send data to the log file
}
}
else
{
ulLastError = ERROR_INVALID_DATA;
}
}
return ulLastError;
}
//+-------------------------------------------------------------------
//
// Member: Log::WriteVar(PCHAR, USHORT, PCHAR, ...)
//
// Synopsis: The WriteVar and WriteData methods allow the user to log
// info in various forms.
//
// Arguments: [pszVar] - Variation
// [usStat] - Status
// [pszFormat] - Format string (like printf)
// [...] - Data for pszStrFmt
//
// Returns: NO_ERROR if successful or ERROR_INVALID_DATA otherwise
//
// Modifies: ulLastError
//
// History: ??-???-?? ???????? Created
// 17-Oct-91 SarahJ Added check for LOG_MAX_STATUS
// 11-Jun-92 DonCl Added call to IncLogStats()
// 3-Jul-92 DeanE Modified to call WriteVarList
//
//--------------------------------------------------------------------
ULONG Log :: WriteVar(PCHAR pszVar, USHORT usStat, PCHAR pszFormat, ...)
{
CHK_UNICODE(FALSE);
va_list pMarker;
if(pszFormat != NULL)
{
va_start(pMarker, pszFormat);
}
ulLastError = WriteVarList(pszVar, usStat, pszFormat, pMarker);
if(pszFormat != NULL)
{
va_end(pMarker);
}
return ulLastError;
}
//+-------------------------------------------------------------------
//
// Member: Log::WriteVar(LPWSTR, USHORT, LPWSTR, ...)
//
// Synopsis: The WriteVar and WriteData methods allow the user to log
// info in various forms.
//
// Arguments: [wszVar] - Variation
// [usStat] - Status
// [wszFormat] - Format string (like printf)
// [...] - Data for pszStrFmt
//
// Returns: NO_ERROR if successful or ERROR_INVALID_DATA otherwise
//
// Modifies: ulLastError
//
// History: ??-???-?? ???????? Created
// 17-Oct-91 SarahJ Added check for LOG_MAX_STATUS
// 11-Jun-92 DonCl Added call to IncLogStats()
// 3-Jul-92 DeanE Modified to call WriteVarList
//
//--------------------------------------------------------------------
ULONG Log :: WriteVar(LPWSTR wszVar, USHORT usStat, LPWSTR wszFormat, ...)
{
CHK_UNICODE(TRUE);
va_list pMarker;
if(wszFormat != NULL)
{
va_start(pMarker, wszFormat);
}
ulLastError = WriteVarList(wszVar, usStat, wszFormat, pMarker);
if(wszFormat != NULL)
{
va_end(pMarker);
}
return ulLastError;
}
//+-------------------------------------------------------------------
//
// Member: Log::WriteVarList(PCHAR, USHORT, USHORT, PVOID, PCHAR, va_list)
//
// Synopsis: Write data to the log file that contains binary data with
// or without an accompanying string.
//
// Arguments: [pszVar] - Variation
// [usStat] - Status code
// [usBytes] - #bytes binary data
// [pvData] - The binary data
// [pszFormat] - printf style format
// [vaArgs] - Data for pszStrFmt
//
// Returns:
//
// History: ??-???-?? ???????? Created
// 11-Jun-92 DonCl Added call to IncLogStats()
// 3-Jul-92 DeanE Stolen from WriteVar, renamed, supports
// va_list type now.
//
//--------------------------------------------------------------------
ULONG Log :: WriteVarList(PCHAR pszVar,
USHORT usStat,
USHORT usBytes,
PVOID pvData,
PCHAR pszFormat,
va_list vaArgs )
{
CHK_UNICODE(FALSE);
#if defined(WIN32)
CTCLock clMemLock (hMtxSerialize); // Serialize access to this object
#endif
ulLastError = NO_ERROR;
IncLogStats(_stLogStats, usStat);
if (ulLastError == NO_ERROR)
{
if (fInfoSet)
{
// verify that the status is in allowed range
if (usStat > LOG_MAX_STATUS)
{
LogPrintf(stderr,
"ERROR: Illegal status parameter %u for "
"Variation %s\n",
usStat,
pszVar);
ulLastError = ERROR_INVALID_DATA;
return ulLastError;
}
// Note if pszFormat is NULL, SetStrData will ignore vaArgs
ulLastError = SetStrData(pszFormat, vaArgs);
if (ulLastError == NO_ERROR)
{
ulLastError = SetVariation((const char *) pszVar)
|| SetStatus(aStatus[usStat])
|| SetBinData(usBytes, pvData);
if (ulLastError == NO_ERROR)
{
ulLastError = LogData(); // Send data to the log file
}
}
}
else
{
ulLastError = ERROR_INVALID_DATA;
}
}
return ulLastError;
}
//+-------------------------------------------------------------------
//
// Member: Log::WriteVarList(LPWSTR, USHORT, USHORT, PVOID,
// LPWSTR, va_list)
//
// Synopsis: Write data to the log file that contains binary data with
// or without an accompanying string.
//
// Arguments: [wszVar] - Variation
// [usStat] - Status code
// [usBytes] - #bytes binary data
// [pvData] - The binary data
// [wszFormat] - printf style format
// [vaArgs] - Data for pszStrFmt
//
// Returns:
//
// History: ??-???-?? ???????? Created
// 11-Jun-92 DonCl Added call to IncLogStats()
// 3-Jul-92 DeanE Stolen from WriteVar, renamed, supports
// va_list type now.
//
//--------------------------------------------------------------------
ULONG Log :: WriteVarList(LPWSTR wszVar,
USHORT usStat,
USHORT usBytes,
PVOID pvData,
LPWSTR wszFormat,
va_list vaArgs )
{
CHK_UNICODE(TRUE);
#if defined(WIN32)
CTCLock clMemLock (hMtxSerialize); // Serialize access to this object
#endif
ulLastError = NO_ERROR;
IncLogStats(_stLogStats, usStat);
if(ulLastError == NO_ERROR)
{
if(fInfoSet)
{
// verify that the status is in allowed range
if(usStat > LOG_MAX_STATUS)
{
LogPrintf(stderr, L"ERROR: Illegal status parameter %u "
L"for Variation %ls\n",
usStat, wszVar);
ulLastError = ERROR_INVALID_DATA;
return ulLastError;
}
// Note if wszFormat is NULL, SetStrData will ignore vaArgs
ulLastError = SetStrData(wszFormat, vaArgs);
if(ulLastError == NO_ERROR)
{
ulLastError =
SetVariation((LPCWSTR) wszVar) ||
SetStatus(waStatus[usStat]) ||
SetBinData(usBytes, pvData);
if(ulLastError == NO_ERROR)
{
ulLastError = LogData(); // Send data to the log file
}
}
}
else
{
ulLastError = ERROR_INVALID_DATA;
}
}
return ulLastError;
}
//+-------------------------------------------------------------------
//
// Member: Log::WriteVar(PCHAR, USHORT, USHORT, PVOID, PCHAR, ...)
//
// Synopsis: Write data to the log file that contains binary data with
// or without an accompanying string.
//
// Arguments: [pszVar] - Variation
// [usStat] - Status code
// [usBytes] - #bytes binary data
// [pvData] - The binary data
// [pszFormat] - printf style format
// [...] - Data for pszStrFmt
//
// Returns:
//
// History: ??-???-?? ???????? Created
// 11-Jun-92 DonCl Added call to IncLogStats()
// 3-Jul-92 DeanE Modified to call WriteVarList
//
//--------------------------------------------------------------------
ULONG Log :: WriteVar(PCHAR pszVar,
USHORT usStat,
USHORT usBytes,
PVOID pvData,
PCHAR pszFormat,
... )
{
CHK_UNICODE(FALSE);
va_list pMarker;
if(pszFormat != NULL)
{
va_start(pMarker, pszFormat);
}
ulLastError = WriteVarList(pszVar,
usStat,
usBytes,
pvData,
pszFormat,
pMarker);
if(pszFormat != NULL)
{
va_end(pMarker);
}
return ulLastError;
}
//+-------------------------------------------------------------------
//
// Member: Log::WriteVar(LPWSTR, USHORT, USHORT, PVOID, LPWSTR, ...)
//
// Synopsis: Write data to the log file that contains binary data with
// or without an accompanying string.
//
// Arguments: [wszVar] - Variation
// [usStat] - Status code
// [usBytes] - #bytes binary data
// [pvData] - The binary data
// [wszFormat] - printf style format
// [...] - Data for pszStrFmt
//
// Returns:
//
// History: ??-???-?? ???????? Created
// 11-Jun-92 DonCl Added call to IncLogStats()
// 3-Jul-92 DeanE Modified to call WriteVarList
//
//--------------------------------------------------------------------
ULONG Log :: WriteVar(LPWSTR wszVar,
USHORT usStat,
USHORT usBytes,
PVOID pvData,
LPWSTR wszFormat,
... )
{
CHK_UNICODE(TRUE);
va_list pMarker;
if(wszFormat != NULL)
{
va_start(pMarker, wszFormat);
}
ulLastError = WriteVarList(wszVar,
usStat,
usBytes,
pvData,
wszFormat,
pMarker);
if(wszFormat != NULL)
{
va_end(pMarker);
}
return ulLastError;
}
//+-------------------------------------------------------------------
//
// Member: Log::WriteDataList(PCHAR, va_list)
//
// Synopsis: Write a string to the Log file.
//
// Arguments: [pszFormat] - a printf-like format string
// [vaArgs] - The data to print out.
//
// Returns: NO_ERROR if successful
// ERROR_INVALID_DATA
// Any error code from Log::SetStrData() or Log::LogData
//
// Modifies: ulLastError
//
// History: ??-???-?? ???????? Created
// 3-Jul-92 DeanE Stolen from WriteData, renamed, made
// to work on a va_list
//
//--------------------------------------------------------------------
ULONG Log :: WriteDataList(PCHAR pszFormat, va_list vaArgs)
{
CHK_UNICODE(FALSE);
#if defined(WIN32)
CTCLock clMemLock (hMtxSerialize); // Serialize access to this object
#endif
ulLastError = NO_ERROR;
if (ulLastError == NO_ERROR)
{
if (fInfoSet)
{
// Note if pszFormat is NULL, SetStrData will ignore vaArgs
ulLastError = SetStrData(pszFormat, vaArgs);
if (ulLastError == NO_ERROR)
{
ulLastError = LogData(); // Send data to the log file
}
}
else
{
ulLastError = ERROR_INVALID_DATA;
}
}
return(ulLastError);
}
//+-------------------------------------------------------------------
//
// Member: Log::WriteDataList(LPWSTR, va_list)
//
// Synopsis: Write a string to the Log file.
//
// Arguments: [wszFormat] - a printf-like format string
// [vaArgs] - The data to print out.
//
// Returns: NO_ERROR if successful
// ERROR_INVALID_DATA
// Any error code from Log::SetStrData() or Log::LogData
//
// Modifies: ulLastError
//
// History: ??-???-?? ???????? Created
// 3-Jul-92 DeanE Stolen from WriteData, renamed, made
// to work on a va_list
//
//--------------------------------------------------------------------
ULONG Log :: WriteDataList(LPWSTR wszFormat, va_list vaArgs)
{
CHK_UNICODE(TRUE);
#if defined(WIN32)
CTCLock clMemLock (hMtxSerialize); // Serialize access to this object
#endif
ulLastError = NO_ERROR;
if(ulLastError == NO_ERROR)
{
if(fInfoSet)
{
// Note if wszFormat is NULL, SetStrData will ignore vaArgs
ulLastError = SetStrData(wszFormat, vaArgs);
if(ulLastError == NO_ERROR)
{
ulLastError = LogData(); // Send data to the log file
}
}
else
{
ulLastError = ERROR_INVALID_DATA;
}
}
return ulLastError;
}
//+-------------------------------------------------------------------
//
// Member: Log::WriteData(PCHAR, ...)
//
// Synopsis: Write a string to the Log file.
//
// Arguments: [pszFormat] - a printf-like format string
// [...] - The data to print out.
//
// Returns: NO_ERROR if successful
// ERROR_INVALID_DATA
// Any error code from Log::SetStrData() or Log::LogData
//
// Modifies: ulLastError
//
// History: ??-???-?? ???????? Created
// 3-Jul-92 DeanE Modified to call WriteDataList
//
//--------------------------------------------------------------------
ULONG Log :: WriteData(PCHAR pszFormat, ...)
{
CHK_UNICODE(FALSE);
va_list pMarker;
if (pszFormat != NULL)
{
va_start(pMarker, pszFormat);
}
ulLastError = WriteDataList(pszFormat, pMarker);
if (pszFormat != NULL)
{
va_end(pMarker);
}
return(ulLastError);
}
//+-------------------------------------------------------------------
//
// Member: Log::WriteData(LPWSTR, ...)
//
// Synopsis: Write a string to the Log file.
//
// Arguments: [wszFormat] - a printf-like format string
// [...] - The data to print out.
//
// Returns: NO_ERROR if successful
// ERROR_INVALID_DATA
// Any error code from Log::SetStrData() or Log::LogData
//
// Modifies: ulLastError
//
// History: ??-???-?? ???????? Created
// 3-Jul-92 DeanE Modified to call WriteDataList
//
//--------------------------------------------------------------------
ULONG Log :: WriteData(LPWSTR wszFormat, ...)
{
CHK_UNICODE(TRUE);
va_list pMarker;
if(wszFormat != NULL)
{
va_start(pMarker, wszFormat);
}
ulLastError = WriteDataList(wszFormat, pMarker);
if(wszFormat != NULL)
{
va_end(pMarker);
}
return ulLastError;
}
//+-------------------------------------------------------------------
//
// Member: Log::WriteDataList(USHORT, PVOID, PCHAR, va_list)
//
// Synopsis: Write data to the log file that contains binary data
// and possibly a string.
//
// Arguments: [usBytes] - #bytes binary data
// [pvData] - The binary data
// [pszFormat] - printf style format
// [vaArgs] - Data for pszStrFmt
//
// Returns: NO_ERROR If successful
// ERROR_INVALID_DATA
// Any error code from Log::SetSetData, Log::SetBinData, or
// Log::LogData
//
// Modifies: ulLastError
//
// History: ??-???-?? ???????? Created
// 3-Jul-92 DeanE Stolen from WriteData, renamed, made
// to support va_list
//
//--------------------------------------------------------------------
ULONG Log :: WriteDataList(USHORT usBytes,
PVOID pvData,
PCHAR pszFormat,
va_list vaArgs)
{
CHK_UNICODE(FALSE);
#if defined(WIN32)
CTCLock clMemLock (hMtxSerialize); // Serialize access to this object
#endif
ulLastError = NO_ERROR;
if (ulLastError == NO_ERROR)
{
if (fInfoSet)
{
// Set up to log the string data
// Note if pszFormat is NULL, SetStrData will ignore vaArgs
ulLastError = SetStrData(pszFormat, vaArgs);
if (ulLastError == NO_ERROR)
{
// Set up to log the binary data
ulLastError = SetBinData(usBytes, pvData);
if (ulLastError == NO_ERROR)
{
ulLastError = LogData(); // Send data to the log file
}
}
}
else
{
ulLastError = ERROR_INVALID_DATA;
}
}
return(ulLastError);
}
//+-------------------------------------------------------------------
//
// Member: Log::WriteDataList(USHORT, PVOID, LPWSTR, va_list)
//
// Synopsis: Write data to the log file that contains binary data
// and possibly a string.
//
// Arguments: [usBytes] - #bytes binary data
// [pvData] - The binary data
// [wszFormat] - printf style format
// [vaArgs] - Data for pszStrFmt
//
// Returns: NO_ERROR If successful
// ERROR_INVALID_DATA
// Any error code from Log::SetSetData, Log::SetBinData, or
// Log::LogData
//
// Modifies: ulLastError
//
// History: ??-???-?? ???????? Created
// 3-Jul-92 DeanE Stolen from WriteData, renamed, made
// to support va_list
//
//--------------------------------------------------------------------
ULONG Log :: WriteDataList(USHORT usBytes,
PVOID pvData,
LPWSTR wszFormat,
va_list vaArgs)
{
CHK_UNICODE(TRUE);
#if defined(WIN32)
CTCLock clMemLock (hMtxSerialize); // Serialize access to this object
#endif
ulLastError = NO_ERROR;
if(ulLastError == NO_ERROR)
{
if(fInfoSet)
{
// Set up to log the string data
// Note if wszFormat is NULL, SetStrData will ignore vaArgs
ulLastError = SetStrData(wszFormat, vaArgs);
if(ulLastError == NO_ERROR)
{
// Set up to log the binary data
ulLastError = SetBinData(usBytes, pvData);
if(ulLastError == NO_ERROR)
{
ulLastError = LogData(); // Send data to the log file
}
}
}
else
{
ulLastError = ERROR_INVALID_DATA;
}
}
return ulLastError;
}
//+-------------------------------------------------------------------
//
// Member: Log::WriteData(USHORT, PVOID, PCHAR, ...)
//
// Synopsis: Write data to the log file that contains binary data
// and possibly a string.
//
// Arguments: [usBytes] - #bytes binary data
// [pvData] - The binary data
// [pszFormat] - printf style format
// [...] - Data for pszStrFmt
//
// Returns: NO_ERROR If successful
// ERROR_INVALID_DATA
// Any error code from Log::SetSetData, Log::SetBinData, or
// Log::LogData
//
// Modifies: ulLastError
//
// History: ??-???-?? ???????? Created
// 3-Jul-92 DeanE Modified to call WriteDataList
//
//--------------------------------------------------------------------
ULONG Log :: WriteData(USHORT usBytes, PVOID pvData, PCHAR pszFormat, ...)
{
CHK_UNICODE(FALSE);
va_list pMarker;
if (pszFormat != NULL)
{
va_start(pMarker, pszFormat);
}
ulLastError = WriteDataList(usBytes, pvData, pszFormat, pMarker);
if (pszFormat != NULL)
{
va_end(pMarker);
}
return(ulLastError);
}
//+-------------------------------------------------------------------
//
// Member: Log::WriteData(USHORT, PVOID, LPWSTR, ...)
//
// Synopsis: Write data to the log file that contains binary data
// and possibly a string.
//
// Arguments: [usBytes] - #bytes binary data
// [pvData] - The binary data
// [wszFormat] - printf style format
// [...] - Data for pszStrFmt
//
// Returns: NO_ERROR If successful
// ERROR_INVALID_DATA
// Any error code from Log::SetSetData, Log::SetBinData, or
// Log::LogData
//
// Modifies: ulLastError
//
// History: ??-???-?? ???????? Created
// 3-Jul-92 DeanE Modified to call WriteDataList
//
//--------------------------------------------------------------------
ULONG Log :: WriteData(USHORT usBytes, PVOID pvData, LPWSTR wszFormat, ...)
{
CHK_UNICODE(TRUE);
va_list pMarker;
if(wszFormat != NULL)
{
va_start(pMarker, wszFormat);
}
ulLastError = WriteDataList(usBytes, pvData, wszFormat, pMarker);
if(wszFormat != NULL)
{
va_end(pMarker);
}
return ulLastError;
}
//+----------------------------------------------------------------------------
//
// Member: Log::GetLogStats(), public
//
// Synopsis: returns _stLogStats structure inside log object
//
// Effects: Returns actual reference to the real thing.
//
// Arguments: [out] LogStats& stStats - structure to fill in.
//
// Returns: nothing, except stStats now is value of structure.
//
// Modifies: stStats
//
// History: 11 Jun 92 DonCl first version
//
// Notes:
//
//-----------------------------------------------------------------------------
VOID Log::GetLogStats(LogStats& stStats)
{
stStats = _stLogStats;
}
//+-------------------------------------------------------------------
//
// Function: MbNametoWcs(PCHAR *)
//
// Synopsis: Given a pointer to a CHAR string, return a WCHAR copy
//
// Arguments: [pszName] CHAR string to copy
//
// Returns: <nothing>
//
// History: ??-???-?? ???????? Created
//
//--------------------------------------------------------------------
LPWSTR Log :: MbNameToWcs(PCHAR pszName)
{
LPWSTR wszName = NULL;
if(pszName != NULL)
{
size_t sizLen = strlen(pszName);
if((wszName = new WCHAR[sizLen + 1]) == NULL)
{
ulLastError = ERROR_NOT_ENOUGH_MEMORY;
}
else
{
if (mbstowcs(wszName, pszName, sizLen) == (size_t)0)
{
delete[] wszName;
ulLastError = ERROR_INVALID_DATA;
}
wszName[sizLen] = wNULLTERM;
}
}
return wszName;
}