// 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. #ifndef MOJO_PUBLIC_CPP_BINDINGS_LIB_HANDLE_INTERFACE_SERIALIZATION_H_ #define MOJO_PUBLIC_CPP_BINDINGS_LIB_HANDLE_INTERFACE_SERIALIZATION_H_ #include "mojo/public/cpp/bindings/associated_group_controller.h" #include "mojo/public/cpp/bindings/associated_interface_ptr_info.h" #include "mojo/public/cpp/bindings/associated_interface_request.h" #include "mojo/public/cpp/bindings/interface_ptr.h" #include "mojo/public/cpp/bindings/interface_request.h" #include "mojo/public/cpp/bindings/lib/bindings_internal.h" #include "mojo/public/cpp/bindings/lib/serialization_context.h" #include "mojo/public/cpp/bindings/lib/serialization_forward.h" #include "mojo/public/cpp/system/handle.h" namespace mojo { namespace internal { template struct Serializer, AssociatedInterfacePtrInfo> { static void Serialize(AssociatedInterfacePtrInfo& input, AssociatedInterface_Data* output, SerializationContext* context) { DCHECK(!input.handle().is_valid() || !input.handle().is_local()); DCHECK_EQ(input.handle().group_controller(), context->group_controller.get()); output->version = input.version(); output->interface_id = input.PassHandle().release(); } static bool Deserialize(AssociatedInterface_Data* input, AssociatedInterfacePtrInfo* output, SerializationContext* context) { output->set_handle(context->group_controller->CreateLocalEndpointHandle( FetchAndReset(&input->interface_id))); output->set_version(input->version); return true; } }; template struct Serializer, AssociatedInterfaceRequest> { static void Serialize(AssociatedInterfaceRequest& input, AssociatedInterfaceRequest_Data* output, SerializationContext* context) { DCHECK(!input.handle().is_valid() || !input.handle().is_local()); DCHECK_EQ(input.handle().group_controller(), context->group_controller.get()); output->interface_id = input.PassHandle().release(); } static bool Deserialize(AssociatedInterfaceRequest_Data* input, AssociatedInterfaceRequest* output, SerializationContext* context) { output->Bind(context->group_controller->CreateLocalEndpointHandle( FetchAndReset(&input->interface_id))); return true; } }; template struct Serializer, InterfacePtr> { static void Serialize(InterfacePtr& input, Interface_Data* output, SerializationContext* context) { InterfacePtrInfo info = input.PassInterface(); output->handle = context->handles.AddHandle(info.PassHandle().release()); output->version = info.version(); } static bool Deserialize(Interface_Data* input, InterfacePtr* output, SerializationContext* context) { output->Bind(InterfacePtrInfo( context->handles.TakeHandleAs(input->handle), input->version)); return true; } }; template struct Serializer, InterfaceRequest> { static void Serialize(InterfaceRequest& input, Handle_Data* output, SerializationContext* context) { *output = context->handles.AddHandle(input.PassMessagePipe().release()); } static bool Deserialize(Handle_Data* input, InterfaceRequest* output, SerializationContext* context) { output->Bind(context->handles.TakeHandleAs(*input)); return true; } }; template struct Serializer, ScopedHandleBase> { static void Serialize(ScopedHandleBase& input, Handle_Data* output, SerializationContext* context) { *output = context->handles.AddHandle(input.release()); } static bool Deserialize(Handle_Data* input, ScopedHandleBase* output, SerializationContext* context) { *output = context->handles.TakeHandleAs(*input); return true; } }; } // namespace internal } // namespace mojo #endif // MOJO_PUBLIC_CPP_BINDINGS_LIB_HANDLE_INTERFACE_SERIALIZATION_H_