mirror of
https://github.com/1dot13/source.git
synced 2026-07-29 13:52:17 +02:00
git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@4447 3b4a5df2-a311-0410-b5c6-a8a6f20db521
250 lines
6.4 KiB
C++
250 lines
6.4 KiB
C++
/*
|
|
* bfVFS : vfs/Core/vfs_dfebug.cpp
|
|
* - Exception class and throw macros, used to notify the using program of unexpected situations
|
|
*
|
|
* Copyright (C) 2008 - 2010 (BF) john.bf.smith@googlemail.com
|
|
*
|
|
* This file is part of the bfVFS library
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
* License as published by the Free Software Foundation; either
|
|
* version 2.1 of the License, or (at your option) any later version.
|
|
*
|
|
* This library 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
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
*/
|
|
|
|
#include <vfs/Core/vfs_debug.h>
|
|
#include <vfs/Core/vfs_string.h>
|
|
#include <vfs/Core/vfs_file_raii.h>
|
|
#include <vfs/Core/File/vfs_file.h>
|
|
#include <vfs/Core/vfs_os_functions.h>
|
|
#include <vfs/Tools/vfs_log.h>
|
|
|
|
#include <sstream>
|
|
#include <ctime>
|
|
|
|
vfs::Exception::Exception(vfs::String const& text, vfs::String const& function, int line, const char* file)
|
|
: std::exception() //(text.utf8().c_str())
|
|
{
|
|
VFS_LOG_ERROR( text.c_str() );
|
|
|
|
time_t rawtime;
|
|
time ( &rawtime );
|
|
std::string datetime(ctime(&rawtime));
|
|
|
|
SEntry en;
|
|
en.message = text;
|
|
en.line = line;
|
|
en.file = file;
|
|
en.function = function;
|
|
VFS_IGNOREEXCEPTION(en.time = vfs::String(datetime.substr(0,datetime.length()-1)), false);
|
|
m_CallStack.push_back(en);
|
|
};
|
|
|
|
vfs::Exception::Exception(vfs::String const& text, vfs::String const& function, int line, const char* file, std::exception& ex)
|
|
: std::exception() //(text.utf8().c_str())
|
|
{
|
|
VFS_LOG_ERROR( text.c_str() );
|
|
|
|
if(dynamic_cast<vfs::Exception*>(&ex))
|
|
{
|
|
vfs::Exception& vfs_ex = *static_cast<vfs::Exception*>(&ex);
|
|
m_CallStack.insert(m_CallStack.end(), vfs_ex.m_CallStack.begin(), vfs_ex.m_CallStack.end());
|
|
}
|
|
else
|
|
{
|
|
SEntry en;
|
|
en.line = -1;
|
|
en.file = "";
|
|
en.function = "";
|
|
en.time = "";
|
|
VFS_IGNOREEXCEPTION( en.message = vfs::String(ex.what()), false );
|
|
|
|
m_CallStack.push_back(en);
|
|
}
|
|
|
|
time_t rawtime;
|
|
time ( &rawtime );
|
|
std::string datetime(ctime(&rawtime));
|
|
|
|
SEntry en;
|
|
en.message = text;
|
|
en.line = line;
|
|
en.file = file;
|
|
en.function = function;
|
|
VFS_IGNOREEXCEPTION(en.time = vfs::String(datetime.substr(0,datetime.length()-1)), false);
|
|
|
|
m_CallStack.push_back(en);
|
|
};
|
|
|
|
|
|
|
|
|
|
vfs::Exception::~Exception() throw()
|
|
{
|
|
}
|
|
|
|
vfs::String vfs::Exception::getLastEntryString() const
|
|
{
|
|
if(!m_CallStack.empty())
|
|
{
|
|
CALLSTACK::const_reverse_iterator rit = m_CallStack.rbegin();
|
|
std::wstringstream wss;
|
|
wss << rit->file.c_wcs()
|
|
<< L" (l. "
|
|
<< rit->line
|
|
<< ") : ["
|
|
<< rit->function.c_wcs()
|
|
<< L"] - "
|
|
<< rit->message.c_wcs();
|
|
return wss.str();
|
|
}
|
|
return "";
|
|
}
|
|
|
|
const char* vfs::Exception::what() const throw()
|
|
{
|
|
static std::string msg;
|
|
msg = "";
|
|
if(!m_CallStack.empty())
|
|
{
|
|
//msg = m_CallStack.front().message.utf8();
|
|
msg = this->getExceptionString().utf8();
|
|
}
|
|
return msg.c_str();
|
|
}
|
|
|
|
|
|
vfs::String vfs::Exception::getExceptionString() const
|
|
{
|
|
if(!m_CallStack.empty())
|
|
{
|
|
std::wstringstream wss;
|
|
CALLSTACK::const_reverse_iterator rit = m_CallStack.rbegin();
|
|
for(; rit != m_CallStack.rend(); ++rit)
|
|
{
|
|
wss << L"========== " << rit->time << L" ==========\r\n";
|
|
wss << L"File : " << rit->file << L"\r\n";
|
|
wss << L"Line : " << rit->line << L"\r\n";
|
|
wss << L"Location : " << rit->function << L"\r\n\r\n";
|
|
wss << L" " << rit->message << L"\r\n";
|
|
}
|
|
return wss.str();
|
|
}
|
|
return L"";
|
|
}
|
|
//
|
|
//void vfs::Exception::writeFile(vfs::Path const& sPath)
|
|
//{
|
|
// try
|
|
// {
|
|
// vfs::COpenWriteFile oFile(sPath,true,true);
|
|
// vfs::String s = this->getExceptionString();
|
|
// oFile->write(s.utf8().c_str(), s.length());
|
|
// oFile->close();
|
|
// }
|
|
// catch(vfs::Exception &ex)
|
|
// {
|
|
// vfs::Exception ex2(L"Could not write exception file into VFS",
|
|
// _FUNCTION_FORMAT_,__LINE__,__FILE__, ex);
|
|
// vfs::Exception out("Writing exception to disc failed : is there no writable profile?",
|
|
// _FUNCTION_FORMAT_,__LINE__,__FILE__, *this);
|
|
//
|
|
// out.m_CallStack.insert(out.m_CallStack.begin(), ex.m_CallStack.begin(), ex.m_CallStack.end());
|
|
//
|
|
// vfs::Path sDir,sFile;
|
|
// sPath.splitLast(sDir,sFile);
|
|
// vfs::CFile oFile(sFile);
|
|
//
|
|
// try
|
|
// {
|
|
// // can also fail, but there is only so much we can do
|
|
// vfs::COpenWriteFile file( vfs::tWritableFile::cast(&oFile) );
|
|
// vfs::String s = out.getExceptionString();
|
|
// file->write(s.utf8().c_str(), s.length());
|
|
// }
|
|
// catch(std::exception &fex)
|
|
// {
|
|
// VFS_RETHROW(L"Could write exception file at all",fex);
|
|
// }
|
|
// }
|
|
//}
|
|
//
|
|
|
|
//
|
|
//void logException(vfs::Exception const& ex)
|
|
//{
|
|
// static bool is_logging = false;
|
|
// if(is_logging)
|
|
// {
|
|
// // drop message
|
|
// return;
|
|
// }
|
|
// //////////////////
|
|
// is_logging = true;
|
|
// //////////////////
|
|
//
|
|
// static vfs::Log& exlog = *vfs::Log::create(L"game_exceptions.log", false, vfs::Log::FLUSH_IMMEDIATELY);
|
|
// try
|
|
// {
|
|
// exlog << ">>>>>>>>>>>>>>>>>>>>>" << vfs::Log::endl;
|
|
// exlog << ex.getExceptionString();
|
|
// exlog << "<<<<<<<<<<<<<<<<<<<<<" << vfs::Log::endl << vfs::Log::endl;
|
|
// }
|
|
// catch(...)
|
|
// {
|
|
// // don't throw at all
|
|
// }
|
|
//
|
|
// //////////////////
|
|
// is_logging = false;
|
|
// //////////////////
|
|
//}
|
|
//
|
|
//void logException(std::exception const& ex)
|
|
//{
|
|
// logException(ex.what());
|
|
//}
|
|
//
|
|
//void logException(const wchar_t* ex)
|
|
//{
|
|
// logException(vfs::String::as_utf8(ex).c_str());
|
|
//}
|
|
//
|
|
//void logException(const char* ex)
|
|
//{
|
|
// static bool is_logging = false;
|
|
// if(is_logging)
|
|
// {
|
|
// // drop message
|
|
// return;
|
|
// }
|
|
// //////////////////
|
|
// is_logging = true;
|
|
// //////////////////
|
|
//
|
|
// static vfs::Log& exlog = *vfs::Log::create(L"game_exceptions.log", false, vfs::Log::FLUSH_IMMEDIATELY);
|
|
// try
|
|
// {
|
|
// exlog << ">>>>>>>>>>>>>>>>>>>>>" << vfs::Log::endl;
|
|
// exlog << ex;
|
|
// exlog << "<<<<<<<<<<<<<<<<<<<<<" << vfs::Log::endl << vfs::Log::endl;
|
|
// }
|
|
// catch(...)
|
|
// {
|
|
// // don't throw at all
|
|
// }
|
|
//
|
|
// //////////////////
|
|
// is_logging = false;
|
|
// //////////////////}
|
|
//}
|