// Copyright 2018 The Fuchsia 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 "lib/fidl/cpp/decoder.h"
#include <utility>
namespace fidl {
Decoder::Decoder(Message message) : message_(std::move(message)) {}
Decoder::~Decoder() = default;
size_t Decoder::GetOffset(void* ptr) {
return GetOffset(reinterpret_cast<uintptr_t>(ptr));
}
size_t Decoder::GetOffset(uintptr_t ptr) {
// The |ptr| value comes from the message buffer, which we've already
// validated. That means it should coorespond to a valid offset within the
// message.
return ptr - reinterpret_cast<uintptr_t>(message_.bytes().data());
}
#ifdef __Fuchsia__
void Decoder::DecodeHandle(zx::object_base* value, size_t offset) {
zx_handle_t* handle = GetPtr<zx_handle_t>(offset);
value->reset(*handle);
*handle = ZX_HANDLE_INVALID;
}
#endif
uint8_t* Decoder::InternalGetPtr(size_t offset) {
return message_.bytes().data() + offset;
}
} // namespace fidl