// 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 // 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]); } }