// Copyright 2015 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 "tonic/dart_string.h"

#include "base/logging.h"

namespace tonic {
namespace {

void FinalizeString(void* string_impl) {
  DCHECK(string_impl);
  reinterpret_cast<StringImpl*>(string_impl)->deref();
}

template <typename CharType>
String Externalize(Dart_Handle handle, intptr_t length) {
  if (!length)
    return StringImpl::empty();
  CharType* buffer = nullptr;
  RefPtr<StringImpl> string_impl =
      StringImpl::createUninitialized(length, buffer);

  string_impl->ref();  // Balanced in FinalizeString.

  Dart_Handle result =
      Dart_MakeExternalString(handle, buffer, length * sizeof(CharType),
                              string_impl.get(), FinalizeString);
  DCHECK(!Dart_IsError(result));
  return String(string_impl.release());
}

}  // namespace

Dart_Handle CreateDartString(StringImpl* string_impl) {
  if (!string_impl)
    return Dart_EmptyString();

  string_impl->ref();  // Balanced in FinalizeString.

  if (string_impl->is8Bit()) {
    return Dart_NewExternalLatin1String(string_impl->characters8(),
                                        string_impl->length(), string_impl,
                                        FinalizeString);
  } else {
    return Dart_NewExternalUTF16String(string_impl->characters16(),
                                       string_impl->length(), string_impl,
                                       FinalizeString);
  }
}

String ExternalizeDartString(Dart_Handle handle) {
  DCHECK(Dart_IsString(handle));
  DCHECK(!Dart_IsExternalString(handle));
  bool is_latin1 = Dart_IsStringLatin1(handle);
  intptr_t length;
  Dart_StringLength(handle, &length);
  if (is_latin1)
    return Externalize<LChar>(handle, length);
  return Externalize<UChar>(handle, length);
}

}  // namespace tonic
