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 #ifndef MOJO_PUBLIC_CPP_BINDINGS_LIB_BINDINGS_SERIALIZATION_CONTEXT_H_ 6 #define MOJO_PUBLIC_CPP_BINDINGS_LIB_BINDINGS_SERIALIZATION_CONTEXT_H_ 7 8 #include <stddef.h> 9 10 #include <memory> 11 #include <vector> 12 13 #include "base/component_export.h" 14 #include "base/containers/stack_container.h" 15 #include "base/macros.h" 16 #include "mojo/public/cpp/bindings/lib/bindings_internal.h" 17 #include "mojo/public/cpp/bindings/scoped_interface_endpoint_handle.h" 18 #include "mojo/public/cpp/system/handle.h" 19 20 namespace mojo { 21 22 class Message; 23 24 namespace internal { 25 26 // Context information for serialization/deserialization routines. COMPONENT_EXPORT(MOJO_CPP_BINDINGS_BASE)27class COMPONENT_EXPORT(MOJO_CPP_BINDINGS_BASE) SerializationContext { 28 public: 29 SerializationContext(); 30 ~SerializationContext(); 31 32 // Adds a handle to the handle list and outputs its serialized form in 33 // |*out_data|. 34 void AddHandle(mojo::ScopedHandle handle, Handle_Data* out_data); 35 36 // Adds an interface info to the handle list and outputs its serialized form 37 // in |*out_data|. 38 void AddInterfaceInfo(mojo::ScopedMessagePipeHandle handle, 39 uint32_t version, 40 Interface_Data* out_data); 41 42 // Adds an associated interface endpoint (for e.g. an 43 // AssociatedInterfaceRequest) to this context and outputs its serialized form 44 // in |*out_data|. 45 void AddAssociatedEndpoint(ScopedInterfaceEndpointHandle handle, 46 AssociatedEndpointHandle_Data* out_data); 47 48 // Adds an associated interface info to associated endpoint handle and version 49 // data lists and outputs its serialized form in |*out_data|. 50 void AddAssociatedInterfaceInfo(ScopedInterfaceEndpointHandle handle, 51 uint32_t version, 52 AssociatedInterface_Data* out_data); 53 54 const std::vector<mojo::ScopedHandle>* handles() { return &handles_; } 55 std::vector<mojo::ScopedHandle>* mutable_handles() { return &handles_; } 56 57 const std::vector<ScopedInterfaceEndpointHandle>* 58 associated_endpoint_handles() const { 59 return &associated_endpoint_handles_; 60 } 61 std::vector<ScopedInterfaceEndpointHandle>* 62 mutable_associated_endpoint_handles() { 63 return &associated_endpoint_handles_; 64 } 65 66 // Takes handles from a received Message object and assumes ownership of them. 67 // Individual handles can be extracted using Take* methods below. 68 void TakeHandlesFromMessage(Message* message); 69 70 // Takes a handle from the list of serialized handle data. 71 mojo::ScopedHandle TakeHandle(const Handle_Data& encoded_handle); 72 73 // Takes a handle from the list of serialized handle data and returns it in 74 // |*out_handle| as a specific scoped handle type. 75 template <typename T> 76 ScopedHandleBase<T> TakeHandleAs(const Handle_Data& encoded_handle) { 77 return ScopedHandleBase<T>::From(TakeHandle(encoded_handle)); 78 } 79 80 mojo::ScopedInterfaceEndpointHandle TakeAssociatedEndpointHandle( 81 const AssociatedEndpointHandle_Data& encoded_handle); 82 83 private: 84 // Handles owned by this object. Used during serialization to hold onto 85 // handles accumulated during pre-serialization, and used during 86 // deserialization to hold onto handles extracted from a message. 87 std::vector<mojo::ScopedHandle> handles_; 88 89 // Stashes ScopedInterfaceEndpointHandles encoded in a message by index. 90 std::vector<ScopedInterfaceEndpointHandle> associated_endpoint_handles_; 91 92 DISALLOW_COPY_AND_ASSIGN(SerializationContext); 93 }; 94 95 } // namespace internal 96 } // namespace mojo 97 98 #endif // MOJO_PUBLIC_CPP_BINDINGS_LIB_BINDINGS_SERIALIZATION_CONTEXT_H_ 99