diff --git a/src/Base/CMakeLists.txt b/src/Base/CMakeLists.txt index 30f40e0ded..7c93f02f42 100644 --- a/src/Base/CMakeLists.txt +++ b/src/Base/CMakeLists.txt @@ -197,6 +197,7 @@ SET(FreeCADBase_CPP_SRCS CoordinateSystem.cpp Debugger.cpp Exception.cpp + ExceptionFactory.cpp Factory.cpp FileInfo.cpp FileTemplate.cpp @@ -251,6 +252,7 @@ SET(FreeCADBase_HPP_SRCS CoordinateSystem.h Debugger.h Exception.h + ExceptionFactory.h Factory.h FileInfo.h FileTemplate.h diff --git a/src/Base/ExceptionFactory.cpp b/src/Base/ExceptionFactory.cpp new file mode 100644 index 0000000000..dfb1ab94e5 --- /dev/null +++ b/src/Base/ExceptionFactory.cpp @@ -0,0 +1,55 @@ +/*************************************************************************** + * Copyright (c) 2017 Abdullah Tahiri * + * * + * This file is part of the FreeCAD CAx development system. * + * * + * This library is free software; you can redistribute it and/or * + * modify it under the terms of the GNU Library General Public * + * License as published by the Free Software Foundation; either * + * version 2 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 Library General Public License for more details. * + * * + * You should have received a copy of the GNU Library General Public * + * License along with this library; see the file COPYING.LIB. If not, * + * write to the Free Software Foundation, Inc., 59 Temple Place, * + * Suite 330, Boston, MA 02111-1307, USA * + * * + ***************************************************************************/ + +#include "ExceptionFactory.h" + +using namespace Base; + +ExceptionFactory* ExceptionFactory::_pcSingleton = NULL; + +ExceptionFactory& ExceptionFactory::Instance(void) +{ + if (_pcSingleton == NULL) + _pcSingleton = new ExceptionFactory; + return *_pcSingleton; +} + +void ExceptionFactory::Destruct (void) +{ + if (_pcSingleton != 0) + delete _pcSingleton; + _pcSingleton = 0; +} + +void ExceptionFactory::raiseException (const ExceptionInfo& info) const +{ + if(this->CanProduce(info.exceptionname.c_str())) { + + std::map::const_iterator pProd; + + pProd = _mpcProducers.find(info.exceptionname.c_str()); + if (pProd != _mpcProducers.end()) + static_cast(pProd->second)->raiseException(info); + } +} + + diff --git a/src/Base/ExceptionFactory.h b/src/Base/ExceptionFactory.h new file mode 100644 index 0000000000..b0e77b244b --- /dev/null +++ b/src/Base/ExceptionFactory.h @@ -0,0 +1,102 @@ +/*************************************************************************** + * Copyright (c) 2017 Abdullah Tahiri * + * * + * This file is part of the FreeCAD CAx development system. * + * * + * This library is free software; you can redistribute it and/or * + * modify it under the terms of the GNU Library General Public * + * License as published by the Free Software Foundation; either * + * version 2 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 Library General Public License for more details. * + * * + * You should have received a copy of the GNU Library General Public * + * License along with this library; see the file COPYING.LIB. If not, * + * write to the Free Software Foundation, Inc., 59 Temple Place, * + * Suite 330, Boston, MA 02111-1307, USA * + * * + ***************************************************************************/ + + +#ifndef BASE_EXCEPTIONFACTORY_H +#define BASE_EXCEPTIONFACTORY_H + + + +#include "Factory.h" + +namespace Base +{ + +struct ExceptionInfo { + std::string exceptionname; + std::string function; + std::string message; + std::string file; + unsigned int line; +}; + +/// Abstract base class of all exception producers +class BaseExport AbstractExceptionProducer : public AbstractProducer +{ +public: + AbstractExceptionProducer () {} + ~AbstractExceptionProducer() {} + // just implement it + void* Produce () const { + return nullptr; + } + virtual void raiseException(const ExceptionInfo& info) const = 0; +}; + +// -------------------------------------------------------------------- + +/** The ExceptionFactory */ +class BaseExport ExceptionFactory : public Factory +{ +public: + static ExceptionFactory& Instance(void); + static void Destruct (void); + + void raiseException(const ExceptionInfo& info) const; + +private: + static ExceptionFactory* _pcSingleton; + + ExceptionFactory(){} + ~ExceptionFactory(){} +}; + +/* Producers */ + +template +class BaseExport ExceptionProducer : public AbstractExceptionProducer +{ +public: + ExceptionProducer () + { + ExceptionFactory::Instance().AddProducer(typeid(CLASS).name(), this); + } + + virtual ~ExceptionProducer (){} + + void raiseException(const ExceptionInfo& info) const + { + CLASS c; + + c.setMessage(info.message); + + c.setDebugInformation(info.file, info.line, info.function); + + throw c; + } +}; + +} //namespace Base + + +#endif +