// 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 "flutter/lib/mojo/dart_mojo_internal.h"

#include "dart/runtime/include/dart_api.h"
#include "lib/ftl/logging.h"
#include "lib/tonic/converter/dart_converter.h"
#include "lib/tonic/logging/dart_error.h"
#include "mojo/public/platform/dart/mojo_natives.h"

using tonic::LogIfError;
using tonic::ToDart;

namespace blink {
namespace {

MojoHandle g_handle_watcher_producer_handle = MOJO_HANDLE_INVALID;

void SetHandleWatcherControlHandle(Dart_Handle mojo_internal) {
  FTL_CHECK(g_handle_watcher_producer_handle != MOJO_HANDLE_INVALID);
  Dart_Handle handle_watcher_type =
      Dart_GetType(mojo_internal, ToDart("MojoHandleWatcher"), 0, nullptr);
  Dart_Handle field_name = ToDart("mojoControlHandle");
  Dart_Handle control_port_value = ToDart(g_handle_watcher_producer_handle);
  Dart_Handle result =
      Dart_SetField(handle_watcher_type, field_name, control_port_value);
  FTL_CHECK(!LogIfError(result));
}

}  // namespace

void DartMojoInternal::SetHandleWatcherProducerHandle(MojoHandle handle) {
  FTL_CHECK(g_handle_watcher_producer_handle == MOJO_HANDLE_INVALID);
  g_handle_watcher_producer_handle = handle;
}

void DartMojoInternal::InitForIsolate() {
  Dart_Handle mojo_internal = Dart_LookupLibrary(ToDart("dart:mojo.internal"));
  DART_CHECK_VALID(Dart_SetNativeResolver(mojo_internal,
                                          mojo::dart::MojoNativeLookup,
                                          mojo::dart::MojoNativeSymbol));
  SetHandleWatcherControlHandle(mojo_internal);
}

}  // namespace blink
