// Copyright 2013 The Flutter 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 <string>

#include "flutter/lib/ui/isolate_name_server/isolate_name_server.h"
#include "flutter/lib/ui/isolate_name_server/isolate_name_server_natives.h"
#include "flutter/lib/ui/ui_dart_state.h"
#include "third_party/tonic/dart_binding_macros.h"
#include "third_party/tonic/dart_library_natives.h"

namespace flutter {

Dart_Handle IsolateNameServerNatives::LookupPortByName(
    const std::string& name) {
  auto name_server = UIDartState::Current()->GetIsolateNameServer();
  if (!name_server) {
    return Dart_Null();
  }
  Dart_Port port = name_server->LookupIsolatePortByName(name);
  if (port == ILLEGAL_PORT) {
    return Dart_Null();
  }
  return Dart_NewSendPort(port);
}

Dart_Handle IsolateNameServerNatives::RegisterPortWithName(
    Dart_Handle port_handle,
    const std::string& name) {
  auto name_server = UIDartState::Current()->GetIsolateNameServer();
  if (!name_server) {
    return Dart_False();
  }
  Dart_Port port = ILLEGAL_PORT;
  Dart_SendPortGetId(port_handle, &port);
  if (!name_server->RegisterIsolatePortWithName(port, name)) {
    return Dart_False();
  }
  return Dart_True();
}

Dart_Handle IsolateNameServerNatives::RemovePortNameMapping(
    const std::string& name) {
  auto name_server = UIDartState::Current()->GetIsolateNameServer();
  if (!name_server) {
    return Dart_False();
  }
  if (!name_server->RemoveIsolateNameMapping(name)) {
    return Dart_False();
  }
  return Dart_True();
}

#define FOR_EACH_BINDING(V)                         \
  V(IsolateNameServerNatives, LookupPortByName)     \
  V(IsolateNameServerNatives, RegisterPortWithName) \
  V(IsolateNameServerNatives, RemovePortNameMapping)

FOR_EACH_BINDING(DART_NATIVE_CALLBACK_STATIC)

#define DART_REGISTER_NATIVE_STATIC_(CLASS, METHOD) \
  DART_REGISTER_NATIVE_STATIC(CLASS, METHOD),

void IsolateNameServerNatives::RegisterNatives(
    tonic::DartLibraryNatives* natives) {
  natives->Register({FOR_EACH_BINDING(DART_REGISTER_NATIVE_STATIC_)});
}

}  // namespace flutter
