diff --git a/wpiutil/build.gradle b/wpiutil/build.gradle index 7d76796309..146eeec2d8 100644 --- a/wpiutil/build.gradle +++ b/wpiutil/build.gradle @@ -99,7 +99,7 @@ ext { include '**/*.cpp' } exportedHeaders { - srcDirs 'src/main/native/include', 'src/main/native/cpp', 'src/main/native/thirdparty/llvm/include', 'src/main/native/thirdparty/sigslot/include', 'src/main/native/thirdparty/tcb_span/include' + srcDirs 'src/main/native/include', 'src/main/native/cpp', 'src/main/native/thirdparty/llvm/include', 'src/main/native/thirdparty/sigslot/include', 'src/main/native/thirdparty/tcb_span/include', 'src/main/native/thirdparty/mpack/include' include '**/*.h' } } @@ -113,7 +113,7 @@ ext { include '**/*.cpp' } exportedHeaders { - srcDirs 'src/main/native/include', 'src/main/native/cpp', 'src/main/native/thirdparty/llvm/include', 'src/main/native/thirdparty/fmtlib/include', 'src/main/native/thirdparty/sigslot/include', 'src/main/native/thirdparty/json/include', 'src/main/native/thirdparty/tcb_span/include' + srcDirs 'src/main/native/include', 'src/main/native/cpp', 'src/main/native/thirdparty/llvm/include', 'src/main/native/thirdparty/fmtlib/include', 'src/main/native/thirdparty/sigslot/include', 'src/main/native/thirdparty/json/include', 'src/main/native/thirdparty/tcb_span/include', 'src/main/native/thirdparty/mpack/include' include '**/*.h' } } @@ -126,7 +126,7 @@ ext { include '**/*.cpp' } exportedHeaders { - srcDirs 'src/main/native/include', 'src/main/native/cpp', 'src/main/native/thirdparty/llvm/include', 'src/main/native/thirdparty/fmtlib/include', 'src/main/native/thirdparty/sigslot/include', 'src/main/native/thirdparty/json/include', 'src/main/native/thirdparty/tcb_span/include' + srcDirs 'src/main/native/include', 'src/main/native/cpp', 'src/main/native/thirdparty/llvm/include', 'src/main/native/thirdparty/fmtlib/include', 'src/main/native/thirdparty/sigslot/include', 'src/main/native/thirdparty/json/include', 'src/main/native/thirdparty/tcb_span/include', 'src/main/native/thirdparty/mpack/include' include '**/*.h' } } @@ -139,7 +139,7 @@ ext { include '**/*.cpp' } exportedHeaders { - srcDirs 'src/main/native/include', 'src/main/native/cpp', 'src/main/native/thirdparty/llvm/include', 'src/main/native/thirdparty/fmtlib/include', 'src/main/native/thirdparty/sigslot/include', 'src/main/native/thirdparty/json/include', 'src/main/native/thirdparty/tcb_span/include' + srcDirs 'src/main/native/include', 'src/main/native/cpp', 'src/main/native/thirdparty/llvm/include', 'src/main/native/thirdparty/fmtlib/include', 'src/main/native/thirdparty/sigslot/include', 'src/main/native/thirdparty/json/include', 'src/main/native/thirdparty/tcb_span/include', 'src/main/native/thirdparty/mpack/include' include '**/*.h' } } @@ -231,7 +231,7 @@ model { all { it.sources.each { it.exportedHeaders { - srcDirs 'src/main/native/include', 'src/main/native/thirdparty/fmtlib/include', 'src/main/native/thirdparty/llvm/include', 'src/main/native/thirdparty/sigslot/include', 'src/main/native/thirdparty/json/include', 'src/main/native/thirdparty/tcb_span/include', 'src/main/native/thirdparty/ghc/include', 'src/main/native/thirdparty/memory/include' + srcDirs 'src/main/native/include', 'src/main/native/thirdparty/fmtlib/include', 'src/main/native/thirdparty/llvm/include', 'src/main/native/thirdparty/sigslot/include', 'src/main/native/thirdparty/json/include', 'src/main/native/thirdparty/tcb_span/include', 'src/main/native/thirdparty/ghc/include', 'src/main/native/thirdparty/memory/include', 'src/main/native/thirdparty/mpack/include' } } } diff --git a/wpiutil/src/main/native/cpp/MessagePack.cpp b/wpiutil/src/main/native/cpp/MessagePack.cpp new file mode 100644 index 0000000000..60a2f013ce --- /dev/null +++ b/wpiutil/src/main/native/cpp/MessagePack.cpp @@ -0,0 +1,45 @@ +// Copyright (c) FIRST and other WPILib contributors. +// Open Source Software; you can modify and/or share it under the terms of +// the WPILib BSD license file in the root directory of this project. + +#include "wpi/MessagePack.h" + +using namespace mpack; + +mpack_error_t mpack::mpack_expect_str(mpack_reader_t* reader, std::string* out, + uint32_t maxLen) { + uint32_t count = mpack_expect_str_max(reader, maxLen); + mpack_error_t err = mpack_reader_error(reader); + if (err != mpack_ok) { + return err; + } + const char* bytes = mpack_read_bytes_inplace(reader, count); + if (bytes) { + out->assign(bytes, count); + } else { + return mpack_reader_error(reader); + } + mpack_done_str(reader); + return mpack_ok; +} + +mpack_error_t mpack::mpack_read_str(mpack_reader_t* reader, mpack_tag_t* tag, + std::string* out, uint32_t maxLen) { + uint32_t count = mpack_tag_str_length(tag); + mpack_error_t err = mpack_reader_error(reader); + if (err != mpack_ok) { + return err; + } + if (count > maxLen) { + mpack_reader_flag_error(reader, mpack_error_too_big); + return mpack_error_too_big; + } + const char* bytes = mpack_read_bytes_inplace(reader, count); + if (bytes) { + out->assign(bytes, count); + } else { + return mpack_reader_error(reader); + } + mpack_done_str(reader); + return mpack_ok; +} diff --git a/wpiutil/src/main/native/include/wpi/MessagePack.h b/wpiutil/src/main/native/include/wpi/MessagePack.h new file mode 100644 index 0000000000..e32be7f6a7 --- /dev/null +++ b/wpiutil/src/main/native/include/wpi/MessagePack.h @@ -0,0 +1,39 @@ +// Copyright (c) FIRST and other WPILib contributors. +// Open Source Software; you can modify and/or share it under the terms of +// the WPILib BSD license file in the root directory of this project. + +#pragma once + +#include + +#include +#include + +#include "wpi/mpack.h" +#include "wpi/span.h" + +namespace mpack { + +inline void mpack_write_str(mpack_writer_t* writer, std::string_view str) { + mpack_write_str(writer, str.data(), str.size()); +} + +inline void mpack_write_bytes(mpack_writer_t* writer, + wpi::span data) { + mpack_write_bytes(writer, reinterpret_cast(data.data()), + data.size()); +} + +inline void mpack_reader_init_data(mpack_reader_t* reader, + wpi::span data) { + mpack_reader_init_data(reader, reinterpret_cast(data.data()), + data.size()); +} + +mpack_error_t mpack_expect_str(mpack_reader_t* reader, std::string* out, + uint32_t maxLen = 1024); + +mpack_error_t mpack_read_str(mpack_reader_t* reader, mpack_tag_t* tag, + std::string* out, uint32_t maxLen = 1024); + +} // namespace mpack