| // Copyright 2015 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. | 
 |  | 
 | package bindings | 
 |  | 
 | import ( | 
 | 	"fmt" | 
 | 	"mojo/public/go/system" | 
 | ) | 
 |  | 
 | // MessagePipeHandleOwner owns a message pipe handle, it can only pass it | 
 | // invalidating itself or close it. | 
 | type MessagePipeHandleOwner struct { | 
 | 	handle system.MessagePipeHandle | 
 | } | 
 |  | 
 | // PassMessagePipe passes ownership of the underlying message pipe handle to | 
 | // the newly created handle object, invalidating the underlying handle object | 
 | // in the process. | 
 | func (o *MessagePipeHandleOwner) PassMessagePipe() system.MessagePipeHandle { | 
 | 	if o.handle == nil { | 
 | 		return &InvalidHandle{} | 
 | 	} | 
 | 	return o.handle.ToUntypedHandle().ToMessagePipeHandle() | 
 | } | 
 |  | 
 | // Close closes the underlying handle. | 
 | func (o *MessagePipeHandleOwner) Close() { | 
 | 	if o.handle != nil { | 
 | 		o.handle.Close() | 
 | 	} | 
 | } | 
 |  | 
 | // NewMessagePipeHandleOwner creates |MessagePipeHandleOwner| that owns the | 
 | // provided message pipe handle. | 
 | func NewMessagePipeHandleOwner(handle system.MessagePipeHandle) MessagePipeHandleOwner { | 
 | 	return MessagePipeHandleOwner{handle} | 
 | } | 
 |  | 
 | // InterfaceRequest represents a request from a remote client for an | 
 | // implementation of mojo interface over a specified message pipe. The | 
 | // implementor of the interface should remove the message pipe by calling | 
 | // PassMessagePipe() and attach it to the implementation. | 
 | type InterfaceRequest struct { | 
 | 	MessagePipeHandleOwner | 
 | } | 
 |  | 
 | // InterfacePointer owns a message pipe handle with an implementation of mojo | 
 | // interface attached to the other end of the message pipe. The client of the | 
 | // interface should remove the message pipe by calling PassMessagePipe() and | 
 | // attach it to the proxy. | 
 | type InterfacePointer struct { | 
 | 	MessagePipeHandleOwner | 
 | } | 
 |  | 
 | // CreateMessagePipeForInterface creates a message pipe with interface request | 
 | // on one end and interface pointer on the other end. The interface request | 
 | // should be attached to appropriate mojo interface implementation and | 
 | // the interface pointer should be attached to mojo interface proxy. | 
 | func CreateMessagePipeForMojoInterface() (InterfaceRequest, InterfacePointer) { | 
 | 	r, h0, h1 := system.GetCore().CreateMessagePipe(nil) | 
 | 	if r != system.MOJO_RESULT_OK { | 
 | 		panic(fmt.Sprintf("can't create a message pipe: %v", r)) | 
 | 	} | 
 | 	return InterfaceRequest{MessagePipeHandleOwner{h0}}, InterfacePointer{MessagePipeHandleOwner{h1}} | 
 | } |