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 34 SocketAddress::SocketAddress (void) 35 { 36 m_address = deSocketAddress_create(); 37 if (!m_address) 38 throw std::bad_alloc(); 39 } 40 41 SocketAddress::~SocketAddress (void) 42 { 43 deSocketAddress_destroy(m_address); 44 } 45 46 void SocketAddress::setHost (const char* host) 47 { 48 if (!deSocketAddress_setHost(m_address, host)) 49 throw std::runtime_error("SocketAddress::setHost()"); 50 } 51 52 void SocketAddress::setPort (int port) 53 { 54 if (!deSocketAddress_setPort(m_address, port)) 55 throw std::runtime_error("SocketAddress::setPort()"); 56 } 57 58 void SocketAddress::setFamily (deSocketFamily family) 59 { 60 if (!deSocketAddress_setFamily(m_address, family)) 61 throw std::runtime_error("SocketAddress::setFamily()"); 62 } 63 64 void SocketAddress::setType (deSocketType type) 65 { 66 if (!deSocketAddress_setType(m_address, type)) 67 throw std::runtime_error("SocketAddress::setType()"); 68 } 69 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 78 Socket::Socket (void) 79 { 80 m_socket = deSocket_create(); 81 if (!m_socket) 82 throw std::bad_alloc(); 83 } 84 85 Socket::~Socket (void) 86 { 87 deSocket_destroy(m_socket); 88 } 89 90 void Socket::setFlags (deUint32 flags) 91 { 92 if (!deSocket_setFlags(m_socket, flags)) 93 throw SocketError("Setting socket flags failed"); 94 } 95 96 void Socket::listen (const SocketAddress& address) 97 { 98 if (!deSocket_listen(m_socket, address)) 99 throw SocketError("Listening on socket failed"); 100 } 101 102 void Socket::connect (const SocketAddress& address) 103 { 104 if (!deSocket_connect(m_socket, address)) 105 throw SocketError("Connecting socket failed"); 106 } 107 108 void Socket::shutdown (void) 109 { 110 if (!deSocket_shutdown(m_socket, DE_SOCKETCHANNEL_BOTH)) 111 throw SocketError("Socket shutdown failed"); 112 } 113 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 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 126 void Socket::close (void) 127 { 128 if (!deSocket_close(m_socket)) 129 throw SocketError("Closing socket failed"); 130 } 131 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