feat: Add binary packing functions for tox events.

This commit is contained in:
iphydf 2022-02-06 23:53:41 +00:00
parent 9218566599
commit 0a2190f28c
No known key found for this signature in database
GPG Key ID: 3855DBA2D74403C9
54 changed files with 846 additions and 51 deletions

View File

@ -32,6 +32,7 @@ jobs:
git git
libconfig-dev libconfig-dev
libgtest-dev libgtest-dev
libmsgpack-dev
libopus-dev libopus-dev
libsodium-dev libsodium-dev
libvpx-dev libvpx-dev
@ -79,7 +80,7 @@ jobs:
toxcore/*/*.c toxcore/*/*.c
toxencryptsave/*.c toxencryptsave/*.c
-lpthread -lpthread
$(pkg-config --cflags --libs libsodium opus vpx) $(pkg-config --cflags --libs libsodium msgpack opus vpx)
static-analysis: static-analysis:
working_directory: ~/work working_directory: ~/work

View File

@ -4,7 +4,12 @@ set -eu
NPROC=$(nproc) NPROC=$(nproc)
sudo apt-get install -y --no-install-recommends libopus-dev libsodium-dev libvpx-dev ninja-build sudo apt-get install -y --no-install-recommends \
libmsgpack-dev \
libopus-dev \
libsodium-dev \
libvpx-dev \
ninja-build
. ".github/scripts/flags-$CC.sh" . ".github/scripts/flags-$CC.sh"

View File

@ -7,7 +7,12 @@ NPROC=$(sysctl -n hw.physicalcpu)
# Workaround for bug in Homebrew where it only finds an old Ruby version. # Workaround for bug in Homebrew where it only finds an old Ruby version.
brew update brew update
brew install libconfig libsodium libvpx opus brew install \
libconfig \
libsodium \
libvpx \
msgpack \
opus
. ".github/scripts/flags-clang.sh" . ".github/scripts/flags-clang.sh"

View File

@ -1,4 +1,4 @@
#!/bin/bash #!/usr/bin/env bash
i686=true i686=true
x86_64=false x86_64=false

View File

@ -1,4 +1,4 @@
#!/bin/bash #!/usr/bin/env bash
i686=false i686=false
x86_64=true x86_64=true

View File

@ -7,14 +7,12 @@ set -eu
NPROC=$(nproc) NPROC=$(nproc)
ci_install() { ci_install() {
cd other/docker/windows
docker build \ docker build \
--build-arg SUPPORT_ARCH_i686="$i686" \ --build-arg SUPPORT_ARCH_i686="$i686" \
--build-arg SUPPORT_ARCH_x86_64="$x86_64" \ --build-arg SUPPORT_ARCH_x86_64="$x86_64" \
--build-arg SUPPORT_TEST=true \ --build-arg SUPPORT_TEST=true \
-t toxcore-"$WINDOWS_ARCH" \ -t toxcore-"$WINDOWS_ARCH" \
. other/docker/windows
} }
ci_script() { ci_script() {

View File

@ -2,7 +2,13 @@
set -eu set -eu
sudo apt-get install -y --no-install-recommends libconfig-dev libopus-dev libsodium-dev libvpx-dev ninja-build sudo apt-get install -y --no-install-recommends \
libconfig-dev \
libmsgpack-dev \
libopus-dev \
libsodium-dev \
libvpx-dev \
ninja-build
. ".github/scripts/flags-gcc.sh" . ".github/scripts/flags-gcc.sh"

View File

@ -25,6 +25,7 @@ branches:
- "build-tcc" - "build-tcc"
- "build-win32" - "build-win32"
- "build-win64" - "build-win64"
- "buildifier"
- "CodeFactor" - "CodeFactor"
- "coverage-linux" - "coverage-linux"
- "ci/circleci: asan" - "ci/circleci: asan"

View File

@ -95,12 +95,14 @@ jobs:
sudo apt-get install -y --no-install-recommends sudo apt-get install -y --no-install-recommends
tcc tcc
libconfig-dev libconfig-dev
libmsgpack-dev
libopus-dev libopus-dev
libsodium-dev libsodium-dev
libvpx-dev libvpx-dev
- name: Build with TCC - name: Build with TCC
run: run:
tcc tcc
-Dinline=static
-o send_message_test -o send_message_test
-Wall -Werror -Wall -Werror
-bench -g -bench -g
@ -111,7 +113,7 @@ jobs:
toxcore/*.c toxcore/*.c
toxcore/*/*.c toxcore/*/*.c
toxencryptsave/*.c toxencryptsave/*.c
$(pkg-config --cflags --libs libsodium opus vpx) $(pkg-config --cflags --libs libsodium msgpack opus vpx)
- name: Run the test - name: Run the test
run: "./send_message_test | grep 'tox clients connected'" run: "./send_message_test | grep 'tox clients connected'"
- name: Build amalgamation file with TCC - name: Build amalgamation file with TCC
@ -124,7 +126,7 @@ jobs:
-o send_message_test -o send_message_test
-Wall -Werror -Wall -Werror
-bench -g -bench -g
$(pkg-config --cflags --libs libsodium opus vpx) $(pkg-config --cflags --libs libsodium msgpack opus vpx)
- name: Run the test again - name: Run the test again
run: "./send_message_test | grep 'tox clients connected'" run: "./send_message_test | grep 'tox clients connected'"
@ -149,8 +151,8 @@ jobs:
toxcore/*.c toxcore/*.c
toxcore/*/*.c toxcore/*/*.c
toxencryptsave/*.c toxencryptsave/*.c
-D__COMPCERT__ -DDISABLE_VLA -D__COMPCERT__ -DDISABLE_VLA -Dinline=
-lpthread $(pkg-config --cflags --libs libsodium opus vpx) -lpthread $(pkg-config --cflags --libs libsodium msgpack opus vpx)
- name: Run the test - name: Run the test
run: "./send_message_test | grep 'tox clients connected'" run: "./send_message_test | grep 'tox clients connected'"

View File

@ -9,3 +9,5 @@ ignored:
- DL3013 - DL3013
- DL3018 - DL3018
- DL3059 - DL3059
# $(pkg-config ...) needs this
- SC2046

View File

@ -274,6 +274,8 @@ set(toxcore_SOURCES ${toxcore_SOURCES}
toxcore/tox_events.c toxcore/tox_events.c
toxcore/tox_events.h) toxcore/tox_events.h)
set(toxcore_API_HEADERS ${toxcore_API_HEADERS} ${toxcore_SOURCE_DIR}/toxcore/tox_events.h^tox) set(toxcore_API_HEADERS ${toxcore_API_HEADERS} ${toxcore_SOURCE_DIR}/toxcore/tox_events.h^tox)
set(toxcore_LINK_MODULES ${toxcore_LINK_MODULES} ${MSGPACK_LIBRARIES})
set(toxcore_PKGCONFIG_REQUIRES ${toxcore_PKGCONFIG_REQUIRES} msgpack)
# LAYER 10: Dispatch recorded events to callbacks. # LAYER 10: Dispatch recorded events to callbacks.
# ------------------- # -------------------

View File

@ -7,6 +7,7 @@ install:
- py -3 -m pip install conan - py -3 -m pip install conan
before_build: before_build:
- conan remote add -i 0 conancenter https://center.conan.io
- conan install -if _build . - conan install -if _build .
build_script: build_script:

View File

@ -34,6 +34,8 @@ TESTS = \
set_name_test \ set_name_test \
set_status_message_test \ set_status_message_test \
TCP_test \ TCP_test \
tox_events_test \
tox_dispatch_test \
tox_many_tcp_test \ tox_many_tcp_test \
tox_many_test \ tox_many_test \
tox_one_test \ tox_one_test \
@ -49,16 +51,19 @@ endif
AUTOTEST_CFLAGS = \ AUTOTEST_CFLAGS = \
$(LIBSODIUM_CFLAGS) \ $(LIBSODIUM_CFLAGS) \
$(MSGPACK_CFLAGS) \
$(NACL_CFLAGS) $(NACL_CFLAGS)
AUTOTEST_LDADD = \ AUTOTEST_LDADD = \
$(LIBSODIUM_LDFLAGS) \ $(LIBSODIUM_LDFLAGS) \
$(MSGPACK_LDFLAGS) \
$(NACL_LDFLAGS) \ $(NACL_LDFLAGS) \
libmisc_tools.la \ libmisc_tools.la \
libauto_test_support.la \ libauto_test_support.la \
libtoxcore.la \ libtoxcore.la \
libtoxencryptsave.la \ libtoxencryptsave.la \
$(LIBSODIUM_LIBS) \ $(LIBSODIUM_LIBS) \
$(MSGPACK_LIBS) \
$(NACL_OBJECTS) \ $(NACL_OBJECTS) \
$(NACL_LIBS) $(NACL_LIBS)
@ -198,6 +203,14 @@ TCP_test_SOURCES = ../auto_tests/TCP_test.c
TCP_test_CFLAGS = $(AUTOTEST_CFLAGS) TCP_test_CFLAGS = $(AUTOTEST_CFLAGS)
TCP_test_LDADD = $(AUTOTEST_LDADD) TCP_test_LDADD = $(AUTOTEST_LDADD)
tox_events_test_SOURCES = ../auto_tests/tox_events_test.c
tox_events_test_CFLAGS = $(AUTOTEST_CFLAGS)
tox_events_test_LDADD = $(AUTOTEST_LDADD)
tox_dispatch_test_SOURCES = ../auto_tests/tox_dispatch_test.c
tox_dispatch_test_CFLAGS = $(AUTOTEST_CFLAGS)
tox_dispatch_test_LDADD = $(AUTOTEST_LDADD)
tox_many_tcp_test_SOURCES = ../auto_tests/tox_many_tcp_test.c tox_many_tcp_test_SOURCES = ../auto_tests/tox_many_tcp_test.c
tox_many_tcp_test_CFLAGS = $(AUTOTEST_CFLAGS) tox_many_tcp_test_CFLAGS = $(AUTOTEST_CFLAGS)
tox_many_tcp_test_LDADD = $(AUTOTEST_LDADD) tox_many_tcp_test_LDADD = $(AUTOTEST_LDADD)

View File

@ -12,6 +12,9 @@
#include "../toxcore/tox_events.h" #include "../toxcore/tox_events.h"
#include "check_compat.h" #include "check_compat.h"
// Set to true to produce an msgpack file at /tmp/test.mp.
static const bool want_dump_events = false;
static void handle_events_friend_message(Tox *tox, const Tox_Event_Friend_Message *event, void *user_data) static void handle_events_friend_message(Tox *tox, const Tox_Event_Friend_Message *event, void *user_data)
{ {
bool *success = (bool *)user_data; bool *success = (bool *)user_data;
@ -24,17 +27,43 @@ static void handle_events_friend_message(Tox *tox, const Tox_Event_Friend_Messag
*success = true; *success = true;
} }
static void dump_events(const char *path, const Tox_Events *events)
{
if (want_dump_events) {
FILE *fh = fopen(path, "w");
ck_assert(fh != nullptr);
const uint32_t len = tox_events_bytes_size(events);
uint8_t *buf = (uint8_t *)malloc(len);
ck_assert(buf != nullptr);
tox_events_get_bytes(events, buf);
fwrite(buf, 1, len, fh);
free(buf);
fclose(fh);
}
}
static void print_events(Tox_Events *events)
{
if (tox_events_bytes_size(events) > 24) {
tox_events_print(events);
}
tox_events_free(events);
}
static bool await_message(Tox **toxes, const Tox_Dispatch *dispatch) static bool await_message(Tox **toxes, const Tox_Dispatch *dispatch)
{ {
for (uint32_t i = 0; i < 100; ++i) { for (uint32_t i = 0; i < 100; ++i) {
// Ignore events on tox 1. // Ignore events on tox 1.
tox_events_free(tox_events_iterate(toxes[0], nullptr)); print_events(tox_events_iterate(toxes[0], nullptr));
// Check if tox 2 got the message from tox 1. // Check if tox 2 got the message from tox 1.
Tox_Events *events = tox_events_iterate(toxes[1], nullptr); Tox_Events *events = tox_events_iterate(toxes[1], nullptr);
dump_events("/tmp/test.mp", events);
bool success = false; bool success = false;
tox_dispatch_invoke(dispatch, events, toxes[1], &success); tox_dispatch_invoke(dispatch, events, toxes[1], &success);
tox_events_free(events); print_events(events);
if (success) { if (success) {
return true; return true;
@ -81,8 +110,8 @@ static void test_tox_events(void)
while (tox_self_get_connection_status(toxes[0]) == TOX_CONNECTION_NONE || while (tox_self_get_connection_status(toxes[0]) == TOX_CONNECTION_NONE ||
tox_self_get_connection_status(toxes[1]) == TOX_CONNECTION_NONE) { tox_self_get_connection_status(toxes[1]) == TOX_CONNECTION_NONE) {
// Ignore connection events for now. // Ignore connection events for now.
tox_events_free(tox_events_iterate(toxes[0], nullptr)); print_events(tox_events_iterate(toxes[0], nullptr));
tox_events_free(tox_events_iterate(toxes[1], nullptr)); print_events(tox_events_iterate(toxes[1], nullptr));
c_sleep(tox_iteration_interval(toxes[0])); c_sleep(tox_iteration_interval(toxes[0]));
} }
@ -92,8 +121,8 @@ static void test_tox_events(void)
while (tox_friend_get_connection_status(toxes[0], 0, nullptr) == TOX_CONNECTION_NONE || while (tox_friend_get_connection_status(toxes[0], 0, nullptr) == TOX_CONNECTION_NONE ||
tox_friend_get_connection_status(toxes[1], 0, nullptr) == TOX_CONNECTION_NONE) { tox_friend_get_connection_status(toxes[1], 0, nullptr) == TOX_CONNECTION_NONE) {
// Ignore connection events for now. // Ignore connection events for now.
tox_events_free(tox_events_iterate(toxes[0], nullptr)); print_events(tox_events_iterate(toxes[0], nullptr));
tox_events_free(tox_events_iterate(toxes[1], nullptr)); print_events(tox_events_iterate(toxes[1], nullptr));
c_sleep(tox_iteration_interval(toxes[0])); c_sleep(tox_iteration_interval(toxes[0]));
} }

View File

@ -14,6 +14,8 @@ find_library(SOCKET_LIBRARIES socket )
# For toxcore. # For toxcore.
pkg_use_module(LIBSODIUM libsodium ) pkg_use_module(LIBSODIUM libsodium )
pkg_use_module(MSGPACK msgpack )
#find_package(msgpack REQUIRED)
# For toxav. # For toxav.
pkg_use_module(OPUS "opus;Opus" ) pkg_use_module(OPUS "opus;Opus" )
@ -22,9 +24,6 @@ pkg_use_module(VPX "vpx;libvpx" )
# For tox-bootstrapd. # For tox-bootstrapd.
pkg_use_module(LIBCONFIG libconfig ) pkg_use_module(LIBCONFIG libconfig )
# For tox-spectest.
pkg_use_module(MSGPACK msgpack )
############################################################################### ###############################################################################
# #
# :: For MSVC Windows builds. # :: For MSVC Windows builds.

View File

@ -14,7 +14,7 @@ class ToxConan(ConanFile):
description = "The future of online communications." description = "The future of online communications."
license = "GPL-3.0-only" license = "GPL-3.0-only"
settings = "os", "compiler", "build_type", "arch" settings = "os", "compiler", "build_type", "arch"
requires = "libsodium/1.0.18", "opus/1.3.1", "libvpx/1.9.0" requires = "libsodium/1.0.18", "opus/1.3.1", "msgpack/3.3.0", "libvpx/1.9.0"
generators = "cmake_find_package" generators = "cmake_find_package"
scm = {"type": "git", "url": "auto", "revision": "auto"} scm = {"type": "git", "url": "auto", "revision": "auto"}

View File

@ -302,6 +302,14 @@ PKG_CHECK_MODULES([LIBSODIUM], [libsodium],
LIBSODIUM_FOUND="no" LIBSODIUM_FOUND="no"
]) ])
PKG_CHECK_MODULES([MSGPACK], [msgpack],
[
MSGPACK_FOUND="yes"
],
[
MSGPACK_FOUND="no"
])
if test "x$WANT_NACL" = "xyes"; then if test "x$WANT_NACL" = "xyes"; then
NACL_LIBS= NACL_LIBS=
NACL_LDFLAGS= NACL_LDFLAGS=

View File

@ -10,6 +10,8 @@ ALLOWLIST: Tuple[str, ...] = (
"stdbool.h", "stdbool.h",
"stddef.h", "stddef.h",
"stdint.h", "stdint.h",
# msgpack, currently not abstracted away
"msgpack.h",
# toxav stuff, maybe not worth abstracting away # toxav stuff, maybe not worth abstracting away
"opus.h", "opus.h",
"vpx/vp8cx.h", "vpx/vp8cx.h",

View File

@ -14,7 +14,7 @@ CPPFLAGS+=("-Itoxcore/events")
CPPFLAGS+=("-Itoxav") CPPFLAGS+=("-Itoxav")
CPPFLAGS+=("-Itoxencryptsave") CPPFLAGS+=("-Itoxencryptsave")
LDFLAGS=("-lopus" "-lsodium" "-lvpx" "-lpthread" "-lconfig" "-lgtest") LDFLAGS=("-lopus" "-lmsgpackc" "-lsodium" "-lvpx" "-lpthread" "-lconfig" "-lgtest")
LDFLAGS+=("-fuse-ld=gold") LDFLAGS+=("-fuse-ld=gold")
LDFLAGS+=("-Wl,--detect-odr-violations") LDFLAGS+=("-Wl,--detect-odr-violations")
LDFLAGS+=("-Wl,--warn-common") LDFLAGS+=("-Wl,--warn-common")

View File

@ -8,6 +8,7 @@ RUN ["apk", "--no-cache", "add",\
"linux-headers",\ "linux-headers",\
"libconfig-dev",\ "libconfig-dev",\
"libconfig-static",\ "libconfig-static",\
"msgpack-c-dev",\
"libsodium-dev",\ "libsodium-dev",\
"libsodium-static",\ "libsodium-static",\
"ninja",\ "ninja",\

View File

@ -8,6 +8,7 @@ RUN apt-get update && apt-get install --no-install-recommends -y \
ca-certificates \ ca-certificates \
curl \ curl \
libconfig-dev \ libconfig-dev \
libmsgpack-dev \
libopus-dev \ libopus-dev \
libtool \ libtool \
libvpx-dev \ libvpx-dev \

View File

@ -7,6 +7,7 @@ RUN apt-get update && \
clang \ clang \
cmake \ cmake \
libconfig-dev \ libconfig-dev \
libmsgpack-dev \
libopus-dev \ libopus-dev \
libsodium-dev \ libsodium-dev \
libvpx-dev \ libvpx-dev \

View File

@ -0,0 +1,47 @@
FROM ubuntu:20.04
RUN apt-get update && \
DEBIAN_FRONTEND="noninteractive" apt-get install -y --no-install-recommends \
libc-dev \
libmsgpack-dev \
libopus-dev \
libsodium-dev \
libvpx-dev \
pkg-config \
tcc \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
WORKDIR /work
COPY auto_tests/ /work/auto_tests/
COPY testing/ /work/testing/
COPY toxav/ /work/toxav/
COPY toxcore/ /work/toxcore/
COPY toxencryptsave/ /work/toxencryptsave/
RUN tcc \
-Dinline=static \
-o send_message_test \
-Wall -Werror \
-bench -g \
auto_tests/auto_test_support.c \
auto_tests/send_message_test.c \
testing/misc_tools.c \
toxav/*.c \
toxcore/*.c \
toxcore/*/*.c \
toxencryptsave/*.c \
$(pkg-config --cflags --libs libsodium msgpack opus vpx)
SHELL ["/bin/bash", "-o", "pipefail", "-c"]
COPY other/make_single_file /work/other/
RUN \
other/make_single_file \
auto_tests/auto_test_support.c \
auto_tests/send_message_test.c \
testing/misc_tools.c | \
tcc - \
-o send_message_test \
-Wall -Werror \
-bench -g \
$(pkg-config --cflags --libs libsodium msgpack opus vpx)

5
other/docker/tcc/run Executable file
View File

@ -0,0 +1,5 @@
#!/bin/sh
set -eux
docker build -t toxchat/c-toxcore:tcc -f other/docker/tcc/Dockerfile .

View File

@ -1,33 +1,35 @@
FROM debian:buster-slim FROM debian:buster-slim
# Build-time environment variables # Build-time environment variables
ARG VERSION_SODIUM=1.0.18 ARG VERSION_MSGPACK=4.0.0 \
ARG VERSION_OPUS=1.3.1 VERSION_SODIUM=1.0.18 \
ARG VERSION_VPX=1.9.0 VERSION_OPUS=1.3.1 \
VERSION_VPX=1.9.0 \
ARG SUPPORT_TEST=false \
ARG SUPPORT_ARCH_i686=true SUPPORT_TEST=false \
ARG SUPPORT_ARCH_x86_64=true SUPPORT_ARCH_i686=true \
ARG CROSS_COMPILE=true SUPPORT_ARCH_x86_64=true \
CROSS_COMPILE=true
# Make those available when running the container # Make those available when running the container
ENV SUPPORT_TEST=${SUPPORT_TEST} ENV SUPPORT_TEST=${SUPPORT_TEST} \
ENV SUPPORT_ARCH_i686=${SUPPORT_ARCH_i686} SUPPORT_ARCH_i686=${SUPPORT_ARCH_i686} \
ENV SUPPORT_ARCH_x86_64=${SUPPORT_ARCH_x86_64} SUPPORT_ARCH_x86_64=${SUPPORT_ARCH_x86_64} \
ENV CROSS_COMPILE=${CROSS_COMPILE} CROSS_COMPILE=${CROSS_COMPILE}
WORKDIR /work
COPY get_packages.sh . COPY get_packages.sh .
RUN sh ./get_packages.sh RUN ./get_packages.sh
COPY build_dependencies.sh . COPY build_dependencies.sh .
RUN sh ./build_dependencies.sh RUN ./build_dependencies.sh
COPY build_toxcore.sh . COPY build_toxcore.sh .
ENV ENABLE_TEST=false ENV ENABLE_TEST=false \
ENV ALLOW_TEST_FAILURE=false ALLOW_TEST_FAILURE=false \
ENV ENABLE_ARCH_i686=true ENABLE_ARCH_i686=true \
ENV ENABLE_ARCH_x86_64=true ENABLE_ARCH_x86_64=true \
ENV EXTRA_CMAKE_FLAGS="-DTEST_TIMEOUT_SECONDS=90" EXTRA_CMAKE_FLAGS="-DTEST_TIMEOUT_SECONDS=90"
ENTRYPOINT ["sh", "./build_toxcore.sh"] ENTRYPOINT ["sh", "./build_toxcore.sh"]

32
other/docker/windows/build_dependencies.sh Normal file → Executable file
View File

@ -1,4 +1,4 @@
#!/usr/bin/env sh #!/usr/bin/env bash
# disable on Cygwin otherwise some builds fail # disable on Cygwin otherwise some builds fail
if [ "$CROSS_COMPILE" = "true" ]; then if [ "$CROSS_COMPILE" = "true" ]; then
@ -23,14 +23,36 @@ build() {
export MAKEFLAGS=j"$(nproc)" export MAKEFLAGS=j"$(nproc)"
export CFLAGS=-O3 export CFLAGS=-O3
CURL_OPTIONS="-L --connect-timeout 10" CURL_OPTIONS=(-L --connect-timeout 10)
cd /tmp cd /tmp
rm -rf /tmp/* rm -rf /tmp/*
echo "
SET(CMAKE_SYSTEM_NAME Windows)
SET(CMAKE_C_COMPILER $WINDOWS_TOOLCHAIN-gcc)
SET(CMAKE_CXX_COMPILER $WINDOWS_TOOLCHAIN-g++)
SET(CMAKE_RC_COMPILER $WINDOWS_TOOLCHAIN-windres)
SET(CMAKE_FIND_ROOT_PATH /usr/$WINDOWS_TOOLCHAIN $DEP_PREFIX_DIR)
" >windows_toolchain.cmake
echo
echo "=== Building Msgpack $VERSION_MSGPACK $ARCH ==="
curl "${CURL_OPTIONS[@]}" -O "https://github.com/msgpack/msgpack-c/releases/download/c-$VERSION_MSGPACK/msgpack-c-$VERSION_MSGPACK.tar.gz"
tar -xf "msgpack-c-$VERSION_MSGPACK.tar.gz"
cd "msgpack-c-$VERSION_MSGPACK"
cmake -DCMAKE_TOOLCHAIN_FILE=../windows_toolchain.cmake \
-DCMAKE_INSTALL_PREFIX="$PREFIX_DIR" \
-DBUILD_SHARED_LIBS=OFF \
.
cmake --build . --target install -- -j"$(nproc)"
cd ..
echo echo
echo "=== Building Sodium $VERSION_SODIUM $ARCH ===" echo "=== Building Sodium $VERSION_SODIUM $ARCH ==="
curl $CURL_OPTIONS -O "https://download.libsodium.org/libsodium/releases/libsodium-$VERSION_SODIUM.tar.gz" curl "${CURL_OPTIONS[@]}" -O "https://download.libsodium.org/libsodium/releases/libsodium-$VERSION_SODIUM.tar.gz"
tar -xf "libsodium-$VERSION_SODIUM.tar.gz" tar -xf "libsodium-$VERSION_SODIUM.tar.gz"
cd "libsodium-$VERSION_SODIUM" cd "libsodium-$VERSION_SODIUM"
./configure --host="$WINDOWS_TOOLCHAIN" --prefix="$PREFIX_DIR" --disable-shared --enable-static ./configure --host="$WINDOWS_TOOLCHAIN" --prefix="$PREFIX_DIR" --disable-shared --enable-static
@ -40,7 +62,7 @@ build() {
echo echo
echo "=== Building Opus $VERSION_OPUS $ARCH ===" echo "=== Building Opus $VERSION_OPUS $ARCH ==="
curl $CURL_OPTIONS -O "https://archive.mozilla.org/pub/opus/opus-$VERSION_OPUS.tar.gz" curl "${CURL_OPTIONS[@]}" -O "https://archive.mozilla.org/pub/opus/opus-$VERSION_OPUS.tar.gz"
tar -xf "opus-$VERSION_OPUS.tar.gz" tar -xf "opus-$VERSION_OPUS.tar.gz"
cd "opus-$VERSION_OPUS" cd "opus-$VERSION_OPUS"
./configure --host="$WINDOWS_TOOLCHAIN" --prefix="$PREFIX_DIR" --disable-extra-programs --disable-doc --disable-shared --enable-static ./configure --host="$WINDOWS_TOOLCHAIN" --prefix="$PREFIX_DIR" --disable-extra-programs --disable-doc --disable-shared --enable-static
@ -61,7 +83,7 @@ build() {
# This is a workaround as suggested in https://stackoverflow.com/questions/43152633 # This is a workaround as suggested in https://stackoverflow.com/questions/43152633
LIB_VPX_CFLAGS="-fno-asynchronous-unwind-tables" LIB_VPX_CFLAGS="-fno-asynchronous-unwind-tables"
fi fi
curl $CURL_OPTIONS "https://github.com/webmproject/libvpx/archive/v$VERSION_VPX.tar.gz" -o "libvpx-$VERSION_VPX.tar.gz" curl "${CURL_OPTIONS[@]}" "https://github.com/webmproject/libvpx/archive/v$VERSION_VPX.tar.gz" -o "libvpx-$VERSION_VPX.tar.gz"
tar -xf "libvpx-$VERSION_VPX.tar.gz" tar -xf "libvpx-$VERSION_VPX.tar.gz"
cd "libvpx-$VERSION_VPX" cd "libvpx-$VERSION_VPX"
CFLAGS="$LIB_VPX_CFLAGS" CROSS="$WINDOWS_TOOLCHAIN"- ./configure --target="$LIB_VPX_TARGET" --prefix="$PREFIX_DIR" --disable-examples --disable-unit-tests --disable-shared --enable-static CFLAGS="$LIB_VPX_CFLAGS" CROSS="$WINDOWS_TOOLCHAIN"- ./configure --target="$LIB_VPX_TARGET" --prefix="$PREFIX_DIR" --disable-examples --disable-unit-tests --disable-shared --enable-static

0
other/docker/windows/get_packages.sh Normal file → Executable file
View File

View File

@ -36,6 +36,16 @@ RUN . "/work/emsdk/emsdk_env.sh" \
--disable-ssp --disable-asm --disable-pie \ --disable-ssp --disable-asm --disable-pie \
&& emmake make install -j8 && emmake make install -j8
# Build msgpack.
RUN . "/work/emsdk/emsdk_env.sh" \
&& git clone --depth=1 --branch=c-4.0.0 https://github.com/msgpack/msgpack-c /work/msgpack-c \
&& cd /work/msgpack-c \
&& emcmake cmake -B_build -H. -GNinja \
-DCMAKE_INSTALL_PREFIX:PATH="/usr/local" \
-DCMAKE_C_FLAGS="-O3 -flto -fPIC" \
-DBUILD_SHARED_LIBS=OFF \
&& emmake cmake --build _build --parallel 8 --target install
# Build an unused libsodium binding first so emcc caches all the system # Build an unused libsodium binding first so emcc caches all the system
# libraries. This makes rebuilds of toxcore below much faster. # libraries. This makes rebuilds of toxcore below much faster.
RUN . "/work/emsdk/emsdk_env.sh" \ RUN . "/work/emsdk/emsdk_env.sh" \
@ -58,11 +68,11 @@ COPY . /work/c-toxcore
RUN . "/work/emsdk/emsdk_env.sh" \ RUN . "/work/emsdk/emsdk_env.sh" \
&& cd /work/c-toxcore \ && cd /work/c-toxcore \
&& emcmake cmake -B_build -H. -GNinja \ && emcmake cmake -B_build -H. -GNinja \
-DCMAKE_INSTALL_PREFIX:PATH="/usr/local" \
-DCMAKE_C_FLAGS="-O3 -flto -fPIC" \ -DCMAKE_C_FLAGS="-O3 -flto -fPIC" \
-DBUILD_TOXAV=OFF \ -DBUILD_TOXAV=OFF \
-DENABLE_SHARED=OFF \ -DENABLE_SHARED=OFF \
-DBOOTSTRAP_DAEMON=OFF \ -DBOOTSTRAP_DAEMON=OFF \
-DCMAKE_INSTALL_PREFIX:PATH="/usr/local" \
-DMIN_LOGGER_LEVEL=DEBUG \ -DMIN_LOGGER_LEVEL=DEBUG \
&& emmake cmake --build _build --parallel 8 --target install && emmake cmake --build _build --parallel 8 --target install
@ -79,6 +89,7 @@ RUN . "/work/emsdk/emsdk_env.sh" \
-s MODULARIZE=1 \ -s MODULARIZE=1 \
-s STRICT=1 \ -s STRICT=1 \
-s WEBSOCKET_URL=wss:// \ -s WEBSOCKET_URL=wss:// \
/usr/local/lib/libmsgpackc.a \
/usr/local/lib/libsodium.a \ /usr/local/lib/libsodium.a \
/usr/local/lib/libtoxcore.a \ /usr/local/lib/libtoxcore.a \
-o /work/wasm/libtoxcore.js -o /work/wasm/libtoxcore.js

3
other/emscripten/build Executable file
View File

@ -0,0 +1,3 @@
#!/bin/sh
docker build -t toxchat/toxcore-js -f other/emscripten/Dockerfile .

View File

@ -471,6 +471,7 @@ cc_library(
deps = [ deps = [
":ccompat", ":ccompat",
":toxcore", ":toxcore",
"@msgpack-c",
], ],
) )

View File

@ -24,6 +24,13 @@ struct Tox_Event_Conference_Connected {
uint32_t conference_number; uint32_t conference_number;
}; };
static void tox_event_conference_connected_pack(const Tox_Event_Conference_Connected *event, msgpack_packer *mp)
{
assert(event != nullptr);
msgpack_pack_array(mp, 1);
msgpack_pack_uint32(mp, event->conference_number);
}
static void tox_event_conference_connected_construct(Tox_Event_Conference_Connected *conference_connected) static void tox_event_conference_connected_construct(Tox_Event_Conference_Connected *conference_connected)
{ {
*conference_connected = (Tox_Event_Conference_Connected) { *conference_connected = (Tox_Event_Conference_Connected) {
@ -100,6 +107,10 @@ void tox_events_clear_conference_connected(Tox_Events *events)
uint32_t tox_events_get_conference_connected_size(const Tox_Events *events) uint32_t tox_events_get_conference_connected_size(const Tox_Events *events)
{ {
if (events == nullptr) {
return 0;
}
return events->conference_connected_size; return events->conference_connected_size;
} }
@ -110,6 +121,17 @@ const Tox_Event_Conference_Connected *tox_events_get_conference_connected(const
return &events->conference_connected[index]; return &events->conference_connected[index];
} }
void tox_events_pack_conference_connected(const Tox_Events *events, msgpack_packer *mp)
{
const uint32_t size = tox_events_get_conference_connected_size(events);
msgpack_pack_array(mp, size);
for (uint32_t i = 0; i < size; ++i) {
tox_event_conference_connected_pack(tox_events_get_conference_connected(events, i), mp);
}
}
/***************************************************** /*****************************************************
* *

View File

@ -27,6 +27,16 @@ struct Tox_Event_Conference_Invite {
size_t cookie_length; size_t cookie_length;
}; };
static void tox_event_conference_invite_pack(const Tox_Event_Conference_Invite *event, msgpack_packer *mp)
{
assert(event != nullptr);
msgpack_pack_array(mp, 3);
msgpack_pack_uint32(mp, event->friend_number);
msgpack_pack_uint32(mp, event->type);
msgpack_pack_bin(mp, event->cookie_length);
msgpack_pack_bin_body(mp, event->cookie, event->cookie_length);
}
static void tox_event_conference_invite_construct(Tox_Event_Conference_Invite *conference_invite) static void tox_event_conference_invite_construct(Tox_Event_Conference_Invite *conference_invite)
{ {
*conference_invite = (Tox_Event_Conference_Invite) { *conference_invite = (Tox_Event_Conference_Invite) {
@ -146,6 +156,10 @@ void tox_events_clear_conference_invite(Tox_Events *events)
uint32_t tox_events_get_conference_invite_size(const Tox_Events *events) uint32_t tox_events_get_conference_invite_size(const Tox_Events *events)
{ {
if (events == nullptr) {
return 0;
}
return events->conference_invite_size; return events->conference_invite_size;
} }
@ -156,6 +170,17 @@ const Tox_Event_Conference_Invite *tox_events_get_conference_invite(const Tox_Ev
return &events->conference_invite[index]; return &events->conference_invite[index];
} }
void tox_events_pack_conference_invite(const Tox_Events *events, msgpack_packer *mp)
{
const uint32_t size = tox_events_get_conference_invite_size(events);
msgpack_pack_array(mp, size);
for (uint32_t i = 0; i < size; ++i) {
tox_event_conference_invite_pack(tox_events_get_conference_invite(events, i), mp);
}
}
/***************************************************** /*****************************************************
* *

View File

@ -28,6 +28,17 @@ struct Tox_Event_Conference_Message {
size_t message_length; size_t message_length;
}; };
static void tox_event_conference_message_pack(const Tox_Event_Conference_Message *event, msgpack_packer *mp)
{
assert(event != nullptr);
msgpack_pack_array(mp, 5);
msgpack_pack_uint32(mp, event->conference_number);
msgpack_pack_uint32(mp, event->peer_number);
msgpack_pack_uint32(mp, event->type);
msgpack_pack_bin(mp, event->message_length);
msgpack_pack_bin_body(mp, event->message, event->message_length);
}
static void tox_event_conference_message_construct(Tox_Event_Conference_Message *conference_message) static void tox_event_conference_message_construct(Tox_Event_Conference_Message *conference_message)
{ {
*conference_message = (Tox_Event_Conference_Message) { *conference_message = (Tox_Event_Conference_Message) {
@ -158,6 +169,10 @@ void tox_events_clear_conference_message(Tox_Events *events)
uint32_t tox_events_get_conference_message_size(const Tox_Events *events) uint32_t tox_events_get_conference_message_size(const Tox_Events *events)
{ {
if (events == nullptr) {
return 0;
}
return events->conference_message_size; return events->conference_message_size;
} }
@ -168,6 +183,17 @@ const Tox_Event_Conference_Message *tox_events_get_conference_message(const Tox_
return &events->conference_message[index]; return &events->conference_message[index];
} }
void tox_events_pack_conference_message(const Tox_Events *events, msgpack_packer *mp)
{
const uint32_t size = tox_events_get_conference_message_size(events);
msgpack_pack_array(mp, size);
for (uint32_t i = 0; i < size; ++i) {
tox_event_conference_message_pack(tox_events_get_conference_message(events, i), mp);
}
}
/***************************************************** /*****************************************************
* *

View File

@ -24,6 +24,14 @@ struct Tox_Event_Conference_Peer_List_Changed {
uint32_t conference_number; uint32_t conference_number;
}; };
static void tox_event_conference_peer_list_changed_pack(const Tox_Event_Conference_Peer_List_Changed *event,
msgpack_packer *mp)
{
assert(event != nullptr);
msgpack_pack_array(mp, 1);
msgpack_pack_uint32(mp, event->conference_number);
}
static void tox_event_conference_peer_list_changed_construct(Tox_Event_Conference_Peer_List_Changed static void tox_event_conference_peer_list_changed_construct(Tox_Event_Conference_Peer_List_Changed
*conference_peer_list_changed) *conference_peer_list_changed)
{ {
@ -104,6 +112,10 @@ void tox_events_clear_conference_peer_list_changed(Tox_Events *events)
uint32_t tox_events_get_conference_peer_list_changed_size(const Tox_Events *events) uint32_t tox_events_get_conference_peer_list_changed_size(const Tox_Events *events)
{ {
if (events == nullptr) {
return 0;
}
return events->conference_peer_list_changed_size; return events->conference_peer_list_changed_size;
} }
@ -115,6 +127,17 @@ const Tox_Event_Conference_Peer_List_Changed *tox_events_get_conference_peer_lis
return &events->conference_peer_list_changed[index]; return &events->conference_peer_list_changed[index];
} }
void tox_events_pack_conference_peer_list_changed(const Tox_Events *events, msgpack_packer *mp)
{
const uint32_t size = tox_events_get_conference_peer_list_changed_size(events);
msgpack_pack_array(mp, size);
for (uint32_t i = 0; i < size; ++i) {
tox_event_conference_peer_list_changed_pack(tox_events_get_conference_peer_list_changed(events, i), mp);
}
}
/***************************************************** /*****************************************************
* *

View File

@ -27,6 +27,16 @@ struct Tox_Event_Conference_Peer_Name {
size_t name_length; size_t name_length;
}; };
static void tox_event_conference_peer_name_pack(const Tox_Event_Conference_Peer_Name *event, msgpack_packer *mp)
{
assert(event != nullptr);
msgpack_pack_array(mp, 3);
msgpack_pack_uint32(mp, event->conference_number);
msgpack_pack_uint32(mp, event->peer_number);
msgpack_pack_bin(mp, event->name_length);
msgpack_pack_bin_body(mp, event->name, event->name_length);
}
static void tox_event_conference_peer_name_construct(Tox_Event_Conference_Peer_Name *conference_peer_name) static void tox_event_conference_peer_name_construct(Tox_Event_Conference_Peer_Name *conference_peer_name)
{ {
*conference_peer_name = (Tox_Event_Conference_Peer_Name) { *conference_peer_name = (Tox_Event_Conference_Peer_Name) {
@ -147,6 +157,10 @@ void tox_events_clear_conference_peer_name(Tox_Events *events)
uint32_t tox_events_get_conference_peer_name_size(const Tox_Events *events) uint32_t tox_events_get_conference_peer_name_size(const Tox_Events *events)
{ {
if (events == nullptr) {
return 0;
}
return events->conference_peer_name_size; return events->conference_peer_name_size;
} }
@ -157,6 +171,17 @@ const Tox_Event_Conference_Peer_Name *tox_events_get_conference_peer_name(const
return &events->conference_peer_name[index]; return &events->conference_peer_name[index];
} }
void tox_events_pack_conference_peer_name(const Tox_Events *events, msgpack_packer *mp)
{
const uint32_t size = tox_events_get_conference_peer_name_size(events);
msgpack_pack_array(mp, size);
for (uint32_t i = 0; i < size; ++i) {
tox_event_conference_peer_name_pack(tox_events_get_conference_peer_name(events, i), mp);
}
}
/***************************************************** /*****************************************************
* *

View File

@ -27,6 +27,16 @@ struct Tox_Event_Conference_Title {
size_t title_length; size_t title_length;
}; };
static void tox_event_conference_title_pack(const Tox_Event_Conference_Title *event, msgpack_packer *mp)
{
assert(event != nullptr);
msgpack_pack_array(mp, 3);
msgpack_pack_uint32(mp, event->conference_number);
msgpack_pack_uint32(mp, event->peer_number);
msgpack_pack_bin(mp, event->title_length);
msgpack_pack_bin_body(mp, event->title, event->title_length);
}
static void tox_event_conference_title_construct(Tox_Event_Conference_Title *conference_title) static void tox_event_conference_title_construct(Tox_Event_Conference_Title *conference_title)
{ {
*conference_title = (Tox_Event_Conference_Title) { *conference_title = (Tox_Event_Conference_Title) {
@ -145,6 +155,10 @@ void tox_events_clear_conference_title(Tox_Events *events)
uint32_t tox_events_get_conference_title_size(const Tox_Events *events) uint32_t tox_events_get_conference_title_size(const Tox_Events *events)
{ {
if (events == nullptr) {
return 0;
}
return events->conference_title_size; return events->conference_title_size;
} }
@ -155,6 +169,17 @@ const Tox_Event_Conference_Title *tox_events_get_conference_title(const Tox_Even
return &events->conference_title[index]; return &events->conference_title[index];
} }
void tox_events_pack_conference_title(const Tox_Events *events, msgpack_packer *mp)
{
const uint32_t size = tox_events_get_conference_title_size(events);
msgpack_pack_array(mp, size);
for (uint32_t i = 0; i < size; ++i) {
tox_event_conference_title_pack(tox_events_get_conference_title(events, i), mp);
}
}
/***************************************************** /*****************************************************
* *

View File

@ -5,6 +5,8 @@
#ifndef C_TOXCORE_TOXCORE_TOX_EVENTS_INTERNAL_H #ifndef C_TOXCORE_TOXCORE_TOX_EVENTS_INTERNAL_H
#define C_TOXCORE_TOXCORE_TOX_EVENTS_INTERNAL_H #define C_TOXCORE_TOXCORE_TOX_EVENTS_INTERNAL_H
#include <msgpack.h>
#include "../tox_events.h" #include "../tox_events.h"
#ifdef __cplusplus #ifdef __cplusplus
@ -146,6 +148,30 @@ void tox_events_clear_friend_status(Tox_Events *events);
void tox_events_clear_friend_typing(Tox_Events *events); void tox_events_clear_friend_typing(Tox_Events *events);
void tox_events_clear_self_connection_status(Tox_Events *events); void tox_events_clear_self_connection_status(Tox_Events *events);
void tox_events_pack_conference_connected(const Tox_Events *events, msgpack_packer *mp);
void tox_events_pack_conference_invite(const Tox_Events *events, msgpack_packer *mp);
void tox_events_pack_conference_message(const Tox_Events *events, msgpack_packer *mp);
void tox_events_pack_conference_peer_list_changed(const Tox_Events *events, msgpack_packer *mp);
void tox_events_pack_conference_peer_name(const Tox_Events *events, msgpack_packer *mp);
void tox_events_pack_conference_title(const Tox_Events *events, msgpack_packer *mp);
void tox_events_pack_file_chunk_request(const Tox_Events *events, msgpack_packer *mp);
void tox_events_pack_file_recv_chunk(const Tox_Events *events, msgpack_packer *mp);
void tox_events_pack_file_recv_control(const Tox_Events *events, msgpack_packer *mp);
void tox_events_pack_file_recv(const Tox_Events *events, msgpack_packer *mp);
void tox_events_pack_friend_connection_status(const Tox_Events *events, msgpack_packer *mp);
void tox_events_pack_friend_lossless_packet(const Tox_Events *events, msgpack_packer *mp);
void tox_events_pack_friend_lossy_packet(const Tox_Events *events, msgpack_packer *mp);
void tox_events_pack_friend_message(const Tox_Events *events, msgpack_packer *mp);
void tox_events_pack_friend_name(const Tox_Events *events, msgpack_packer *mp);
void tox_events_pack_friend_read_receipt(const Tox_Events *events, msgpack_packer *mp);
void tox_events_pack_friend_request(const Tox_Events *events, msgpack_packer *mp);
void tox_events_pack_friend_status_message(const Tox_Events *events, msgpack_packer *mp);
void tox_events_pack_friend_status(const Tox_Events *events, msgpack_packer *mp);
void tox_events_pack_friend_typing(const Tox_Events *events, msgpack_packer *mp);
void tox_events_pack_self_connection_status(const Tox_Events *events, msgpack_packer *mp);
void tox_events_pack(const Tox_Events *events, msgpack_packer *mp);
Tox_Events_State *tox_events_alloc(void *user_data); Tox_Events_State *tox_events_alloc(void *user_data);
#ifdef __cplusplus #ifdef __cplusplus

View File

@ -27,6 +27,16 @@ struct Tox_Event_File_Chunk_Request {
size_t length; size_t length;
}; };
static void tox_event_file_chunk_request_pack(const Tox_Event_File_Chunk_Request *event, msgpack_packer *mp)
{
assert(event != nullptr);
msgpack_pack_array(mp, 4);
msgpack_pack_uint32(mp, event->friend_number);
msgpack_pack_uint32(mp, event->file_number);
msgpack_pack_uint64(mp, event->position);
msgpack_pack_uint16(mp, event->length);
}
static void tox_event_file_chunk_request_construct(Tox_Event_File_Chunk_Request *file_chunk_request) static void tox_event_file_chunk_request_construct(Tox_Event_File_Chunk_Request *file_chunk_request)
{ {
*file_chunk_request = (Tox_Event_File_Chunk_Request) { *file_chunk_request = (Tox_Event_File_Chunk_Request) {
@ -136,6 +146,10 @@ void tox_events_clear_file_chunk_request(Tox_Events *events)
uint32_t tox_events_get_file_chunk_request_size(const Tox_Events *events) uint32_t tox_events_get_file_chunk_request_size(const Tox_Events *events)
{ {
if (events == nullptr) {
return 0;
}
return events->file_chunk_request_size; return events->file_chunk_request_size;
} }
@ -146,6 +160,17 @@ const Tox_Event_File_Chunk_Request *tox_events_get_file_chunk_request(const Tox_
return &events->file_chunk_request[index]; return &events->file_chunk_request[index];
} }
void tox_events_pack_file_chunk_request(const Tox_Events *events, msgpack_packer *mp)
{
const uint32_t size = tox_events_get_file_chunk_request_size(events);
msgpack_pack_array(mp, size);
for (uint32_t i = 0; i < size; ++i) {
tox_event_file_chunk_request_pack(tox_events_get_file_chunk_request(events, i), mp);
}
}
/***************************************************** /*****************************************************
* *

View File

@ -29,6 +29,18 @@ struct Tox_Event_File_Recv {
size_t filename_length; size_t filename_length;
}; };
static void tox_event_file_recv_pack(const Tox_Event_File_Recv *event, msgpack_packer *mp)
{
assert(event != nullptr);
msgpack_pack_array(mp, 5);
msgpack_pack_uint32(mp, event->friend_number);
msgpack_pack_uint32(mp, event->file_number);
msgpack_pack_uint32(mp, event->kind);
msgpack_pack_uint64(mp, event->file_size);
msgpack_pack_bin(mp, event->filename_length);
msgpack_pack_bin_body(mp, event->filename, event->filename_length);
}
static void tox_event_file_recv_construct(Tox_Event_File_Recv *file_recv) static void tox_event_file_recv_construct(Tox_Event_File_Recv *file_recv)
{ {
*file_recv = (Tox_Event_File_Recv) { *file_recv = (Tox_Event_File_Recv) {
@ -171,6 +183,10 @@ void tox_events_clear_file_recv(Tox_Events *events)
uint32_t tox_events_get_file_recv_size(const Tox_Events *events) uint32_t tox_events_get_file_recv_size(const Tox_Events *events)
{ {
if (events == nullptr) {
return 0;
}
return events->file_recv_size; return events->file_recv_size;
} }
@ -181,6 +197,17 @@ const Tox_Event_File_Recv *tox_events_get_file_recv(const Tox_Events *events, ui
return &events->file_recv[index]; return &events->file_recv[index];
} }
void tox_events_pack_file_recv(const Tox_Events *events, msgpack_packer *mp)
{
const uint32_t size = tox_events_get_file_recv_size(events);
msgpack_pack_array(mp, size);
for (uint32_t i = 0; i < size; ++i) {
tox_event_file_recv_pack(tox_events_get_file_recv(events, i), mp);
}
}
/***************************************************** /*****************************************************
* *

View File

@ -28,6 +28,17 @@ struct Tox_Event_File_Recv_Chunk {
size_t data_length; size_t data_length;
}; };
static void tox_event_file_recv_chunk_pack(const Tox_Event_File_Recv_Chunk *event, msgpack_packer *mp)
{
assert(event != nullptr);
msgpack_pack_array(mp, 4);
msgpack_pack_uint32(mp, event->friend_number);
msgpack_pack_uint32(mp, event->file_number);
msgpack_pack_uint64(mp, event->position);
msgpack_pack_bin(mp, event->data_length);
msgpack_pack_bin_body(mp, event->data, event->data_length);
}
static void tox_event_file_recv_chunk_construct(Tox_Event_File_Recv_Chunk *file_recv_chunk) static void tox_event_file_recv_chunk_construct(Tox_Event_File_Recv_Chunk *file_recv_chunk)
{ {
*file_recv_chunk = (Tox_Event_File_Recv_Chunk) { *file_recv_chunk = (Tox_Event_File_Recv_Chunk) {
@ -158,6 +169,10 @@ void tox_events_clear_file_recv_chunk(Tox_Events *events)
uint32_t tox_events_get_file_recv_chunk_size(const Tox_Events *events) uint32_t tox_events_get_file_recv_chunk_size(const Tox_Events *events)
{ {
if (events == nullptr) {
return 0;
}
return events->file_recv_chunk_size; return events->file_recv_chunk_size;
} }
@ -168,6 +183,17 @@ const Tox_Event_File_Recv_Chunk *tox_events_get_file_recv_chunk(const Tox_Events
return &events->file_recv_chunk[index]; return &events->file_recv_chunk[index];
} }
void tox_events_pack_file_recv_chunk(const Tox_Events *events, msgpack_packer *mp)
{
const uint32_t size = tox_events_get_file_recv_chunk_size(events);
msgpack_pack_array(mp, size);
for (uint32_t i = 0; i < size; ++i) {
tox_event_file_recv_chunk_pack(tox_events_get_file_recv_chunk(events, i), mp);
}
}
/***************************************************** /*****************************************************
* *

View File

@ -26,6 +26,15 @@ struct Tox_Event_File_Recv_Control {
Tox_File_Control control; Tox_File_Control control;
}; };
static void tox_event_file_recv_control_pack(const Tox_Event_File_Recv_Control *event, msgpack_packer *mp)
{
assert(event != nullptr);
msgpack_pack_array(mp, 3);
msgpack_pack_uint32(mp, event->friend_number);
msgpack_pack_uint32(mp, event->file_number);
msgpack_pack_uint32(mp, event->control);
}
static void tox_event_file_recv_control_construct(Tox_Event_File_Recv_Control *file_recv_control) static void tox_event_file_recv_control_construct(Tox_Event_File_Recv_Control *file_recv_control)
{ {
*file_recv_control = (Tox_Event_File_Recv_Control) { *file_recv_control = (Tox_Event_File_Recv_Control) {
@ -124,6 +133,10 @@ void tox_events_clear_file_recv_control(Tox_Events *events)
uint32_t tox_events_get_file_recv_control_size(const Tox_Events *events) uint32_t tox_events_get_file_recv_control_size(const Tox_Events *events)
{ {
if (events == nullptr) {
return 0;
}
return events->file_recv_control_size; return events->file_recv_control_size;
} }
@ -134,6 +147,17 @@ const Tox_Event_File_Recv_Control *tox_events_get_file_recv_control(const Tox_Ev
return &events->file_recv_control[index]; return &events->file_recv_control[index];
} }
void tox_events_pack_file_recv_control(const Tox_Events *events, msgpack_packer *mp)
{
const uint32_t size = tox_events_get_file_recv_control_size(events);
msgpack_pack_array(mp, size);
for (uint32_t i = 0; i < size; ++i) {
tox_event_file_recv_control_pack(tox_events_get_file_recv_control(events, i), mp);
}
}
/***************************************************** /*****************************************************
* *

View File

@ -25,6 +25,14 @@ struct Tox_Event_Friend_Connection_Status {
Tox_Connection connection_status; Tox_Connection connection_status;
}; };
static void tox_event_friend_connection_status_pack(const Tox_Event_Friend_Connection_Status *event, msgpack_packer *mp)
{
assert(event != nullptr);
msgpack_pack_array(mp, 2);
msgpack_pack_uint32(mp, event->friend_number);
msgpack_pack_uint32(mp, event->connection_status);
}
static void tox_event_friend_connection_status_construct(Tox_Event_Friend_Connection_Status *friend_connection_status) static void tox_event_friend_connection_status_construct(Tox_Event_Friend_Connection_Status *friend_connection_status)
{ {
*friend_connection_status = (Tox_Event_Friend_Connection_Status) { *friend_connection_status = (Tox_Event_Friend_Connection_Status) {
@ -114,6 +122,10 @@ void tox_events_clear_friend_connection_status(Tox_Events *events)
uint32_t tox_events_get_friend_connection_status_size(const Tox_Events *events) uint32_t tox_events_get_friend_connection_status_size(const Tox_Events *events)
{ {
if (events == nullptr) {
return 0;
}
return events->friend_connection_status_size; return events->friend_connection_status_size;
} }
@ -125,6 +137,17 @@ const Tox_Event_Friend_Connection_Status *tox_events_get_friend_connection_statu
return &events->friend_connection_status[index]; return &events->friend_connection_status[index];
} }
void tox_events_pack_friend_connection_status(const Tox_Events *events, msgpack_packer *mp)
{
const uint32_t size = tox_events_get_friend_connection_status_size(events);
msgpack_pack_array(mp, size);
for (uint32_t i = 0; i < size; ++i) {
tox_event_friend_connection_status_pack(tox_events_get_friend_connection_status(events, i), mp);
}
}
/***************************************************** /*****************************************************
* *

View File

@ -26,6 +26,15 @@ struct Tox_Event_Friend_Lossless_Packet {
size_t data_length; size_t data_length;
}; };
static void tox_event_friend_lossless_packet_pack(const Tox_Event_Friend_Lossless_Packet *event, msgpack_packer *mp)
{
assert(event != nullptr);
msgpack_pack_array(mp, 2);
msgpack_pack_uint32(mp, event->friend_number);
msgpack_pack_bin(mp, event->data_length);
msgpack_pack_bin_body(mp, event->data, event->data_length);
}
static void tox_event_friend_lossless_packet_construct(Tox_Event_Friend_Lossless_Packet *friend_lossless_packet) static void tox_event_friend_lossless_packet_construct(Tox_Event_Friend_Lossless_Packet *friend_lossless_packet)
{ {
*friend_lossless_packet = (Tox_Event_Friend_Lossless_Packet) { *friend_lossless_packet = (Tox_Event_Friend_Lossless_Packet) {
@ -134,6 +143,10 @@ void tox_events_clear_friend_lossless_packet(Tox_Events *events)
uint32_t tox_events_get_friend_lossless_packet_size(const Tox_Events *events) uint32_t tox_events_get_friend_lossless_packet_size(const Tox_Events *events)
{ {
if (events == nullptr) {
return 0;
}
return events->friend_lossless_packet_size; return events->friend_lossless_packet_size;
} }
@ -144,6 +157,17 @@ const Tox_Event_Friend_Lossless_Packet *tox_events_get_friend_lossless_packet(co
return &events->friend_lossless_packet[index]; return &events->friend_lossless_packet[index];
} }
void tox_events_pack_friend_lossless_packet(const Tox_Events *events, msgpack_packer *mp)
{
const uint32_t size = tox_events_get_friend_lossless_packet_size(events);
msgpack_pack_array(mp, size);
for (uint32_t i = 0; i < size; ++i) {
tox_event_friend_lossless_packet_pack(tox_events_get_friend_lossless_packet(events, i), mp);
}
}
/***************************************************** /*****************************************************
* *

View File

@ -26,6 +26,15 @@ struct Tox_Event_Friend_Lossy_Packet {
size_t data_length; size_t data_length;
}; };
static void tox_event_friend_lossy_packet_pack(const Tox_Event_Friend_Lossy_Packet *event, msgpack_packer *mp)
{
assert(event != nullptr);
msgpack_pack_array(mp, 2);
msgpack_pack_uint32(mp, event->friend_number);
msgpack_pack_bin(mp, event->data_length);
msgpack_pack_bin_body(mp, event->data, event->data_length);
}
static void tox_event_friend_lossy_packet_construct(Tox_Event_Friend_Lossy_Packet *friend_lossy_packet) static void tox_event_friend_lossy_packet_construct(Tox_Event_Friend_Lossy_Packet *friend_lossy_packet)
{ {
*friend_lossy_packet = (Tox_Event_Friend_Lossy_Packet) { *friend_lossy_packet = (Tox_Event_Friend_Lossy_Packet) {
@ -133,6 +142,10 @@ void tox_events_clear_friend_lossy_packet(Tox_Events *events)
uint32_t tox_events_get_friend_lossy_packet_size(const Tox_Events *events) uint32_t tox_events_get_friend_lossy_packet_size(const Tox_Events *events)
{ {
if (events == nullptr) {
return 0;
}
return events->friend_lossy_packet_size; return events->friend_lossy_packet_size;
} }
@ -143,6 +156,17 @@ const Tox_Event_Friend_Lossy_Packet *tox_events_get_friend_lossy_packet(const To
return &events->friend_lossy_packet[index]; return &events->friend_lossy_packet[index];
} }
void tox_events_pack_friend_lossy_packet(const Tox_Events *events, msgpack_packer *mp)
{
const uint32_t size = tox_events_get_friend_lossy_packet_size(events);
msgpack_pack_array(mp, size);
for (uint32_t i = 0; i < size; ++i) {
tox_event_friend_lossy_packet_pack(tox_events_get_friend_lossy_packet(events, i), mp);
}
}
/***************************************************** /*****************************************************
* *

View File

@ -27,6 +27,16 @@ struct Tox_Event_Friend_Message {
size_t message_length; size_t message_length;
}; };
static void tox_event_friend_message_pack(const Tox_Event_Friend_Message *event, msgpack_packer *mp)
{
assert(event != nullptr);
msgpack_pack_array(mp, 3);
msgpack_pack_uint32(mp, event->friend_number);
msgpack_pack_uint32(mp, event->type);
msgpack_pack_bin(mp, event->message_length);
msgpack_pack_bin_body(mp, event->message, event->message_length);
}
static void tox_event_friend_message_construct(Tox_Event_Friend_Message *friend_message) static void tox_event_friend_message_construct(Tox_Event_Friend_Message *friend_message)
{ {
*friend_message = (Tox_Event_Friend_Message) { *friend_message = (Tox_Event_Friend_Message) {
@ -144,6 +154,10 @@ void tox_events_clear_friend_message(Tox_Events *events)
uint32_t tox_events_get_friend_message_size(const Tox_Events *events) uint32_t tox_events_get_friend_message_size(const Tox_Events *events)
{ {
if (events == nullptr) {
return 0;
}
return events->friend_message_size; return events->friend_message_size;
} }
@ -154,6 +168,17 @@ const Tox_Event_Friend_Message *tox_events_get_friend_message(const Tox_Events *
return &events->friend_message[index]; return &events->friend_message[index];
} }
void tox_events_pack_friend_message(const Tox_Events *events, msgpack_packer *mp)
{
const uint32_t size = tox_events_get_friend_message_size(events);
msgpack_pack_array(mp, size);
for (uint32_t i = 0; i < size; ++i) {
tox_event_friend_message_pack(tox_events_get_friend_message(events, i), mp);
}
}
/***************************************************** /*****************************************************
* *

View File

@ -26,6 +26,15 @@ struct Tox_Event_Friend_Name {
size_t name_length; size_t name_length;
}; };
static void tox_event_friend_name_pack(const Tox_Event_Friend_Name *event, msgpack_packer *mp)
{
assert(event != nullptr);
msgpack_pack_array(mp, 2);
msgpack_pack_uint32(mp, event->friend_number);
msgpack_pack_bin(mp, event->name_length);
msgpack_pack_bin_body(mp, event->name, event->name_length);
}
static void tox_event_friend_name_construct(Tox_Event_Friend_Name *friend_name) static void tox_event_friend_name_construct(Tox_Event_Friend_Name *friend_name)
{ {
*friend_name = (Tox_Event_Friend_Name) { *friend_name = (Tox_Event_Friend_Name) {
@ -132,6 +141,10 @@ void tox_events_clear_friend_name(Tox_Events *events)
uint32_t tox_events_get_friend_name_size(const Tox_Events *events) uint32_t tox_events_get_friend_name_size(const Tox_Events *events)
{ {
if (events == nullptr) {
return 0;
}
return events->friend_name_size; return events->friend_name_size;
} }
@ -142,6 +155,17 @@ const Tox_Event_Friend_Name *tox_events_get_friend_name(const Tox_Events *events
return &events->friend_name[index]; return &events->friend_name[index];
} }
void tox_events_pack_friend_name(const Tox_Events *events, msgpack_packer *mp)
{
const uint32_t size = tox_events_get_friend_name_size(events);
msgpack_pack_array(mp, size);
for (uint32_t i = 0; i < size; ++i) {
tox_event_friend_name_pack(tox_events_get_friend_name(events, i), mp);
}
}
/***************************************************** /*****************************************************
* *

View File

@ -25,6 +25,14 @@ struct Tox_Event_Friend_Read_Receipt {
uint32_t message_id; uint32_t message_id;
}; };
static void tox_event_friend_read_receipt_pack(const Tox_Event_Friend_Read_Receipt *event, msgpack_packer *mp)
{
assert(event != nullptr);
msgpack_pack_array(mp, 2);
msgpack_pack_uint32(mp, event->friend_number);
msgpack_pack_uint32(mp, event->message_id);
}
static void tox_event_friend_read_receipt_construct(Tox_Event_Friend_Read_Receipt *friend_read_receipt) static void tox_event_friend_read_receipt_construct(Tox_Event_Friend_Read_Receipt *friend_read_receipt)
{ {
*friend_read_receipt = (Tox_Event_Friend_Read_Receipt) { *friend_read_receipt = (Tox_Event_Friend_Read_Receipt) {
@ -112,6 +120,10 @@ void tox_events_clear_friend_read_receipt(Tox_Events *events)
uint32_t tox_events_get_friend_read_receipt_size(const Tox_Events *events) uint32_t tox_events_get_friend_read_receipt_size(const Tox_Events *events)
{ {
if (events == nullptr) {
return 0;
}
return events->friend_read_receipt_size; return events->friend_read_receipt_size;
} }
@ -122,6 +134,17 @@ const Tox_Event_Friend_Read_Receipt *tox_events_get_friend_read_receipt(const To
return &events->friend_read_receipt[index]; return &events->friend_read_receipt[index];
} }
void tox_events_pack_friend_read_receipt(const Tox_Events *events, msgpack_packer *mp)
{
const uint32_t size = tox_events_get_friend_read_receipt_size(events);
msgpack_pack_array(mp, size);
for (uint32_t i = 0; i < size; ++i) {
tox_event_friend_read_receipt_pack(tox_events_get_friend_read_receipt(events, i), mp);
}
}
/***************************************************** /*****************************************************
* *

View File

@ -26,6 +26,16 @@ struct Tox_Event_Friend_Request {
size_t message_length; size_t message_length;
}; };
static void tox_event_friend_request_pack(const Tox_Event_Friend_Request *event, msgpack_packer *mp)
{
assert(event != nullptr);
msgpack_pack_array(mp, 2);
msgpack_pack_bin(mp, TOX_PUBLIC_KEY_SIZE);
msgpack_pack_bin_body(mp, event->public_key, TOX_PUBLIC_KEY_SIZE);
msgpack_pack_bin(mp, event->message_length);
msgpack_pack_bin_body(mp, event->message, event->message_length);
}
static void tox_event_friend_request_construct(Tox_Event_Friend_Request *friend_request) static void tox_event_friend_request_construct(Tox_Event_Friend_Request *friend_request)
{ {
*friend_request = (Tox_Event_Friend_Request) { *friend_request = (Tox_Event_Friend_Request) {
@ -133,6 +143,10 @@ void tox_events_clear_friend_request(Tox_Events *events)
uint32_t tox_events_get_friend_request_size(const Tox_Events *events) uint32_t tox_events_get_friend_request_size(const Tox_Events *events)
{ {
if (events == nullptr) {
return 0;
}
return events->friend_request_size; return events->friend_request_size;
} }
@ -143,6 +157,17 @@ const Tox_Event_Friend_Request *tox_events_get_friend_request(const Tox_Events *
return &events->friend_request[index]; return &events->friend_request[index];
} }
void tox_events_pack_friend_request(const Tox_Events *events, msgpack_packer *mp)
{
const uint32_t size = tox_events_get_friend_request_size(events);
msgpack_pack_array(mp, size);
for (uint32_t i = 0; i < size; ++i) {
tox_event_friend_request_pack(tox_events_get_friend_request(events, i), mp);
}
}
/***************************************************** /*****************************************************
* *

View File

@ -25,6 +25,14 @@ struct Tox_Event_Friend_Status {
Tox_User_Status connection_status; Tox_User_Status connection_status;
}; };
static void tox_event_friend_status_pack(const Tox_Event_Friend_Status *event, msgpack_packer *mp)
{
assert(event != nullptr);
msgpack_pack_array(mp, 2);
msgpack_pack_uint32(mp, event->friend_number);
msgpack_pack_uint32(mp, event->connection_status);
}
static void tox_event_friend_status_construct(Tox_Event_Friend_Status *friend_status) static void tox_event_friend_status_construct(Tox_Event_Friend_Status *friend_status)
{ {
*friend_status = (Tox_Event_Friend_Status) { *friend_status = (Tox_Event_Friend_Status) {
@ -111,6 +119,10 @@ void tox_events_clear_friend_status(Tox_Events *events)
uint32_t tox_events_get_friend_status_size(const Tox_Events *events) uint32_t tox_events_get_friend_status_size(const Tox_Events *events)
{ {
if (events == nullptr) {
return 0;
}
return events->friend_status_size; return events->friend_status_size;
} }
@ -121,6 +133,17 @@ const Tox_Event_Friend_Status *tox_events_get_friend_status(const Tox_Events *ev
return &events->friend_status[index]; return &events->friend_status[index];
} }
void tox_events_pack_friend_status(const Tox_Events *events, msgpack_packer *mp)
{
const uint32_t size = tox_events_get_friend_status_size(events);
msgpack_pack_array(mp, size);
for (uint32_t i = 0; i < size; ++i) {
tox_event_friend_status_pack(tox_events_get_friend_status(events, i), mp);
}
}
/***************************************************** /*****************************************************
* *

View File

@ -26,6 +26,15 @@ struct Tox_Event_Friend_Status_Message {
size_t status_message_length; size_t status_message_length;
}; };
static void tox_event_friend_status_message_pack(const Tox_Event_Friend_Status_Message *event, msgpack_packer *mp)
{
assert(event != nullptr);
msgpack_pack_array(mp, 2);
msgpack_pack_uint32(mp, event->friend_number);
msgpack_pack_bin(mp, event->status_message_length);
msgpack_pack_bin_body(mp, event->status_message, event->status_message_length);
}
static void tox_event_friend_status_message_construct(Tox_Event_Friend_Status_Message *friend_status_message) static void tox_event_friend_status_message_construct(Tox_Event_Friend_Status_Message *friend_status_message)
{ {
*friend_status_message = (Tox_Event_Friend_Status_Message) { *friend_status_message = (Tox_Event_Friend_Status_Message) {
@ -135,6 +144,10 @@ void tox_events_clear_friend_status_message(Tox_Events *events)
uint32_t tox_events_get_friend_status_message_size(const Tox_Events *events) uint32_t tox_events_get_friend_status_message_size(const Tox_Events *events)
{ {
if (events == nullptr) {
return 0;
}
return events->friend_status_message_size; return events->friend_status_message_size;
} }
@ -145,6 +158,17 @@ const Tox_Event_Friend_Status_Message *tox_events_get_friend_status_message(cons
return &events->friend_status_message[index]; return &events->friend_status_message[index];
} }
void tox_events_pack_friend_status_message(const Tox_Events *events, msgpack_packer *mp)
{
const uint32_t size = tox_events_get_friend_status_message_size(events);
msgpack_pack_array(mp, size);
for (uint32_t i = 0; i < size; ++i) {
tox_event_friend_status_message_pack(tox_events_get_friend_status_message(events, i), mp);
}
}
/***************************************************** /*****************************************************
* *

View File

@ -25,6 +25,19 @@ struct Tox_Event_Friend_Typing {
bool typing; bool typing;
}; };
static void tox_event_friend_typing_pack(const Tox_Event_Friend_Typing *event, msgpack_packer *mp)
{
assert(event != nullptr);
msgpack_pack_array(mp, 2);
msgpack_pack_uint32(mp, event->friend_number);
if (event->typing) {
msgpack_pack_true(mp);
} else {
msgpack_pack_false(mp);
}
}
static void tox_event_friend_typing_construct(Tox_Event_Friend_Typing *friend_typing) static void tox_event_friend_typing_construct(Tox_Event_Friend_Typing *friend_typing)
{ {
*friend_typing = (Tox_Event_Friend_Typing) { *friend_typing = (Tox_Event_Friend_Typing) {
@ -110,6 +123,10 @@ void tox_events_clear_friend_typing(Tox_Events *events)
uint32_t tox_events_get_friend_typing_size(const Tox_Events *events) uint32_t tox_events_get_friend_typing_size(const Tox_Events *events)
{ {
if (events == nullptr) {
return 0;
}
return events->friend_typing_size; return events->friend_typing_size;
} }
@ -120,6 +137,17 @@ const Tox_Event_Friend_Typing *tox_events_get_friend_typing(const Tox_Events *ev
return &events->friend_typing[index]; return &events->friend_typing[index];
} }
void tox_events_pack_friend_typing(const Tox_Events *events, msgpack_packer *mp)
{
const uint32_t size = tox_events_get_friend_typing_size(events);
msgpack_pack_array(mp, size);
for (uint32_t i = 0; i < size; ++i) {
tox_event_friend_typing_pack(tox_events_get_friend_typing(events, i), mp);
}
}
/***************************************************** /*****************************************************
* *

View File

@ -24,6 +24,13 @@ struct Tox_Event_Self_Connection_Status {
Tox_Connection connection_status; Tox_Connection connection_status;
}; };
static void tox_event_self_connection_status_pack(const Tox_Event_Self_Connection_Status *event, msgpack_packer *mp)
{
assert(event != nullptr);
msgpack_pack_array(mp, 1);
msgpack_pack_uint32(mp, event->connection_status);
}
static void tox_event_self_connection_status_construct(Tox_Event_Self_Connection_Status *self_connection_status) static void tox_event_self_connection_status_construct(Tox_Event_Self_Connection_Status *self_connection_status)
{ {
*self_connection_status = (Tox_Event_Self_Connection_Status) { *self_connection_status = (Tox_Event_Self_Connection_Status) {
@ -100,6 +107,10 @@ void tox_events_clear_self_connection_status(Tox_Events *events)
uint32_t tox_events_get_self_connection_status_size(const Tox_Events *events) uint32_t tox_events_get_self_connection_status_size(const Tox_Events *events)
{ {
if (events == nullptr) {
return 0;
}
return events->self_connection_status_size; return events->self_connection_status_size;
} }
@ -110,6 +121,17 @@ const Tox_Event_Self_Connection_Status *tox_events_get_self_connection_status(co
return &events->self_connection_status[index]; return &events->self_connection_status[index];
} }
void tox_events_pack_self_connection_status(const Tox_Events *events, msgpack_packer *mp)
{
const uint32_t size = tox_events_get_self_connection_status_size(events);
msgpack_pack_array(mp, size);
for (uint32_t i = 0; i < size; ++i) {
tox_event_self_connection_status_pack(tox_events_get_self_connection_status(events, i), mp);
}
}
/***************************************************** /*****************************************************
* *

View File

@ -4,6 +4,8 @@
#include "tox_events.h" #include "tox_events.h"
#include <msgpack.h>
#include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
@ -55,3 +57,84 @@ Tox_Events *tox_events_iterate(Tox *tox, Tox_Err_Events_Iterate *error)
return state.events; return state.events;
} }
void tox_events_pack(const Tox_Events *events, msgpack_packer *mp)
{
msgpack_pack_array(mp, 21);
tox_events_pack_conference_connected(events, mp);
tox_events_pack_conference_invite(events, mp);
tox_events_pack_conference_message(events, mp);
tox_events_pack_conference_peer_list_changed(events, mp);
tox_events_pack_conference_peer_name(events, mp);
tox_events_pack_conference_title(events, mp);
tox_events_pack_file_chunk_request(events, mp);
tox_events_pack_file_recv_chunk(events, mp);
tox_events_pack_file_recv_control(events, mp);
tox_events_pack_file_recv(events, mp);
tox_events_pack_friend_connection_status(events, mp);
tox_events_pack_friend_lossless_packet(events, mp);
tox_events_pack_friend_lossy_packet(events, mp);
tox_events_pack_friend_message(events, mp);
tox_events_pack_friend_name(events, mp);
tox_events_pack_friend_read_receipt(events, mp);
tox_events_pack_friend_request(events, mp);
tox_events_pack_friend_status_message(events, mp);
tox_events_pack_friend_status(events, mp);
tox_events_pack_friend_typing(events, mp);
tox_events_pack_self_connection_status(events, mp);
}
static int count_bytes(void *data, const char *buf, size_t len)
{
uint32_t *count = (uint32_t *)data;
assert(count != nullptr);
*count += len;
return 0;
}
uint32_t tox_events_bytes_size(const Tox_Events *events)
{
uint32_t count = 0;
msgpack_packer mp;
msgpack_packer_init(&mp, &count, count_bytes);
tox_events_pack(events, &mp);
return count;
}
static int write_bytes(void *data, const char *buf, size_t len)
{
uint8_t **bytes = (uint8_t **)data;
assert(bytes != nullptr && *bytes != nullptr);
memcpy(*bytes, buf, len);
*bytes += len;
return 0;
}
void tox_events_get_bytes(const Tox_Events *events, uint8_t *bytes)
{
msgpack_packer mp;
msgpack_packer_init(&mp, &bytes, write_bytes);
tox_events_pack(events, &mp);
}
void tox_events_print(const Tox_Events *events)
{
msgpack_sbuffer sbuf;
msgpack_sbuffer_init(&sbuf);
msgpack_packer mp;
msgpack_packer_init(&mp, &sbuf, msgpack_sbuffer_write);
tox_events_pack(events, &mp);
msgpack_zone mempool;
msgpack_zone_init(&mempool, 2048);
msgpack_object deserialized;
msgpack_unpack(sbuf.data, sbuf.size, nullptr, &mempool, &deserialized);
msgpack_object_print(stdout, deserialized);
fputc('\n', stdout);
msgpack_zone_destroy(&mempool);
msgpack_sbuffer_destroy(&sbuf);
}

View File

@ -306,6 +306,11 @@ Tox_Events *tox_events_iterate(Tox *tox, Tox_Err_Events_Iterate *error);
*/ */
void tox_events_free(Tox_Events *events); void tox_events_free(Tox_Events *events);
uint32_t tox_events_bytes_size(const Tox_Events *events);
void tox_events_get_bytes(const Tox_Events *events, uint8_t *bytes);
void tox_events_print(const Tox_Events *events);
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif