// 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 "base/macros.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,
    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 void 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_[];
  DISALLOW_IMPLICIT_CONSTRUCTORS(Builtin);
};

}  // namespace dart
}  // namespace mojo

#endif  // MOJO_DART_EMBEDDER_BUILTIN_H_
