www.pudn.com > rDUNclientBeta1.zip > Debug.cpp


//Debug.cpp - Generic debug information output engine 
//Copyright (C) Robert Merrison 2001  
 
//This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License  
//as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. 
//This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied  
//warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. 
//You should have received a copy of the GNU General Public License along with this program; if not, write to the  
//Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 
 
 
#include  
 
#include "Debug.h" 
#include "timer.h" 
 
/*Constructor: Initialises a few things*/ 
debug_engine::debug_engine( ) 
{ 
	is_inited	= false; //Not initialized yet 
	write_file	= false; //Don't output to a file by default 
	level		= DBLEVEL_MED; //Set default debug level to medium 
	debug_file	= NULL;	 
	bytes_written	= 0; 
	file_size_limit	= 0; //Turn file size limit off by default 
	timer		= NULL; 
	log_time	= false; 
 
	memset( filename, 0, sizeof( filename ) ); 
} 
 
/*Destructor: Do nothing*/ 
debug_engine::~debug_engine( ) 
{ 
} 
 
/*Initialization: Init stuff*/ 
bool debug_engine::init( short debug_level, char *debug_filename, time_engine* timer_engine ) 
{	 
		//Make sure the debug level is valid 
	if( debug_level != DBLEVEL_LOW && debug_level != DBLEVEL_MED && debug_level != DBLEVEL_HIGH){ 
		return false; 
	}	 
		//Check if a filename is specfied and if so, activate file writing 
	if( debug_filename != NULL ){ 
		write_file	= true; 
	} 
	else{ 
		write_file = false; 
	} 
	timer	= timer_engine; 
		//Enable time outputting if a timer engine is specified 
	if( timer_engine != NULL ){ 
		log_time	= true; 
	} 
	else{ 
		log_time	= false; 
	} 
		//If file writing is activated, open the file for writing 
	if( write_file ){ 
		if( !open_debug_file( debug_filename ) ){ 
			write_file = false;	//Disable file writing if there was an error 
		} 
	} 
		//Set the debug level 
	level		= debug_level; 
		//Initialization is complete 
	is_inited	= true; 
	log_message( MSG_NOTICE, "Debug engine started"); 
 
	return is_inited; 
} 
 
/*Open debug file: Opens the debug file (if used) for writing*/ 
bool debug_engine::open_debug_file( char *debug_filename ) 
{	 
		//Open the file and check for errors 
	debug_file = fopen( debug_filename, "w" ); 
	if( !debug_file ){ 
		return false; 
	} 
    bytes_written	= 0; 
	strcpy( filename, debug_filename ); 
	return true; 
} 
 
/*Kill: Clears everything up when we are done*/ 
bool debug_engine::kill( ) 
{	 
	if( is_inited == false ){ 
		return true; 
	} 
	log_message( MSG_NOTICE, "Debug engine killed" ); 
 
		//Close the debug logging file if it exists 
	if( debug_file ){ 
		fclose( debug_file ); 
	} 
		//No longer initialized 
	is_inited	= false; 
 
 
	return true; 
} 
 
/*Log Message: Logs an error/status message to the screen/log file*/ 
bool debug_engine::log_message( short msg_type, char* message, ... ) 
{ 
		//Check the logging engine has been initialized 
	if( !is_inited ) { 
		return false; 
	} 
 
	if( timer != NULL ){ 
		log_time	= true; 
	} 
	else{ 
		log_time	= false; 
	}	 
		//Now read in any paramters that may have been passed 
	va_list	parameters; 
	char	debug_string[256]; 
	memset( debug_string, 0, sizeof( debug_string ) ); 
	va_start( parameters, message ); 
	vsprintf( debug_string, message, parameters ); 
	va_end( parameters ); 
		//Add the time/date information if needed 
	char	string_to_output[1024]; 
	memset	(string_to_output, 0, sizeof( string_to_output )); 
	if( log_time == true ){ 
		tm	time	= timer->get_current_time(); 
		sprintf( string_to_output, "[%i/%i/%i %i:%i] %s", time.tm_mday, time.tm_mon+1, time.tm_year+1900,  
			time.tm_hour, time.tm_min+1, debug_string ); 
	} 
	else 
	{ 
		sprintf( string_to_output, "%s", debug_string ); 
	} 
	bool output_string	= must_log( msg_type ); 
 
	if( output_string ){ 
		printf( "%s\n", string_to_output ); 
		if( write_file ){	 
			bytes_written += (int)(strlen( string_to_output) + 1);	//Just make sure we haven't gone over the file size 
			check_file_size();	 
			fprintf( debug_file, "%s\n", string_to_output ); 
			fflush( debug_file ); 
		} 
	} 
	 
	return true; 
} 
 
/*Check Logging: Checks the logging level and type of message and detemines if it should be logged*/ 
bool debug_engine::must_log( short msg_type ) 
{ 
		//Always log critical errors and notices 
	if( msg_type == MSG_NOTICE || msg_type == MSG_CRITICAL ){	  
		return true; 
	} 
 
		//Check the message type against the logging level and return accordingly 
	switch( msg_type ){ 
		case MSG_STATUS:{ 
			if( level == DBLEVEL_HIGH ){ 
				return true; 
			} 
			else{ 
				return false; 
			} 
		} 
		case MSG_ERROR:{ 
			if( level == DBLEVEL_MED || level == DBLEVEL_HIGH ){ 
				return true; 
			} 
			else{ 
				return false; 
			} 
		} 
	} 
 
	return false; 
} 
 
/*Check file size: Checks that logging hasn't gone over the allowable file size, and if it has,  
	restarts the log file*/ 
void debug_engine::check_file_size() 
{ 
		//Check if the filesize limit is enabled or not 
	if( file_size_limit == 0 ){ 
		return; 
	} 
		//Check if we have hit the limit, and if so close the file and then re-open it to clear it 
	if( bytes_written > file_size_limit ){ 
		if( debug_file ){ 
			printf( "Remaking log file\n" ); 
			fclose( debug_file ); 
			open_debug_file( filename ); 
		} 
	} 
 
	return; 
}