activity_client_identity_parser.h 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. #pragma once
  2. #include <cstddef>
  3. #include <cstdint>
  4. #include <span>
  5. namespace sunrise::middleware::bap::activity_message::client_identity {
  6. /** Logical fields in the client's per-join identity record. */
  7. struct ClientIdentity final {
  8. std::uint64_t memberKey{};
  9. /** Decoded signed value from the 10-bit bias-1 field. */
  10. std::int32_t field1{};
  11. /** Decoded signed value from the 32-bit sign-biased field. */
  12. std::int32_t field2{};
  13. /** First opaque identity that changes between joins. */
  14. std::uint64_t field3{};
  15. std::uint64_t accountSoid{};
  16. /** Identity field left unnamed until its role is confirmed. */
  17. std::uint64_t field5{};
  18. /** Second opaque identity that changes between joins. */
  19. std::uint64_t field6{};
  20. };
  21. /** Client identity updates use activity message type 23. */
  22. inline constexpr std::uint32_t kMessageType = 23;
  23. /** The identity schema carries 362 meaningful bits. */
  24. inline constexpr std::size_t kMeaningfulBitCount = 362;
  25. /** 6 trailing padding bits finish the 46-byte identity body. */
  26. inline constexpr std::size_t kEncodedSize = 46;
  27. /**
  28. * Parses the fixed client-identity prefix into logical signed and identity fields.
  29. * @param input Activity message body holding the whole 46-byte identity prefix.
  30. * @param identity Cleared first. Filled in only on success.
  31. * @return True when every field and all 6 trailing padding bits are there.
  32. */
  33. [[nodiscard]] bool parse_client_identity(std::span<const std::byte> input,
  34. ClientIdentity& identity) noexcept;
  35. } // namespace sunrise::middleware::bap::activity_message::client_identity