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

#include "mojo/public/cpp/environment/logging.h"
#include "mojo/services/media/common/cpp/mapped_shared_buffer.h"

namespace mojo {
namespace media {

MappedSharedBuffer::MappedSharedBuffer() {}

MappedSharedBuffer::~MappedSharedBuffer() {}

void MappedSharedBuffer::InitNew(uint64_t size) {
  MOJO_DCHECK(size > 0);

  buffer_.reset(new SharedBuffer(size));
  handle_.reset();

  InitInternal(buffer_->handle, size);
}

void MappedSharedBuffer::InitFromHandle(
    ScopedSharedBufferHandle handle,
    uint64_t size) {
  MOJO_DCHECK(handle.is_valid());
  MOJO_DCHECK(size > 0);

  buffer_.reset();
  handle_ = handle.Pass();

  InitInternal(handle_, size);
}

void MappedSharedBuffer::InitInternal(
    ScopedSharedBufferHandle& handle,
    uint64_t size) {
  MOJO_DCHECK(handle.is_valid());
  MOJO_DCHECK(size > 0);

  size_ = size;
  buffer_ptr_.reset();

  void* ptr;
  auto result = MapBuffer(
      handle.get(),
      0, // offset
      size,
      &ptr,
      MOJO_MAP_BUFFER_FLAG_NONE);
  MOJO_DCHECK(result == MOJO_RESULT_OK);
  MOJO_DCHECK(ptr);

  buffer_ptr_.reset(reinterpret_cast<uint8_t*>(ptr));

  OnInit();
}

bool MappedSharedBuffer::initialized() const {
  return buffer_ptr_ != nullptr;
}

uint64_t MappedSharedBuffer::size() const {
  return size_;
}

ScopedSharedBufferHandle MappedSharedBuffer::GetDuplicateHandle() const {
  MOJO_DCHECK(initialized());
  ScopedSharedBufferHandle handle;
  if (buffer_) {
    DuplicateBuffer(buffer_->handle.get(), nullptr, &handle);
  } else {
    MOJO_DCHECK(handle_.is_valid());
    DuplicateBuffer(handle_.get(), nullptr, &handle);
  }
  return handle.Pass();
}

void* MappedSharedBuffer::PtrFromOffset(uint64_t offset) const {
  MOJO_DCHECK(buffer_ptr_);

  if (offset == FifoAllocator::kNullOffset) {
    return nullptr;
  }

  MOJO_DCHECK(offset < size_);
  return buffer_ptr_.get() + offset;
}

uint64_t MappedSharedBuffer::OffsetFromPtr(void *ptr) const {
  MOJO_DCHECK(buffer_ptr_);
  if (ptr == nullptr) {
    return FifoAllocator::kNullOffset;
  }
  uint64_t offset = reinterpret_cast<uint8_t*>(ptr) - buffer_ptr_.get();
  MOJO_DCHECK(offset < size_);
  return offset;
}

void MappedSharedBuffer::OnInit() {}

} // namespace media
} // namespace mojo
