// Copyright 2014 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/bindings/js/handle.h"

#include <sstream>
#include "mojo/bindings/js/handle_close_observer.h"

namespace mojo {
namespace js {

gin::WrapperInfo HandleWrapper::kWrapperInfo = { gin::kEmbedderNativeGin };

HandleWrapper::HandleWrapper(MojoHandle handle)
    : handle_(mojo::Handle(handle)) {
}

HandleWrapper::~HandleWrapper() {
  NotifyCloseObservers();
}

std::string HandleWrapper::ToString() {
  std::ostringstream oss;
  oss << "[mojo::Handle ";
  if (handle_.is_valid())
    oss << handle_.get().value();
  else
    oss << "null";
  oss << "]";
  return oss.str();
}

gin::ObjectTemplateBuilder HandleWrapper::GetObjectTemplateBuilder(
    v8::Isolate* isolate) {
  return Wrappable<HandleWrapper>::GetObjectTemplateBuilder(isolate)
      .SetMethod("toString", &HandleWrapper::ToString);
}

void HandleWrapper::Close() {
  NotifyCloseObservers();
  handle_.reset();
}

void HandleWrapper::AddCloseObserver(HandleCloseObserver* observer) {
  close_observers_.AddObserver(observer);
}

void HandleWrapper::RemoveCloseObserver(HandleCloseObserver* observer) {
  close_observers_.RemoveObserver(observer);
}

void HandleWrapper::NotifyCloseObservers() {
  if (!handle_.is_valid())
    return;

  FOR_EACH_OBSERVER(HandleCloseObserver, close_observers_, OnWillCloseHandle());
}

}  // namespace js
}  // namespace mojo

namespace gin {

v8::Handle<v8::Value> Converter<mojo::Handle>::ToV8(v8::Isolate* isolate,
                                                    const mojo::Handle& val) {
  if (!val.is_valid())
    return v8::Null(isolate);
  return mojo::js::HandleWrapper::Create(isolate, val.value()).ToV8();
}

bool Converter<mojo::Handle>::FromV8(v8::Isolate* isolate,
                                     v8::Handle<v8::Value> val,
                                     mojo::Handle* out) {
  if (val->IsNull()) {
    *out = mojo::Handle();
    return true;
  }

  gin::Handle<mojo::js::HandleWrapper> handle;
  if (!Converter<gin::Handle<mojo::js::HandleWrapper> >::FromV8(
      isolate, val, &handle))
    return false;

  *out = handle->get();
  return true;
}

}  // namespace gin
