00001
00014
00015
00016 #ifndef SYSTEMCALL_H_
00017 #define SYSTEMCALL_H_
00018
00019 #include <sstream>
00020 #include "NetworkEx.h"
00021
00118
00119
00120
00121 #ifdef WIN32
00122
00123 #define socket_error (WSAGetLastError())
00124
00125 #else
00126
00127 #define socket_error ( errno )
00128
00129 #endif // WIN32
00130
00131
00133
00134
00135
00136 #define NET_FORMAT_CONCATENATE(ARG) \
00137 " " << (ARG) << ", // " << #ARG << "\n"
00138
00139 #define NET_FORMAT_END(ARG) \
00140 " " << (ARG) << " // " << #ARG
00141
00142 #define FORMAT_2(ARG1,ARG2) \
00143 "\n (\n" << NET_FORMAT_CONCATENATE(ARG1) << NET_FORMAT_END(ARG2) \
00144 << "\n )"
00145
00146 #define FORMAT_3(ARG1,ARG2,ARG3) \
00147 "\n (\n" << NET_FORMAT_CONCATENATE(ARG1) << NET_FORMAT_CONCATENATE(ARG2) \
00148 << NET_FORMAT_END(ARG3) << "\n )"
00149
00150 #define FORMAT_5(ARG1,ARG2,ARG3,ARG4,ARG5) \
00151 "\n (\n" << NET_FORMAT_CONCATENATE(ARG1) << NET_FORMAT_CONCATENATE(ARG2) \
00152 << NET_FORMAT_CONCATENATE(ARG3) << NET_FORMAT_CONCATENATE(ARG4) << NET_FORMAT_END(ARG5) \
00153 << "\n )"
00154
00155 #define FORMAT_6(ARG1,ARG2,ARG3,ARG4,ARG5,ARG6) \
00156 "\n (\n" << NET_FORMAT_CONCATENATE(ARG1) << NET_FORMAT_CONCATENATE(ARG2) \
00157 << NET_FORMAT_CONCATENATE(ARG3) << NET_FORMAT_CONCATENATE(ARG4) << NET_FORMAT_CONCATENATE(ARG5) \
00158 << NET_FORMAT_END(ARG6) << "\n )"
00159
00160 #define THROW_FORMATTED_ERROR(CODE,NOTE) \
00161 { \
00162 std::ostringstream stream; \
00163 stream << NetworkException::getErrorSymbol(NetworkException::system_call_failure) \
00164 << ": " << NOTE << " [" << __FILE__ << ':' << __LINE__ << "]" << std::ends; \
00165 throw NetworkException(NetworkException::system_call_failure,stream.str().c_str(),CODE ); \
00166 }
00167
00169
00170
00171 #define SOCKET_CALL_2(PREFIX,FUNC,ARG1,ARG2) \
00172 { \
00173 if ((PREFIX FUNC (ARG1,ARG2)) == -1) \
00174 THROW_FORMATTED_ERROR(socket_error, #FUNC << FORMAT_2(ARG1,ARG2) ) \
00175 }
00176
00177 #define SOCKET_CALL_3(PREFIX,FUNC,ARG1,ARG2,ARG3) \
00178 { \
00179 if ((PREFIX FUNC (ARG1,ARG2,ARG3)) == -1) \
00180 THROW_FORMATTED_ERROR(socket_error, #FUNC << FORMAT_3(ARG1,ARG2,ARG3) ) \
00181 }
00182
00183 #define SOCKET_CALL_5(PREFIX,FUNC,ARG1,ARG2,ARG3,ARG4,ARG5) \
00184 { \
00185 if ((PREFIX FUNC (ARG1,ARG2,ARG3,ARG4,ARG5)) == -1) \
00186 THROW_FORMATTED_ERROR(socket_error, #FUNC << FORMAT_5(ARG1,ARG2,ARG3,ARG4,ARG5) ) \
00187 }
00188
00189 #define SOCKET_CALL_6(PREFIX,FUNC,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6) \
00190 { \
00191 if ((PREFIX FUNC (ARG1,ARG2,ARG3,ARG4,ARG5,ARG6)) == -1) \
00192 THROW_FORMATTED_ERROR(socket_error, #FUNC << FORMAT_6(ARG1,ARG2,ARG3,ARG4,ARG5,ARG6) ) \
00193 }
00194
00195
00196 #endif // SYSTEMCALL_H_