# IPacket

<a id="ipacket"></a>

# IPacket

```cpp
#include <icy/packet.h>

class IPacket
```

[Defined in src/base/include/icy/packet.h:47](https://github.com/auscaster/icey/blob/main/src/base/include/icy/packet.h#L47)

> **Subclassed by:** [`FlagPacket`](https://auscaster.com/icey/docs/api-reference/icy-FlagPacket.md#flagpacket), [`RawPacket`](https://auscaster.com/icey/docs/api-reference/icy-RawPacket.md#rawpacket-4), [`Message`](https://auscaster.com/icey/docs/api-reference/icy-smpl-Message.md#message-12), [`Message`](https://auscaster.com/icey/docs/api-reference/icy-stun-Message.md#message-6)

The basic packet type which is passed around the icey system. [IPacket](#ipacket) can be extended for each protocol to enable polymorphic processing and callbacks using [PacketStream](https://auscaster.com/icey/docs/api-reference/icy-PacketStream.md#packetstream) and friends.

## Friends

| Name | Description |
|------|-------------|
| [`operator<<`](#operator-41) `inline` | [Stream](https://auscaster.com/icey/docs/api-reference/icy-Stream.md#stream) insertion operator; delegates to [print()](#print). |

---

<a id="operator-41"></a>

### operator<<

`inline`

```cpp
friend inline std::ostream & operator<<(std::ostream & stream, const IPacket & p)
```

[Defined in src/base/include/icy/packet.h:137](https://github.com/auscaster/icey/blob/main/src/base/include/icy/packet.h#L137)

[Stream](https://auscaster.com/icey/docs/api-reference/icy-Stream.md#stream) insertion operator; delegates to [print()](#print). 
#### Returns
Reference to the stream.

#### Parameters

| Parameter | Type | Description |
|-----------|------|-------------|
| `stream` | `std::ostream &` | Output stream. |
| `p` | const [`IPacket`](#ipacket) & | Packet to print. |

## Public Attributes

| Return | Name | Description |
|--------|------|-------------|
| `std::any` | [`opaque`](#opaque)  | Optional type-safe context data. Use std::any_cast to retrieve. Lifetime of the stored value is tied to the packet's lifetime. |
| std::unique_ptr< [`IPacketInfo`](https://auscaster.com/icey/docs/api-reference/icy-IPacketInfo.md#ipacketinfo) > | [`info`](#info)  | Optional extra information about the packet. |
| [`Bitwise`](https://auscaster.com/icey/docs/api-reference/icy-Bitwise.md#bitwise) | [`flags`](#flags)  | Provides basic information about the packet. |

---

<a id="opaque"></a>

### opaque

```cpp
std::any opaque
```

[Defined in src/base/include/icy/packet.h:86](https://github.com/auscaster/icey/blob/main/src/base/include/icy/packet.h#L86)

Optional type-safe context data. Use std::any_cast to retrieve. Lifetime of the stored value is tied to the packet's lifetime.

---

<a id="info"></a>

### info

```cpp
std::unique_ptr< IPacketInfo > info
```

Type: std::unique_ptr< [`IPacketInfo`](https://auscaster.com/icey/docs/api-reference/icy-IPacketInfo.md#ipacketinfo) >

[Defined in src/base/include/icy/packet.h:89](https://github.com/auscaster/icey/blob/main/src/base/include/icy/packet.h#L89)

Optional extra information about the packet.

---

<a id="flags"></a>

### flags

```cpp
Bitwise flags
```

Type: [`Bitwise`](https://auscaster.com/icey/docs/api-reference/icy-Bitwise.md#bitwise)

[Defined in src/base/include/icy/packet.h:92](https://github.com/auscaster/icey/blob/main/src/base/include/icy/packet.h#L92)

Provides basic information about the packet.

## Public Methods

| Return | Name | Description |
|--------|------|-------------|
|  | [`IPacket`](#ipacket-1) `inline` |  |
|  | [`IPacket`](#ipacket-2) `inline` | Copy constructor; clones the info object if present. |
| [`IPacket`](#ipacket) & | [`operator=`](#operator-42) `inline` | Copy assignment; clones the info object if present. |
| std::unique_ptr< [`IPacket`](#ipacket) > | [`clone`](#clone-1) `virtual` `const` | Returns a heap-allocated deep copy of this packet. |
|  | [`~IPacket`](#ipacket-3) `virtual` | Defaulted destructor. |
| `ssize_t` | [`read`](#read-1) `virtual` | Read/parse to the packet from the given input buffer. The number of bytes read is returned. |
| `void` | [`write`](#write-4) `virtual` `const` | Copy/generate to the packet given output buffer. The number of bytes written can be obtained from the buffer. |
| `size_t` | [`size`](#size-1) `virtual` `const` `inline` | The size of the packet in bytes. |
| `bool` | [`hasData`](#hasdata) `virtual` `const` `inline` | Returns true if the packet has a non-null data pointer. |
| `char *` | [`data`](#data-2) `virtual` `const` `inline` | The packet data pointer for buffered packets. |
| `const void *` | [`constData`](#constdata) `virtual` `const` `inline` | The const packet data pointer for buffered packets. |
| `const char *` | [`className`](#classname-1) `virtual` `const` | Returns the class name of this packet type for logging and diagnostics. |
| `void` | [`print`](#print) `virtual` `const` `inline` | Prints a human-readable representation to the given stream. |

---

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

### IPacket

`inline`

```cpp
inline IPacket(std::unique_ptr< IPacketInfo > info = nullptr, unsigned flags = 0)
```

[Defined in src/base/include/icy/packet.h:52](https://github.com/auscaster/icey/blob/main/src/base/include/icy/packet.h#L52)

#### Parameters

| Parameter | Type | Description |
|-----------|------|-------------|
| `info` | std::unique_ptr< [`IPacketInfo`](https://auscaster.com/icey/docs/api-reference/icy-IPacketInfo.md#ipacketinfo) > | Optional packet info; ownership transferred. |
| `flags` | `unsigned` | Initial bitwise flags. |

---

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

### IPacket

`inline`

```cpp
inline IPacket(const IPacket & r)
```

[Defined in src/base/include/icy/packet.h:60](https://github.com/auscaster/icey/blob/main/src/base/include/icy/packet.h#L60)

Copy constructor; clones the info object if present.

#### Parameters

| Parameter | Type | Description |
|-----------|------|-------------|
| `r` | const [`IPacket`](#ipacket) & | Source packet. |

---

<a id="operator-42"></a>

### operator=

`inline`

```cpp
inline IPacket & operator=(const IPacket & r)
```

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

Copy assignment; clones the info object if present. 
#### Returns
Reference to this packet.

#### Parameters

| Parameter | Type | Description |
|-----------|------|-------------|
| `r` | const [`IPacket`](#ipacket) & | Source packet. |

---

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

### clone

`virtual` `const`

```cpp
virtual std::unique_ptr< IPacket > clone() const
```

[Defined in src/base/include/icy/packet.h:80](https://github.com/auscaster/icey/blob/main/src/base/include/icy/packet.h#L80)

Returns a heap-allocated deep copy of this packet. 
#### Returns
Owning pointer to the cloned packet.

#### Reimplemented by

- [`SocketPacket::clone`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketPacket.md#clone-10)
- [`MediaPacket::clone`](https://auscaster.com/icey/docs/api-reference/icy-av-MediaPacket.md#clone-4)
- [`VideoPacket::clone`](https://auscaster.com/icey/docs/api-reference/icy-av-VideoPacket.md#clone-5)
- [`PlanarVideoPacket::clone`](https://auscaster.com/icey/docs/api-reference/icy-av-PlanarVideoPacket.md#clone-6)
- [`AudioPacket::clone`](https://auscaster.com/icey/docs/api-reference/icy-av-AudioPacket.md#clone-7)
- [`PlanarAudioPacket::clone`](https://auscaster.com/icey/docs/api-reference/icy-av-PlanarAudioPacket.md#clone-8)
- [`FlagPacket::clone`](https://auscaster.com/icey/docs/api-reference/icy-FlagPacket.md#clone)
- [`RawPacket::clone`](https://auscaster.com/icey/docs/api-reference/icy-RawPacket.md#clone-3)
- [`Message::clone`](https://auscaster.com/icey/docs/api-reference/icy-stun-Message.md#clone-15)
- [`Message::clone`](https://auscaster.com/icey/docs/api-reference/icy-smpl-Message.md#clone-22)
- [`VisionFramePacket::clone`](https://auscaster.com/icey/docs/api-reference/icy-vision-VisionFramePacket.md#clone-23)

---

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

### ~IPacket

`virtual`

```cpp
virtual ~IPacket() = default
```

[Defined in src/base/include/icy/packet.h:82](https://github.com/auscaster/icey/blob/main/src/base/include/icy/packet.h#L82)

Defaulted destructor.

---

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

### read

`virtual`

```cpp
virtual ssize_t read(const ConstBuffer &)
```

[Defined in src/base/include/icy/packet.h:96](https://github.com/auscaster/icey/blob/main/src/base/include/icy/packet.h#L96)

Read/parse to the packet from the given input buffer. The number of bytes read is returned.

#### Reimplemented by

- [`SocketPacket::read`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketPacket.md#read-5)
- [`FlagPacket::read`](https://auscaster.com/icey/docs/api-reference/icy-FlagPacket.md#read)
- [`RawPacket::read`](https://auscaster.com/icey/docs/api-reference/icy-RawPacket.md#read-2)
- [`Message::read`](https://auscaster.com/icey/docs/api-reference/icy-stun-Message.md#read-10)
- [`Message::read`](https://auscaster.com/icey/docs/api-reference/icy-smpl-Message.md#read-17)

---

<a id="write-4"></a>

### write

`virtual` `const`

```cpp
virtual void write(Buffer &) const
```

[Defined in src/base/include/icy/packet.h:105](https://github.com/auscaster/icey/blob/main/src/base/include/icy/packet.h#L105)

Copy/generate to the packet given output buffer. The number of bytes written can be obtained from the buffer.

Todo: It may be preferable to use our pod types here instead of buffer input, but the current codebase requires that the buffer be dynamically resizable for some protocols...

#### Reimplemented by

- [`FlagPacket::write`](https://auscaster.com/icey/docs/api-reference/icy-FlagPacket.md#write-3)
- [`SocketPacket::write`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketPacket.md#write-19)
- [`RawPacket::write`](https://auscaster.com/icey/docs/api-reference/icy-RawPacket.md#write-14)
- [`Message::write`](https://auscaster.com/icey/docs/api-reference/icy-stun-Message.md#write-39)
- [`Message::write`](https://auscaster.com/icey/docs/api-reference/icy-smpl-Message.md#write-46)

---

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

### size

`virtual` `const` `inline`

```cpp
virtual inline size_t size() const
```

[Defined in src/base/include/icy/packet.h:112](https://github.com/auscaster/icey/blob/main/src/base/include/icy/packet.h#L112)

The size of the packet in bytes.

This is the number of bytes that will be written on a call to [write()](#write-4), but may not be the number of bytes that will be consumed by [read()](#read-1).

#### Reimplemented by

- [`RawPacket::size`](https://auscaster.com/icey/docs/api-reference/icy-RawPacket.md#size-7)
- [`Message::size`](https://auscaster.com/icey/docs/api-reference/icy-stun-Message.md#size-14)
- [`Message::size`](https://auscaster.com/icey/docs/api-reference/icy-smpl-Message.md#size-20)

---

<a id="hasdata"></a>

### hasData

`virtual` `const` `inline`

```cpp
virtual inline bool hasData() const
```

[Defined in src/base/include/icy/packet.h:115](https://github.com/auscaster/icey/blob/main/src/base/include/icy/packet.h#L115)

Returns true if the packet has a non-null data pointer.

#### Reimplemented by

- [`Message::hasData`](https://auscaster.com/icey/docs/api-reference/icy-smpl-Message.md#hasdata-2)

---

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

### data

`virtual` `const` `inline`

```cpp
virtual inline char * data() const
```

[Defined in src/base/include/icy/packet.h:118](https://github.com/auscaster/icey/blob/main/src/base/include/icy/packet.h#L118)

The packet data pointer for buffered packets.

#### Reimplemented by

- [`Message::data`](https://auscaster.com/icey/docs/api-reference/icy-smpl-Message.md#data-11)
- [`RawPacket::data`](https://auscaster.com/icey/docs/api-reference/icy-RawPacket.md#data-4)

---

<a id="constdata"></a>

### constData

`virtual` `const` `inline`

```cpp
virtual inline const void * constData() const
```

[Defined in src/base/include/icy/packet.h:121](https://github.com/auscaster/icey/blob/main/src/base/include/icy/packet.h#L121)

The const packet data pointer for buffered packets.

---

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

### className

`virtual` `const`

```cpp
virtual const char * className() const
```

[Defined in src/base/include/icy/packet.h:124](https://github.com/auscaster/icey/blob/main/src/base/include/icy/packet.h#L124)

Returns the class name of this packet type for logging and diagnostics.

#### Reimplemented by

- [`SocketPacket::className`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketPacket.md#classname-10)
- [`MediaPacket::className`](https://auscaster.com/icey/docs/api-reference/icy-av-MediaPacket.md#classname-5)
- [`VideoPacket::className`](https://auscaster.com/icey/docs/api-reference/icy-av-VideoPacket.md#classname-6)
- [`PlanarVideoPacket::className`](https://auscaster.com/icey/docs/api-reference/icy-av-PlanarVideoPacket.md#classname-7)
- [`AudioPacket::className`](https://auscaster.com/icey/docs/api-reference/icy-av-AudioPacket.md#classname-8)
- [`PlanarAudioPacket::className`](https://auscaster.com/icey/docs/api-reference/icy-av-PlanarAudioPacket.md#classname-9)
- [`FlagPacket::className`](https://auscaster.com/icey/docs/api-reference/icy-FlagPacket.md#classname)
- [`RawPacket::className`](https://auscaster.com/icey/docs/api-reference/icy-RawPacket.md#classname-2)
- [`Message::className`](https://auscaster.com/icey/docs/api-reference/icy-stun-Message.md#classname-12)
- [`Message::className`](https://auscaster.com/icey/docs/api-reference/icy-smpl-Message.md#classname-13)
- [`VisionFramePacket::className`](https://auscaster.com/icey/docs/api-reference/icy-vision-VisionFramePacket.md#classname-16)

---

<a id="print"></a>

### print

`virtual` `const` `inline`

```cpp
virtual inline void print(std::ostream & os) const
```

[Defined in src/base/include/icy/packet.h:128](https://github.com/auscaster/icey/blob/main/src/base/include/icy/packet.h#L128)

Prints a human-readable representation to the given stream.

#### Reimplemented by

- [`SocketPacket::print`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketPacket.md#print-8)
- [`Message::print`](https://auscaster.com/icey/docs/api-reference/icy-stun-Message.md#print-15)
- [`Message::print`](https://auscaster.com/icey/docs/api-reference/icy-smpl-Message.md#print-18)

#### Parameters

| Parameter | Type | Description |
|-----------|------|-------------|
| `os` | `std::ostream &` | Output stream. |
