#ifndef BOOST_ARCHIVE_ARCHIVE_EXCEPTION_HPP
#define BOOST_ARCHIVE_ARCHIVE_EXCEPTION_HPP

// MS compatible compilers support #pragma once
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
# pragma once
#endif

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

// (C) Copyright 2002 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.

#include <boost/config.hpp>
#ifndef BOOST_NO_EXCEPTIONS
#include <exception>

#include <cassert>

namespace boost {
namespace archive {

//////////////////////////////////////////////////////////////////////
// exceptions thrown by archives
//
class archive_exception : public virtual std::exception
{
public:
    typedef enum {
        no_exception,       // initialized without code
        other_exception,    // any excepton not listed below
        unregistered_class, // attempt to serialize a pointer of an
                            // an unregistered class
        invalid_signature,  // first line of archive does not contain
                            // expected string
        unsupported_version,// archive created with library version
                            // subsequent to this one
        pointer_conflict,   // an attempt has been made to directly
                            // serialization::detail an object
                            // after having already serialzed the same
                            // object through a pointer.  Were this permited,
                            // it the archive load would result in the
                            // creation of an extra copy of the obect.
        incompatible_native_format, // attempt to read native binary format
                            // on incompatible platform
        array_size_too_short,// array being loaded doesn't fit in array allocated
        stream_error,       // i/o error on stream
        invalid_class_name, // class name greater than the maximum permitted.
                            // most likely a corrupted archive or an attempt
                            // to insert virus via buffer overrun method.
        unregistered_cast   // base - derived relationship not registered with 
                            // void_cast_register
    } exception_code;
    exception_code code;
    archive_exception(exception_code c) : 
        code(c)
    {}
    virtual const char *what( ) const throw( )
    {
        const char *msg = "programming error";
        switch(code){
        case no_exception:
            msg = "uninitialized exception";
            break;
        case unregistered_class:
            msg = "unregistered class";
            break;
        case invalid_signature:
            msg = "invalid signature";
            break;
        case unsupported_version:
            msg = "unsupported version";
            break;
        case pointer_conflict:
            msg = "pointer conflict";
            break;
        case incompatible_native_format:
            msg = "incompatible native format";
            break;
        case array_size_too_short:
            msg = "array size too short";
            break;
        case stream_error:
            msg = "stream error";
            break;
        case invalid_class_name:
            msg = "class name too long";
            break;
        case unregistered_cast:
            msg = "unregistered void cast";
            break;
        case other_exception:
            // if get here - it indicates a derived exception 
            // was sliced by passing by value in catch
            msg = "unknown derived exception";
            break;
        default:
            assert(false);
            break;
        }
        return msg;
    }
protected:
    archive_exception() : 
         code(no_exception)
    {}
};

}// namespace archive
}// namespace boost

#endif //BOOST_NO_EXCEPTIONS
#endif //BOOST_ARCHIVE_ARCHIVE_EXCEPTION_HPP
