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.
 
 
 
 
 
 

243 lines
5.2 KiB

//
// Copyright (c) 1997-2001 Microsoft Corporation, All Rights Reserved
//
#include <stdio.h>
#include <time.h>
#include <tchar.h>
#include <windows.h>
#include <comdef.h>
#include "provlog.h"
//***************************************************************************
//
// CDsLog::CDsLog
//
// Purpose: Contructs an empty CDsLog object.
//
// Parameters:
// None
//
//***************************************************************************
CDsLog :: CDsLog()
{
m_lpszLogFileName = NULL;
m_fpLogFile = NULL;
// Turn on logging by default
m_bEnabled = TRUE;
// Enable all severity levels
m_iLevel = NONE;
}
//***************************************************************************
//
// CDsLog::~CDsLog
//
// Purpose: Destructor
//
//
//***************************************************************************
CDsLog :: ~CDsLog()
{
delete [] m_lpszLogFileName;
if(m_fpLogFile)
fclose(m_fpLogFile);
}
//***************************************************************************
//
// CDsLog::LogMessage
//
// Purpose: See Header
//
//***************************************************************************
BOOLEAN CDsLog :: Initialise(LPCWSTR lpszRegistrySubTreeRoot)
{
// Get the various values from the registry
if(!GetRegistryValues(lpszRegistrySubTreeRoot))
return FALSE;
// Open the Log File
m_fpLogFile = _tfopen((LPTSTR)(_bstr_t)(m_lpszLogFileName), __TEXT("w"));
if(m_fpLogFile)
WriteInitialMessage();
return (m_fpLogFile != NULL);
}
//***************************************************************************
//
// CDsLog::LogMessage
//
// Purpose: See Header
//
//***************************************************************************
BOOLEAN CDsLog :: Initialise(LPCWSTR lpszFileName, BOOLEAN bEnabled, UINT iLevel)
{
m_bEnabled = bEnabled;
m_iLevel = iLevel;
m_fpLogFile = _tfopen((LPTSTR)(_bstr_t)(lpszFileName), __TEXT("w"));
if(m_fpLogFile)
WriteInitialMessage();
return (m_fpLogFile != NULL);
}
//***************************************************************************
//
// CDsLog::LogMessage
//
// Purpose: See Header
//
//***************************************************************************
void CDsLog :: LogMessage(UINT iLevel, LPCWSTR lpszMessage, ...)
{
va_list marker;
va_start(marker, lpszMessage);
if(m_bEnabled && iLevel >= m_iLevel)
{
EnterCriticalSection(&m_FileCriticalSection);
_vftprintf(m_fpLogFile, lpszMessage, marker);
fflush(m_fpLogFile);
LeaveCriticalSection(&m_FileCriticalSection);
}
va_end(marker);
}
//***************************************************************************
//
// CDsLog::GetRegistryValues
//
// Purpose: See Header
//***************************************************************************
BOOLEAN CDsLog :: GetRegistryValues(LPCWSTR lpszRegistrySubTreeRoot)
{
HKEY subtreeRootKey;
if( RegOpenKeyEx(HKEY_LOCAL_MACHINE,
(LPTSTR)(_bstr_t)(lpszRegistrySubTreeRoot),
0,
KEY_READ,
&subtreeRootKey) != ERROR_SUCCESS)
return FALSE;
BOOLEAN retVal = TRUE;
// Retrieve the "File" value
LONG lDataLength = 0;
if(RegQueryValue(subtreeRootKey,
FILE_STRING,
NULL,
&lDataLength) == ERROR_SUCCESS)
{
m_lpszLogFileName = new TCHAR [lDataLength + 1];
if(RegQueryValue(subtreeRootKey,
FILE_STRING,
m_lpszLogFileName,
&lDataLength) != ERROR_SUCCESS)
{
retVal = FALSE;
}
}
else
retVal = FALSE;
// Retrieve the "Enabled" value
lDataLength = 0;
if(RegQueryValue(subtreeRootKey,
ENABLED_STRING,
NULL,
&lDataLength) == ERROR_SUCCESS)
{
LPTSTR lpszEnabled = new TCHAR [lDataLength + 1];
if(RegQueryValue(subtreeRootKey,
FILE_STRING,
lpszEnabled,
&lDataLength) != ERROR_SUCCESS)
{
retVal = FALSE;
}
else // Convert the string to boolena
{
if(_tcscmp(lpszEnabled, ONE_STRING) == 0)
m_bEnabled = TRUE;
else
m_bEnabled = FALSE;
}
delete [] lpszEnabled;
}
else
retVal = FALSE;
// Retrieve the "Level" value
lDataLength = 0;
if(RegQueryValue(subtreeRootKey,
LEVEL_STRING,
NULL,
&lDataLength) == ERROR_SUCCESS)
{
LPTSTR lpszEnabled = new TCHAR [lDataLength + 1];
if(RegQueryValue(subtreeRootKey,
FILE_STRING,
lpszEnabled,
&lDataLength) != ERROR_SUCCESS)
{
retVal = FALSE;
}
else // Convert the string to boolena
{
if(_tcscmp(lpszEnabled, ONE_STRING) == 0)
m_bEnabled = TRUE;
else
m_bEnabled = FALSE;
}
delete [] lpszEnabled;
}
else
retVal = FALSE;
// Close the registry key
RegCloseKey(subtreeRootKey);
return retVal;
}
//***************************************************************************
//
// CDsLog::WriteInitialMessage
//
// Purpose: See Header
//***************************************************************************
void CDsLog :: WriteInitialMessage()
{
if(m_bEnabled)
{
EnterCriticalSection(&m_FileCriticalSection);
// Get the DateTime in Ascii format
struct tm *newtime;
time_t long_time;
time( &long_time ); /* Get time as long integer. */
newtime = localtime( &long_time ); /* Convert to local time. */
_ftprintf(m_fpLogFile, __TEXT("Log File Created at : %s\n"), _tasctime(newtime));
_ftprintf(m_fpLogFile, __TEXT("================================================\n\n"));
fflush(m_fpLogFile);
LeaveCriticalSection(&m_FileCriticalSection);
}
}