Skip to content

Commit cb8b9bb

Browse files
committed
feat: Add unpacker functions for events structures.
1 parent 0a2190f commit cb8b9bb

30 files changed

+1306
-221
lines changed

CMakeLists.txt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -272,7 +272,9 @@ set(toxcore_SOURCES ${toxcore_SOURCES}
272272
toxcore/events/events_alloc.h
273273
toxcore/events/self_connection_status.c
274274
toxcore/tox_events.c
275-
toxcore/tox_events.h)
275+
toxcore/tox_events.h
276+
toxcore/tox_unpack.c
277+
toxcore/tox_unpack.h)
276278
set(toxcore_API_HEADERS ${toxcore_API_HEADERS} ${toxcore_SOURCE_DIR}/toxcore/tox_events.h^tox)
277279
set(toxcore_LINK_MODULES ${toxcore_LINK_MODULES} ${MSGPACK_LIBRARIES})
278280
set(toxcore_PKGCONFIG_REQUIRES ${toxcore_PKGCONFIG_REQUIRES} msgpack)

auto_tests/tox_dispatch_test.c

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,10 +44,31 @@ static void dump_events(const char *path, const Tox_Events *events)
4444

4545
static void print_events(Tox_Events *events)
4646
{
47-
if (tox_events_bytes_size(events) > 24) {
47+
const uint32_t size = tox_events_bytes_size(events);
48+
49+
if (size > 24) {
50+
tox_events_print(events);
51+
}
52+
53+
uint8_t *bytes = (uint8_t *)malloc(size);
54+
ck_assert(bytes != nullptr);
55+
56+
tox_events_get_bytes(events, bytes);
57+
58+
Tox_Events *events_copy = tox_events_load(bytes, size);
59+
ck_assert(events_copy != nullptr);
60+
free(bytes);
61+
62+
if (!tox_events_equal(events, events_copy)) {
63+
printf("serialised and deserialised events are not equal:\n");
64+
printf("a = ");
4865
tox_events_print(events);
66+
printf("b = ");
67+
tox_events_print(events_copy);
68+
abort();
4969
}
5070

71+
tox_events_free(events_copy);
5172
tox_events_free(events);
5273
}
5374

toxcore/BUILD.bazel

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -460,6 +460,18 @@ cc_library(
460460
],
461461
)
462462

