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