www.pudn.com > zfxcengine-0.1.0.zip > ceLogSystem.cpp


/* $Id: ceLogSystem.cpp,v 1.7 2005/08/12 19:20:41 kimmi Exp $ */ 
//////////////////////////////////////////////////////////////////////////////// 
//  Module:    Core                                                           
//! \file      ceLogSystem.cpp        
//! \brief     Deklaration der Klasse ceLogSystem. 
//! \author    Clemens Scherer aka CMSCOPY 
//                                                                             
//                                                   
// Diese Datei steht unter der LGPL-Lizenz, welche   
// im Hauptordner(ZFXC-Engine) unter LICENSE         
// nachlesbar ist.                                   
//////////////////////////////////////////////////////////////////////////////// 
#include "Core/ceLogSystem.h" 
#include "Core/ceTimer.h" 
#include "Core/ceMemManager.h" 
 
namespace ZFXCE { 
	//////////////////////////////////////////////////////////////////////////////// 
	using namespace std; 
	 
	ceLogSystem *ceLogSystem::s_pClass = NULL; 
	//! \var Default name for log 
	static string l_strName = "ZFXCE_Log.txt"; 
 
	//////////////////////////////////////////////////////////////////////////////// 
	ceLogSystem *ceLogSystem::GetSingletonPtr() 
	{ 
		PUSH_FUNCTION; 
		 
		// Enshure existing  
		if (NULL == s_pClass) { 
			s_pClass = new ceLogSystem(); 
			ce_assert(s_pClass != NULL); 
		} 
	 
		return s_pClass; 
	} 
	//////////////////////////////////////////////////////////////////////////////// 
	ceLogSystem& ceLogSystem::GetSingleton() 
	{ 
		PUSH_FUNCTION; 
 
		if (NULL == s_pClass) { 
			s_pClass = new ceLogSystem(); 
			ce_assert(s_pClass != NULL); 
		} 
	 
		return *s_pClass; 
	} 
	//////////////////////////////////////////////////////////////////////////////// 
	void ceLogSystem::Release() 
	{ 
		PUSH_FUNCTION; 
 
		WriteTail(); 
	 
		// Wenn File noch offen, schliesse es 
		if(m_pFile.is_open()) 
			m_pFile.close(); 
 
		delete this; 
	} 
	//////////////////////////////////////////////////////////////////////////////// 
	ceLogSystem::ceLogSystem() 
	{ 
		PUSH_FUNCTION; 
	 
		m_pFile.clear(); 
		 
		m_bOpen = FALSE; 
	} 
	//////////////////////////////////////////////////////////////////////////////// 
	ceLogSystem::~ceLogSystem() 
	{ 
		PUSH_FUNCTION; 
	 
		Release(); 
	} 
	//////////////////////////////////////////////////////////////////////////////// 
	BOOL ceLogSystem::OpenLog(const string strFileName) 
	{ 
		PUSH_FUNCTION; 
 
		if (0 == strFileName.size())  
			SetLogName(l_strName); 
		 
		// Oeffne File mit Schreibzugriff 
		if (!m_bOpen) { 
			m_pFile.open(strFileName.c_str(),std::ios_base::out); 
	 
			if (!m_pFile.good())  
				return FALSE; 
 
			// Write header 
			WriteHeader(); 
			SetLogName(strFileName); 
			m_bOpen = TRUE; 
		} 
	 
		return TRUE; 
	} 
	//////////////////////////////////////////////////////////////////////////////// 
	void ceLogSystem::CloseLog() 
	{ 
		PUSH_FUNCTION; 
 
		// Write tail  
		if (m_pFile.is_open())   { 
			WriteTail(); 
			m_pFile.close(); 
			m_bOpen = FALSE; 
		} 
	} 
	//////////////////////////////////////////////////////////////////////////////// 
	void ceLogSystem::WriteLog(const string strText)   
	{	 
		PUSH_FUNCTION; 
		 
		// Einfach auf std::cout ausgeben 
		if (!m_pFile.is_open()) { 
			cout << strText; 
			return; 
		} 
 
		// Schreibe Meldung in das Logfile 
		m_pFile << strText; 
		m_pFile.flush(); 
 
		// Zusätzlicher Konsolen-Output 
		Debug::Print(strText); 
	} 
	//////////////////////////////////////////////////////////////////////////////// 
	BOOL ceLogSystem::CheckStatus() const 
	{ 
		return m_bOpen; 
	} 
	//////////////////////////////////////////////////////////////////////////////// 
	void ceLogSystem::WriteHeader() 
	{ 
		PUSH_FUNCTION; 
 
		ceTimer       my; 
		ostringstream ausgabe; 
 
		// Checke Status vom Logfile 
		if (!m_bOpen) 
			return; 
 
		// Hole das aktuelle Datum 
		my.UpdateTimeOfDay(); 
 
		// Schreibe Header 
		m_pFile.precision(1); 
		m_pFile.setf(ios::fixed); 
		m_pFile.fill(' '); 
		m_pFile << CE_LINENL; 
		ausgabe << "+++++ LogSystem Version " << CE_VERSION_LOG; 
		m_pFile <<  setiosflags(ios::left) << setw(61) << ausgabe.str(); 
		m_pFile << "+++++\n"; 
		m_pFile.precision(2);	 
		ausgabe.seekp(0); 
	//	ausgabe << "+++++ "<tm_mday<<"."<<(my.m_pDayTime->tm_mon)+1 << "."<<(my.m_pDayTime->tm_year)+1900 
				<<" um "<tm_hour<<":"<< std::setfill('0') << std::setw(2) << my.m_pDayTime->tm_min << ":" << std::setw(2) << my.m_pDayTime->tm_sec << "          "; 
		m_pFile << setw(61) << ausgabe.str(); 
		m_pFile << "+++++\n";		 
		m_pFile << CE_LINENL << "\n\n"; 
	} 
	//////////////////////////////////////////////////////////////////////////////// 
	void ceLogSystem::SetLogName(string strName) 
	{ 
		PUSH_FUNCTION; 
	 
		if (0 == strName.size()) 
			return; 
				 
		m_strLog = strName; 
	} 
	//////////////////////////////////////////////////////////////////////////////// 
	string ceLogSystem::GetLogName() const 
	{ 
		PUSH_FUNCTION; 
 
		return m_strLog; 
	} 
	//////////////////////////////////////////////////////////////////////////////// 
	void ceLogSystem::WriteTail() 
	{ 
		PUSH_FUNCTION; 
 
		ceTimer my; 
		my.UpdateTimeOfDay(); 
		ostringstream ausgabe; 
 
		// Schreibe Ende 
		m_pFile << "\n\n" <tm_mday<<"."<<(my.m_pDayTime->tm_mon)+1 << "."<<(my.m_pDayTime->tm_year)+1900 
		        <<" um "<tm_hour<<":"<< std::setfill('0') << std::setw(2) << my.m_pDayTime->tm_min << ":" << std::setw(2) << my.m_pDayTime->tm_sec << "          "; 
		m_pFile << std::setw(61) << ausgabe.str(); 
		m_pFile << "+++++\n"; 
		m_pFile << CE_LINENL; 
	} 
	//////////////////////////////////////////////////////////////////////////////// 
	ceLogSystem &ceLogSystem::operator =(const ceLogSystem &rhs) 
	{ 
		return *this; 
	} 
} // Namespace ZFXCE