/* =============================================================================
 *  scpp_exception.cpp
 *  Copyright (c) 2003 - 2013  Nomura Kei
 * =============================================================================
 */
#include <sc_errno.h>
#include <scpp_exception.hpp>

#ifndef MAXMSG
#define MAXMSG (512)
#endif

namespace scpp
{


////////////////////////////////////////////////////////////////////////////////
//
// Throwable
//

/**
 * 最後に発生した errno に対応するメッセージをもつ Throwable を構築します.
 * エラーメッセージを取得できない場合, 空文字がメッセージに設定されます.
 */
Throwable::Throwable() NO_THROW() : message("")
{
	char buf[MAXMSG];
	int  errnum = getError();
	int  ret    = getErrorMessage(errnum, buf, sizeof(buf));
	if (ret)
	{
		this->message = buf;
	}
}


/**
 * コピーコンストラクタ.
 *
 * @param t コピー元
 */
Throwable::Throwable(const Throwable& t) NO_THROW() : message(t.message)
{
	// NOP
}


/**
 * 指定されたメッセージを持つ Throwable を構築します.
 *
 * @param msg メッセージ
 */
Throwable::Throwable(const std::string& msg) NO_THROW() : message(msg)
{
	// NOP
}


/**
 * デストラクタ.
 */
Throwable::~Throwable() NO_THROW()
{
	// NOP
}


/**
 * エラーメッセージを返します.
 *
 * @return エラーメッセージ
 */
const char* Throwable::what() const NO_THROW()
{
	return message.c_str();
}



////////////////////////////////////////////////////////////////////////////////
//
// Exception
//

/**
 * 最後に発生した errno に対応するメッセージをもつ Exception を構築します.
 * エラーメッセージを取得できない場合, 空文字がメッセージに設定されます.
 */
Exception::Exception() NO_THROW() : Throwable()
{
}


/**
 * コピーコンストラクタ.
 *
 * @param t コピー元
 */
Exception::Exception(const Exception& t) NO_THROW() : Throwable(t)
{
	// NOP
}


/**
 * 指定されたメッセージを持つ Exception を構築します.
 *
 * @param msg メッセージ
 */
Exception::Exception(const std::string& msg) NO_THROW() : Throwable(msg)
{
	// NOP
}


/**
 * デストラクタ.
 */
Exception::~Exception() NO_THROW()
{
	// NOP
}



////////////////////////////////////////////////////////////////////////////////
//
// Error
//

/**
 * 最後に発生した errno に対応するメッセージをもつ Exception を構築します.
 * エラーメッセージを取得できない場合, 空文字がメッセージに設定されます.
 */
Error::Error() NO_THROW() : Throwable()
{
	// NOP
}


/**
 * コピーコンストラクタ.
 *
 * @param t コピー元
 */
Error::Error(const Error& t) NO_THROW() : Throwable(t)
{
	// NOP
}


/**
 * 指定されたメッセージを持つ Exception を構築します.
 *
 * @param msg メッセージ
 */
Error::Error(const std::string& msg) NO_THROW() : Throwable(msg)
{
	// NOP
}


/**
 * デストラクタ.
 */
Error::~Error() NO_THROW()
{
	// NOP
}
	
}	// namespace scpp

