251 lines
5 KiB
C++
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]);
|
|
}
|
|
}
|