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