// 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";
