// GenLog.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include "GenLog.h" CGenLog::CGenLog() : m_pFileHandle( NULL ), m_pWriteBuffer( NULL ), m_lWriteBufferLen( 0L ) { } CGenLog::CGenLog ( IN const char *pszFilePath ) : m_pFileHandle( NULL ), m_pWriteBuffer( NULL ), m_lWriteBufferLen( 0L ) { // _ASSERTE( pszFilePath != NULL ); InitLog( pszFilePath, "w+" ); } CGenLog::~CGenLog() { ResetGenLog(); } long CGenLog::InitLog ( IN const char *pszFilePath, /* = NULL */ IN const char *pszMode, /* = NULL */ IN const unsigned long lWriteBuffer /* = 256 */ ) { // _ASSERTE( pszFilePath != NULL ); // _ASSERTE( pszMode != NULL ); // _ASSERTE( lWriteBuffer > 0L ); long lLastRet = GENLOG_ERROR_UNEXPECTED; FILE *pTempFile = NULL; char *pWriteBuff = NULL; __try { if( pszFilePath == NULL || pszMode == NULL || lWriteBuffer == 0L ) { lLastRet = GENLOG_ERROR_INVALIDARG; goto qInitLog; } ResetGenLog(); pTempFile = fopen( pszFilePath, pszMode ); if( !pTempFile ) { lLastRet = GENLOG_ERROR_FILEOPERATIONFAILED; goto qInitLog; } // // we allocate a byte more than what is required, so that we can // take care of av issues.. // pWriteBuff = (char *) calloc( lWriteBuffer + 1, sizeof( char ) ); // _ASSERTE( pWriteBuff != NULL ); if( !pWriteBuff ) { lLastRet = GENLOG_ERROR_MEMORY; goto qInitLog; } lLastRet = GENLOG_SUCCESS; qInitLog: if( lLastRet == GENLOG_SUCCESS ) { m_pFileHandle = pTempFile; m_pWriteBuffer = pWriteBuff; m_lWriteBufferLen = lWriteBuffer; } else { // do the cleanup stuff here.. if( pTempFile ) { fclose ( pTempFile ); } if( pWriteBuff ) { free( pWriteBuff ); } } } __except ( -1/*EXCEPTION_EXECUTE_HANDLER*/, 1 ) { lLastRet = GENLOG_ERROR_UNEXPECTED; if( pTempFile ) { fclose ( pTempFile ); } if( pWriteBuff ) { free( pWriteBuff ); } // _ASSERTE( false ); } return lLastRet; } void CGenLog::Debug ( IN const char *pDebugString, IN ... ) { // _ASSERTE( pDebugString != NULL ); // _ASSERTE( m_pFileHandle != NULL ); // _ASSERTE( m_pWriteBuffer != NULL ); __try { if( !pDebugString || !m_pFileHandle || !m_pWriteBuffer ) { return; } va_list argList; va_start(argList, pDebugString); _vsnprintf(m_pWriteBuffer, m_lWriteBufferLen, pDebugString, argList); Write(); va_end(argList); } __except( -1/*EXCEPTION_EXECUTE_HANDLER*/, 1 ) { // _ASSERTE( false ); } } void CGenLog::Error ( IN const char *pErrorString, IN ... ) { // _ASSERTE( pErrorString != NULL ); // _ASSERTE( m_pFileHandle != NULL ); // _ASSERTE( m_pWriteBuffer != NULL ); __try { if( !pErrorString || !m_pFileHandle || !m_pWriteBuffer ) { return; } va_list argList; va_start(argList, pErrorString); _vsnprintf(m_pWriteBuffer, m_lWriteBufferLen, pErrorString, argList); Write(); va_end(argList); } __except( -1/*EXCEPTION_EXECUTE_HANDLER*/, 1 ) { // _ASSERTE( false ); } } void CGenLog::Log ( IN const char *pLogString, IN ... ) { // _ASSERTE( pLogString != NULL ); // _ASSERTE( m_pFileHandle != NULL ); // _ASSERTE( m_pWriteBuffer != NULL ); __try { if( !pLogString || !m_pFileHandle || !m_pWriteBuffer ) { return; } va_list argList; va_start(argList, pLogString); _vsnprintf(m_pWriteBuffer, m_lWriteBufferLen, pLogString, argList); Write(); va_end(argList); } __except( -1/*EXCEPTION_EXECUTE_HANDLER*/, 1 ) { // _ASSERTE( false ); } } long CGenLog::Write() { // _ASSERTE( m_pFileHandle != NULL ); // _ASSERTE( m_pWriteBuffer != NULL ); long lLastRet = GENLOG_ERROR_UNEXPECTED; unsigned long lWrittenDataLen = 0L; __try { if( !m_pWriteBuffer || !m_pFileHandle ) { lLastRet = GENLOG_ERROR_INVALIDARG; goto qWrite; } if( !m_pFileHandle ) { lLastRet = GENLOG_ERROR_UNINITIALIZED; goto qWrite; } lWrittenDataLen = fwrite( (void *)m_pWriteBuffer, sizeof( char ), strlen( m_pWriteBuffer), m_pFileHandle ); if( lWrittenDataLen != strlen( m_pWriteBuffer) ) { lLastRet = GENLOG_ERROR_FILEOPERATIONFAILED; goto qWrite; } lLastRet = GENLOG_SUCCESS; qWrite: if( lLastRet == GENLOG_SUCCESS ) { // great!! } else { // cleanup.. } } __except ( -1 /*EXCEPTION_EXECUTE_HANDLER*/, 1 ) { lLastRet = GENLOG_ERROR_UNEXPECTED; // _ASSERTE( false ); } return lLastRet; } void CGenLog::ResetGenLog() { if( m_pFileHandle ) { fclose( m_pFileHandle ); m_pFileHandle = NULL; } if( m_pWriteBuffer ) { free( (void *) m_pWriteBuffer ); m_pWriteBuffer = NULL; } m_lWriteBufferLen = GENLOG_DEFAULT_WRITEBUFSIZE; } void CGenLog::Header ( IN const char *pszHeaderString ) { const char *pszHead = "---------------------------------------------------\n"; __try { if( !pszHeaderString ) { strcpy( m_pWriteBuffer, pszHead ); Write(); Now(); strcpy( m_pWriteBuffer, pszHead ); Write(); } else { strncpy( m_pWriteBuffer, pszHeaderString, m_lWriteBufferLen ); Write(); } } __except ( -1 /*EXCEPTION_EXECUTE_HANDLER*/, 1 ) { // _ASSERTE( false ); } } void CGenLog::Now() { time_t timeNow = ::time(NULL); struct tm *ptmTemp = localtime(&timeNow); const char *pFormat = "%H : %M : %S - %A, %B %d, %Y\n"; __try { if (ptmTemp == NULL || !strftime(m_pWriteBuffer, m_lWriteBufferLen, pFormat, ptmTemp)) m_pWriteBuffer[0] = '\0'; Write(); } __except ( -1 /*EXCEPTION_EXECUTE_HANDLER*/, 1 ) { // _ASSERTE( false ); } }