1 /*-------------------------------------------------------------------------
2  * drawElements C++ Base Library
3  * -----------------------------
4  *
5  * Copyright 2014 The Android Open Source Project
6  *
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  *
19  *//*!
20  * \file
21  * \brief deSocket C++ wrapper.
22  *//*--------------------------------------------------------------------*/
23 
24 #include "deSocket.hpp"
25 
26 #include <new>
27 #include <exception>
28 
29 namespace de
30 {
31 
32 // SocketAddress
33 
SocketAddress(void)34 SocketAddress::SocketAddress (void)
35 {
36 	m_address = deSocketAddress_create();
37 	if (!m_address)
38 		throw std::bad_alloc();
39 }
40 
~SocketAddress(void)41 SocketAddress::~SocketAddress (void)
42 {
43 	deSocketAddress_destroy(m_address);
44 }
45 
setHost(const char * host)46 void SocketAddress::setHost (const char* host)
47 {
48 	if (!deSocketAddress_setHost(m_address, host))
49 		throw std::runtime_error("SocketAddress::setHost()");
50 }
51 
setPort(int port)52 void SocketAddress::setPort (int port)
53 {
54 	if (!deSocketAddress_setPort(m_address, port))
55 		throw std::runtime_error("SocketAddress::setPort()");
56 }
57 
setFamily(deSocketFamily family)58 void SocketAddress::setFamily (deSocketFamily family)
59 {
60 	if (!deSocketAddress_setFamily(m_address, family))
61 		throw std::runtime_error("SocketAddress::setFamily()");
62 }
63 
setType(deSocketType type)64 void SocketAddress::setType (deSocketType type)
65 {
66 	if (!deSocketAddress_setType(m_address, type))
67 		throw std::runtime_error("SocketAddress::setType()");
68 }
69 
setProtocol(deSocketProtocol protocol)70 void SocketAddress::setProtocol (deSocketProtocol protocol)
71 {
72 	if (!deSocketAddress_setProtocol(m_address, protocol))
73 		throw std::runtime_error("SocketAddress::setProtocol()");
74 }
75 
76 // Socket
77 
Socket(void)78 Socket::Socket (void)
79 {
80 	m_socket = deSocket_create();
81 	if (!m_socket)
82 		throw std::bad_alloc();
83 }
84 
~Socket(void)85 Socket::~Socket (void)
86 {
87 	deSocket_destroy(m_socket);
88 }
89 
setFlags(deUint32 flags)90 void Socket::setFlags (deUint32 flags)
91 {
92 	if (!deSocket_setFlags(m_socket, flags))
93 		throw SocketError("Setting socket flags failed");
94 }
95 
listen(const SocketAddress & address)96 void Socket::listen (const SocketAddress& address)
97 {
98 	if (!deSocket_listen(m_socket, address))
99 		throw SocketError("Listening on socket failed");
100 }
101 
connect(const SocketAddress & address)102 void Socket::connect (const SocketAddress& address)
103 {
104 	if (!deSocket_connect(m_socket, address))
105 		throw SocketError("Connecting socket failed");
106 }
107 
shutdown(void)108 void Socket::shutdown (void)
109 {
110 	if (!deSocket_shutdown(m_socket, DE_SOCKETCHANNEL_BOTH))
111 		throw SocketError("Socket shutdown failed");
112 }
113 
shutdownSend(void)114 void Socket::shutdownSend (void)
115 {
116 	if (!deSocket_shutdown(m_socket, DE_SOCKETCHANNEL_SEND))
117 		throw SocketError("Socket send channel shutdown failed");
118 }
119 
shutdownReceive(void)120 void Socket::shutdownReceive (void)
121 {
122 	if (!deSocket_shutdown(m_socket, DE_SOCKETCHANNEL_RECEIVE))
123 		throw SocketError("Socket receive channel shutdown failed");
124 }
125 
close(void)126 void Socket::close (void)
127 {
128 	if (!deSocket_close(m_socket))
129 		throw SocketError("Closing socket failed");
130 }
131 
accept(deSocketAddress * clientAddress)132 Socket* Socket::accept (deSocketAddress* clientAddress)
133 {
134 	deSocket* clientSocket = deSocket_accept(m_socket, clientAddress);
135 	if (!clientSocket)
136 		throw SocketError("Accepting connection to socket failed");
137 
138 	try
139 	{
140 		return new Socket(clientSocket);
141 	}
142 	catch (...)
143 	{
144 		deSocket_destroy(clientSocket);
145 		throw;
146 	}
147 }
148 
149 } // de
150