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
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041 #ifndef RECLS_INCL_RECLS_CPP_HPP_RECLSHPP
00042 #define RECLS_INCL_RECLS_CPP_HPP_RECLSHPP
00043
00044
00045 #ifndef RECLS_DOCUMENTATION_SKIP_SECTION
00046 # define RECLS_VER_RECLS_CPP_HPP_RECLSHPP_MAJOR 3
00047 # define RECLS_VER_RECLS_CPP_HPP_RECLSHPP_MINOR 0
00048 # define RECLS_VER_RECLS_CPP_HPP_RECLSHPP_REVISION 7
00049 # define RECLS_VER_RECLS_CPP_HPP_RECLSHPP_EDIT 27
00050 #endif
00051
00059
00060
00061
00062
00063 #include <recls/recls.h>
00064
00065 #if !defined(RECLS_VER_1_8_1) || \
00066 RECLS_VER < RECLS_VER_1_8_1
00067 # error The recls C++ mapping now requires version 1.8.1 or later of the recls core API
00068 #endif
00069
00070 #include <stlsoft/stlsoft.h>
00071 #if !defined(_STLSOFT_VER_1_9_1) || \
00072 _STLSOFT_VER < _STLSOFT_VER_1_9_1
00073 # error Requires STLSoft 1.9.1, or later. (www.stlsoft.org/downloads.html)
00074 #endif
00075
00076 #ifdef RECLS_CPP_STRING_HEADER
00077 # include RECLS_CPP_STRING_HEADER
00078 #else
00079 # include <string>
00080 #endif
00081
00082 #if defined(RECLS_COMPILER_IS_DMC)
00083 # include <stlsoft/util/std/library_discriminator.hpp>
00084 #endif
00085 #include <stlsoft/memory/auto_buffer.hpp>
00086
00087 #ifdef RECLS_CPP_METHOD_PROPERTY_SUPPORT
00088 # undef RECLS_CPP_METHOD_PROPERTY_SUPPORT
00089 #endif
00090
00091 #if defined(RECLS_CPP_FORCE_METHOD_PROPERTY_SUPPORT)
00092 # define RECLS_CPP_METHOD_PROPERTY_SUPPORT
00093 #elif defined(RECLS_CPP_NO_METHOD_PROPERTY_SUPPORT)
00094
00095 #else
00096 # if defined(STLSOFT_COMPILER_IS_BORLAND)
00097
00098 # elif defined(STLSOFT_COMPILER_IS_DMC)
00099 # if __DMC__ >= 0x0846
00100 # define RECLS_CPP_METHOD_PROPERTY_SUPPORT */
00101 # endif
00102 # elif defined(STLSOFT_COMPILER_IS_GCC) && \
00103 ( __GNUC__ >= 4 || \
00104 ( __GNUC__ == 3 && \
00105 __GNUC_MINOR__ >= 3))
00106 # define RECLS_CPP_METHOD_PROPERTY_SUPPORT
00107 # elif defined(STLSOFT_COMPILER_IS_INTEL)
00108 # define RECLS_CPP_METHOD_PROPERTY_SUPPORT
00109 # elif defined(STLSOFT_COMPILER_IS_MSVC)
00110 # if _MSC_VER >= 1310
00111 # define RECLS_CPP_METHOD_PROPERTY_SUPPORT
00112 # endif
00113 # elif defined(STLSOFT_COMPILER_IS_MWERKS)
00114 # define RECLS_CPP_METHOD_PROPERTY_SUPPORT
00115 # endif
00116 #endif
00117
00118 #ifdef RECLS_CPP_METHOD_PROPERTY_SUPPORT
00119 # include <stlsoft/properties/method_properties.hpp>
00120 #endif
00121
00122
00123
00124
00125
00126 #ifdef RECLS_CPP_METHOD_PROPERTY_SUPPORT
00127 # define RECLS_CPP_OPT_METHOD_PROPERTY_GET(V, R, C, GM, P) STLSOFT_METHOD_PROPERTY_GET(V, R, C, GM, P)
00128 # define RECLS_CPP_OPT_METHOD_PROPERTY_GET_PROP(R, C, GM, P) STLSOFT_METHOD_PROPERTY_GET_EXTERNAL_PROP(R, C, GM, P)
00129 # define RECLS_CPP_OPT_METHOD_PROPERTY_GETSET(V, RG, RS, C, GM, SM, P) STLSOFT_METHOD_PROPERTY_GETSET_EXTERNAL(RG, RS, C, GM, SM, P)
00130 # define RECLS_CPP_OPT_METHOD_PROPERTY_DEFINE_OFFSET(C, P) STLSOFT_METHOD_PROPERTY_DEFINE_OFFSET(C, P)
00131 # define RECLS_CPP_OPT_METHOD_PROPERTY_GETSET_PROP(RG, RS, C, GM, SM, P) STLSOFT_METHOD_PROPERTY_GETSET_EXTERNAL_PROP(RG, RS, C, GM, SM, P)
00132 #else
00133 # define RECLS_CPP_OPT_METHOD_PROPERTY_GET(V, R, C, GM, P)
00134 # define RECLS_CPP_OPT_METHOD_PROPERTY_GET_PROP(R, C, GM, P)
00135 # define RECLS_CPP_OPT_METHOD_PROPERTY_GETSET(V, RG, RS, C, GM, SM, P)
00136 # define RECLS_CPP_OPT_METHOD_PROPERTY_DEFINE_OFFSET(C, P)
00137 # define RECLS_CPP_OPT_METHOD_PROPERTY_GETSET_PROP(RG, RS, C, GM, SM, P)
00138 #endif
00139
00140
00141
00142
00143
00144 #if !defined(RECLS_NO_NAMESPACE)
00145 namespace recls
00146 {
00147
00148 namespace cpp
00149 {
00150 #endif
00151
00152
00153
00154
00155
00156 #ifdef RECLS_DOCUMENTATION_SKIP_SECTION
00157
00166 typedef std::string string_a_t;
00167 typedef std::wstring string_w_t;
00168
00169 # if defined(RECLS_CHAR_TYPE_IS_CHAR)
00170 typedef string_a_t string_t;
00171 # elif defined(RECLS_CHAR_TYPE_IS_WCHAR)
00172 typedef string_w_t string_t;
00173 # else
00174 # error RECLS_CHAR_TYPE_IS_CHAR or RECLS_CHAR_TYPE_IS_WCHAR must be defined.
00175 # endif
00176
00177 #else
00178
00179 # ifdef RECLS_CPP_STRING_HEADER
00180 # ifndef RECLS_CPP_STRING_T
00181 # error RECLS_CPP_STRING_T must be defined when RECLS_CPP_STRING_HEADER is defined
00182 # endif
00183 typedef RECLS_CPP_STRING_T string_t;
00184 # else
00185 # if defined(RECLS_COMPILER_IS_DMC) && \
00186 !defined(STLSOFT_CF_STD_LIBRARY_IS_STLPORT)
00187 typedef string string_a_t;
00188 typedef wstring string_w_t;
00189 # else
00190 typedef std::string string_a_t;
00191 typedef std::wstring string_w_t;
00192 # endif
00193 # if defined(RECLS_CHAR_TYPE_IS_CHAR)
00194 typedef string_a_t string_t;
00195 # elif defined(RECLS_CHAR_TYPE_IS_WCHAR)
00196 typedef string_w_t string_t;
00197 # else
00198 # error RECLS_CHAR_TYPE_IS_CHAR or RECLS_CHAR_TYPE_IS_WCHAR must be defined.
00199 # endif
00200 # endif
00201
00202 #endif
00203
00204
00205
00206
00207
00209 class ReclsException
00210 : public std::exception
00211 {
00214 public:
00215 typedef std::exception parent_class_type;
00216 typedef ReclsException class_type;
00217 private:
00218 #if defined(RECLS_CHAR_TYPE_IS_CHAR)
00219 typedef string_t string_type;
00220 #else
00221 typedef string_a_t string_type;
00222 #endif
00224
00227 public:
00229 explicit ReclsException(recls_rc_t rc)
00230 : m_rc(rc)
00231 , m_message(create_message_(rc))
00232 {}
00233 #ifdef STLSOFT_COMPILER_IS_GCC
00234 virtual ~ReclsException() throw()
00235 {}
00236 #endif
00238
00241 public:
00243 recls_rc_t rc() const
00244 {
00245 return m_rc;
00246 }
00247
00249 virtual char const *what() const throw()
00250 {
00251 return m_message.c_str();
00252 }
00254
00257 private:
00258 static string_type create_message_(recls_rc_t rc)
00259 {
00260 stlsoft::auto_buffer<recls_char_t> buffer(1 + recls::Recls_GetErrorString(rc, NULL, 0));
00261
00262 recls::Recls_GetErrorString(rc, &buffer[0], buffer.size());
00263
00264 #if defined(RECLS_CHAR_TYPE_IS_CHAR)
00265 return string_type(buffer.data(), buffer.size() - 1);
00266 # elif defined(RECLS_CHAR_TYPE_IS_WCHAR)
00267
00268 size_t cbRequired = ::wcstombs(NULL, buffer.data(), buffer.size());
00269 stlsoft::auto_buffer<char> abuffer(1 + cbRequired);
00270
00271 cbRequired = ::wcstombs(&abuffer[0], buffer.data(), abuffer.size());
00272
00273 return string_type(abuffer.data(), cbRequired);
00274
00275 #else
00276 # error RECLS_CHAR_TYPE_IS_CHAR or RECLS_CHAR_TYPE_IS_WCHAR must be defined.
00277 #endif
00278 }
00280
00283 private:
00284 const recls_rc_t m_rc;
00285 const string_type m_message;
00287
00288
00289 private:
00290 class_type &operator =(class_type const &);
00291 };
00292
00293
00294
00295
00296
00297 #if !defined(RECLS_NO_NAMESPACE)
00298 }
00299 }
00300 namespace reclspp = ::recls::cpp;
00301 #endif
00302
00303
00304
00305 #endif
00306
00307