|
|
/*
* Copyright (c) 1998 Microsoft Corporation * * Module Name: * * logfile.cpp * * Abstract: * * This file contains code to log messages to a file. * * Author: * * Breen Hagan (BreenH) Oct-02-98 * * Environment: * * User Mode */
#define _LSOC_LOGFILE_CPP_
#include "stdafx.h"
#include "logfile.h"
/*
* Globals. */
LogFile SetupLog;
/*
* Constants. */
const UINT LOG_ENTRY_SIZE = 1024; const UINT S_SIZE = 1024;
/*
* Function prototypes. */
DWORD TCharStringToAnsiString(LPCTSTR, LPSTR);
/*
* Class LogFile. */
LogFile::LogFile( ) { m_fInitialized = FALSE; m_szLogFile[0] = (TCHAR)NULL; m_szLogModule[0] = (TCHAR)NULL; }
LogFile::~LogFile( ) { }
VOID LogFile::Close( VOID ) { if (m_fInitialized) { LogMessage(_T(CRLF)); LogMessage(_T("**")); LogMessage(_T("** Closing Message Log for %s"), m_szLogModule); LogMessage(_T("**")); LogMessage(_T(CRLF)); LogMessage(_T(CRLF)); CloseHandle(m_hFile); m_fInitialized = FALSE; } }
DWORD LogFile::Initialize( IN LPCTSTR pszLogFile, IN LPCTSTR pszLogModule ) { OSVERSIONINFO osVersion; TCHAR pszDate[S_SIZE]; TCHAR pszTime[S_SIZE];
//
// Initializing the log file twice is "A Bad Thing."
//
if (m_fInitialized) { LogMessage(_T("LogFile::Initialize called twice!")); return(ERROR_SUCCESS); }
//
// Sanity checks. Pointless in a limited setting, but useful if this
// file is copied to other projects.
//
if ((pszLogFile == NULL) || (pszLogFile[0] == (TCHAR)NULL)) { return(ERROR_INVALID_PARAMETER); }
if ((pszLogModule == NULL) || (pszLogModule[0] == (TCHAR)NULL)) { return(ERROR_INVALID_PARAMETER); }
if ((_tcslen(pszLogFile) > MAX_PATH) || (_tcslen(pszLogModule) > MAX_PATH)) { return(ERROR_INVALID_PARAMETER); }
//
// Save the log file and module name.
//
_tcscpy(m_szLogFile, pszLogFile); _tcscpy(m_szLogModule, pszLogModule);
//
// Open or create the log file.
//
m_hFile = CreateFile( pszLogFile, GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, 0, NULL ); if (m_hFile == INVALID_HANDLE_VALUE) { return(GetLastError()); }
m_fInitialized = TRUE; SetFilePointer(m_hFile, 0, NULL, FILE_END);
//
// Get the current date and time for the log file.
//
_tstrdate(pszDate); _tstrtime(pszTime);
LogMessage(_T("**")); LogMessage(_T("** Initializing Message Log for %s"), m_szLogModule); LogMessage(_T("** Date: %s Time: %s"), pszDate, pszTime); LogMessage(_T("**")); LogMessage(_T(CRLF));
//
// Log information on the OS version.
//
osVersion.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
if (GetVersionEx(&osVersion) != 0) {
LogMessage( _T("Version: %lu.%lu.%lu Platform: %lu, %s"), osVersion.dwMajorVersion, osVersion.dwMinorVersion, osVersion.dwBuildNumber, osVersion.dwPlatformId, #ifdef DBG
_T("Checked") #else
_T("Free") #endif
); }
return(ERROR_SUCCESS); }
/*
* LogFile::LogMessage() * * */
DWORD __cdecl LogFile::LogMessage( LPCTSTR pszFormat, ... ) { CHAR cszOutput[LOG_ENTRY_SIZE]; DWORD cBytes; DWORD cLength; TCHAR tszOutput[LOG_ENTRY_SIZE]; va_list vaList;
if (!m_fInitialized) { return(ERROR_INVALID_HANDLE); }
SetLastError(ERROR_SUCCESS);
va_start(vaList, pszFormat); _vstprintf(tszOutput, pszFormat, vaList); va_end(vaList);
cLength = TCharStringToAnsiString(tszOutput, cszOutput);
if (cLength != (DWORD)-1) { WriteFile(m_hFile, cszOutput, cLength * sizeof(char), &cBytes, NULL); WriteFile(m_hFile, CRLF, strlen(CRLF) * sizeof(char), &cBytes, NULL); }
return(GetLastError()); }
/*
* * * */
DWORD TCharStringToAnsiString( LPCTSTR tszStr, LPSTR cszStr ) { #ifdef UNICODE
DWORD cLength;
cLength = WideCharToMultiByte( CP_ACP, 0, tszStr, -1, NULL, 0, NULL, NULL );
if ((cLength == 0) || (cLength > S_SIZE)) { return((DWORD)-1); }
cLength = WideCharToMultiByte( CP_ACP, 0, tszStr, -1, cszStr, cLength, NULL, NULL );
return(cLength); #else
_tcscpy(cszStr, tszStr); return(_tcslen(cszStr)); #endif
}
|