windows-nt/Source/XPSP1/NT/admin/pchealth/helpctr/service/database/logger.cpp
2020-09-26 16:20:57 +08:00

158 lines
3.3 KiB
C++

/******************************************************************************
Copyright (c) 2001 Microsoft Corporation
Module Name:
Logger.cpp
Abstract:
This file contains the implementation of the Taxonomy::Logger class,
which is used during database updates.
Revision History:
Davide Massarenti (Dmassare) 24/03/2001
created
******************************************************************************/
#include "stdafx.h"
Taxonomy::Logger::Logger()
{
// MPC::FileLog m_obj;
m_dwLogging = 0; // DWORD m_dwLogging;
}
Taxonomy::Logger::~Logger()
{
if(m_dwLogging)
{
WriteLog( E_FAIL, L"Forcing closure of log file." );
EndLog ( );
}
}
HRESULT Taxonomy::Logger::StartLog( /*[in]*/ LPCWSTR szLocation )
{
__HCP_FUNC_ENTRY( "Taxonomy::Logger::StartLog" );
HRESULT hr;
if(m_dwLogging++ == 0)
{
MPC::wstring szFile( szLocation ? szLocation : HC_HCUPDATE_LOGNAME ); MPC::SubstituteEnvVariables( szFile );
// Attempt to open the log for writing
__MPC_EXIT_IF_METHOD_FAILS(hr, m_obj.SetLocation( szFile.c_str() ));
// write it out to log file
__MPC_EXIT_IF_METHOD_FAILS(hr, WriteLog( -1, L"===========================================\nHCUPDATE Log started\n===========================================" ));
}
hr = S_OK;
__HCP_FUNC_CLEANUP;
__HCP_FUNC_EXIT(hr);
}
HRESULT Taxonomy::Logger::EndLog()
{
__HCP_FUNC_ENTRY( "Taxonomy::Logger::EndLog" );
HRESULT hr;
if(m_dwLogging > 0)
{
if(m_dwLogging == 1)
{
(void)WriteLog( -1, L"===========================================\nHCUPDATE Log ended\n===========================================" );
__MPC_EXIT_IF_METHOD_FAILS(hr, m_obj.Terminate());
}
m_dwLogging--;
}
hr = S_OK;
__HCP_FUNC_CLEANUP;
__HCP_FUNC_EXIT(hr);
}
HRESULT Taxonomy::Logger::WriteLogV( /*[in]*/ HRESULT hrRes ,
/*[in]*/ LPCWSTR szLogFormat ,
/*[in]*/ va_list arglist )
{
__HCP_FUNC_ENTRY( "Taxonomy::Logger::WriteLogV" );
HRESULT hr;
WCHAR rgLine[256];
WCHAR* pLine = NULL;
WCHAR* pLinePtr;
if(_vsnwprintf( rgLine, MAXSTRLEN(rgLine), szLogFormat, arglist ) == -1)
{
const int iSizeMax = 8192;
__MPC_EXIT_IF_ALLOC_FAILS(hr, pLine, new WCHAR[iSizeMax]);
_vsnwprintf( pLine, iSizeMax-1, szLogFormat, arglist ); pLine[iSizeMax-1] = 0;
pLinePtr = pLine;
}
else
{
rgLine[MAXSTRLEN(rgLine)] = 0;
pLinePtr = rgLine;
}
if(hrRes == -2)
{
hrRes = HRESULT_FROM_WIN32(::GetLastError());
}
if(hrRes == -1)
{
hrRes = S_OK;
if(m_dwLogging)
{
__MPC_EXIT_IF_METHOD_FAILS(hr, m_obj.LogRecord( L"%s", pLinePtr ));
}
}
else
{
if(m_dwLogging)
{
__MPC_EXIT_IF_METHOD_FAILS(hr, m_obj.LogRecord( L"%x - %s", hrRes, pLinePtr ));
}
}
hr = S_OK;
__HCP_FUNC_CLEANUP;
delete [] pLine;
if(FAILED(hrRes)) hr = hrRes;
__HCP_FUNC_EXIT(hr);
}
HRESULT Taxonomy::Logger::WriteLog( /*[in]*/ HRESULT hrRes ,
/*[in]*/ LPCWSTR szLogFormat ,
/*[in]*/ ... )
{
va_list arglist;
va_start( arglist, szLogFormat );
return WriteLogV( hrRes, szLogFormat, arglist );
}