windows-nt/Source/XPSP1/NT/net/wlbs/nlbmgr/wmibase/mtrace.cpp
2020-09-26 16:20:57 +08:00

251 lines
5 KiB
C++

// Copyright (c) Microsoft. All rights reserved.
//
// This is unpublished source code of Microsoft.
// The copyright notice above does not evidence any
// actual or intended publication of such source code.
// OneLiner : Implementation of MWmiInstance
// DevUnit : wlbstest
// Author : Murtaza Hakim
// include files
#include "MTrace.h"
#include <time.h>
// initialize static variables.
//
MTrace* MTrace::_instance = 0;
// constructor
//
MTrace::MTrace()
: _traceFile( "tracedata.txt"),
_level( WARNING )
{}
// Instance
//
MTrace*
MTrace::Instance()
{
if( _instance == 0 )
{
_instance = new MTrace;
}
return _instance;
}
// Initialize
// traceFile specified.
void
MTrace::Initialize( TraceLevel level,
string traceFile )
{
char temp[MAX_MESSAGE_SIZE];
_traceFile = traceFile;
FILE* stream = fopen( _traceFile.c_str(), "w");
if( stream == 0 )
{
cout << "not able to initialize trace file " << _traceFile.c_str() << endl;
}
else
{
fclose( stream );
}
_level = level;
}
// Initialize
// no trace file specified. Data written to tracedata.txt
void
MTrace::Initialize( TraceLevel level )
{
FILE* stream = fopen( _traceFile.c_str(), "w");
if( stream == 0 )
{
cout << "not able to initialize trace file " << _traceFile.c_str() << endl;
}
else
{
fclose( stream );
}
_level = level;
}
// SendTraceOutput
// wchar interface.
void
MTrace::SendTraceOutput( TraceLevel level,
wstring traceMessage )
{
FILE* stream;
if( level >= _level )
{
char temp[ MAX_MESSAGE_SIZE ];
WCharToChar( (unsigned short *) traceMessage.c_str(), wcslen( traceMessage.c_str() ) + 1,
temp, MAX_MESSAGE_SIZE );
FormatOutput( level,
temp );
}
}
// SendTraceOutput
// char interface.
void
MTrace::SendTraceOutput( TraceLevel level,
string traceMessage )
{
if( level >= _level )
{
FormatOutput( level, traceMessage );
}
}
void
MTrace::FormatOutput( TraceLevel level,
string traceMessage )
{
FILE* stream;
string levelToPrint;
switch( level )
{
case INFO:
levelToPrint = "INFO :";
break;
case WARNING:
levelToPrint = "WARNING :";
break;
case SEVERE_ERROR:
levelToPrint = "SEVERE_ERROR :";
break;
default :
levelToPrint = "Unknown Level :";
break;
}
// get time.
struct tm when;
time_t now;
time( &now );
when = *( localtime( &now ) );
// write to standard output
cout << levelToPrint << asctime( &when ) << traceMessage << endl;
// write to trace file
stream = fopen( _traceFile.c_str(), "a+");
if( stream == 0 )
{
cout << "not able to write trace data to file" << endl;
}
else
{
fprintf( stream, levelToPrint.c_str() );
fprintf( stream, asctime( &when ) );
fprintf( stream, traceMessage.c_str() );
fclose( stream );
}
}
// GetLevel
//
MTrace::TraceLevel
MTrace::GetLevel()
{
return _level;
}
// SetLevel
//
void
MTrace::SetLevel( TraceLevel level)
{
_level = level;
}
// TRACE
// char version
void
MYTRACE( int lineNum, string fileName, MTrace::TraceLevel level, string traceMessage )
{
MTrace* instance = MTrace::Instance();
// use lineNum information to send to output string.
char temp[100];
sprintf( temp, "%d", lineNum );
string newMessage = fileName + " :" + string( temp ) + " : " + traceMessage;
instance->SendTraceOutput( level, newMessage );
}
// TRACE
// wchar version
void
MYTRACE( int lineNum, string fileName, MTrace::TraceLevel level, wstring traceMessage )
{
MTrace* instance = MTrace::Instance();
wchar_t temp[100];
swprintf( temp, L"%d", lineNum );
wchar_t fileName_wc[1000];
CharToWChar( (char *) fileName.c_str(), strlen( fileName.c_str() ) + 1,
fileName_wc, 1000 );
wstring newMessage = wstring( fileName_wc ) + L" :" + wstring( temp ) + L" :" + traceMessage;
instance->SendTraceOutput( level, newMessage );
}
// utility functions.
//
void
CharToWChar( PCHAR pchCharString,
int iSizeOfCharString,
PWCHAR pwchCharString,
int iSizeOfWideCharString )
{
for (int i=0; i<= iSizeOfCharString; i++)
{
pwchCharString[i] = (CHAR)(pchCharString[i]);
}
}
void
WCharToChar( PWCHAR pwchWideCharString,
int iSizeOfWCharString,
PCHAR pchCharString,
int iSizeOfCharString )
{
for (int i=0; i<= iSizeOfWCharString; i++)
{
pchCharString[i] = (CHAR)(pwchWideCharString[i]);
}
}