blob: 728779f752f9a42e1d4077872daa97df826618a4 [file] [log] [blame]
// Copyright 2017 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 "hid_message.h"
#include <base/logging.h>
#include <base/strings/stringprintf.h>
namespace atrusctl {
namespace {
const int kHeaderSize = 3;
} // namespace
HIDMessage::HIDMessage(uint8_t report_id, uint16_t command_id)
: report_id_(report_id), command_id_(command_id) {}
bool HIDMessage::PackIntoBuffer(std::vector<uint8_t>* buffer) const {
CHECK(buffer);
*buffer = {report_id_, static_cast<uint8_t>(command_id_),
static_cast<uint8_t>(command_id_ >> 8)};
return true;
}
bool HIDMessage::UnpackFromBuffer(const std::vector<uint8_t>& buffer) {
if (buffer.size() < kHeaderSize + 1) { // + 1 for body
LOG(ERROR) << "HIDMessage::UnpackFromBuffer needs a vector with a minimum"
<< "size of " << kHeaderSize + 1
<< ", actual: " << buffer.size();
return false;
}
static_assert(
sizeof(report_id_) + sizeof(command_id_) == kHeaderSize,
"sizeof(report_id_) + sizeof(command_id_) should equal kHeaderSize");
report_id_ = buffer[0];
command_id_ = (buffer[2] << 8) | buffer[1];
// The body of the message comes after the header
const char* buffer_data = reinterpret_cast<const char*>(buffer.data());
body_.assign(buffer_data + kHeaderSize, buffer_data + buffer.size());
return true;
}
bool HIDMessage::Validate(const HIDMessage& other) {
return (command_id_ == other.command_id()) ||
(command_id_ == 0x7FF0); // Unknown command
}
std::string HIDMessage::ToString() const {
return (base::StringPrintf("[0x%04X]: %s", command_id_, body_.c_str()));
}
} // namespace atrusctl