# SocketAdapter

<a id="socketadapter"></a>

# SocketAdapter

```cpp
#include <icy/net/socketadapter.h>

class SocketAdapter
```

[Defined in src/net/include/icy/net/socketadapter.h:41](https://github.com/auscaster/icey/blob/main/src/net/include/icy/net/socketadapter.h#L41)

> **Subclassed by:** [`Connection`](https://auscaster.com/icey/docs/api-reference/icy-http-Connection.md#connection-1), [`ConnectionAdapter`](https://auscaster.com/icey/docs/api-reference/icy-http-ConnectionAdapter.md#connectionadapter-1), [`ConnectionStream`](https://auscaster.com/icey/docs/api-reference/icy-http-ConnectionStream.md#connectionstream-1), [`Server`](https://auscaster.com/icey/docs/api-reference/icy-http-Server.md#server), [`Socket`](https://auscaster.com/icey/docs/api-reference/icy-net-Socket.md#socket-1), [`SocketEmitter`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketEmitter.md#socketemitter)

Abstract adapter interface for socket send/receive chains.

[SocketAdapter](#socketadapter) is the abstract interface for all socket classes. A [SocketAdapter](#socketadapter) can also be attached to a [Socket](https://auscaster.com/icey/docs/api-reference/icy-net-Socket.md#socket-1) in order to override default [Socket](https://auscaster.com/icey/docs/api-reference/icy-net-Socket.md#socket-1) callbacks and behaviour, while still maintaining the default [Socket](https://auscaster.com/icey/docs/api-reference/icy-net-Socket.md#socket-1) interface (see Socket::setAdapter).

This class can also be extended to implement custom processing for received socket data before it is dispatched to the application (see [PacketSocketEmitter](https://auscaster.com/icey/docs/api-reference/icy-net-PacketSocketEmitter.md#packetsocketemitter) and [Transaction](https://auscaster.com/icey/docs/api-reference/icy-net-Transaction.md#transaction) classes).

## Public Attributes

| Return | Name | Description |
|--------|------|-------------|
| `int` | [`priority`](#priority-3)  | The priority of this adapter for STL sort operations. |

---

<a id="priority-3"></a>

### priority

```cpp
int priority = 0
```

[Defined in src/net/include/icy/net/socketadapter.h:132](https://github.com/auscaster/icey/blob/main/src/net/include/icy/net/socketadapter.h#L132)

The priority of this adapter for STL sort operations.

## Public Methods

| Return | Name | Description |
|--------|------|-------------|
|  | [`SocketAdapter`](#socketadapter-1)  | Creates the [SocketAdapter](#socketadapter). |
|  | [`~SocketAdapter`](#socketadapter-2) `virtual` `noexcept` | Destroys the [SocketAdapter](#socketadapter). |
| `ssize_t` | [`send`](#send-1) `virtual` | Sends the given data buffer to the connected peer. Returns the number of bytes sent or -1 on error. No exception will be thrown. For TCP sockets the given peer address must match the connected peer address. |
| `ssize_t` | [`send`](#send-2) `virtual` |  |
| `ssize_t` | [`sendOwned`](#sendowned-2) `virtual` | Sends an owned payload buffer to the connected peer. |
| `ssize_t` | [`sendOwned`](#sendowned-3) `virtual` |  |
| `ssize_t` | [`sendPacket`](#sendpacket) `virtual` | Sends the given packet to the connected peer. Returns the number of bytes sent or -1 on error. No exception will be thrown. For TCP sockets the given peer address must match the connected peer address. |
| `ssize_t` | [`sendPacket`](#sendpacket-1) `virtual` |  |
| `void` | [`sendPacket`](#sendpacket-2) `virtual` | Sends the given packet to the connected peer. This method provides delegate compatibility, and unlike other send methods throws an exception if the underlying socket is closed. |
| `void` | [`setSender`](#setsender) `virtual` | Sets the pointer to the outgoing data adapter. Send methods proxy data to this adapter by default. |
| [`SocketAdapter`](#socketadapter) * | [`sender`](#sender)  | Returns the output [SocketAdapter](#socketadapter) pointer. |
| `void` | [`addReceiver`](#addreceiver) `virtual` | Sets the pointer to the incoming data adapter. Events proxy data to this adapter by default. |
| `void` | [`removeReceiver`](#removereceiver) `virtual` | Remove the given receiver. |
| `bool` | [`hasReceiver`](#hasreceiver) `virtual` | Returns true if the given receiver is connected. |
| std::vector< [`SocketAdapter`](#socketadapter) * > | [`receivers`](#receivers)  | Returns all currently registered input [SocketAdapter](#socketadapter) pointers. Dead (removed) entries are excluded from the returned list. |
| `bool` | [`onSocketConnect`](#onsocketconnect) `virtual` | Called when the socket establishes a connection. Forwards the event to all registered receivers in priority order. Override to intercept before the application sees the event. |
| `bool` | [`onSocketRecv`](#onsocketrecv-1) `virtual` | Called when data is received from the socket. Forwards the event to all registered receivers in priority order. |
| `bool` | [`onSocketError`](#onsocketerror) `virtual` | Called when the socket encounters an error. Forwards the event to all registered receivers in priority order. |
| `bool` | [`onSocketClose`](#onsocketclose) `virtual` | Called when the socket is closed. Forwards the event to all registered receivers in priority order. |

---

<a id="socketadapter-1"></a>

### SocketAdapter

```cpp
SocketAdapter(SocketAdapter * sender = nullptr)
```

[Defined in src/net/include/icy/net/socketadapter.h:45](https://github.com/auscaster/icey/blob/main/src/net/include/icy/net/socketadapter.h#L45)

Creates the [SocketAdapter](#socketadapter).

---

<a id="socketadapter-2"></a>

### ~SocketAdapter

`virtual` `noexcept`

```cpp
virtual ~SocketAdapter() noexcept
```

[Defined in src/net/include/icy/net/socketadapter.h:48](https://github.com/auscaster/icey/blob/main/src/net/include/icy/net/socketadapter.h#L48)

Destroys the [SocketAdapter](#socketadapter).

---

<a id="send-1"></a>

### send

`virtual`

```cpp
virtual ssize_t send(const char * data, size_t len, int flags = 0)
```

[Defined in src/net/include/icy/net/socketadapter.h:55](https://github.com/auscaster/icey/blob/main/src/net/include/icy/net/socketadapter.h#L55)

Sends the given data buffer to the connected peer. Returns the number of bytes sent or -1 on error. No exception will be thrown. For TCP sockets the given peer address must match the connected peer address.

#### Reimplemented by

- [`ClientConnection::send`](https://auscaster.com/icey/docs/api-reference/icy-http-ClientConnection.md#send-11)
- [`Connection::send`](https://auscaster.com/icey/docs/api-reference/icy-http-Connection.md#send-12)
- [`ConnectionAdapter::send`](https://auscaster.com/icey/docs/api-reference/icy-http-ConnectionAdapter.md#send-13)
- [`ConnectionStream::send`](https://auscaster.com/icey/docs/api-reference/icy-http-ConnectionStream.md#send-14)
- [`WebSocketAdapter::send`](https://auscaster.com/icey/docs/api-reference/icy-http-ws-WebSocketAdapter.md#send-15)
- [`SSLSocket::send`](https://auscaster.com/icey/docs/api-reference/icy-net-SSLSocket.md#send-3)
- [`TCPSocket::send`](https://auscaster.com/icey/docs/api-reference/icy-net-TCPSocket.md#send-5)
- [`UDPSocket::send`](https://auscaster.com/icey/docs/api-reference/icy-net-UDPSocket.md#send-8)

---

<a id="send-2"></a>

### send

`virtual`

```cpp
virtual ssize_t send(const char * data, size_t len, const Address & peerAddress, int flags = 0)
```

[Defined in src/net/include/icy/net/socketadapter.h:56](https://github.com/auscaster/icey/blob/main/src/net/include/icy/net/socketadapter.h#L56)

#### Reimplemented by

- [`WebSocketAdapter::send`](https://auscaster.com/icey/docs/api-reference/icy-http-ws-WebSocketAdapter.md#send-16)
- [`SSLSocket::send`](https://auscaster.com/icey/docs/api-reference/icy-net-SSLSocket.md#send-4)
- [`TCPSocket::send`](https://auscaster.com/icey/docs/api-reference/icy-net-TCPSocket.md#send-6)
- [`UDPSocket::send`](https://auscaster.com/icey/docs/api-reference/icy-net-UDPSocket.md#send-9)

---

<a id="sendowned-2"></a>

### sendOwned

`virtual`

```cpp
virtual ssize_t sendOwned(Buffer && buffer, int flags = 0)
```

[Defined in src/net/include/icy/net/socketadapter.h:62](https://github.com/auscaster/icey/blob/main/src/net/include/icy/net/socketadapter.h#L62)

Sends an owned payload buffer to the connected peer.

The buffer is moved through the adapter chain and retained by the transport layer until async write completion.

#### Reimplemented by

- [`Connection::sendOwned`](https://auscaster.com/icey/docs/api-reference/icy-http-Connection.md#sendowned-10)
- [`ConnectionAdapter::sendOwned`](https://auscaster.com/icey/docs/api-reference/icy-http-ConnectionAdapter.md#sendowned-11)
- [`WebSocketAdapter::sendOwned`](https://auscaster.com/icey/docs/api-reference/icy-http-ws-WebSocketAdapter.md#sendowned-12)
- [`SSLSocket::sendOwned`](https://auscaster.com/icey/docs/api-reference/icy-net-SSLSocket.md#sendowned-4)
- [`TCPSocket::sendOwned`](https://auscaster.com/icey/docs/api-reference/icy-net-TCPSocket.md#sendowned-6)
- [`UDPSocket::sendOwned`](https://auscaster.com/icey/docs/api-reference/icy-net-UDPSocket.md#sendowned-8)
- [`Socket::sendOwned`](https://auscaster.com/icey/docs/api-reference/icy-net-Socket.md#sendowned)

---

<a id="sendowned-3"></a>

### sendOwned

`virtual`

```cpp
virtual ssize_t sendOwned(Buffer && buffer, const Address & peerAddress, int flags = 0)
```

[Defined in src/net/include/icy/net/socketadapter.h:63](https://github.com/auscaster/icey/blob/main/src/net/include/icy/net/socketadapter.h#L63)

#### Reimplemented by

- [`Socket::sendOwned`](https://auscaster.com/icey/docs/api-reference/icy-net-Socket.md#sendowned-1)
- [`WebSocketAdapter::sendOwned`](https://auscaster.com/icey/docs/api-reference/icy-http-ws-WebSocketAdapter.md#sendowned-13)
- [`SSLSocket::sendOwned`](https://auscaster.com/icey/docs/api-reference/icy-net-SSLSocket.md#sendowned-5)
- [`TCPSocket::sendOwned`](https://auscaster.com/icey/docs/api-reference/icy-net-TCPSocket.md#sendowned-7)
- [`UDPSocket::sendOwned`](https://auscaster.com/icey/docs/api-reference/icy-net-UDPSocket.md#sendowned-9)

---

<a id="sendpacket"></a>

### sendPacket

`virtual`

```cpp
virtual ssize_t sendPacket(const IPacket & packet, int flags = 0)
```

[Defined in src/net/include/icy/net/socketadapter.h:70](https://github.com/auscaster/icey/blob/main/src/net/include/icy/net/socketadapter.h#L70)

Sends the given packet to the connected peer. Returns the number of bytes sent or -1 on error. No exception will be thrown. For TCP sockets the given peer address must match the connected peer address.

---

<a id="sendpacket-1"></a>

### sendPacket

`virtual`

```cpp
virtual ssize_t sendPacket(const IPacket & packet, const Address & peerAddress, int flags = 0)
```

[Defined in src/net/include/icy/net/socketadapter.h:71](https://github.com/auscaster/icey/blob/main/src/net/include/icy/net/socketadapter.h#L71)

---

<a id="sendpacket-2"></a>

### sendPacket

`virtual`

```cpp
virtual void sendPacket(IPacket & packet)
```

[Defined in src/net/include/icy/net/socketadapter.h:77](https://github.com/auscaster/icey/blob/main/src/net/include/icy/net/socketadapter.h#L77)

Sends the given packet to the connected peer. This method provides delegate compatibility, and unlike other send methods throws an exception if the underlying socket is closed.

---

<a id="setsender"></a>

### setSender

`virtual`

```cpp
virtual void setSender(SocketAdapter * adapter)
```

[Defined in src/net/include/icy/net/socketadapter.h:81](https://github.com/auscaster/icey/blob/main/src/net/include/icy/net/socketadapter.h#L81)

Sets the pointer to the outgoing data adapter. Send methods proxy data to this adapter by default.

---

<a id="sender"></a>

### sender

```cpp
SocketAdapter * sender()
```

[Defined in src/net/include/icy/net/socketadapter.h:84](https://github.com/auscaster/icey/blob/main/src/net/include/icy/net/socketadapter.h#L84)

Returns the output [SocketAdapter](#socketadapter) pointer.

---

<a id="addreceiver"></a>

### addReceiver

`virtual`

```cpp
virtual void addReceiver(SocketAdapter * adapter)
```

[Defined in src/net/include/icy/net/socketadapter.h:88](https://github.com/auscaster/icey/blob/main/src/net/include/icy/net/socketadapter.h#L88)

Sets the pointer to the incoming data adapter. Events proxy data to this adapter by default.

#### Reimplemented by

- [`SocketEmitter::addReceiver`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketEmitter.md#addreceiver-1)

---

<a id="removereceiver"></a>

### removeReceiver

`virtual`

```cpp
virtual void removeReceiver(SocketAdapter * adapter)
```

[Defined in src/net/include/icy/net/socketadapter.h:94](https://github.com/auscaster/icey/blob/main/src/net/include/icy/net/socketadapter.h#L94)

Remove the given receiver.

By default this function does nothing unless the given receiver matches the current receiver.

#### Reimplemented by

- [`SocketEmitter::removeReceiver`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketEmitter.md#removereceiver-1)

---

<a id="hasreceiver"></a>

### hasReceiver

`virtual`

```cpp
virtual bool hasReceiver(SocketAdapter * adapter)
```

[Defined in src/net/include/icy/net/socketadapter.h:97](https://github.com/auscaster/icey/blob/main/src/net/include/icy/net/socketadapter.h#L97)

Returns true if the given receiver is connected.

---

<a id="receivers"></a>

### receivers

```cpp
std::vector< SocketAdapter * > receivers()
```

[Defined in src/net/include/icy/net/socketadapter.h:101](https://github.com/auscaster/icey/blob/main/src/net/include/icy/net/socketadapter.h#L101)

Returns all currently registered input [SocketAdapter](#socketadapter) pointers. Dead (removed) entries are excluded from the returned list.

---

<a id="onsocketconnect"></a>

### onSocketConnect

`virtual`

```cpp
virtual bool onSocketConnect(Socket & socket)
```

[Defined in src/net/include/icy/net/socketadapter.h:108](https://github.com/auscaster/icey/blob/main/src/net/include/icy/net/socketadapter.h#L108)

Called when the socket establishes a connection. Forwards the event to all registered receivers in priority order. Override to intercept before the application sees the event. 
#### Returns
true to stop propagation to subsequent receivers.

#### Reimplemented by

- [`ClientConnection::onSocketConnect`](https://auscaster.com/icey/docs/api-reference/icy-http-ClientConnection.md#onsocketconnect-2)
- [`Connection::onSocketConnect`](https://auscaster.com/icey/docs/api-reference/icy-http-Connection.md#onsocketconnect-3)
- [`WebSocketAdapter::onSocketConnect`](https://auscaster.com/icey/docs/api-reference/icy-http-ws-WebSocketAdapter.md#onsocketconnect-4)
- [`SocketEmitter::onSocketConnect`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketEmitter.md#onsocketconnect-1)

#### Parameters

| Parameter | Type | Description |
|-----------|------|-------------|
| `socket` | [`Socket`](https://auscaster.com/icey/docs/api-reference/icy-net-Socket.md#socket-1) & | The connected socket. |

---

<a id="onsocketrecv-1"></a>

### onSocketRecv

`virtual`

```cpp
virtual bool onSocketRecv(Socket & socket, const MutableBuffer & buffer, const Address & peerAddress)
```

[Defined in src/net/include/icy/net/socketadapter.h:116](https://github.com/auscaster/icey/blob/main/src/net/include/icy/net/socketadapter.h#L116)

Called when data is received from the socket. Forwards the event to all registered receivers in priority order. 
#### Returns
true to stop propagation to subsequent receivers.

#### Reimplemented by

- [`Connection::onSocketRecv`](https://auscaster.com/icey/docs/api-reference/icy-http-Connection.md#onsocketrecv-3)
- [`ConnectionAdapter::onSocketRecv`](https://auscaster.com/icey/docs/api-reference/icy-http-ConnectionAdapter.md#onsocketrecv-4)
- [`ConnectionStream::onSocketRecv`](https://auscaster.com/icey/docs/api-reference/icy-http-ConnectionStream.md#onsocketrecv-5)
- [`WebSocketAdapter::onSocketRecv`](https://auscaster.com/icey/docs/api-reference/icy-http-ws-WebSocketAdapter.md#onsocketrecv-6)
- [`PacketSocketEmitter::onSocketRecv`](https://auscaster.com/icey/docs/api-reference/icy-net-PacketSocketEmitter.md#onsocketrecv)
- [`SocketEmitter::onSocketRecv`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketEmitter.md#onsocketrecv-2)

#### Parameters

| Parameter | Type | Description |
|-----------|------|-------------|
| `socket` | [`Socket`](https://auscaster.com/icey/docs/api-reference/icy-net-Socket.md#socket-1) & | The socket that received data. |
| `buffer` | const [`MutableBuffer`](https://auscaster.com/icey/docs/api-reference/icy-MutableBuffer.md#mutablebuffer-6) & | The received data buffer. |
| `peerAddress` | const [`Address`](https://auscaster.com/icey/docs/api-reference/icy-net-Address.md#address) & | [Address](https://auscaster.com/icey/docs/api-reference/icy-net-Address.md#address) of the sender. |

---

<a id="onsocketerror"></a>

### onSocketError

`virtual`

```cpp
virtual bool onSocketError(Socket & socket, const Error & error)
```

[Defined in src/net/include/icy/net/socketadapter.h:123](https://github.com/auscaster/icey/blob/main/src/net/include/icy/net/socketadapter.h#L123)

Called when the socket encounters an error. Forwards the event to all registered receivers in priority order. 
#### Returns
true to stop propagation to subsequent receivers.

#### Reimplemented by

- [`ClientConnection::onSocketError`](https://auscaster.com/icey/docs/api-reference/icy-http-ClientConnection.md#onsocketerror-2)
- [`Connection::onSocketError`](https://auscaster.com/icey/docs/api-reference/icy-http-Connection.md#onsocketerror-3)
- [`SocketEmitter::onSocketError`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketEmitter.md#onsocketerror-1)

#### Parameters

| Parameter | Type | Description |
|-----------|------|-------------|
| `socket` | [`Socket`](https://auscaster.com/icey/docs/api-reference/icy-net-Socket.md#socket-1) & | The socket that encountered the error. |
| `error` | const [`Error`](https://auscaster.com/icey/docs/api-reference/icy-Error.md#error) & | [Error](https://auscaster.com/icey/docs/api-reference/icy-Error.md#error) details. |

---

<a id="onsocketclose"></a>

### onSocketClose

`virtual`

```cpp
virtual bool onSocketClose(Socket & socket)
```

[Defined in src/net/include/icy/net/socketadapter.h:129](https://github.com/auscaster/icey/blob/main/src/net/include/icy/net/socketadapter.h#L129)

Called when the socket is closed. Forwards the event to all registered receivers in priority order. 
#### Returns
true to stop propagation to subsequent receivers.

#### Reimplemented by

- [`Server::onSocketClose`](https://auscaster.com/icey/docs/api-reference/icy-http-Server.md#onsocketclose-3)
- [`Connection::onSocketClose`](https://auscaster.com/icey/docs/api-reference/icy-http-Connection.md#onsocketclose-2)
- [`WebSocketAdapter::onSocketClose`](https://auscaster.com/icey/docs/api-reference/icy-http-ws-WebSocketAdapter.md#onsocketclose-4)
- [`SocketEmitter::onSocketClose`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketEmitter.md#onsocketclose-1)

#### Parameters

| Parameter | Type | Description |
|-----------|------|-------------|
| `socket` | [`Socket`](https://auscaster.com/icey/docs/api-reference/icy-net-Socket.md#socket-1) & | The socket that was closed. |

## Protected Attributes

| Return | Name | Description |
|--------|------|-------------|
| [`SocketAdapter`](#socketadapter) * | [`_sender`](#_sender)  |  |
| std::vector< [`Ref`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketAdapter-Ref.md#ref-1) > | [`_receivers`](#_receivers)  |  |
| `bool` | [`_dirty`](#_dirty)  |  |
| `int` | [`_dispatchDepth`](#_dispatchdepth)  |  |

---

<a id="_sender"></a>

### _sender

```cpp
SocketAdapter * _sender
```

Type: [`SocketAdapter`](#socketadapter) *

[Defined in src/net/include/icy/net/socketadapter.h:156](https://github.com/auscaster/icey/blob/main/src/net/include/icy/net/socketadapter.h#L156)

---

<a id="_receivers"></a>

### _receivers

```cpp
std::vector< Ref > _receivers
```

Type: std::vector< [`Ref`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketAdapter-Ref.md#ref-1) >

[Defined in src/net/include/icy/net/socketadapter.h:157](https://github.com/auscaster/icey/blob/main/src/net/include/icy/net/socketadapter.h#L157)

---

<a id="_dirty"></a>

### _dirty

```cpp
bool _dirty = false
```

[Defined in src/net/include/icy/net/socketadapter.h:158](https://github.com/auscaster/icey/blob/main/src/net/include/icy/net/socketadapter.h#L158)

---

<a id="_dispatchdepth"></a>

### _dispatchDepth

```cpp
int _dispatchDepth = 0
```

[Defined in src/net/include/icy/net/socketadapter.h:159](https://github.com/auscaster/icey/blob/main/src/net/include/icy/net/socketadapter.h#L159)

## Protected Methods

| Return | Name | Description |
|--------|------|-------------|
| `void` | [`cleanupReceivers`](#cleanupreceivers) `virtual` |  |

---

<a id="cleanupreceivers"></a>

### cleanupReceivers

`virtual`

```cpp
virtual void cleanupReceivers()
```

[Defined in src/net/include/icy/net/socketadapter.h:135](https://github.com/auscaster/icey/blob/main/src/net/include/icy/net/socketadapter.h#L135)
