//  boost/system/windows_error.hpp  ------------------------------------------//



//  Copyright Beman Dawes 2007



//  Distributed under 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 library home page at http://www.boost.org/libs/system



#ifndef BOOST_WINDOWS_ERROR_HPP

#define BOOST_WINDOWS_ERROR_HPP



//  This header is effectively empty for compiles on operating systems where

//  it is not applicable.



#include <boost/system/config.hpp>



#ifdef BOOST_WINDOWS_API



#include <boost/system/error_code.hpp>

#include <winerror.h>



namespace boost

{

  namespace system

  {



    //  Microsoft Windows  ---------------------------------------------------//



    //  To construct an error_code after a API error:

    //

    //      error_code( ::GetLastError(), system_category )



    namespace windows_error

    {

      enum windows_error_code

      {

        success = 0,

        // These names and values are based on Windows winerror.h

        invalid_function = ERROR_INVALID_FUNCTION,

        file_not_found = ERROR_FILE_NOT_FOUND,

        path_not_found = ERROR_PATH_NOT_FOUND,

        too_many_open_files = ERROR_TOO_MANY_OPEN_FILES,

        access_denied = ERROR_ACCESS_DENIED,

        invalid_handle = ERROR_INVALID_HANDLE,

        arena_trashed = ERROR_ARENA_TRASHED,

        not_enough_memory = ERROR_NOT_ENOUGH_MEMORY,

        invalid_block = ERROR_INVALID_BLOCK,

        bad_environment = ERROR_BAD_ENVIRONMENT,

        bad_format = ERROR_BAD_FORMAT,

        invalid_access = ERROR_INVALID_ACCESS,

        outofmemory = ERROR_OUTOFMEMORY,

        invalid_drive = ERROR_INVALID_DRIVE,

        current_directory = ERROR_CURRENT_DIRECTORY,

        not_same_device = ERROR_NOT_SAME_DEVICE,

        no_more_files = ERROR_NO_MORE_FILES,

        write_protect = ERROR_WRITE_PROTECT,

        bad_unit = ERROR_BAD_UNIT,

        not_ready = ERROR_NOT_READY,

        bad_command = ERROR_BAD_COMMAND,

        crc = ERROR_CRC,

        bad_length = ERROR_BAD_LENGTH,

        seek = ERROR_SEEK,

        not_dos_disk = ERROR_NOT_DOS_DISK,

        sector_not_found = ERROR_SECTOR_NOT_FOUND,

        out_of_paper = ERROR_OUT_OF_PAPER,

        write_fault = ERROR_WRITE_FAULT,

        read_fault = ERROR_READ_FAULT,

        gen_failure = ERROR_GEN_FAILURE,

        sharing_violation = ERROR_SHARING_VIOLATION,

        lock_violation = ERROR_LOCK_VIOLATION,

        wrong_disk = ERROR_WRONG_DISK,

        sharing_buffer_exceeded = ERROR_SHARING_BUFFER_EXCEEDED,

        handle_eof = ERROR_HANDLE_EOF,

        handle_disk_full= ERROR_HANDLE_DISK_FULL,

        rem_not_list = ERROR_REM_NOT_LIST,

        dup_name = ERROR_DUP_NAME,

        bad_net_path = ERROR_BAD_NETPATH,

        network_busy = ERROR_NETWORK_BUSY,

        // ...

        file_exists = ERROR_FILE_EXISTS,

        cannot_make = ERROR_CANNOT_MAKE,

        // ...

        broken_pipe = ERROR_BROKEN_PIPE,

        open_failed = ERROR_OPEN_FAILED,

        buffer_overflow = ERROR_BUFFER_OVERFLOW,

        disk_full= ERROR_DISK_FULL,

        // ...

        lock_failed = ERROR_LOCK_FAILED,

        busy = ERROR_BUSY,

        cancel_violation = ERROR_CANCEL_VIOLATION,

        already_exists = ERROR_ALREADY_EXISTS

        // ...



        // TODO: add more Windows errors

      };



    }  // namespace windows



# ifndef BOOST_SYSTEM_NO_DEPRECATED

    namespace windows = windows_error;

# endif



    template<> struct is_error_code_enum<windows_error::windows_error_code>

      { static const bool value = true; };



    namespace windows_error

    {

      inline error_code make_error_code( windows_error_code e )

        { return error_code( e, get_system_category() ); }

    }



  }  // namespace system

}  // namespace boost



#endif  // BOOST_WINDOWS_API



#endif  // BOOST_WINDOWS_ERROR_HPP

