SystemCall.h

Go to the documentation of this file.
00001 
00014 // SystemCall.h -- macro definitions for socket system calls to through formated exceptions
00015 
00016 #ifndef SYSTEMCALL_H_
00017 #define SYSTEMCALL_H_
00018 
00019 #include <sstream>
00020 #include "NetworkEx.h"
00021 
00118 
00119 // Microsoft Windows specific information
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 // Macros to format messages and parameters from functions
00134 // made to operating system calls
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 // Macros for to format messages from operating system socket errors
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_

Generated on Tue Mar 28 09:10:15 2006 for Simple SOAP by  doxygen 1.4.6