blob: 0c8502dfc3df4f843ade3d176c2a10a09cb0cc06 [file] [log] [blame]
// Copyright 2019 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "hlink_buffer.h"
#include <cassert>
namespace huddly {
HLinkBuffer::HLinkBuffer(const std::string& msg_name,
const uint8_t* payload,
const int payload_size)
: msg_name_(msg_name), payload_(payload, payload + payload_size) {
header_.req_id = 0;
header_.res_id = 0;
header_.flags = 0;
header_.msg_name_size = static_cast<uint16_t>(msg_name.size());
header_.payload_size = payload_size;
}
bool HLinkBuffer::FromRawBuffer(const std::vector<uint8_t>& raw_buffer,
HLinkBuffer* hlink_buffer,
std::string* err_msg) {
const auto header = *reinterpret_cast<const HLinkHeader*>(&raw_buffer[0]);
if (raw_buffer.size() != header.TotalSize()) {
*err_msg =
"HLink Buffer mismatch between header size field and actual size.";
return false;
}
hlink_buffer->header_ = header;
const auto msg_name_begin =
reinterpret_cast<const char*>(&raw_buffer[0] + sizeof(header));
const auto msg_name_end = msg_name_begin + header.msg_name_size;
hlink_buffer->msg_name_ = std::string(msg_name_begin, msg_name_end);
const auto payload_begin = raw_buffer.cbegin() + header.HeaderSize();
const auto payload_end = payload_begin + header.payload_size;
hlink_buffer->payload_ = std::vector<uint8_t>(payload_begin, payload_end);
return true;
}
std::string HLinkBuffer::GetMessageName() const {
return msg_name_;
}
const std::vector<uint8_t>& HLinkBuffer::GetPayload() const {
return payload_;
}
std::vector<uint8_t> HLinkBuffer::CreatePacket() const {
std::vector<uint8_t> data;
for (auto i = 0; i < sizeof(header_); i++) {
data.push_back(reinterpret_cast<const uint8_t*>(&header_)[i]);
}
data.insert(std::end(data), std::begin(msg_name_), std::end(msg_name_));
data.insert(std::end(data), std::begin(payload_), std::end(payload_));
return data;
}
} // namespace huddly