# MultipartAdapter

<a id="multipartadapter"></a>

# MultipartAdapter

```cpp
#include <icy/http/packetizers.h>

class MultipartAdapter
```

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

> **Inherits:** [`PacketProcessor`](https://auscaster.com/icey/docs/api-reference/icy-PacketProcessor.md#packetprocessor)

HTTP multipart encoding adapter for multipart/x-mixed-replace streaming.

## List of all members

| Name | Kind | Owner |
|------|------|-------|
| [`connection`](#connection-8) | `variable` | Declared here |
| [`contentType`](#contenttype-2) | `variable` | Declared here |
| [`isBase64`](#isbase64) | `variable` | Declared here |
| [`initial`](#initial-1) | `variable` | Declared here |
| [`emitter`](#emitter-12) | `variable` | Declared here |
| [`MultipartAdapter`](#multipartadapter-1) | `function` | Declared here |
| [`MultipartAdapter`](#multipartadapter-2) | `function` | Declared here |
| [`~MultipartAdapter`](#multipartadapter-3) | `function` | Declared here |
| [`emitHeader`](#emitheader-1) | `function` | Declared here |
| [`emitChunkHeader`](#emitchunkheader) | `function` | Declared here |
| [`process`](#process-16) | `function` | Declared here |
| [`PacketProcessor`](https://auscaster.com/icey/docs/api-reference/icy-PacketProcessor.md#packetprocessor-1) | `function` | Inherited from [`PacketProcessor`](https://auscaster.com/icey/docs/api-reference/icy-PacketProcessor.md#packetprocessor) |
| [`process`](https://auscaster.com/icey/docs/api-reference/icy-PacketProcessor.md#process-1) | `function` | Inherited from [`PacketProcessor`](https://auscaster.com/icey/docs/api-reference/icy-PacketProcessor.md#packetprocessor) |
| [`accepts`](https://auscaster.com/icey/docs/api-reference/icy-PacketProcessor.md#accepts-1) | `function` | Inherited from [`PacketProcessor`](https://auscaster.com/icey/docs/api-reference/icy-PacketProcessor.md#packetprocessor) |
| [`operator<<`](https://auscaster.com/icey/docs/api-reference/icy-PacketProcessor.md#operator-69) | `function` | Inherited from [`PacketProcessor`](https://auscaster.com/icey/docs/api-reference/icy-PacketProcessor.md#packetprocessor) |
| [`PacketStreamAdapter`](https://auscaster.com/icey/docs/api-reference/icy-PacketStreamAdapter.md#packetstreamadapter-1) | `function` | Inherited from [`PacketStreamAdapter`](https://auscaster.com/icey/docs/api-reference/icy-PacketStreamAdapter.md#packetstreamadapter) |
| [`~PacketStreamAdapter`](https://auscaster.com/icey/docs/api-reference/icy-PacketStreamAdapter.md#packetstreamadapter-2) | `function` | Inherited from [`PacketStreamAdapter`](https://auscaster.com/icey/docs/api-reference/icy-PacketStreamAdapter.md#packetstreamadapter) |
| [`emit`](https://auscaster.com/icey/docs/api-reference/icy-PacketStreamAdapter.md#emit-1) | `function` | Inherited from [`PacketStreamAdapter`](https://auscaster.com/icey/docs/api-reference/icy-PacketStreamAdapter.md#packetstreamadapter) |
| [`emit`](https://auscaster.com/icey/docs/api-reference/icy-PacketStreamAdapter.md#emit-2) | `function` | Inherited from [`PacketStreamAdapter`](https://auscaster.com/icey/docs/api-reference/icy-PacketStreamAdapter.md#packetstreamadapter) |
| [`emit`](https://auscaster.com/icey/docs/api-reference/icy-PacketStreamAdapter.md#emit-3) | `function` | Inherited from [`PacketStreamAdapter`](https://auscaster.com/icey/docs/api-reference/icy-PacketStreamAdapter.md#packetstreamadapter) |
| [`emit`](https://auscaster.com/icey/docs/api-reference/icy-PacketStreamAdapter.md#emit-4) | `function` | Inherited from [`PacketStreamAdapter`](https://auscaster.com/icey/docs/api-reference/icy-PacketStreamAdapter.md#packetstreamadapter) |
| [`emit`](https://auscaster.com/icey/docs/api-reference/icy-PacketStreamAdapter.md#emit-5) | `function` | Inherited from [`PacketStreamAdapter`](https://auscaster.com/icey/docs/api-reference/icy-PacketStreamAdapter.md#packetstreamadapter) |
| [`getEmitter`](https://auscaster.com/icey/docs/api-reference/icy-PacketStreamAdapter.md#getemitter) | `function` | Inherited from [`PacketStreamAdapter`](https://auscaster.com/icey/docs/api-reference/icy-PacketStreamAdapter.md#packetstreamadapter) |
| [`retention`](https://auscaster.com/icey/docs/api-reference/icy-PacketStreamAdapter.md#retention-1) | `function` | Inherited from [`PacketStreamAdapter`](https://auscaster.com/icey/docs/api-reference/icy-PacketStreamAdapter.md#packetstreamadapter) |
| [`onStreamStateChange`](https://auscaster.com/icey/docs/api-reference/icy-PacketStreamAdapter.md#onstreamstatechange-1) | `function` | Inherited from [`PacketStreamAdapter`](https://auscaster.com/icey/docs/api-reference/icy-PacketStreamAdapter.md#packetstreamadapter) |
| [`_emitter`](https://auscaster.com/icey/docs/api-reference/icy-PacketStreamAdapter.md#_emitter) | `variable` | Inherited from [`PacketStreamAdapter`](https://auscaster.com/icey/docs/api-reference/icy-PacketStreamAdapter.md#packetstreamadapter) |
| [`PacketStreamAdapter`](https://auscaster.com/icey/docs/api-reference/icy-PacketStreamAdapter.md#packetstreamadapter-3) | `function` | Inherited from [`PacketStreamAdapter`](https://auscaster.com/icey/docs/api-reference/icy-PacketStreamAdapter.md#packetstreamadapter) |
| [`operator=`](https://auscaster.com/icey/docs/api-reference/icy-PacketStreamAdapter.md#operator-72) | `function` | Inherited from [`PacketStreamAdapter`](https://auscaster.com/icey/docs/api-reference/icy-PacketStreamAdapter.md#packetstreamadapter) |
| [`PacketStreamAdapter`](https://auscaster.com/icey/docs/api-reference/icy-PacketStreamAdapter.md#packetstreamadapter-4) | `function` | Inherited from [`PacketStreamAdapter`](https://auscaster.com/icey/docs/api-reference/icy-PacketStreamAdapter.md#packetstreamadapter) |
| [`operator=`](https://auscaster.com/icey/docs/api-reference/icy-PacketStreamAdapter.md#operator-73) | `function` | Inherited from [`PacketStreamAdapter`](https://auscaster.com/icey/docs/api-reference/icy-PacketStreamAdapter.md#packetstreamadapter) |

## Inherited from [`PacketProcessor`](https://auscaster.com/icey/docs/api-reference/icy-PacketProcessor.md#packetprocessor)

| Kind | Name | Description |
|------|------|-------------|
| `function` | [`PacketProcessor`](https://auscaster.com/icey/docs/api-reference/icy-PacketProcessor.md#packetprocessor-1) `inline` |  |
| `function` | [`process`](https://auscaster.com/icey/docs/api-reference/icy-PacketProcessor.md#process-1) `virtual` | This method performs processing on the given packet and emits the result. |
| `function` | [`accepts`](https://auscaster.com/icey/docs/api-reference/icy-PacketProcessor.md#accepts-1) `virtual` `inline` | This method ensures compatibility with the given packet type. Return false to reject the packet. |
| `function` | [`operator<<`](https://auscaster.com/icey/docs/api-reference/icy-PacketProcessor.md#operator-69) `virtual` `inline` | [Stream](https://auscaster.com/icey/docs/api-reference/icy-Stream.md#stream) operator alias for [process()](https://auscaster.com/icey/docs/api-reference/icy-PacketProcessor.md#process-1) |

## Inherited from [`PacketStreamAdapter`](https://auscaster.com/icey/docs/api-reference/icy-PacketStreamAdapter.md#packetstreamadapter)

| Kind | Name | Description |
|------|------|-------------|
| `function` | [`PacketStreamAdapter`](https://auscaster.com/icey/docs/api-reference/icy-PacketStreamAdapter.md#packetstreamadapter-1)  | Construct the adapter, binding it to the given packet signal. |
| `function` | [`~PacketStreamAdapter`](https://auscaster.com/icey/docs/api-reference/icy-PacketStreamAdapter.md#packetstreamadapter-2) `virtual` `inline` |  |
| `function` | [`emit`](https://auscaster.com/icey/docs/api-reference/icy-PacketStreamAdapter.md#emit-1) `virtual` | Emit a mutable raw buffer as a packet. |
| `function` | [`emit`](https://auscaster.com/icey/docs/api-reference/icy-PacketStreamAdapter.md#emit-2) `virtual` | Emit a read-only raw buffer as a packet (data is copied internally). |
| `function` | [`emit`](https://auscaster.com/icey/docs/api-reference/icy-PacketStreamAdapter.md#emit-3) `virtual` | Emit a string as a packet (data is copied internally). |
| `function` | [`emit`](https://auscaster.com/icey/docs/api-reference/icy-PacketStreamAdapter.md#emit-4) `virtual` | Emit a flag-only packet carrying no payload data. |
| `function` | [`emit`](https://auscaster.com/icey/docs/api-reference/icy-PacketStreamAdapter.md#emit-5) `virtual` | Emit an existing packet directly onto the outgoing signal. |
| `function` | [`getEmitter`](https://auscaster.com/icey/docs/api-reference/icy-PacketStreamAdapter.md#getemitter)  | Returns a reference to the outgoing packet signal. |
| `function` | [`retention`](https://auscaster.com/icey/docs/api-reference/icy-PacketStreamAdapter.md#retention-1) `virtual` `const` | Returns how this adapter treats incoming packet lifetime. Most adapters are synchronous and therefore only borrow the packet for the current call chain. Queue-style adapters override this to advertise that they clone before deferred use. Callers may treat the first adapter reporting Cloned or Retained as the explicit ownership boundary in the stream graph. |
| `function` | [`onStreamStateChange`](https://auscaster.com/icey/docs/api-reference/icy-PacketStreamAdapter.md#onstreamstatechange-1) `virtual` `inline` | Called by the [PacketStream](https://auscaster.com/icey/docs/api-reference/icy-PacketStream.md#packetstream) to notify when the internal [Stream](https://auscaster.com/icey/docs/api-reference/icy-Stream.md#stream) state changes. On receiving the Stopped state, it is the responsibility of the adapter to have ceased all outgoing packet transmission, especially in multi-thread scenarios. |
| `variable` | [`_emitter`](https://auscaster.com/icey/docs/api-reference/icy-PacketStreamAdapter.md#_emitter)  |  |
| `function` | [`PacketStreamAdapter`](https://auscaster.com/icey/docs/api-reference/icy-PacketStreamAdapter.md#packetstreamadapter-3)  | NonCopyable and NonMovable. |
| `function` | [`operator=`](https://auscaster.com/icey/docs/api-reference/icy-PacketStreamAdapter.md#operator-72)  | Deleted assignment operator. |
| `function` | [`PacketStreamAdapter`](https://auscaster.com/icey/docs/api-reference/icy-PacketStreamAdapter.md#packetstreamadapter-4)  | Deleted constructor. |
| `function` | [`operator=`](https://auscaster.com/icey/docs/api-reference/icy-PacketStreamAdapter.md#operator-73)  | Deleted assignment operator. |

## Public Attributes

| Return | Name | Description |
|--------|------|-------------|
| [`Connection::Ptr`](https://auscaster.com/icey/docs/api-reference/icy-http-Connection.md#ptr-17) | [`connection`](#connection-8)  | HTTP connection for sending the initial response header. |
| `std::string` | [`contentType`](#contenttype-2)  | Content-Type of each part (e.g. "image/jpeg"). |
| `bool` | [`isBase64`](#isbase64)  | If true, adds "Content-Transfer-Encoding: base64" to each part. |
| `bool` | [`initial`](#initial-1)  | True until the first chunk is processed and the boundary header emitted. |
| [`PacketSignal`](https://auscaster.com/icey/docs/api-reference/base.md#packetsignal) | [`emitter`](#emitter-12)  |  |

---

<a id="connection-8"></a>

### connection

```cpp
Connection::Ptr connection
```

Type: [`Connection::Ptr`](https://auscaster.com/icey/docs/api-reference/icy-http-Connection.md#ptr-17)

[Defined in src/http/include/icy/http/packetizers.h:160](https://github.com/auscaster/icey/blob/main/src/http/include/icy/http/packetizers.h#L160)

HTTP connection for sending the initial response header.

---

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

### contentType

```cpp
std::string contentType
```

[Defined in src/http/include/icy/http/packetizers.h:161](https://github.com/auscaster/icey/blob/main/src/http/include/icy/http/packetizers.h#L161)

Content-Type of each part (e.g. "image/jpeg").

---

<a id="isbase64"></a>

### isBase64

```cpp
bool isBase64
```

[Defined in src/http/include/icy/http/packetizers.h:162](https://github.com/auscaster/icey/blob/main/src/http/include/icy/http/packetizers.h#L162)

If true, adds "Content-Transfer-Encoding: base64" to each part.

---

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

### initial

```cpp
bool initial
```

[Defined in src/http/include/icy/http/packetizers.h:163](https://github.com/auscaster/icey/blob/main/src/http/include/icy/http/packetizers.h#L163)

True until the first chunk is processed and the boundary header emitted.

---

<a id="emitter-12"></a>

### emitter

```cpp
PacketSignal emitter
```

Type: [`PacketSignal`](https://auscaster.com/icey/docs/api-reference/base.md#packetsignal)

[Defined in src/http/include/icy/http/packetizers.h:260](https://github.com/auscaster/icey/blob/main/src/http/include/icy/http/packetizers.h#L260)

## Public Methods

| Return | Name | Description |
|--------|------|-------------|
|  | [`MultipartAdapter`](#multipartadapter-1) `inline` | Creates a [MultipartAdapter](#multipartadapter) that sends headers through the given connection. The per-part content type is read from the connection's outgoing header. |
|  | [`MultipartAdapter`](#multipartadapter-2) `inline` | Creates a [MultipartAdapter](#multipartadapter) that emits its own raw HTTP/1.1 200 response header. Use this when no [Connection](https://auscaster.com/icey/docs/api-reference/icy-http-Connection.md#connection-1) object is available. |
|  | [`~MultipartAdapter`](#multipartadapter-3) `virtual` `inline` |  |
| `void` | [`emitHeader`](#emitheader-1) `virtual` `inline` | Emits the initial HTTP/1.1 200 OK response with Content-Type multipart/x-mixed-replace. If a connection is set, headers are written through it; otherwise a raw response string is emitted. |
| `void` | [`emitChunkHeader`](#emitchunkheader) `virtual` `inline` | Emits the MIME boundary and per-part headers (Content-Type, optionally Content-Transfer-Encoding) for the next multipart chunk. |
| `void` | [`process`](#process-16) `virtual` `inline` | Wraps the incoming packet as a multipart chunk and emits it downstream. Emits the multipart HTTP response headers on the first call. |

---

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

### MultipartAdapter

`inline`

```cpp
inline MultipartAdapter(Connection::Ptr connection, bool base64 = false)
```

[Defined in src/http/include/icy/http/packetizers.h:169](https://github.com/auscaster/icey/blob/main/src/http/include/icy/http/packetizers.h#L169)

Creates a [MultipartAdapter](#multipartadapter) that sends headers through the given connection. The per-part content type is read from the connection's outgoing header.

#### Parameters

| Parameter | Type | Description |
|-----------|------|-------------|
| `connection` | [`Connection::Ptr`](https://auscaster.com/icey/docs/api-reference/icy-http-Connection.md#ptr-17) | HTTP connection to use for sending the initial multipart header. |
| `base64` | `bool` | If true, indicates parts are base64-encoded. |

---

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

### MultipartAdapter

`inline`

```cpp
inline MultipartAdapter(const std::string & contentType, bool base64 = false)
```

[Defined in src/http/include/icy/http/packetizers.h:182](https://github.com/auscaster/icey/blob/main/src/http/include/icy/http/packetizers.h#L182)

Creates a [MultipartAdapter](#multipartadapter) that emits its own raw HTTP/1.1 200 response header. Use this when no [Connection](https://auscaster.com/icey/docs/api-reference/icy-http-Connection.md#connection-1) object is available.

#### Parameters

| Parameter | Type | Description |
|-----------|------|-------------|
| `contentType` | `const std::string &` | Content-Type for each multipart part. |
| `base64` | `bool` | If true, indicates parts are base64-encoded. |

---

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

### ~MultipartAdapter

`virtual` `inline`

```cpp
virtual inline ~MultipartAdapter()
```

[Defined in src/http/include/icy/http/packetizers.h:191](https://github.com/auscaster/icey/blob/main/src/http/include/icy/http/packetizers.h#L191)

---

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

### emitHeader

`virtual` `inline`

```cpp
virtual inline void emitHeader()
```

[Defined in src/http/include/icy/http/packetizers.h:195](https://github.com/auscaster/icey/blob/main/src/http/include/icy/http/packetizers.h#L195)

Emits the initial HTTP/1.1 200 OK response with Content-Type multipart/x-mixed-replace. If a connection is set, headers are written through it; otherwise a raw response string is emitted.

---

<a id="emitchunkheader"></a>

### emitChunkHeader

`virtual` `inline`

```cpp
virtual inline void emitChunkHeader()
```

[Defined in src/http/include/icy/http/packetizers.h:227](https://github.com/auscaster/icey/blob/main/src/http/include/icy/http/packetizers.h#L227)

Emits the MIME boundary and per-part headers (Content-Type, optionally Content-Transfer-Encoding) for the next multipart chunk.

---

<a id="process-16"></a>

### process

`virtual` `inline`

```cpp
virtual inline void process(IPacket & packet)
```

[Defined in src/http/include/icy/http/packetizers.h:244](https://github.com/auscaster/icey/blob/main/src/http/include/icy/http/packetizers.h#L244)

Wraps the incoming packet as a multipart chunk and emits it downstream. Emits the multipart HTTP response headers on the first call.

#### Reimplements

- [`PacketProcessor::process`](https://auscaster.com/icey/docs/api-reference/icy-PacketProcessor.md#process-1)

#### Parameters

| Parameter | Type | Description |
|-----------|------|-------------|
| `packet` | [`IPacket`](https://auscaster.com/icey/docs/api-reference/icy-IPacket.md#ipacket) & | Packet containing the raw payload data. |
