Serialization
All serialization is done in network format big-endian.
Serialization of basic types is trivial and will not be discussed here.
Primitive types are serialized by serializing each of their fields sequentially.
Type Aliases¶
Certain types have a representation which is identical to a pre-existing type in this document. For this reason, we do not define them twice, but list the type whose network representation they borrow here:
| Type name | Network representation |
|---|---|
| BufferId | Int |
| IdentityId | Int |
| NetworkId | Int |
| MsgId | Int |
| PeerPtr | Long |
| IrcUser | QVariantMap |
| IrcChannel | QVariantMap |
| Identity | QVariantMap |
| NetworkInfo | QVariantMap |
| Network::Server | QVariantMap |
MsgId’s serialization changes depending on which features are available on both client and server. Specifically,
if LongMessageId is available, it is serialized as long, and its values can go above INT_MAX.
String¶
Strings are serialized as a signed int of the length in bytes plus their content in UTF-16BE. If the length is -1, the
String is to be considered equivalent to
NULL.
StringList¶
StringLists are serialized as an Int of the amount of elements, and a
string for each element.
Variant¶
First, an Int for the type, then an UChar for an unknown value, then, if the type is a usertype, the typename
as bytearray (C-string with null byte at the end), and then the value in its own format.
List¶
VariantLists are serialized as an Int of the length, and a Variant for each element.
Map¶
VariantMaps are serialized as an Int of the amount of keys, and then for each key a QString for the key and
a Variant for each element.
Type¶
| Enum | Value | Additional Info |
|---|---|---|
| Void | 0x00000000 |
|
| Bool | 0x00000001 |
|
| Int | 0x00000002 |
int32_t |
| UInt | 0x00000003 |
uint32_t |
| QChar | 0x00000007 |
|
| QVariantMap | 0x00000008 |
|
| QVariantList | 0x00000009 |
|
| QString | 0x0000000a |
|
| QStringList | 0x0000000b |
|
| QByteArray | 0x0000000c |
|
| QTime | 0x0000000f |
|
| QDateTime | 0x00000010 |
|
| UserType | 0x0000007f |
|
| Long | 0x00000081 |
int64_t |
| Short | 0x00000082 |
int16_t |
| Char | 0x00000083 |
int8_t |
| ULong | 0x00000084 |
uint64_t |
| UShort | 0x00000085 |
uint16_t |
| UChar | 0x00000086 |
uint8_t |
| QVariant | 0x00000090 |
DateTime¶
| Type | Field | Description |
|---|---|---|
Int |
julianDay | Day in Julian calendar, unknown if signed or unsigned |
Int |
millisOfDay | Milliseconds since start of day |
UChar |
zone | Timezone of DateTime, 0x00 is local, 0x01 is UTC |
Time¶
| Type | Field | Description |
|---|---|---|
Int |
millisOfDay | Milliseconds since start of day |
BufferInfo¶
| Type | Field | Description |
|---|---|---|
Int |
id | BufferId, a unique, sequential id for the buffer |
Int |
networkId | NetworkId of the network the buffer belongs to |
Short |
type | See below |
QByteArray |
name | (UTF-8) BufferName as displayed to the user |
BufferType¶
| Enum | Value |
|---|---|
| Status | 0x01 |
| Channel | 0x02 |
| Query | 0x04 |
| Group | 0x08 |
Message¶
| Type | Field | Description |
|---|---|---|
MsgId |
messageId | The unique, sequential id for the message |
Int |
timestamp | The timestamp of the message in UNIX time (32-bit, seconds) |
Long |
CONDITIONAL: Different Type (Long) if LongTime feature is enabled | |
Int |
type | See below |
UChar |
flags | See below |
BufferInfo |
buffer | The buffer the message belongs to, usually everything but BufferId is set to NULL |
QByteArray |
sender | (UTF-8) The sender as nick!ident@host |
QByteArray |
senderPrefixes | (UTF-8) The prefix modes of the sender |
| CONDITIONAL: Only serialized if SenderPrefixes feature is enabled | ||
QByteArray |
realName | (UTF-8) The realName of the sender |
| CONDITIONAL: Only serialized if RichMessages feature is enabled | ||
QByteArray |
avatarUrl | (UTF-8) The avatarUrl of the sender, if available |
| CONDITIONAL: Only serialized if RichMessages feature is enabled | ||
QByteArray |
content | (UTF-8) The message content, already stripped from CTCP formatting, but containing mIRC format codes |
This type's serialization format depends heavily on the available features — if both client and server support a certain feature, additional fields are added or changed.
| Field | Feature | Effect |
|---|---|---|
| timestamp | LongTime | Type is Long instead of Int, content is milliseconds instead of seconds |
| senderPrefixes | SenderPrefixes | Field is serialized only with feature present |
| realName | RichMessages | Field is serialized only with feature present |
| avatarUrl | RichMessages | Field is serialized only with feature present |
MessageType¶
| Enum | Value |
|---|---|
| Plain | 0x00000001 |
| Notice | 0x00000002 |
| Action | 0x00000004 |
| Nick | 0x00000008 |
| Mode | 0x00000010 |
| Join | 0x00000020 |
| Part | 0x00000040 |
| Quit | 0x00000080 |
| Kick | 0x00000100 |
| Kill | 0x00000200 |
| Server | 0x00000400 |
| Info | 0x00000800 |
| Error | 0x00001000 |
| DayChange | 0x00002000 |
| Topic | 0x00004000 |
| NetsplitJoin | 0x00008000 |
| NetsplitQuit | 0x00010000 |
| Invite | 0x00020000 |
MessageFlags¶
| Type | Value |
|---|---|
| Self | 0x00000001 |
| Highlight | 0x00000002 |
| Redirected | 0x00000004 |
| ServerMsg | 0x00000008 |
| Backlog | 0x00000080 |