| // 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 |