// Copyright (c) 2011 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 "ppapi/cpp/dev/buffer_dev.h"

#include "ppapi/c/dev/ppb_buffer_dev.h"
#include "ppapi/cpp/instance_handle.h"
#include "ppapi/cpp/module.h"
#include "ppapi/cpp/module_impl.h"

namespace pp {

namespace {

template <> const char* interface_name<PPB_Buffer_Dev>() {
  return PPB_BUFFER_DEV_INTERFACE;
}

}  // namespace

Buffer_Dev::Buffer_Dev() : data_(NULL), size_(0) {
}

Buffer_Dev::Buffer_Dev(const Buffer_Dev& other)
    : Resource(other) {
  Init();
}

Buffer_Dev::Buffer_Dev(PP_Resource resource)
    : Resource(resource) {
  Init();
}

Buffer_Dev::Buffer_Dev(const InstanceHandle& instance, uint32_t size)
    : data_(NULL),
      size_(0) {
  if (!has_interface<PPB_Buffer_Dev>())
    return;

  PassRefFromConstructor(get_interface<PPB_Buffer_Dev>()->Create(
      instance.pp_instance(), size));
  Init();
}

Buffer_Dev::Buffer_Dev(PassRef, PP_Resource resource)
    : Resource(PassRef(), resource) {
  Init();
}

Buffer_Dev::~Buffer_Dev() {
  get_interface<PPB_Buffer_Dev>()->Unmap(pp_resource());
}

Buffer_Dev& Buffer_Dev::operator=(const Buffer_Dev& rhs) {
  Resource::operator=(rhs);
  Init();
  return *this;
}

void Buffer_Dev::Init() {
  if (get_interface<PPB_Buffer_Dev>()->Describe(pp_resource(), &size_)) {
    data_ = get_interface<PPB_Buffer_Dev>()->Map(pp_resource());
    if (data_)
      return;
  }

  Clear();
  data_ = NULL;
  size_ = 0;
}

}  // namespace pp
