activity_message_notification_encoder.cpp 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. #include "activity_message_notification_encoder.h"
  2. #include <algorithm>
  3. #include "../../encoding/byte_order.h"
  4. namespace sunrise::middleware::bap::activity_message {
  5. namespace {
  6. /** Fixed discriminator-1 fields that precede a service-9 activity payload. */
  7. struct NotificationLayout final {
  8. /** The activity transport discriminator starts the envelope. */
  9. static constexpr std::size_t discriminator = 0;
  10. /** The big-endian activity session follows the discriminator. */
  11. static constexpr std::size_t sessionId = discriminator + sizeof(std::byte);
  12. /** The big-endian activity message type follows the session. */
  13. static constexpr std::size_t messageType = sessionId + encoding::kU64Size;
  14. /** The big-endian payload length follows the message type. */
  15. static constexpr std::size_t payloadLength = messageType + encoding::kU32Size;
  16. /** Payload bytes start after every fixed-width service field. */
  17. static constexpr std::size_t payload = payloadLength + encoding::kU32Size;
  18. };
  19. } // namespace
  20. /** Encodes one discriminator-1 service-9 activity envelope with no BAP status header. */
  21. bool encode_notification(std::uint64_t sessionId,
  22. std::uint32_t messageType,
  23. std::span<const std::byte> payload,
  24. std::span<std::byte> output,
  25. std::size_t& written) noexcept {
  26. written = {};
  27. if (sessionId == kAbsentSessionId || messageType > kMaximumMessageType
  28. || payload.size() > kMaximumPayloadSize
  29. || output.size() < NotificationLayout::payload + payload.size()) {
  30. return false;
  31. }
  32. output[NotificationLayout::discriminator] = kTransportDiscriminator;
  33. encoding::write_u64_be(output.subspan<NotificationLayout::sessionId, encoding::kU64Size>(),
  34. sessionId);
  35. encoding::write_u32_be(output.subspan<NotificationLayout::messageType, encoding::kU32Size>(),
  36. messageType);
  37. encoding::write_u32_be(output.subspan<NotificationLayout::payloadLength, encoding::kU32Size>(),
  38. static_cast<std::uint32_t>(payload.size()));
  39. std::copy(payload.begin(), payload.end(), output.begin() + NotificationLayout::payload);
  40. written = NotificationLayout::payload + payload.size();
  41. return true;
  42. }
  43. } // namespace sunrise::middleware::bap::activity_message