blob: 3188ecfe256fc6f79489a6d8ae1a9efa6a81d47e [file] [log] [blame]
// 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 system
//#include "c_allocators.h"
//#include "mojo/public/c/system/core.h"
import "C"
import "unsafe"
// MessagePipeHandle is a handle for a bidirectional communication channel for
// framed data (i.e., messages). Messages can contain plain data and/or Mojo
// handles.
type MessagePipeHandle interface {
Handle
// ReadMessage reads a message from the message pipe endpoint with the
// specified flags. Returns the message data and attached handles that were
// received in the "next" message.
ReadMessage(flags MojoReadMessageFlags) (MojoResult, []byte, []UntypedHandle)
// WriteMessage writes message data and optional attached handles to
// the message pipe endpoint given by handle. On success the attached
// handles will no longer be valid (i.e.: the receiver will receive
// equivalent but logically different handles).
WriteMessage(bytes []byte, handles []UntypedHandle, flags MojoWriteMessageFlags) MojoResult
}
type messagePipe struct {
baseHandle
}
func (h *messagePipe) ReadMessage(flags MojoReadMessageFlags) (MojoResult, []byte, []UntypedHandle) {
cParams := C.MallocReadMessageParams()
defer C.FreeReadMessageParams(cParams)
*cParams.num_bytes = 0
*cParams.num_handles = 0
if result := C.MojoReadMessage(h.mojoHandle.cValue(), nil, cParams.num_bytes, nil, cParams.num_handles, flags.cValue()); result != C.MOJO_RESULT_RESOURCE_EXHAUSTED {
return MojoResult(result), nil, nil
}
cArrays := C.MallocMessageArrays(*cParams.num_bytes, *cParams.num_handles)
defer C.FreeMessageArrays(cArrays)
result := C.MojoReadMessage(h.mojoHandle.cValue(), cArrays.bytes, cParams.num_bytes, cArrays.handles, cParams.num_handles, C.MojoReadMessageFlags(flags))
bytesLen := int(*cParams.num_bytes)
cBytes := *(*[]byte)(newUnsafeSlice(unsafe.Pointer(cArrays.bytes), bytesLen))
bytes := make([]byte, bytesLen)
copy(bytes, cBytes)
handlesLen := int(*cParams.num_handles)
cHandles := *(*[]MojoHandle)(newUnsafeSlice(unsafe.Pointer(cArrays.handles), handlesLen))
handles := []UntypedHandle{}
for i := 0; i < handlesLen; i++ {
handles = append(handles, &untypedHandleImpl{baseHandle{cHandles[i]}})
}
return MojoResult(result), bytes, handles
}
func (h *messagePipe) WriteMessage(bytes []byte, handles []UntypedHandle, flags MojoWriteMessageFlags) MojoResult {
cArrays := C.MallocMessageArrays(C.uint32_t(len(bytes)), C.uint32_t(len(handles)))
defer C.FreeMessageArrays(cArrays)
cBytes := *(*[]byte)(newUnsafeSlice(unsafe.Pointer(cArrays.bytes), len(bytes)))
copy(cBytes, bytes)
cHandles := *(*[]MojoHandle)(newUnsafeSlice(unsafe.Pointer(cArrays.handles), len(handles)))
for i := 0; i < len(handles); i++ {
cHandles[i] = handles[i].ReleaseNativeHandle()
}
return MojoResult(C.MojoWriteMessage(h.mojoHandle.cValue(), cArrays.bytes, C.uint32_t(len(bytes)), cArrays.handles, C.uint32_t(len(handles)), flags.cValue()))
}