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