// 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 "flutter/lib/ui/isolate_name_server/isolate_name_server_natives.h"

#include <string>

#include "flutter/lib/ui/isolate_name_server/isolate_name_server.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
