1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "mojo/public/cpp/bindings/lib/serialization_context.h"
6 
7 #include <limits>
8 
9 #include "base/logging.h"
10 #include "mojo/public/cpp/bindings/message.h"
11 #include "mojo/public/cpp/system/core.h"
12 
13 namespace mojo {
14 namespace internal {
15 
16 SerializationContext::SerializationContext() = default;
17 
18 SerializationContext::~SerializationContext() = default;
19 
AddHandle(mojo::ScopedHandle handle,Handle_Data * out_data)20 void SerializationContext::AddHandle(mojo::ScopedHandle handle,
21                                      Handle_Data* out_data) {
22   if (!handle.is_valid()) {
23     out_data->value = kEncodedInvalidHandleValue;
24   } else {
25     DCHECK_LT(handles_.size(), std::numeric_limits<uint32_t>::max());
26     out_data->value = static_cast<uint32_t>(handles_.size());
27     handles_.emplace_back(std::move(handle));
28   }
29 }
30 
AddInterfaceInfo(mojo::ScopedMessagePipeHandle handle,uint32_t version,Interface_Data * out_data)31 void SerializationContext::AddInterfaceInfo(
32     mojo::ScopedMessagePipeHandle handle,
33     uint32_t version,
34     Interface_Data* out_data) {
35   AddHandle(ScopedHandle::From(std::move(handle)), &out_data->handle);
36   out_data->version = version;
37 }
38 
AddAssociatedEndpoint(ScopedInterfaceEndpointHandle handle,AssociatedEndpointHandle_Data * out_data)39 void SerializationContext::AddAssociatedEndpoint(
40     ScopedInterfaceEndpointHandle handle,
41     AssociatedEndpointHandle_Data* out_data) {
42   if (!handle.is_valid()) {
43     out_data->value = kEncodedInvalidHandleValue;
44   } else {
45     DCHECK_LT(associated_endpoint_handles_.size(),
46               std::numeric_limits<uint32_t>::max());
47     out_data->value =
48         static_cast<uint32_t>(associated_endpoint_handles_.size());
49     associated_endpoint_handles_.emplace_back(std::move(handle));
50   }
51 }
52 
AddAssociatedInterfaceInfo(ScopedInterfaceEndpointHandle handle,uint32_t version,AssociatedInterface_Data * out_data)53 void SerializationContext::AddAssociatedInterfaceInfo(
54     ScopedInterfaceEndpointHandle handle,
55     uint32_t version,
56     AssociatedInterface_Data* out_data) {
57   AddAssociatedEndpoint(std::move(handle), &out_data->handle);
58   out_data->version = version;
59 }
60 
TakeHandlesFromMessage(Message * message)61 void SerializationContext::TakeHandlesFromMessage(Message* message) {
62   handles_.swap(*message->mutable_handles());
63   associated_endpoint_handles_.swap(
64       *message->mutable_associated_endpoint_handles());
65 }
66 
TakeHandle(const Handle_Data & encoded_handle)67 mojo::ScopedHandle SerializationContext::TakeHandle(
68     const Handle_Data& encoded_handle) {
69   if (!encoded_handle.is_valid())
70     return mojo::ScopedHandle();
71   DCHECK_LT(encoded_handle.value, handles_.size());
72   return std::move(handles_[encoded_handle.value]);
73 }
74 
75 mojo::ScopedInterfaceEndpointHandle
TakeAssociatedEndpointHandle(const AssociatedEndpointHandle_Data & encoded_handle)76 SerializationContext::TakeAssociatedEndpointHandle(
77     const AssociatedEndpointHandle_Data& encoded_handle) {
78   if (!encoded_handle.is_valid())
79     return mojo::ScopedInterfaceEndpointHandle();
80   DCHECK_LT(encoded_handle.value, associated_endpoint_handles_.size());
81   return std::move(associated_endpoint_handles_[encoded_handle.value]);
82 }
83 
84 }  // namespace internal
85 }  // namespace mojo
86