// 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.

#ifndef MOJO_DART_EMBEDDER_COMMON_H_
#define MOJO_DART_EMBEDDER_COMMON_H_

#include "dart/runtime/include/dart_api.h"

namespace mojo {
namespace dart {

class DartEmbedder {
 public:
  static Dart_Handle GetDartType(const char* library_url,
                                 const char* class_name);

  static Dart_Handle NewDartExceptionWithMessage(const char* library_url,
                                                 const char* error_type,
                                                 const char* message);

  static Dart_Handle NewInternalError(const char* message);

  // Returns the integer value of a Dart object. If the object is not
  // an integer value an API error is propagated.
  static int64_t GetIntegerValue(Dart_Handle value_obj);
  // Returns the integer value of a Dart object. If the object is not
  // an integer value or outside the requested range an API error is
  // propagated.
  static int64_t GetInt64ValueCheckRange(
      Dart_Handle value_obj, int64_t lower, int64_t upper);
  // Returns the intptr_t value of a Dart object. If the object is not
  // an integer value or the value is outside the intptr_t range an
  // API error is propagated.
  static intptr_t GetIntptrValue(Dart_Handle value_obj);
  // Returns the string value of a Dart object. If the object is not
  // a string value an API error is propagated.
  static const char* GetStringValue(Dart_Handle str_obj);
  // Returns the boolean value of a Dart object. If the object is not
  // a boolean value an API error is propagated.
  static bool GetBooleanValue(Dart_Handle bool_obj);
  // Sets the field "name" in handle to val. Any error is propagated.
  static void SetIntegerField(Dart_Handle handle,
                              const char* name,
                              int64_t val);
  // Sets the field "name" in handle to val. Any error is propagated.
  static void SetStringField(Dart_Handle handle,
                             const char* name,
                             const char* val);
  // Returns a new Dart string. Any error is propagated.
  static Dart_Handle NewCString(const char* str);

  // Sets the return value in arguments to null.
  static void SetNullReturn(Dart_NativeArguments arguments);

  // Sets the return value in arguments to a string created from |str|.
  static void SetCStringReturn(Dart_NativeArguments arguments, const char* str);

  // Gets the string argument at index and returns a C string.
  // Any error is propagated.
  static const char* GetStringArgument(Dart_NativeArguments arguments,
                                       intptr_t index);

  // Copies the bytes from a TypedDataList argument at |index| into a C array.
  // Any error is propagated. Caller must call free on |out|.
  // NOTE: Only supports Uint8List now.
  static void GetTypedDataListArgument(Dart_NativeArguments arguments,
                                       intptr_t index,
                                       uint8_t** out,
                                       intptr_t* out_len);

  // Creates a Uint8List with a copy of bytes.
  // Any error is propagated.
  static Dart_Handle MakeUint8TypedData(uint8_t* bytes, intptr_t length);
};

}  // namespace dart
}  // namespace mojo


#endif  // MOJO_DART_EMBEDDER_COMMON_H_
