00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #include "base/except.h"
00029 #include "base/common.h"
00030 #include "base/string.hpp"
00031 #include "base/memory.hpp"
00032
00033 BEGIN_TERIMBER_NAMESPACE
00034 #pragma pack(4)
00035
00037 bool
00038 exception_item::operator <(const exception_item& x) const
00039 {
00040 return _code < x._code;
00041 }
00042
00043 bool
00044 exception_item::operator ==(const exception_item& x ) const
00045 {
00046 return _code == x._code;
00047 }
00048
00050 exception_table::exception_table(exception_item* items) :
00051 _items(items), _len(0)
00052 {
00053
00054 for (exception_item* ptr = items; ptr->_desc; ++_len)
00055 ++ptr;
00056
00057
00058 std::sort(items, items + _len);
00059 }
00060
00061
00062 const char*
00063 exception_table::get_error(size_t code_)
00064 {
00065
00066 exception_item ethalon;
00067
00068 ethalon._code = code_;
00069
00070 ethalon._desc = 0;
00071
00072 exception_item* iter = std::lower_bound(_items, _items + _len, ethalon);
00073
00074 return iter == _items + _len || iter->_code != code_ ? 0 : iter->_desc;
00075 }
00076
00078 exception::exception(size_t id, const wchar_t* desc) :
00079 _id(id)
00080 {
00081
00082 str_template::unicode_to_multibyte(_reason, desc);
00083 }
00084
00085 exception::exception(size_t id, const char* desc) :
00086 _id(id), _reason(desc)
00087 {
00088 }
00089
00090
00091 exception::~exception()
00092 {
00093 }
00094
00095 size_t
00096 exception::get_code() const
00097 {
00098 return _id;
00099 }
00100
00101 const
00102 char*
00103 exception::what() const
00104 {
00105 return _reason;
00106 }
00107
00108
00109 void
00110 exception::_throw(size_t code_, exception_table* table_)
00111 {
00112 if (table_)
00113 throw exception(code_, table_->get_error(code_));
00114 else
00115 {
00116
00117 char err[2048];
00118
00119 os_get_error(code_, err, 2048);
00120
00121 throw exception(code_, err);
00122 }
00123 }
00124
00125
00126 void
00127 exception::_throw(const wchar_t* desc)
00128 {
00129 throw exception(0, desc);
00130 }
00131
00132
00133 void
00134 exception::_throw(const char* desc)
00135 {
00136 throw exception(0, desc);
00137 }
00138
00139
00140 void
00141 exception::extract_os_error(size_t code, string_t& err)
00142 {
00143
00144 char buf[2048];
00145
00146 os_get_error(code, buf, 2048);
00147
00148 err = buf;
00149 }
00150
00151 #pragma pack()
00152 END_TERIMBER_NAMESPACE