/*
-----------------------------------------------------------------------------
This source file is part of OpenSpace3D
For the latest info, see http://www.openspace3d.com

Copyright (c) 2010 I-maginer

This program 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 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 Lesser General Public License for more details.

You should have received a copy of the GNU Lesser 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, or go to
http://www.gnu.org/copyleft/lesser.txt

You may alternatively use this source under the terms of a specific version of
the OpenSpace3D Unrestricted License provided you have obtained such a license from
I-maginer.
-----------------------------------------------------------------------------
*/

/*! \class Exception
  *  \brief Catch all exceptions.
  *  \
  *  \version 1.0
  *  \date may  2011
  */

#include "Exception.h"

Exception::Exception(const std::string& desc, const std::string& src) : line(0), description(desc), source(src)
{
}

Exception::Exception(const std::string& desc, const std::string& src, const char* typ, const char* fil, long lin) : line(lin), typeName(typ), description(desc), source(src), file(fil)
{
  GetFullDescription();
  std::cout << GetFullDescription();
}

Exception::Exception(const Exception& exception) : line(exception.line), typeName(exception.typeName), description(exception.description), source(exception.source), file(exception.file)
{

}

Exception::~Exception() throw()
{
}

void Exception::operator =(const Exception& exception)
{
  description = exception.description;
  source 		  = exception.source;
  file 		    = exception.file;
  line 		    = exception.line;
  typeName 	  = exception.typeName;
}

const std::string& Exception::GetFullDescription() const
{
  if (fullDesc.empty())
  {
    std::ostringstream desc;
    desc <<  "OPTITRACK EXCEPTION(" << typeName << "): " << description << " in " << source;

    if(line > 0)
    {
      desc << " at " << file << " (line " << line << ")";
    }

    fullDesc = desc.str();
  }
  return fullDesc;
}

const std::string& Exception::GetSource() const
{
  return source;
}

const std::string& Exception::GetFile() const
{
  return file;
}

long Exception::GetLine() const
{
  return line;
}

const std::string& Exception::GetDescription() const
{
  return description;
}

const char* Exception::what() const throw()
{
  return GetFullDescription().c_str();
}

ExceptionOptitrack::ExceptionOptitrack(const std::string& description, const std::string& source, const char* file, long line) : Exception(description, source, "ExceptionOptitrack", file, line)
{
}