1 /*
2 * Portable Agile C++ Classes (PACC)
3 * Copyright (C) 2001-2003 by Marc Parizeau
4 * http://manitou.gel.ulaval.ca/~parizeau/PACC
5 *
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
10 *
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 *
20 * Contact:
21 * Laboratoire de Vision et Systemes Numeriques
22 * Departement de genie electrique et de genie informatique
23 * Universite Laval, Quebec, Canada, G1K 7P4
24 * http://vision.gel.ulaval.ca
25 *
26 */
27
28 /*!
29 * \file PACC/Socket/Exception.cpp
30 * \brief Class methods for the portable socket exception.
31 * \author Marc Parizeau, Laboratoire de vision et systèmes numériques, Université Laval
32 * $Revision: 1.5.2.1 $
33 * $Date: 2007/09/10 18:24:09 $
34 */
35
36 #include "Socket/Exception.hpp"
37
38 #ifdef WIN32
39 ///////////// specifics for windows /////////////
40 #include <winsock2.h>
41
42 #else
43 ///////////// specifics for unixes /////////////
44 #include <sys/errno.h>
45 #endif
46
47 #include <sstream>
48
49 using namespace std;
50 using namespace PACC;
51
52 //! Convert native OS error \c inError to Socket::Error.
convertNativeError(int inError)53 Socket::Error Socket::Exception::convertNativeError(int inError)
54 {
55 Error lCode;
56 switch(inError)
57 {
58 #ifdef WIN32
59 case WSAEACCES: lCode = ePrivilegedPort; break;
60 case WSAEADDRINUSE: lCode = eAddressInUse; break;
61 case WSAEADDRNOTAVAIL: lCode = eAddressNotAvailable; break;
62 case WSAECONNREFUSED: lCode = eConnectionRefused; break;
63 case WSAECONNRESET: lCode = eConnectionClosed; break;
64 case WSAEHOSTDOWN: lCode = eConnectionRefused; break;
65 case WSAEHOSTUNREACH: lCode = eConnectionRefused; break;
66 case WSAEINTR: lCode = eConnectionClosed; break;
67 case WSAEISCONN: lCode = eIsConnected; break;
68 case WSAEMSGSIZE: lCode = eDatagramTooLong; break;
69 case WSAENETRESET: lCode = eConnectionClosed; break;
70 case WSAENOPROTOOPT: lCode = eInvalidOption; break;
71 case WSAENOTCONN: lCode = eNotConnected; break;
72 case WSANOTINITIALISED: lCode = eBadDescriptor; break;
73 case WSAENOTSOCK: lCode = eBadDescriptor; break;
74 case WSAEOPNOTSUPP: lCode = eOpNotSupported; break;
75 case WSAESHUTDOWN: lCode = eBadDescriptor; break;
76 case WSAETIMEDOUT: lCode = eTimeOut; break;
77 #else
78 case EACCES: lCode = ePrivilegedPort; break;
79 case EADDRINUSE: lCode = eAddressInUse; break;
80 case EADDRNOTAVAIL: lCode = eAddressNotAvailable; break;
81 case EAGAIN: lCode = eTimeOut; break;
82 case EBADF: lCode = eBadDescriptor; break;
83 case ECONNREFUSED: lCode = eConnectionRefused; break;
84 case ECONNRESET: lCode = eConnectionClosed; break;
85 case EINTR: lCode = eConnectionClosed; break;
86 case EISCONN: lCode = eIsConnected; break;
87 case EMSGSIZE: lCode = eDatagramTooLong; break;
88 case ENOPROTOOPT: lCode = eInvalidOption; break;
89 case ENOTCONN: lCode = eNotConnected; break;
90 case ENOTSOCK: lCode = eBadDescriptor; break;
91 case EPIPE: lCode =eConnectionClosed; break;
92 case ETIMEDOUT: lCode = eTimeOut; break;
93 #endif
94 default: lCode = eOtherError;
95 }
96 return lCode;
97 }
98
getMessage() const99 string Socket::Exception::getMessage() const throw()
100 {
101 ostringstream lMessage;
102 switch(mCode)
103 {
104 case eAddressInUse: lMessage << "AddressInUse"; break;
105 case eAddressNotAvailable: lMessage << "AddressNotAvailable"; break;
106 case eBadDescriptor: lMessage << "BadDescriptor"; break;
107 case eBadMessage: lMessage << "BadMessage"; break;
108 case eConnectionClosed: lMessage << "ConnectionClosed"; break;
109 case eConnectionRefused: lMessage << "ConnectionRefused"; break;
110 case eDatagramTooLong: lMessage << "DatagramTooLong"; break;
111 case eInvalidOption: lMessage << "InvalidOption"; break;
112 case eIsConnected: lMessage << "IsConnected"; break;
113 case eNotConnected: lMessage << "NotConnected"; break;
114 case eOpNotSupported: lMessage << "OpNotSupported"; break;
115 case ePrivilegedPort: lMessage << "PrivilegedPort"; break;
116 case eTimeOut: lMessage << "TimeOut"; break;
117 default: lMessage << "OtherError"; break;
118 }
119 if(mNativeCode) lMessage << " (" << mNativeCode << "): ";
120 else lMessage << ": ";
121 return lMessage.str()+what();
122 }
123