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

#ifndef MOJO_DART_EMBEDDER_BUILTIN_H_
#define MOJO_DART_EMBEDDER_BUILTIN_H_

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

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

namespace mojo {
namespace dart {

#define REGISTER_FUNCTION(name, count)                                         \
  { "" #name, name, count },
#define DECLARE_FUNCTION(name, count)                                          \
  extern void name(Dart_NativeArguments args);

class Builtin {
 public:
  // Note: Changes to this enum should be accompanied with changes to
  // the builtin_libraries_ array in builtin.cc.
  enum BuiltinLibraryId {
    kBuiltinLibrary = 0,
    kMojoInternalLibrary = 1,
    kDartMojoIoLibrary = 2,
    kInvalidLibrary,
  };

  static uint8_t snapshot_magic_number[4];

  // Return the library specified in 'id'.
  static Dart_Handle GetLibrary(BuiltinLibraryId id);

  // Prepare the library specified in 'id'. Preparation includes:
  // 1) Setting the native resolver (if any).
  // 2) Applying patch files (if any).
  // NOTE: This should only be called once for a library per isolate.
  static Dart_Handle PrepareLibrary(BuiltinLibraryId id);

  static int64_t GetIntegerValue(Dart_Handle value_obj) {
    int64_t value = 0;
    Dart_Handle result = Dart_IntegerToInt64(value_obj, &value);
    if (Dart_IsError(result))
      Dart_PropagateError(result);
    return value;
  }

  static Dart_Handle NewError(const char* format, ...);

 private:
  // Native method support.
  static Dart_NativeFunction NativeLookup(Dart_Handle name,
                                          int argument_count,
                                          bool* auto_setup_scope);

  static const uint8_t* NativeSymbol(Dart_NativeFunction nf);
  static Dart_Handle GetStringResource(const char* resource_name);
  static void LoadPatchFiles(Dart_Handle library,
                             const char* patch_uri,
                             const char** patch_files);
  typedef struct {
    const char* url_;
    bool has_natives_;
    Dart_NativeEntrySymbol native_symbol_;
    Dart_NativeEntryResolver native_resolver_;
    const char* patch_url_;
    const char** patch_resources_;
  } builtin_lib_props;
  static builtin_lib_props builtin_libraries_[];

  static const char* mojo_core_patch_resource_names_[];
  static const char* mojo_io_patch_resource_names_[];

  // This type cannot be instantiated.
  Builtin() = delete;
};

}  // namespace dart
}  // namespace mojo

#endif  // MOJO_DART_EMBEDDER_BUILTIN_H_
