// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

@patch class Asset {
  /// Call to request assets from the embedder.
  @patch static HashMap<String, Asset> request() {
    HashMap<String, Asset> assets = new HashMap<String, Asset>();
    Uint8List tarBytes = _requestAssets();
    if (tarBytes == null) {
      return assets;
    }
    List assetList = _decodeAssets(tarBytes);
    for (int i = 0; i < assetList.length; i += 2) {
      var a = new Asset(assetList[i], assetList[i + 1]);
      assets[a.name] = a;
    }
    return assets;
  }
}

List _decodeAssets(Uint8List data) native "VMService_DecodeAssets";

@patch bool sendIsolateServiceMessage(SendPort sp, List m)
    native "VMService_SendIsolateServiceMessage";
@patch void sendRootServiceMessage(List m)
    native "VMService_SendRootServiceMessage";
@patch void sendObjectRootServiceMessage(List m)
    native "VMService_SendObjectRootServiceMessage";
@patch void _onStart() native "VMService_OnStart";
@patch void _onExit() native "VMService_OnExit";
@patch void onServerAddressChange(String address)
    native "VMService_OnServerAddressChange";
@patch bool _vmListenStream(String streamId) native "VMService_ListenStream";
@patch void _vmCancelStream(String streamId) native "VMService_CancelStream";
@patch Uint8List _requestAssets() native "VMService_RequestAssets";
@patch void _spawnUriNotify(obj, String token)
    native "VMService_spawnUriNotify";
