// 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

// SharedBufferHandle is a handle for a buffer that can be shared between
// applications.
type SharedBufferHandle interface {
	Handle

	// DuplicateBufferHandle duplicates the handle to a buffer.
	DuplicateBufferHandle(opts *DuplicateBufferHandleOptions) (MojoResult, SharedBufferHandle)

	// MapBuffer maps the requested part of the shared buffer given by handle
	// into memory with specified flags. On success, it returns slice that
	// points to the requested shared buffer.
	MapBuffer(offset uint64, numBytes int, flags MojoMapBufferFlags) (MojoResult, []byte)

	// UnmapBuffer unmaps a buffer that was returned by MapBuffer.
	UnmapBuffer(buffer []byte) MojoResult

	// Gets the shared buffer information (buffer size, and the specified flags).
	GetBufferInformation() (MojoResult, MojoBufferInformation)
}

type sharedBuffer struct {
	// baseHandle should always be the first component of this struct,
	// see |finalizeHandle()| for more details.
	baseHandle
}

func (h *sharedBuffer) DuplicateBufferHandle(opts *DuplicateBufferHandleOptions) (MojoResult, SharedBufferHandle) {
	var flags uint32
	if opts != nil {
		flags = uint32(opts.Flags)
	}
	h.core.mu.Lock()
	r, dup := sysImpl.DuplicateBufferHandle(uint32(h.mojoHandle), flags)
	h.core.mu.Unlock()
	return MojoResult(r), core.AcquireNativeHandle(MojoHandle(dup)).ToSharedBufferHandle()
}

func (h *sharedBuffer) MapBuffer(offset uint64, numBytes int, flags MojoMapBufferFlags) (MojoResult, []byte) {
	h.core.mu.Lock()
	r, buf := sysImpl.MapBuffer(uint32(h.mojoHandle), offset, uint64(numBytes), uint32(flags))
	h.core.mu.Unlock()
	if r != 0 {
		return MojoResult(r), nil
	}

	return MojoResult(r), buf
}

func (h *sharedBuffer) UnmapBuffer(buffer []byte) MojoResult {
	h.core.mu.Lock()
	r := sysImpl.UnmapBuffer(buffer)
	h.core.mu.Unlock()
	return MojoResult(r)
}

func (h *sharedBuffer) GetBufferInformation() (MojoResult, MojoBufferInformation) {
	h.core.mu.Lock()
	r, flags, numBytes := sysImpl.GetBufferInformation(uint32(h.mojoHandle))
	h.core.mu.Unlock()

	if r != 0 {
		return MojoResult(r), MojoBufferInformation{}
	}

	return MojoResult(r), MojoBufferInformation{
		Flags:    MojoBufferInformationFlags(flags),
		NumBytes: numBytes}
}