463+
cc_library(
464+
name = "tox_unpack",
465+
srcs = ["tox_unpack.c"],
466+
hdrs = ["tox_unpack.h"],
467+
visibility = ["//c-toxcore:__subpackages__"],
468+
deps = [
469+
":ccompat",
470+
":toxcore",
471+
"@msgpack-c",
472+
],
473+
)
474+
463475
cc_library(
464476
name = "tox_events",
465477
srcs = ["tox_events.c"] + glob([
@@ -470,6 +482,7 @@ cc_library(
470482
visibility = ["//c-toxcore:__subpackages__"],
471483
deps = [
472484
":ccompat",
485+
":tox_unpack",
473486
":toxcore",
474487
"@msgpack-c",
475488
],

toxcore/Makefile.inc

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,8 @@ libtoxcore_la_SOURCES = ../toxcore/ccompat.h \
6060
../toxcore/tox_dispatch.c \
6161
../toxcore/tox_events.h \
6262
../toxcore/tox_events.c \
63+
../toxcore/tox_unpack.h \
64+
../toxcore/tox_unpack.c \
6365
../toxcore/tox_private.h \
6466
../toxcore/tox_api.c \
6567
../toxcore/util.h \

toxcore/events/conference_connected.c

Lines changed: 47 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
#include "../ccompat.h"
1212
#include "../tox.h"
1313
#include "../tox_events.h"
14+
#include "../tox_unpack.h"
1415

1516

1617
/*****************************************************
@@ -24,13 +25,6 @@ struct Tox_Event_Conference_Connected {
2425
uint32_t conference_number;
2526
};
2627

27-
static void tox_event_conference_connected_pack(const Tox_Event_Conference_Connected *event, msgpack_packer *mp)
28-
{
29-
assert(event != nullptr);
30-
msgpack_pack_array(mp, 1);
31-
msgpack_pack_uint32(mp, event->conference_number);
32-
}
33-
3428
static void tox_event_conference_connected_construct(Tox_Event_Conference_Connected *conference_connected)
3529
{
3630
*conference_connected = (Tox_Event_Conference_Connected) {
@@ -42,19 +36,39 @@ static void tox_event_conference_connected_destruct(Tox_Event_Conference_Connect
4236
return;
4337
}
4438

45-
static void tox_event_conference_connected_set_conference_number(Tox_Event_Conference_Connected *conference_connected,
46-
uint32_t conference_number)
39+
static void tox_event_conference_connected_set_conference_number(
40+
Tox_Event_Conference_Connected *conference_connected, uint32_t conference_number)
4741
{
4842
assert(conference_connected != nullptr);
4943
conference_connected->conference_number = conference_number;
5044
}
51-
uint32_t tox_event_conference_connected_get_conference_number(const Tox_Event_Conference_Connected
52-
*conference_connected)
45+
uint32_t tox_event_conference_connected_get_conference_number(
46+
const Tox_Event_Conference_Connected *conference_connected)
5347
{
5448
assert(conference_connected != nullptr);
5549
return conference_connected->conference_number;
5650
}
5751

52+
static void tox_event_conference_connected_pack(
53+
const Tox_Event_Conference_Connected *event, msgpack_packer *mp)
54+
{
55+
assert(event != nullptr);
56+
msgpack_pack_array(mp, 1);
57+
msgpack_pack_uint32(mp, event->conference_number);
58+
}
59+
60+
static bool tox_event_conference_connected_unpack(
61+
Tox_Event_Conference_Connected *event, const msgpack_object *obj)
62+
{
63+
assert(event != nullptr);
64+
65+
if (obj->type != MSGPACK_OBJECT_ARRAY || obj->via.array.size < 1) {
66+
return false;
67+
}
68+
69+
return tox_unpack_u32(&event->conference_number, &obj->via.array.ptr[0]);
70+
}
71+
5872

5973
/*****************************************************
6074
*
@@ -132,6 +146,28 @@ void tox_events_pack_conference_connected(const Tox_Events *events, msgpack_pack
132146
}
133147
}
134148

149+
bool tox_events_unpack_conference_connected(Tox_Events *events, const msgpack_object *obj)
150+
{
151+
if (obj->type != MSGPACK_OBJECT_ARRAY) {
152+
return false;
153+
}
154+
155+
for (uint32_t i = 0; i < obj->via.array.size; ++i) {
156+
Tox_Event_Conference_Connected *event = tox_events_add_conference_connected(events);
157+
158+
if (event == nullptr) {
159+
return false;
160+
}
161+
162+
if (!tox_event_conference_connected_unpack(event, &obj->via.array.ptr[i])) {
163+
return false;
164+
}
165+
}
166+
167+
return true;
168+
}
169+
170+
135171

136172
/*****************************************************
137173
*

toxcore/events/conference_invite.c

Lines changed: 48 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
#include "../ccompat.h"
1212
#include "../tox.h"
1313
#include "../tox_events.h"
14+
#include "../tox_unpack.h"
1415

1516

1617
/*****************************************************
@@ -27,16 +28,6 @@ struct Tox_Event_Conference_Invite {
2728
size_t cookie_length;
2829
};
2930

30-
static void tox_event_conference_invite_pack(const Tox_Event_Conference_Invite *event, msgpack_packer *mp)
31-
{
32-
assert(event != nullptr);
33-
msgpack_pack_array(mp, 3);
34-
msgpack_pack_uint32(mp, event->friend_number);
35-
msgpack_pack_uint32(mp, event->type);
36-
msgpack_pack_bin(mp, event->cookie_length);
37-
msgpack_pack_bin_body(mp, event->cookie, event->cookie_length);
38-
}
39-
4031
static void tox_event_conference_invite_construct(Tox_Event_Conference_Invite *conference_invite)
4132
{
4233
*conference_invite = (Tox_Event_Conference_Invite) {
@@ -73,8 +64,7 @@ Tox_Conference_Type tox_event_conference_invite_get_type(const Tox_Event_Confere
7364
}
7465

7566
static bool tox_event_conference_invite_set_cookie(Tox_Event_Conference_Invite *conference_invite,
76-
const uint8_t *cookie,
77-
size_t cookie_length)
67+
const uint8_t *cookie, size_t cookie_length)
7868
{
7969
assert(conference_invite != nullptr);
8070

@@ -105,6 +95,31 @@ const uint8_t *tox_event_conference_invite_get_cookie(const Tox_Event_Conference
10595
return conference_invite->cookie;
10696
}
10797

98+
static void tox_event_conference_invite_pack(
99+
const Tox_Event_Conference_Invite *event, msgpack_packer *mp)
100+
{
101+
assert(event != nullptr);
102+
msgpack_pack_array(mp, 3);
103+
msgpack_pack_uint32(mp, event->friend_number);
104+
msgpack_pack_uint32(mp, event->type);
105+
msgpack_pack_bin(mp, event->cookie_length);
106+
msgpack_pack_bin_body(mp, event->cookie, event->cookie_length);
107+
}
108+
109+
static bool tox_event_conference_invite_unpack(
110+
Tox_Event_Conference_Invite *event, const msgpack_object *obj)
111+
{
112+
assert(event != nullptr);
113+
114+
if (obj->type != MSGPACK_OBJECT_ARRAY || obj->via.array.size < 3) {
115+
return false;
116+
}
117+
118+
return tox_unpack_u32(&event->friend_number, &obj->via.array.ptr[0])
119+
&& tox_unpack_conference_type(&event->type, &obj->via.array.ptr[1])
120+
&& tox_unpack_bin(&event->cookie, &event->cookie_length, &obj->via.array.ptr[2]);
121+
}
122+
108123

109124
/*****************************************************
110125
*
@@ -181,6 +196,27 @@ void tox_events_pack_conference_invite(const Tox_Events *events, msgpack_packer
181196
}
182197
}
183198

199+
bool tox_events_unpack_conference_invite(Tox_Events *events, const msgpack_object *obj)
200+
{
201+
if (obj->type != MSGPACK_OBJECT_ARRAY) {
202+
return false;
203+
}
204+
205+
for (uint32_t i = 0; i < obj->via.array.size; ++i) {
206+
Tox_Event_Conference_Invite *event = tox_events_add_conference_invite(events);
207+
208+
if (event == nullptr) {
209+
return false;
210+
}
211+
212+
if (!tox_event_conference_invite_unpack(event, &obj->via.array.ptr[i])) {
213+
return false;
214+
}
215+
}
216+
217+
return true;
218+
}
219+
184220

185221
/*****************************************************
186222
*

toxcore/events/conference_message.c

Lines changed: 49 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
#include "../ccompat.h"
1212
#include "../tox.h"
1313
#include "../tox_events.h"
14+
#include "../tox_unpack.h"
1415

1516

1617
/*****************************************************
@@ -28,17 +29,6 @@ struct Tox_Event_Conference_Message {
2829
size_t message_length;
2930
};
3031

31-
static void tox_event_conference_message_pack(const Tox_Event_Conference_Message *event, msgpack_packer *mp)
32-
{
33-
assert(event != nullptr);
34-
msgpack_pack_array(mp, 5);
35-
msgpack_pack_uint32(mp, event->conference_number);
36-
msgpack_pack_uint32(mp, event->peer_number);
37-
msgpack_pack_uint32(mp, event->type);
38-
msgpack_pack_bin(mp, event->message_length);
39-
msgpack_pack_bin_body(mp, event->message, event->message_length);
40-
}
41-
4232
static void tox_event_conference_message_construct(Tox_Event_Conference_Message *conference_message)
4333
{
4434
*conference_message = (Tox_Event_Conference_Message) {
@@ -118,6 +108,33 @@ const uint8_t *tox_event_conference_message_get_message(const Tox_Event_Conferen
118108
return conference_message->message;
119109
}
120110

111+
static void tox_event_conference_message_pack(
112+
const Tox_Event_Conference_Message *event, msgpack_packer *mp)
113+
{
114+
assert(event != nullptr);
115+
msgpack_pack_array(mp, 4);
116+
msgpack_pack_uint32(mp, event->conference_number);
117+
msgpack_pack_uint32(mp, event->peer_number);
118+
msgpack_pack_uint32(mp, event->type);
119+
msgpack_pack_bin(mp, event->message_length);
120+
msgpack_pack_bin_body(mp, event->message, event->message_length);
121+
}
122+
123+
static bool tox_event_conference_message_unpack(
124+
Tox_Event_Conference_Message *event, const msgpack_object *obj)
125+
{
126+
assert(event != nullptr);
127+
128+
if (obj->type != MSGPACK_OBJECT_ARRAY || obj->via.array.size < 4) {
129+
return false;
130+
}
131+
132+
return tox_unpack_u32(&event->conference_number, &obj->via.array.ptr[0])
133+
&& tox_unpack_u32(&event->peer_number, &obj->via.array.ptr[1])
134+
&& tox_unpack_message_type(&event->type, &obj->via.array.ptr[2])
135+
&& tox_unpack_bin(&event->message, &event->message_length, &obj->via.array.ptr[3]);
136+
}
137+
121138

122139
/*****************************************************
123140
*
@@ -194,6 +211,27 @@ void tox_events_pack_conference_message(const Tox_Events *events, msgpack_packer
194211
}
195212
}
196213

214+
bool tox_events_unpack_conference_message(Tox_Events *events, const msgpack_object *obj)
215+
{
216+
if (obj->type != MSGPACK_OBJECT_ARRAY) {
217+
return false;
218+
}
219+
220+
for (uint32_t i = 0; i < obj->via.array.size; ++i) {
221+
Tox_Event_Conference_Message *event = tox_events_add_conference_message(events);
222+
223+
if (event == nullptr) {
224+
return false;
225+
}
226+
227+
if (!tox_event_conference_message_unpack(event, &obj->via.array.ptr[i])) {
228+
return false;
229+
}
230+
}
231+
232+
return true;
233+
}
234+
197235

198236
/*****************************************************
199237
*

0 commit comments

Comments
 (0)