/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
// archive_exception.cpp:

// (C) Copyright 2009 Robert Ramey - http://www.rrsd.com . 
// Use, modification and distribution is subject to the Boost Software
// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)

//  See http://www.boost.org for updates, documentation, and revision history.

#if (defined _MSC_VER) && (_MSC_VER == 1200)
#  pragma warning (disable : 4786) // too long name, harmless warning
#endif

#include <exception>
#include <cassert>
#include <string>

#define BOOST_ARCHIVE_SOURCE
#include <boost/archive/archive_exception.hpp>

namespace boost {
namespace archive {

BOOST_ARCHIVE_DECL(BOOST_PP_EMPTY())
archive_exception::archive_exception(
    exception_code c, 
    const char * e1,
    const char * e2
) : 
    code(c)
{
    m_msg = "programming error";
    switch(code){
    case no_exception:
        m_msg = "uninitialized exception";
        break;
    case unregistered_class:
        m_msg = "unregistered class";
        if(NULL != e1){
            m_msg += " - ";
            m_msg += e1;
        }    
        break;
    case invalid_signature:
        m_msg = "invalid signature";
        break;
    case unsupported_version:
        m_msg = "unsupported version";
        break;
    case pointer_conflict:
        m_msg = "pointer conflict";
        break;
    case incompatible_native_format:
        m_msg = "incompatible native format";
        if(NULL != e1){
            m_msg += " - ";
            m_msg += e1;
        }    
        break;
    case array_size_too_short:
        m_msg = "array size too short";
        break;
    case input_stream_error:
        m_msg = "input stream error";
        break;
    case invalid_class_name:
        m_msg = "class name too long";
        break;
    case unregistered_cast:
        m_msg = "unregistered void cast ";
        m_msg += (NULL != e1) ? e1 : "?";
        m_msg += "<-";
        m_msg += (NULL != e2) ? e2 : "?";
        break;
    case unsupported_class_version:
        m_msg = "class version ";
        m_msg += (NULL != e1) ? e1 : "<unknown class>";
        break;
    case other_exception:
        // if get here - it indicates a derived exception 
        // was sliced by passing by value in catch
        m_msg = "unknown derived exception";
        break;
    case multiple_code_instantiation:
        m_msg = "code instantiated in more than one module";
        if(NULL != e1){
            m_msg += " - ";
            m_msg += e1;
        }    
        break;
    case output_stream_error:
        m_msg = "output stream error";
        break;
    default:
        assert(false);
        break;
    }
}
BOOST_ARCHIVE_DECL(BOOST_PP_EMPTY())
archive_exception::~archive_exception() throw () {}

BOOST_ARCHIVE_DECL(const char *)
archive_exception::what( ) const throw()
{
    return m_msg.c_str();
}
BOOST_ARCHIVE_DECL(BOOST_PP_EMPTY())
archive_exception::archive_exception() : 
        code(no_exception)
{}

} // archive
} // boost
