86 lines
2.8 KiB
C++
86 lines
2.8 KiB
C++
// Copyright 2016 The Chromium 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 "mojo/public/cpp/bindings/lib/serialization_context.h"
|
|
|
|
#include <limits>
|
|
|
|
#include "base/logging.h"
|
|
#include "mojo/public/cpp/bindings/message.h"
|
|
#include "mojo/public/cpp/system/core.h"
|
|
|
|
namespace mojo {
|
|
namespace internal {
|
|
|
|
SerializationContext::SerializationContext() = default;
|
|
|
|
SerializationContext::~SerializationContext() = default;
|
|
|
|
void SerializationContext::AddHandle(mojo::ScopedHandle handle,
|
|
Handle_Data* out_data) {
|
|
if (!handle.is_valid()) {
|
|
out_data->value = kEncodedInvalidHandleValue;
|
|
} else {
|
|
DCHECK_LT(handles_.size(), std::numeric_limits<uint32_t>::max());
|
|
out_data->value = static_cast<uint32_t>(handles_.size());
|
|
handles_.emplace_back(std::move(handle));
|
|
}
|
|
}
|
|
|
|
void SerializationContext::AddInterfaceInfo(
|
|
mojo::ScopedMessagePipeHandle handle,
|
|
uint32_t version,
|
|
Interface_Data* out_data) {
|
|
AddHandle(ScopedHandle::From(std::move(handle)), &out_data->handle);
|
|
out_data->version = version;
|
|
}
|
|
|
|
void SerializationContext::AddAssociatedEndpoint(
|
|
ScopedInterfaceEndpointHandle handle,
|
|
AssociatedEndpointHandle_Data* out_data) {
|
|
if (!handle.is_valid()) {
|
|
out_data->value = kEncodedInvalidHandleValue;
|
|
} else {
|
|
DCHECK_LT(associated_endpoint_handles_.size(),
|
|
std::numeric_limits<uint32_t>::max());
|
|
out_data->value =
|
|
static_cast<uint32_t>(associated_endpoint_handles_.size());
|
|
associated_endpoint_handles_.emplace_back(std::move(handle));
|
|
}
|
|
}
|
|
|
|
void SerializationContext::AddAssociatedInterfaceInfo(
|
|
ScopedInterfaceEndpointHandle handle,
|
|
uint32_t version,
|
|
AssociatedInterface_Data* out_data) {
|
|
AddAssociatedEndpoint(std::move(handle), &out_data->handle);
|
|
out_data->version = version;
|
|
}
|
|
|
|
void SerializationContext::TakeHandlesFromMessage(Message* message) {
|
|
handles_.swap(*message->mutable_handles());
|
|
associated_endpoint_handles_.swap(
|
|
*message->mutable_associated_endpoint_handles());
|
|
}
|
|
|
|
mojo::ScopedHandle SerializationContext::TakeHandle(
|
|
const Handle_Data& encoded_handle) {
|
|
if (!encoded_handle.is_valid())
|
|
return mojo::ScopedHandle();
|
|
DCHECK_LT(encoded_handle.value, handles_.size());
|
|
return std::move(handles_[encoded_handle.value]);
|
|
}
|
|
|
|
mojo::ScopedInterfaceEndpointHandle
|
|
SerializationContext::TakeAssociatedEndpointHandle(
|
|
const AssociatedEndpointHandle_Data& encoded_handle) {
|
|
if (!encoded_handle.is_valid())
|
|
return mojo::ScopedInterfaceEndpointHandle();
|
|
DCHECK_LT(encoded_handle.value, associated_endpoint_handles_.size());
|
|
return std::move(associated_endpoint_handles_[encoded_handle.value]);
|
|
}
|
|
|
|
} // namespace internal
|
|
} // namespace mojo
|