diff --git a/.circleci/config.yml b/.circleci/config.yml index 50430f16..28927ea4 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -32,6 +32,7 @@ jobs: git libconfig-dev libgtest-dev + libmsgpack-dev libopus-dev libsodium-dev libvpx-dev @@ -79,7 +80,7 @@ jobs: toxcore/*/*.c toxencryptsave/*.c -lpthread - $(pkg-config --cflags --libs libsodium opus vpx) + $(pkg-config --cflags --libs libsodium msgpack opus vpx) static-analysis: working_directory: ~/work diff --git a/.github/scripts/cmake-linux b/.github/scripts/cmake-linux index a4ddc94e..73c45f68 100755 --- a/.github/scripts/cmake-linux +++ b/.github/scripts/cmake-linux @@ -4,7 +4,12 @@ set -eu 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" diff --git a/.github/scripts/cmake-osx b/.github/scripts/cmake-osx index 4a6c3360..82402380 100755 --- a/.github/scripts/cmake-osx +++ b/.github/scripts/cmake-osx @@ -7,7 +7,12 @@ NPROC=$(sysctl -n hw.physicalcpu) # Workaround for bug in Homebrew where it only finds an old Ruby version. brew update -brew install libconfig libsodium libvpx opus +brew install \ + libconfig \ + libsodium \ + libvpx \ + msgpack \ + opus . ".github/scripts/flags-clang.sh" diff --git a/.github/scripts/cmake-win32 b/.github/scripts/cmake-win32 index b2827722..389e3aec 100755 --- a/.github/scripts/cmake-win32 +++ b/.github/scripts/cmake-win32 @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash i686=true x86_64=false diff --git a/.github/scripts/cmake-win64 b/.github/scripts/cmake-win64 index 4a2cfe29..1b4fa80c 100755 --- a/.github/scripts/cmake-win64 +++ b/.github/scripts/cmake-win64 @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash i686=false x86_64=true diff --git a/.github/scripts/cmake-windows.sh b/.github/scripts/cmake-windows.sh index 7209e230..dac5e396 100644 --- a/.github/scripts/cmake-windows.sh +++ b/.github/scripts/cmake-windows.sh @@ -7,14 +7,12 @@ set -eu NPROC=$(nproc) ci_install() { - cd other/docker/windows - docker build \ --build-arg SUPPORT_ARCH_i686="$i686" \ --build-arg SUPPORT_ARCH_x86_64="$x86_64" \ --build-arg SUPPORT_TEST=true \ -t toxcore-"$WINDOWS_ARCH" \ - . + other/docker/windows } ci_script() { diff --git a/.github/scripts/sonar-prepare b/.github/scripts/sonar-prepare index 566f749c..cf3d42c2 100755 --- a/.github/scripts/sonar-prepare +++ b/.github/scripts/sonar-prepare @@ -2,7 +2,13 @@ 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" diff --git a/.github/settings.yml b/.github/settings.yml index 546b00a5..18bcae21 100644 --- a/.github/settings.yml +++ b/.github/settings.yml @@ -25,6 +25,7 @@ branches: - "build-tcc" - "build-win32" - "build-win64" + - "buildifier" - "CodeFactor" - "coverage-linux" - "ci/circleci: asan" diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index fda0dd0b..6b938351 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -95,12 +95,14 @@ jobs: sudo apt-get install -y --no-install-recommends tcc libconfig-dev + libmsgpack-dev libopus-dev libsodium-dev libvpx-dev - name: Build with TCC run: tcc + -Dinline=static -o send_message_test -Wall -Werror -bench -g @@ -111,7 +113,7 @@ jobs: toxcore/*.c toxcore/*/*.c toxencryptsave/*.c - $(pkg-config --cflags --libs libsodium opus vpx) + $(pkg-config --cflags --libs libsodium msgpack opus vpx) - name: Run the test run: "./send_message_test | grep 'tox clients connected'" - name: Build amalgamation file with TCC @@ -124,7 +126,7 @@ jobs: -o send_message_test -Wall -Werror -bench -g - $(pkg-config --cflags --libs libsodium opus vpx) + $(pkg-config --cflags --libs libsodium msgpack opus vpx) - name: Run the test again run: "./send_message_test | grep 'tox clients connected'" @@ -149,8 +151,8 @@ jobs: toxcore/*.c toxcore/*/*.c toxencryptsave/*.c - -D__COMPCERT__ -DDISABLE_VLA - -lpthread $(pkg-config --cflags --libs libsodium opus vpx) + -D__COMPCERT__ -DDISABLE_VLA -Dinline= + -lpthread $(pkg-config --cflags --libs libsodium msgpack opus vpx) - name: Run the test run: "./send_message_test | grep 'tox clients connected'" diff --git a/.hadolint.yaml b/.hadolint.yaml index 159a07f4..98122e68 100644 --- a/.hadolint.yaml +++ b/.hadolint.yaml @@ -9,3 +9,5 @@ ignored: - DL3013 - DL3018 - DL3059 + # $(pkg-config ...) needs this + - SC2046 diff --git a/CMakeLists.txt b/CMakeLists.txt index 862e4d3c..76ff7176 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -274,6 +274,8 @@ set(toxcore_SOURCES ${toxcore_SOURCES} toxcore/tox_events.c toxcore/tox_events.h) 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. # ------------------- diff --git a/appveyor.yml b/appveyor.yml index 8a87daed..6500dd27 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -7,6 +7,7 @@ install: - py -3 -m pip install conan before_build: + - conan remote add -i 0 conancenter https://center.conan.io - conan install -if _build . build_script: diff --git a/auto_tests/Makefile.inc b/auto_tests/Makefile.inc index a9c814c0..1b5abff8 100644 --- a/auto_tests/Makefile.inc +++ b/auto_tests/Makefile.inc @@ -34,6 +34,8 @@ TESTS = \ set_name_test \ set_status_message_test \ TCP_test \ + tox_events_test \ + tox_dispatch_test \ tox_many_tcp_test \ tox_many_test \ tox_one_test \ @@ -49,16 +51,19 @@ endif AUTOTEST_CFLAGS = \ $(LIBSODIUM_CFLAGS) \ + $(MSGPACK_CFLAGS) \ $(NACL_CFLAGS) AUTOTEST_LDADD = \ $(LIBSODIUM_LDFLAGS) \ + $(MSGPACK_LDFLAGS) \ $(NACL_LDFLAGS) \ libmisc_tools.la \ libauto_test_support.la \ libtoxcore.la \ libtoxencryptsave.la \ $(LIBSODIUM_LIBS) \ + $(MSGPACK_LIBS) \ $(NACL_OBJECTS) \ $(NACL_LIBS) @@ -198,6 +203,14 @@ TCP_test_SOURCES = ../auto_tests/TCP_test.c TCP_test_CFLAGS = $(AUTOTEST_CFLAGS) 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_CFLAGS = $(AUTOTEST_CFLAGS) tox_many_tcp_test_LDADD = $(AUTOTEST_LDADD) diff --git a/auto_tests/tox_dispatch_test.c b/auto_tests/tox_dispatch_test.c index b50c6333..0dc348bf 100644 --- a/auto_tests/tox_dispatch_test.c +++ b/auto_tests/tox_dispatch_test.c @@ -12,6 +12,9 @@ #include "../toxcore/tox_events.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) { bool *success = (bool *)user_data; @@ -24,17 +27,43 @@ static void handle_events_friend_message(Tox *tox, const Tox_Event_Friend_Messag *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) { for (uint32_t i = 0; i < 100; ++i) { // 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. Tox_Events *events = tox_events_iterate(toxes[1], nullptr); + dump_events("/tmp/test.mp", events); + bool success = false; tox_dispatch_invoke(dispatch, events, toxes[1], &success); - tox_events_free(events); + print_events(events); if (success) { return true; @@ -81,8 +110,8 @@ static void test_tox_events(void) while (tox_self_get_connection_status(toxes[0]) == TOX_CONNECTION_NONE || tox_self_get_connection_status(toxes[1]) == TOX_CONNECTION_NONE) { // Ignore connection events for now. - tox_events_free(tox_events_iterate(toxes[0], nullptr)); - tox_events_free(tox_events_iterate(toxes[1], nullptr)); + print_events(tox_events_iterate(toxes[0], nullptr)); + print_events(tox_events_iterate(toxes[1], nullptr)); 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 || tox_friend_get_connection_status(toxes[1], 0, nullptr) == TOX_CONNECTION_NONE) { // Ignore connection events for now. - tox_events_free(tox_events_iterate(toxes[0], nullptr)); - tox_events_free(tox_events_iterate(toxes[1], nullptr)); + print_events(tox_events_iterate(toxes[0], nullptr)); + print_events(tox_events_iterate(toxes[1], nullptr)); c_sleep(tox_iteration_interval(toxes[0])); } diff --git a/cmake/Dependencies.cmake b/cmake/Dependencies.cmake index 37eb40bd..9040d95c 100644 --- a/cmake/Dependencies.cmake +++ b/cmake/Dependencies.cmake @@ -14,17 +14,16 @@ find_library(SOCKET_LIBRARIES socket ) # For toxcore. pkg_use_module(LIBSODIUM libsodium ) +pkg_use_module(MSGPACK msgpack ) +#find_package(msgpack REQUIRED) # For toxav. -pkg_use_module(OPUS "opus;Opus" ) -pkg_use_module(VPX "vpx;libvpx" ) +pkg_use_module(OPUS "opus;Opus" ) +pkg_use_module(VPX "vpx;libvpx" ) # For tox-bootstrapd. pkg_use_module(LIBCONFIG libconfig ) -# For tox-spectest. -pkg_use_module(MSGPACK msgpack ) - ############################################################################### # # :: For MSVC Windows builds. diff --git a/conanfile.py b/conanfile.py index f192e346..2a6c4efb 100644 --- a/conanfile.py +++ b/conanfile.py @@ -14,7 +14,7 @@ class ToxConan(ConanFile): description = "The future of online communications." license = "GPL-3.0-only" 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" scm = {"type": "git", "url": "auto", "revision": "auto"} diff --git a/configure.ac b/configure.ac index 10e36613..68ec5bbc 100644 --- a/configure.ac +++ b/configure.ac @@ -302,6 +302,14 @@ PKG_CHECK_MODULES([LIBSODIUM], [libsodium], LIBSODIUM_FOUND="no" ]) +PKG_CHECK_MODULES([MSGPACK], [msgpack], + [ + MSGPACK_FOUND="yes" + ], + [ + MSGPACK_FOUND="no" + ]) + if test "x$WANT_NACL" = "xyes"; then NACL_LIBS= NACL_LDFLAGS= diff --git a/other/analysis/check_includes b/other/analysis/check_includes index 38d67fea..878aba6e 100755 --- a/other/analysis/check_includes +++ b/other/analysis/check_includes @@ -10,6 +10,8 @@ ALLOWLIST: Tuple[str, ...] = ( "stdbool.h", "stddef.h", "stdint.h", + # msgpack, currently not abstracted away + "msgpack.h", # toxav stuff, maybe not worth abstracting away "opus.h", "vpx/vp8cx.h", diff --git a/other/analysis/gen-file.sh b/other/analysis/gen-file.sh index 2453e794..b25fc3b2 100644 --- a/other/analysis/gen-file.sh +++ b/other/analysis/gen-file.sh @@ -14,7 +14,7 @@ CPPFLAGS+=("-Itoxcore/events") CPPFLAGS+=("-Itoxav") CPPFLAGS+=("-Itoxencryptsave") -LDFLAGS=("-lopus" "-lsodium" "-lvpx" "-lpthread" "-lconfig" "-lgtest") +LDFLAGS=("-lopus" "-lmsgpackc" "-lsodium" "-lvpx" "-lpthread" "-lconfig" "-lgtest") LDFLAGS+=("-fuse-ld=gold") LDFLAGS+=("-Wl,--detect-odr-violations") LDFLAGS+=("-Wl,--warn-common") diff --git a/other/bootstrap_daemon/docker/Dockerfile b/other/bootstrap_daemon/docker/Dockerfile index 67e7df5c..bdc8464f 100644 --- a/other/bootstrap_daemon/docker/Dockerfile +++ b/other/bootstrap_daemon/docker/Dockerfile @@ -8,6 +8,7 @@ RUN ["apk", "--no-cache", "add",\ "linux-headers",\ "libconfig-dev",\ "libconfig-static",\ + "msgpack-c-dev",\ "libsodium-dev",\ "libsodium-static",\ "ninja",\ diff --git a/other/docker/autotools/Dockerfile b/other/docker/autotools/Dockerfile index 425df3b5..094d711d 100644 --- a/other/docker/autotools/Dockerfile +++ b/other/docker/autotools/Dockerfile @@ -8,6 +8,7 @@ RUN apt-get update && apt-get install --no-install-recommends -y \ ca-certificates \ curl \ libconfig-dev \ + libmsgpack-dev \ libopus-dev \ libtool \ libvpx-dev \ diff --git a/other/docker/circleci/Dockerfile b/other/docker/circleci/Dockerfile index ef90683b..a2a611e0 100644 --- a/other/docker/circleci/Dockerfile +++ b/other/docker/circleci/Dockerfile @@ -7,6 +7,7 @@ RUN apt-get update && \ clang \ cmake \ libconfig-dev \ + libmsgpack-dev \ libopus-dev \ libsodium-dev \ libvpx-dev \ diff --git a/other/docker/tcc/Dockerfile b/other/docker/tcc/Dockerfile new file mode 100644 index 00000000..dac132b3 --- /dev/null +++ b/other/docker/tcc/Dockerfile @@ -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) diff --git a/other/docker/tcc/run b/other/docker/tcc/run new file mode 100755 index 00000000..be28a71c --- /dev/null +++ b/other/docker/tcc/run @@ -0,0 +1,5 @@ +#!/bin/sh + +set -eux + +docker build -t toxchat/c-toxcore:tcc -f other/docker/tcc/Dockerfile . diff --git a/other/docker/windows/Dockerfile b/other/docker/windows/Dockerfile index 37b685e7..7a998365 100644 --- a/other/docker/windows/Dockerfile +++ b/other/docker/windows/Dockerfile @@ -1,33 +1,35 @@ FROM debian:buster-slim # Build-time environment variables -ARG VERSION_SODIUM=1.0.18 -ARG VERSION_OPUS=1.3.1 -ARG VERSION_VPX=1.9.0 - -ARG SUPPORT_TEST=false -ARG SUPPORT_ARCH_i686=true -ARG SUPPORT_ARCH_x86_64=true -ARG CROSS_COMPILE=true +ARG VERSION_MSGPACK=4.0.0 \ + VERSION_SODIUM=1.0.18 \ + VERSION_OPUS=1.3.1 \ + VERSION_VPX=1.9.0 \ + \ + SUPPORT_TEST=false \ + SUPPORT_ARCH_i686=true \ + SUPPORT_ARCH_x86_64=true \ + CROSS_COMPILE=true # Make those available when running the container -ENV SUPPORT_TEST=${SUPPORT_TEST} -ENV SUPPORT_ARCH_i686=${SUPPORT_ARCH_i686} -ENV SUPPORT_ARCH_x86_64=${SUPPORT_ARCH_x86_64} -ENV CROSS_COMPILE=${CROSS_COMPILE} +ENV SUPPORT_TEST=${SUPPORT_TEST} \ + SUPPORT_ARCH_i686=${SUPPORT_ARCH_i686} \ + SUPPORT_ARCH_x86_64=${SUPPORT_ARCH_x86_64} \ + CROSS_COMPILE=${CROSS_COMPILE} +WORKDIR /work COPY get_packages.sh . -RUN sh ./get_packages.sh +RUN ./get_packages.sh COPY build_dependencies.sh . -RUN sh ./build_dependencies.sh +RUN ./build_dependencies.sh COPY build_toxcore.sh . -ENV ENABLE_TEST=false -ENV ALLOW_TEST_FAILURE=false -ENV ENABLE_ARCH_i686=true -ENV ENABLE_ARCH_x86_64=true -ENV EXTRA_CMAKE_FLAGS="-DTEST_TIMEOUT_SECONDS=90" +ENV ENABLE_TEST=false \ + ALLOW_TEST_FAILURE=false \ + ENABLE_ARCH_i686=true \ + ENABLE_ARCH_x86_64=true \ + EXTRA_CMAKE_FLAGS="-DTEST_TIMEOUT_SECONDS=90" ENTRYPOINT ["sh", "./build_toxcore.sh"] diff --git a/other/docker/windows/build_dependencies.sh b/other/docker/windows/build_dependencies.sh old mode 100644 new mode 100755 index 5b57d236..5cd03b7b --- a/other/docker/windows/build_dependencies.sh +++ b/other/docker/windows/build_dependencies.sh @@ -1,4 +1,4 @@ -#!/usr/bin/env sh +#!/usr/bin/env bash # disable on Cygwin otherwise some builds fail if [ "$CROSS_COMPILE" = "true" ]; then @@ -23,14 +23,36 @@ build() { export MAKEFLAGS=j"$(nproc)" export CFLAGS=-O3 - CURL_OPTIONS="-L --connect-timeout 10" + CURL_OPTIONS=(-L --connect-timeout 10) cd /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 "=== 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" cd "libsodium-$VERSION_SODIUM" ./configure --host="$WINDOWS_TOOLCHAIN" --prefix="$PREFIX_DIR" --disable-shared --enable-static @@ -40,7 +62,7 @@ build() { echo 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" cd "opus-$VERSION_OPUS" ./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 LIB_VPX_CFLAGS="-fno-asynchronous-unwind-tables" 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" 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 diff --git a/other/docker/windows/get_packages.sh b/other/docker/windows/get_packages.sh old mode 100644 new mode 100755 diff --git a/other/emscripten/Dockerfile b/other/emscripten/Dockerfile index d7e435d6..7b84d064 100644 --- a/other/emscripten/Dockerfile +++ b/other/emscripten/Dockerfile @@ -36,6 +36,16 @@ RUN . "/work/emsdk/emsdk_env.sh" \ --disable-ssp --disable-asm --disable-pie \ && 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 # libraries. This makes rebuilds of toxcore below much faster. RUN . "/work/emsdk/emsdk_env.sh" \ @@ -58,11 +68,11 @@ COPY . /work/c-toxcore RUN . "/work/emsdk/emsdk_env.sh" \ && cd /work/c-toxcore \ && emcmake cmake -B_build -H. -GNinja \ + -DCMAKE_INSTALL_PREFIX:PATH="/usr/local" \ -DCMAKE_C_FLAGS="-O3 -flto -fPIC" \ -DBUILD_TOXAV=OFF \ -DENABLE_SHARED=OFF \ -DBOOTSTRAP_DAEMON=OFF \ - -DCMAKE_INSTALL_PREFIX:PATH="/usr/local" \ -DMIN_LOGGER_LEVEL=DEBUG \ && emmake cmake --build _build --parallel 8 --target install @@ -79,6 +89,7 @@ RUN . "/work/emsdk/emsdk_env.sh" \ -s MODULARIZE=1 \ -s STRICT=1 \ -s WEBSOCKET_URL=wss:// \ + /usr/local/lib/libmsgpackc.a \ /usr/local/lib/libsodium.a \ /usr/local/lib/libtoxcore.a \ -o /work/wasm/libtoxcore.js diff --git a/other/emscripten/build b/other/emscripten/build new file mode 100755 index 00000000..18ea2424 --- /dev/null +++ b/other/emscripten/build @@ -0,0 +1,3 @@ +#!/bin/sh + +docker build -t toxchat/toxcore-js -f other/emscripten/Dockerfile . diff --git a/toxcore/BUILD.bazel b/toxcore/BUILD.bazel index 0fc9ef90..0f9e7917 100644 --- a/toxcore/BUILD.bazel +++ b/toxcore/BUILD.bazel @@ -471,6 +471,7 @@ cc_library( deps = [ ":ccompat", ":toxcore", + "@msgpack-c", ], ) diff --git a/toxcore/events/conference_connected.c b/toxcore/events/conference_connected.c index 769b8feb..33262288 100644 --- a/toxcore/events/conference_connected.c +++ b/toxcore/events/conference_connected.c @@ -24,6 +24,13 @@ struct Tox_Event_Conference_Connected { 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) { *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) { + if (events == nullptr) { + return 0; + } + 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]; } +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); + } +} + /***************************************************** * diff --git a/toxcore/events/conference_invite.c b/toxcore/events/conference_invite.c index 19882a0b..130968ea 100644 --- a/toxcore/events/conference_invite.c +++ b/toxcore/events/conference_invite.c @@ -27,6 +27,16 @@ struct Tox_Event_Conference_Invite { 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) { *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) { + if (events == nullptr) { + return 0; + } + 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]; } +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); + } +} + /***************************************************** * diff --git a/toxcore/events/conference_message.c b/toxcore/events/conference_message.c index 39315c59..3a2199a0 100644 --- a/toxcore/events/conference_message.c +++ b/toxcore/events/conference_message.c @@ -28,6 +28,17 @@ struct Tox_Event_Conference_Message { 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) { *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) { + if (events == nullptr) { + return 0; + } + 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]; } +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); + } +} + /***************************************************** * diff --git a/toxcore/events/conference_peer_list_changed.c b/toxcore/events/conference_peer_list_changed.c index c00f85ac..c7b5b7c6 100644 --- a/toxcore/events/conference_peer_list_changed.c +++ b/toxcore/events/conference_peer_list_changed.c @@ -24,6 +24,14 @@ struct Tox_Event_Conference_Peer_List_Changed { 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 *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) { + if (events == nullptr) { + return 0; + } + 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]; } +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); + } +} + /***************************************************** * diff --git a/toxcore/events/conference_peer_name.c b/toxcore/events/conference_peer_name.c index 340a92ff..e93c5e37 100644 --- a/toxcore/events/conference_peer_name.c +++ b/toxcore/events/conference_peer_name.c @@ -27,6 +27,16 @@ struct Tox_Event_Conference_Peer_Name { 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) { *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) { + if (events == nullptr) { + return 0; + } + 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]; } +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); + } +} + /***************************************************** * diff --git a/toxcore/events/conference_title.c b/toxcore/events/conference_title.c index 45312f8a..a3a49220 100644 --- a/toxcore/events/conference_title.c +++ b/toxcore/events/conference_title.c @@ -27,6 +27,16 @@ struct Tox_Event_Conference_Title { 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) { *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) { + if (events == nullptr) { + return 0; + } + 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]; } +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); + } +} + /***************************************************** * diff --git a/toxcore/events/events_alloc.h b/toxcore/events/events_alloc.h index 9ef60c41..ecffbeec 100644 --- a/toxcore/events/events_alloc.h +++ b/toxcore/events/events_alloc.h @@ -5,6 +5,8 @@ #ifndef C_TOXCORE_TOXCORE_TOX_EVENTS_INTERNAL_H #define C_TOXCORE_TOXCORE_TOX_EVENTS_INTERNAL_H +#include + #include "../tox_events.h" #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_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); #ifdef __cplusplus diff --git a/toxcore/events/file_chunk_request.c b/toxcore/events/file_chunk_request.c index 597c4af6..de671fa9 100644 --- a/toxcore/events/file_chunk_request.c +++ b/toxcore/events/file_chunk_request.c @@ -27,6 +27,16 @@ struct Tox_Event_File_Chunk_Request { 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) { *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) { + if (events == nullptr) { + return 0; + } + 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]; } +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); + } +} + /***************************************************** * diff --git a/toxcore/events/file_recv.c b/toxcore/events/file_recv.c index fb63a346..eb9064d3 100644 --- a/toxcore/events/file_recv.c +++ b/toxcore/events/file_recv.c @@ -29,6 +29,18 @@ struct Tox_Event_File_Recv { 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) { *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) { + if (events == nullptr) { + return 0; + } + 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]; } +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); + } +} + /***************************************************** * diff --git a/toxcore/events/file_recv_chunk.c b/toxcore/events/file_recv_chunk.c index 5eb56afd..2a8cbd75 100644 --- a/toxcore/events/file_recv_chunk.c +++ b/toxcore/events/file_recv_chunk.c @@ -28,6 +28,17 @@ struct Tox_Event_File_Recv_Chunk { 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) { *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) { + if (events == nullptr) { + return 0; + } + 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]; } +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); + } +} + /***************************************************** * diff --git a/toxcore/events/file_recv_control.c b/toxcore/events/file_recv_control.c index de31a9eb..8200406a 100644 --- a/toxcore/events/file_recv_control.c +++ b/toxcore/events/file_recv_control.c @@ -26,6 +26,15 @@ struct Tox_Event_File_Recv_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) { *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) { + if (events == nullptr) { + return 0; + } + 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]; } +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); + } +} + /***************************************************** * diff --git a/toxcore/events/friend_connection_status.c b/toxcore/events/friend_connection_status.c index 1ef73015..e5c6e2bf 100644 --- a/toxcore/events/friend_connection_status.c +++ b/toxcore/events/friend_connection_status.c @@ -25,6 +25,14 @@ struct Tox_Event_Friend_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) { *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) { + if (events == nullptr) { + return 0; + } + 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]; } +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); + } +} + /***************************************************** * diff --git a/toxcore/events/friend_lossless_packet.c b/toxcore/events/friend_lossless_packet.c index 1c7ae450..6be919e8 100644 --- a/toxcore/events/friend_lossless_packet.c +++ b/toxcore/events/friend_lossless_packet.c @@ -26,6 +26,15 @@ struct Tox_Event_Friend_Lossless_Packet { 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) { *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) { + if (events == nullptr) { + return 0; + } + 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]; } +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); + } +} + /***************************************************** * diff --git a/toxcore/events/friend_lossy_packet.c b/toxcore/events/friend_lossy_packet.c index d97586d4..0bde8ac9 100644 --- a/toxcore/events/friend_lossy_packet.c +++ b/toxcore/events/friend_lossy_packet.c @@ -26,6 +26,15 @@ struct Tox_Event_Friend_Lossy_Packet { 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) { *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) { + if (events == nullptr) { + return 0; + } + 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]; } +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); + } +} + /***************************************************** * diff --git a/toxcore/events/friend_message.c b/toxcore/events/friend_message.c index 01551901..9c1357a4 100644 --- a/toxcore/events/friend_message.c +++ b/toxcore/events/friend_message.c @@ -27,6 +27,16 @@ struct Tox_Event_Friend_Message { 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) { *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) { + if (events == nullptr) { + return 0; + } + 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]; } +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); + } +} + /***************************************************** * diff --git a/toxcore/events/friend_name.c b/toxcore/events/friend_name.c index 3c01f886..d6bec033 100644 --- a/toxcore/events/friend_name.c +++ b/toxcore/events/friend_name.c @@ -26,6 +26,15 @@ struct Tox_Event_Friend_Name { 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) { *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) { + if (events == nullptr) { + return 0; + } + 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]; } +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); + } +} + /***************************************************** * diff --git a/toxcore/events/friend_read_receipt.c b/toxcore/events/friend_read_receipt.c index 82ff97f2..3ae80995 100644 --- a/toxcore/events/friend_read_receipt.c +++ b/toxcore/events/friend_read_receipt.c @@ -25,6 +25,14 @@ struct Tox_Event_Friend_Read_Receipt { 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) { *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) { + if (events == nullptr) { + return 0; + } + 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]; } +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); + } +} + /***************************************************** * diff --git a/toxcore/events/friend_request.c b/toxcore/events/friend_request.c index ae725067..95044bca 100644 --- a/toxcore/events/friend_request.c +++ b/toxcore/events/friend_request.c @@ -26,6 +26,16 @@ struct Tox_Event_Friend_Request { 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) { *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) { + if (events == nullptr) { + return 0; + } + 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]; } +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); + } +} + /***************************************************** * diff --git a/toxcore/events/friend_status.c b/toxcore/events/friend_status.c index 8cce94a7..7bb5e3fe 100644 --- a/toxcore/events/friend_status.c +++ b/toxcore/events/friend_status.c @@ -25,6 +25,14 @@ struct Tox_Event_Friend_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) { *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) { + if (events == nullptr) { + return 0; + } + 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]; } +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); + } +} + /***************************************************** * diff --git a/toxcore/events/friend_status_message.c b/toxcore/events/friend_status_message.c index b593a28a..d071ef16 100644 --- a/toxcore/events/friend_status_message.c +++ b/toxcore/events/friend_status_message.c @@ -26,6 +26,15 @@ struct Tox_Event_Friend_Status_Message { 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) { *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) { + if (events == nullptr) { + return 0; + } + 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]; } +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); + } +} + /***************************************************** * diff --git a/toxcore/events/friend_typing.c b/toxcore/events/friend_typing.c index 93911754..fdea3318 100644 --- a/toxcore/events/friend_typing.c +++ b/toxcore/events/friend_typing.c @@ -25,6 +25,19 @@ struct Tox_Event_Friend_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) { *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) { + if (events == nullptr) { + return 0; + } + 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]; } +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); + } +} + /***************************************************** * diff --git a/toxcore/events/self_connection_status.c b/toxcore/events/self_connection_status.c index 89a303ad..9b85eb58 100644 --- a/toxcore/events/self_connection_status.c +++ b/toxcore/events/self_connection_status.c @@ -24,6 +24,13 @@ struct Tox_Event_Self_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) { *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) { + if (events == nullptr) { + return 0; + } + 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]; } +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); + } +} + /***************************************************** * diff --git a/toxcore/tox_events.c b/toxcore/tox_events.c index 703aaf5e..7b9c4d28 100644 --- a/toxcore/tox_events.c +++ b/toxcore/tox_events.c @@ -4,6 +4,8 @@ #include "tox_events.h" +#include +#include #include #include @@ -55,3 +57,84 @@ Tox_Events *tox_events_iterate(Tox *tox, Tox_Err_Events_Iterate *error) 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); +} diff --git a/toxcore/tox_events.h b/toxcore/tox_events.h index 2d65e612..7a44c49c 100644 --- a/toxcore/tox_events.h +++ b/toxcore/tox_events.h @@ -306,6 +306,11 @@ Tox_Events *tox_events_iterate(Tox *tox, Tox_Err_Events_Iterate *error); */ 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 } #endif