// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// WARNING: This file is machine generated by fidlgen.

library fidl_test_name;

import 'dart:async';
import 'dart:typed_data';

import 'package:fidl/fidl.dart' as $fidl;
import 'package:meta/meta.dart';
import 'package:zircon/zircon.dart';

// These imports improve deduplication by making uses of {fidl.dart},
// {fidl_async.dart} and {fidl.dart, fidl_async.dart} generate equivalent
// packages. In AOT, the dead code will be removed by tree shaking.
// ignore: unused_import
import 'fidl_async.dart' as $strongly_connect_async;

// ignore_for_file: always_specify_types
// ignore_for_file: avoid_positional_boolean_parameters
// ignore_for_file: avoid_returning_null
// ignore_for_file: cascade_invocations
// ignore_for_file: constant_identifier_names
// ignore_for_file: one_member_abstracts
// ignore_for_file: prefer_constructors_over_static_methods
// ignore_for_file: prefer_single_quotes
// ignore_for_file: public_member_api_docs
// ignore_for_file: unused_import
// ignore_for_file: unused_local_variable
// ignore_for_file: non_constant_identifier_names
// ignore_for_file: library_prefixes
// ignore_for_file: prefer_typing_uninitialized_variables
// ignore_for_file: avoid_js_rounded_ints
// ignore_for_file: unnecessary_parenthesis
// ignore_for_file: always_put_required_named_parameters_first
// ignore_for_file: prefer_generic_function_type_aliases
// ignore_for_file: prefer_equal_for_default_values

abstract class OvernetInternalProtocol {
  static const String $serviceName = null;
  void methodA(int a, int b);
  void methodB(int a, int b, void callback(int result));
}


// methodA: (int a, int b)
const int _kOvernetInternalProtocol_MethodA_Ordinal = 1993818253;
const $fidl.MethodType _kOvernetInternalProtocol_MethodA_Type = const $fidl.MethodType(
    request: const <$fidl.MemberType>[
      const $fidl.MemberType<int>(type: const $fidl.Int64Type(), offset: 16),
      const $fidl.MemberType<int>(type: const $fidl.Int64Type(), offset: 24),
    ],
	response: null,
	name: r"OvernetInternalProtocol.MethodA",
  );
// eventA:  -> (int a, int b)
const int _kOvernetInternalProtocol_EventA_Ordinal = 1746007436;
const $fidl.MethodType _kOvernetInternalProtocol_EventA_Type = const $fidl.MethodType(
    request: null,
	response: const <$fidl.MemberType>[
      const $fidl.MemberType<int>(type: const $fidl.Int64Type(), offset: 16),
      const $fidl.MemberType<int>(type: const $fidl.Int64Type(), offset: 24),
    ],
	name: r"OvernetInternalProtocol.EventA",
  );
// methodB: (int a, int b) -> (int result)
const int _kOvernetInternalProtocol_MethodB_Ordinal = 952134976;
const $fidl.MethodType _kOvernetInternalProtocol_MethodB_Type = const $fidl.MethodType(
    request: const <$fidl.MemberType>[
      const $fidl.MemberType<int>(type: const $fidl.Int64Type(), offset: 16),
      const $fidl.MemberType<int>(type: const $fidl.Int64Type(), offset: 24),
    ],
	response: const <$fidl.MemberType>[
      const $fidl.MemberType<int>(type: const $fidl.Int64Type(), offset: 16),
    ],
	name: r"OvernetInternalProtocol.MethodB",
  );


typedef void OvernetInternalProtocolEventACallback(int a, int b);

class OvernetInternalProtocolProxy extends $fidl.Proxy<OvernetInternalProtocol>
    implements OvernetInternalProtocol {

  OvernetInternalProtocolProxy() : super(new $fidl.ProxyController<OvernetInternalProtocol>($serviceName: null, $interfaceName: r'OvernetInternalProtocol')) {
    ctrl.onResponse = _handleResponse;
  }

  void _handleEvent($fidl.Message $message) {
    final $fidl.Decoder $decoder = new $fidl.Decoder($message);
    switch ($message.ordinal) {
      case _kOvernetInternalProtocol_EventA_Ordinal:
        try {
          final Function $callback = eventA;
          if ($callback == null) {
            $message.closeHandles();
            return;
          }
          final List<$fidl.MemberType> $types = _kOvernetInternalProtocol_EventA_Type.response;
          $decoder.claimMemory(32);
          $callback(
            $types[0].decode($decoder, 0),
            $types[1].decode($decoder, 0),
          );
        // ignore: avoid_catches_without_on_clauses
        } catch(_e) {
          final String _name = _kOvernetInternalProtocol_EventA_Type.name;
          ctrl.proxyError('Exception handling event $_name: $_e');
          ctrl.close();
          rethrow;
        }
        break;
      default:
        ctrl.proxyError('Unexpected message ordinal: ${$message.ordinal}');
        ctrl.close();
        break;
    }
  }

  void _handleResponse($fidl.Message $message) {
    final int $txid = $message.txid;
    if ($txid == 0) {
      _handleEvent($message);
      return;
    }
    final Function $callback = ctrl.getCallback($txid);
    if ($callback == null) {
      $message.closeHandles();
      return;
    }
    final $fidl.Decoder $decoder = new $fidl.Decoder($message);
    switch ($message.ordinal) {
      case _kOvernetInternalProtocol_MethodB_Ordinal:
        try {
          final List<$fidl.MemberType> $types = _kOvernetInternalProtocol_MethodB_Type.response;
          $decoder.claimMemory(24);
          $callback(
            $types[0].decode($decoder, 0),
          );
        // ignore: avoid_catches_without_on_clauses
        } catch(_e) {
          final String _name = _kOvernetInternalProtocol_MethodB_Type.name;
          ctrl.proxyError('Exception handling method response $_name: $_e');
          ctrl.close();
          rethrow;
        }
        break;
      default:
        ctrl.proxyError('Unexpected message ordinal: ${$message.ordinal}');
        ctrl.close();
        break;
    }
  }
  @override
  void methodA(int a, int b) {
    if (!ctrl.isBound) {
      ctrl.proxyError('The proxy is closed.');
      return;
    }

    final $fidl.Encoder $encoder = new $fidl.Encoder();
    $encoder.encodeMessageHeader(_kOvernetInternalProtocol_MethodA_Ordinal, 0);
    $encoder.alloc(32 - $fidl.kMessageHeaderSize);
    final List<$fidl.MemberType> $types = _kOvernetInternalProtocol_MethodA_Type.request;
    $types[0].encode($encoder, a, 0);
    $types[1].encode($encoder, b, 0);
    ctrl.sendMessage($encoder.message);
  }
  OvernetInternalProtocolEventACallback eventA;
  @override
  void methodB(int a, int b, void callback(int result)) {
    if (!ctrl.isBound) {
      ctrl.proxyError('The proxy is closed.');
      return;
    }

    final $fidl.Encoder $encoder = new $fidl.Encoder();
    $encoder.encodeMessageHeader(_kOvernetInternalProtocol_MethodB_Ordinal, 0);
    $encoder.alloc(32 - $fidl.kMessageHeaderSize);
    final List<$fidl.MemberType> $types = _kOvernetInternalProtocol_MethodB_Type.request;
    $types[0].encode($encoder, a, 0);
    $types[1].encode($encoder, b, 0);
    Function $zonedCallback;
    if ((callback == null) || identical(Zone.current, Zone.root)) {
      $zonedCallback = callback;
    } else {
      Zone $z = Zone.current;
      $zonedCallback = ((int result) {
        $z.bindCallback(() {
          callback(result,);
        })();
      });
    }
    ctrl.sendMessageWithResponse($encoder.message, $zonedCallback);
  }
}

class OvernetInternalProtocolEvents {
  $fidl.Binding<OvernetInternalProtocol> _binding;
  void eventA(int a, int b)
 {
    final $fidl.Encoder $encoder = new $fidl.Encoder();
    $encoder.encodeMessageHeader(_kOvernetInternalProtocol_EventA_Ordinal, 0);
    $encoder.alloc(32 - $fidl.kMessageHeaderSize);
    final List<$fidl.MemberType> $types = _kOvernetInternalProtocol_EventA_Type.response;
    $types[0].encode($encoder, a, 0);
    $types[1].encode($encoder, b, 0);
    _binding.sendMessage($encoder.message);
  }
}

class OvernetInternalProtocolBinding extends $fidl.Binding<OvernetInternalProtocol> {
  OvernetInternalProtocolBinding() {
    events._binding = this;
  }

  final OvernetInternalProtocolEvents events = new OvernetInternalProtocolEvents();


  Function _methodBResponder($fidl.MessageSink $respond, int $txid) {
    return (int result) {
      final $fidl.Encoder $encoder = new $fidl.Encoder();
      $encoder.encodeMessageHeader(_kOvernetInternalProtocol_MethodB_Ordinal, $txid);
      $encoder.alloc(24 - $fidl.kMessageHeaderSize);
      final List<$fidl.MemberType> $types = _kOvernetInternalProtocol_MethodB_Type.response;
      $types[0].encode($encoder, result, 0);
      $respond($encoder.message);
    };
  }

  @override
  void handleMessage($fidl.Message $message, $fidl.MessageSink $respond) {
    final $fidl.Decoder $decoder = new $fidl.Decoder($message);
    switch ($message.ordinal) {
      case _kOvernetInternalProtocol_MethodA_Ordinal:
        try {
          final List<$fidl.MemberType> $types = _kOvernetInternalProtocol_MethodA_Type.request;
          $decoder.claimMemory(32);
          impl.methodA(
            $types[0].decode($decoder, 0),
            $types[1].decode($decoder, 0),
          );
        // ignore: avoid_catches_without_on_clauses
        } catch(_e) {
          close();
          final String _name = _kOvernetInternalProtocol_MethodA_Type.name;
          print('Exception handling method call $_name: $_e');
          rethrow;
        }
        break;
      case _kOvernetInternalProtocol_MethodB_Ordinal:
        try {
          final List<$fidl.MemberType> $types = _kOvernetInternalProtocol_MethodB_Type.request;
          $decoder.claimMemory(32);
          impl.methodB(
            $types[0].decode($decoder, 0),
            $types[1].decode($decoder, 0),
            _methodBResponder($respond, $message.txid),
          );
        // ignore: avoid_catches_without_on_clauses
        } catch(_e) {
          close();
          final String _name = _kOvernetInternalProtocol_MethodB_Type.name;
          print('Exception handling method call $_name: $_e');
          rethrow;
        }
        break;
      default:
        throw new $fidl.FidlError('Unexpected message name for OvernetInternalProtocolBinding');
    }
  }
}


abstract class SocketControlProtocol {
  static const String $serviceName = null;
  void methodA(int a, int b);
  void methodB(int a, int b, void callback(int result));
}


// methodA: (int a, int b)
const int _kSocketControlProtocol_MethodA_Ordinal = 1007842318;
const $fidl.MethodType _kSocketControlProtocol_MethodA_Type = const $fidl.MethodType(
    request: const <$fidl.MemberType>[
      const $fidl.MemberType<int>(type: const $fidl.Int64Type(), offset: 16),
      const $fidl.MemberType<int>(type: const $fidl.Int64Type(), offset: 24),
    ],
	response: null,
	name: r"SocketControlProtocol.MethodA",
  );
// eventA:  -> (int a, int b)
const int _kSocketControlProtocol_EventA_Ordinal = 955483393;
const $fidl.MethodType _kSocketControlProtocol_EventA_Type = const $fidl.MethodType(
    request: null,
	response: const <$fidl.MemberType>[
      const $fidl.MemberType<int>(type: const $fidl.Int64Type(), offset: 16),
      const $fidl.MemberType<int>(type: const $fidl.Int64Type(), offset: 24),
    ],
	name: r"SocketControlProtocol.EventA",
  );
// methodB: (int a, int b) -> (int result)
const int _kSocketControlProtocol_MethodB_Ordinal = 677342235;
const $fidl.MethodType _kSocketControlProtocol_MethodB_Type = const $fidl.MethodType(
    request: const <$fidl.MemberType>[
      const $fidl.MemberType<int>(type: const $fidl.Int64Type(), offset: 16),
      const $fidl.MemberType<int>(type: const $fidl.Int64Type(), offset: 24),
    ],
	response: const <$fidl.MemberType>[
      const $fidl.MemberType<int>(type: const $fidl.Int64Type(), offset: 16),
    ],
	name: r"SocketControlProtocol.MethodB",
  );


typedef void SocketControlProtocolEventACallback(int a, int b);

class SocketControlProtocolProxy extends $fidl.Proxy<SocketControlProtocol>
    implements SocketControlProtocol {

  SocketControlProtocolProxy() : super(new $fidl.ProxyController<SocketControlProtocol>($serviceName: null, $interfaceName: r'SocketControlProtocol')) {
    ctrl.onResponse = _handleResponse;
  }

  void _handleEvent($fidl.Message $message) {
    final $fidl.Decoder $decoder = new $fidl.Decoder($message);
    switch ($message.ordinal) {
      case _kSocketControlProtocol_EventA_Ordinal:
        try {
          final Function $callback = eventA;
          if ($callback == null) {
            $message.closeHandles();
            return;
          }
          final List<$fidl.MemberType> $types = _kSocketControlProtocol_EventA_Type.response;
          $decoder.claimMemory(32);
          $callback(
            $types[0].decode($decoder, 0),
            $types[1].decode($decoder, 0),
          );
        // ignore: avoid_catches_without_on_clauses
        } catch(_e) {
          final String _name = _kSocketControlProtocol_EventA_Type.name;
          ctrl.proxyError('Exception handling event $_name: $_e');
          ctrl.close();
          rethrow;
        }
        break;
      default:
        ctrl.proxyError('Unexpected message ordinal: ${$message.ordinal}');
        ctrl.close();
        break;
    }
  }

  void _handleResponse($fidl.Message $message) {
    final int $txid = $message.txid;
    if ($txid == 0) {
      _handleEvent($message);
      return;
    }
    final Function $callback = ctrl.getCallback($txid);
    if ($callback == null) {
      $message.closeHandles();
      return;
    }
    final $fidl.Decoder $decoder = new $fidl.Decoder($message);
    switch ($message.ordinal) {
      case _kSocketControlProtocol_MethodB_Ordinal:
        try {
          final List<$fidl.MemberType> $types = _kSocketControlProtocol_MethodB_Type.response;
          $decoder.claimMemory(24);
          $callback(
            $types[0].decode($decoder, 0),
          );
        // ignore: avoid_catches_without_on_clauses
        } catch(_e) {
          final String _name = _kSocketControlProtocol_MethodB_Type.name;
          ctrl.proxyError('Exception handling method response $_name: $_e');
          ctrl.close();
          rethrow;
        }
        break;
      default:
        ctrl.proxyError('Unexpected message ordinal: ${$message.ordinal}');
        ctrl.close();
        break;
    }
  }
  @override
  void methodA(int a, int b) {
    if (!ctrl.isBound) {
      ctrl.proxyError('The proxy is closed.');
      return;
    }

    final $fidl.Encoder $encoder = new $fidl.Encoder();
    $encoder.encodeMessageHeader(_kSocketControlProtocol_MethodA_Ordinal, 0);
    $encoder.alloc(32 - $fidl.kMessageHeaderSize);
    final List<$fidl.MemberType> $types = _kSocketControlProtocol_MethodA_Type.request;
    $types[0].encode($encoder, a, 0);
    $types[1].encode($encoder, b, 0);
    ctrl.sendMessage($encoder.message);
  }
  SocketControlProtocolEventACallback eventA;
  @override
  void methodB(int a, int b, void callback(int result)) {
    if (!ctrl.isBound) {
      ctrl.proxyError('The proxy is closed.');
      return;
    }

    final $fidl.Encoder $encoder = new $fidl.Encoder();
    $encoder.encodeMessageHeader(_kSocketControlProtocol_MethodB_Ordinal, 0);
    $encoder.alloc(32 - $fidl.kMessageHeaderSize);
    final List<$fidl.MemberType> $types = _kSocketControlProtocol_MethodB_Type.request;
    $types[0].encode($encoder, a, 0);
    $types[1].encode($encoder, b, 0);
    Function $zonedCallback;
    if ((callback == null) || identical(Zone.current, Zone.root)) {
      $zonedCallback = callback;
    } else {
      Zone $z = Zone.current;
      $zonedCallback = ((int result) {
        $z.bindCallback(() {
          callback(result,);
        })();
      });
    }
    ctrl.sendMessageWithResponse($encoder.message, $zonedCallback);
  }
}

class SocketControlProtocolEvents {
  $fidl.Binding<SocketControlProtocol> _binding;
  void eventA(int a, int b)
 {
    final $fidl.Encoder $encoder = new $fidl.Encoder();
    $encoder.encodeMessageHeader(_kSocketControlProtocol_EventA_Ordinal, 0);
    $encoder.alloc(32 - $fidl.kMessageHeaderSize);
    final List<$fidl.MemberType> $types = _kSocketControlProtocol_EventA_Type.response;
    $types[0].encode($encoder, a, 0);
    $types[1].encode($encoder, b, 0);
    _binding.sendMessage($encoder.message);
  }
}

class SocketControlProtocolBinding extends $fidl.Binding<SocketControlProtocol> {
  SocketControlProtocolBinding() {
    events._binding = this;
  }

  final SocketControlProtocolEvents events = new SocketControlProtocolEvents();


  Function _methodBResponder($fidl.MessageSink $respond, int $txid) {
    return (int result) {
      final $fidl.Encoder $encoder = new $fidl.Encoder();
      $encoder.encodeMessageHeader(_kSocketControlProtocol_MethodB_Ordinal, $txid);
      $encoder.alloc(24 - $fidl.kMessageHeaderSize);
      final List<$fidl.MemberType> $types = _kSocketControlProtocol_MethodB_Type.response;
      $types[0].encode($encoder, result, 0);
      $respond($encoder.message);
    };
  }

  @override
  void handleMessage($fidl.Message $message, $fidl.MessageSink $respond) {
    final $fidl.Decoder $decoder = new $fidl.Decoder($message);
    switch ($message.ordinal) {
      case _kSocketControlProtocol_MethodA_Ordinal:
        try {
          final List<$fidl.MemberType> $types = _kSocketControlProtocol_MethodA_Type.request;
          $decoder.claimMemory(32);
          impl.methodA(
            $types[0].decode($decoder, 0),
            $types[1].decode($decoder, 0),
          );
        // ignore: avoid_catches_without_on_clauses
        } catch(_e) {
          close();
          final String _name = _kSocketControlProtocol_MethodA_Type.name;
          print('Exception handling method call $_name: $_e');
          rethrow;
        }
        break;
      case _kSocketControlProtocol_MethodB_Ordinal:
        try {
          final List<$fidl.MemberType> $types = _kSocketControlProtocol_MethodB_Type.request;
          $decoder.claimMemory(32);
          impl.methodB(
            $types[0].decode($decoder, 0),
            $types[1].decode($decoder, 0),
            _methodBResponder($respond, $message.txid),
          );
        // ignore: avoid_catches_without_on_clauses
        } catch(_e) {
          close();
          final String _name = _kSocketControlProtocol_MethodB_Type.name;
          print('Exception handling method call $_name: $_e');
          rethrow;
        }
        break;
      default:
        throw new $fidl.FidlError('Unexpected message name for SocketControlProtocolBinding');
    }
  }
}


abstract class ChannelProtocol {
  static const String $serviceName = null;
  void methodA(int a, int b);
  void methodB(int a, int b, void callback(int result));
}


// methodA: (int a, int b)
const int _kChannelProtocol_MethodA_Ordinal = 1432785874;
const $fidl.MethodType _kChannelProtocol_MethodA_Type = const $fidl.MethodType(
    request: const <$fidl.MemberType>[
      const $fidl.MemberType<int>(type: const $fidl.Int64Type(), offset: 16),
      const $fidl.MemberType<int>(type: const $fidl.Int64Type(), offset: 24),
    ],
	response: null,
	name: r"ChannelProtocol.MethodA",
  );
// eventA:  -> (int a, int b)
const int _kChannelProtocol_EventA_Ordinal = 477676034;
const $fidl.MethodType _kChannelProtocol_EventA_Type = const $fidl.MethodType(
    request: null,
	response: const <$fidl.MemberType>[
      const $fidl.MemberType<int>(type: const $fidl.Int64Type(), offset: 16),
      const $fidl.MemberType<int>(type: const $fidl.Int64Type(), offset: 24),
    ],
	name: r"ChannelProtocol.EventA",
  );
// methodB: (int a, int b) -> (int result)
const int _kChannelProtocol_MethodB_Ordinal = 180770075;
const $fidl.MethodType _kChannelProtocol_MethodB_Type = const $fidl.MethodType(
    request: const <$fidl.MemberType>[
      const $fidl.MemberType<int>(type: const $fidl.Int64Type(), offset: 16),
      const $fidl.MemberType<int>(type: const $fidl.Int64Type(), offset: 24),
    ],
	response: const <$fidl.MemberType>[
      const $fidl.MemberType<int>(type: const $fidl.Int64Type(), offset: 16),
    ],
	name: r"ChannelProtocol.MethodB",
  );


typedef void ChannelProtocolEventACallback(int a, int b);

class ChannelProtocolProxy extends $fidl.Proxy<ChannelProtocol>
    implements ChannelProtocol {

  ChannelProtocolProxy() : super(new $fidl.ProxyController<ChannelProtocol>($serviceName: null, $interfaceName: r'ChannelProtocol')) {
    ctrl.onResponse = _handleResponse;
  }

  void _handleEvent($fidl.Message $message) {
    final $fidl.Decoder $decoder = new $fidl.Decoder($message);
    switch ($message.ordinal) {
      case _kChannelProtocol_EventA_Ordinal:
        try {
          final Function $callback = eventA;
          if ($callback == null) {
            $message.closeHandles();
            return;
          }
          final List<$fidl.MemberType> $types = _kChannelProtocol_EventA_Type.response;
          $decoder.claimMemory(32);
          $callback(
            $types[0].decode($decoder, 0),
            $types[1].decode($decoder, 0),
          );
        // ignore: avoid_catches_without_on_clauses
        } catch(_e) {
          final String _name = _kChannelProtocol_EventA_Type.name;
          ctrl.proxyError('Exception handling event $_name: $_e');
          ctrl.close();
          rethrow;
        }
        break;
      default:
        ctrl.proxyError('Unexpected message ordinal: ${$message.ordinal}');
        ctrl.close();
        break;
    }
  }

  void _handleResponse($fidl.Message $message) {
    final int $txid = $message.txid;
    if ($txid == 0) {
      _handleEvent($message);
      return;
    }
    final Function $callback = ctrl.getCallback($txid);
    if ($callback == null) {
      $message.closeHandles();
      return;
    }
    final $fidl.Decoder $decoder = new $fidl.Decoder($message);
    switch ($message.ordinal) {
      case _kChannelProtocol_MethodB_Ordinal:
        try {
          final List<$fidl.MemberType> $types = _kChannelProtocol_MethodB_Type.response;
          $decoder.claimMemory(24);
          $callback(
            $types[0].decode($decoder, 0),
          );
        // ignore: avoid_catches_without_on_clauses
        } catch(_e) {
          final String _name = _kChannelProtocol_MethodB_Type.name;
          ctrl.proxyError('Exception handling method response $_name: $_e');
          ctrl.close();
          rethrow;
        }
        break;
      default:
        ctrl.proxyError('Unexpected message ordinal: ${$message.ordinal}');
        ctrl.close();
        break;
    }
  }
  @override
  void methodA(int a, int b) {
    if (!ctrl.isBound) {
      ctrl.proxyError('The proxy is closed.');
      return;
    }

    final $fidl.Encoder $encoder = new $fidl.Encoder();
    $encoder.encodeMessageHeader(_kChannelProtocol_MethodA_Ordinal, 0);
    $encoder.alloc(32 - $fidl.kMessageHeaderSize);
    final List<$fidl.MemberType> $types = _kChannelProtocol_MethodA_Type.request;
    $types[0].encode($encoder, a, 0);
    $types[1].encode($encoder, b, 0);
    ctrl.sendMessage($encoder.message);
  }
  ChannelProtocolEventACallback eventA;
  @override
  void methodB(int a, int b, void callback(int result)) {
    if (!ctrl.isBound) {
      ctrl.proxyError('The proxy is closed.');
      return;
    }

    final $fidl.Encoder $encoder = new $fidl.Encoder();
    $encoder.encodeMessageHeader(_kChannelProtocol_MethodB_Ordinal, 0);
    $encoder.alloc(32 - $fidl.kMessageHeaderSize);
    final List<$fidl.MemberType> $types = _kChannelProtocol_MethodB_Type.request;
    $types[0].encode($encoder, a, 0);
    $types[1].encode($encoder, b, 0);
    Function $zonedCallback;
    if ((callback == null) || identical(Zone.current, Zone.root)) {
      $zonedCallback = callback;
    } else {
      Zone $z = Zone.current;
      $zonedCallback = ((int result) {
        $z.bindCallback(() {
          callback(result,);
        })();
      });
    }
    ctrl.sendMessageWithResponse($encoder.message, $zonedCallback);
  }
}

class ChannelProtocolEvents {
  $fidl.Binding<ChannelProtocol> _binding;
  void eventA(int a, int b)
 {
    final $fidl.Encoder $encoder = new $fidl.Encoder();
    $encoder.encodeMessageHeader(_kChannelProtocol_EventA_Ordinal, 0);
    $encoder.alloc(32 - $fidl.kMessageHeaderSize);
    final List<$fidl.MemberType> $types = _kChannelProtocol_EventA_Type.response;
    $types[0].encode($encoder, a, 0);
    $types[1].encode($encoder, b, 0);
    _binding.sendMessage($encoder.message);
  }
}

class ChannelProtocolBinding extends $fidl.Binding<ChannelProtocol> {
  ChannelProtocolBinding() {
    events._binding = this;
  }

  final ChannelProtocolEvents events = new ChannelProtocolEvents();


  Function _methodBResponder($fidl.MessageSink $respond, int $txid) {
    return (int result) {
      final $fidl.Encoder $encoder = new $fidl.Encoder();
      $encoder.encodeMessageHeader(_kChannelProtocol_MethodB_Ordinal, $txid);
      $encoder.alloc(24 - $fidl.kMessageHeaderSize);
      final List<$fidl.MemberType> $types = _kChannelProtocol_MethodB_Type.response;
      $types[0].encode($encoder, result, 0);
      $respond($encoder.message);
    };
  }

  @override
  void handleMessage($fidl.Message $message, $fidl.MessageSink $respond) {
    final $fidl.Decoder $decoder = new $fidl.Decoder($message);
    switch ($message.ordinal) {
      case _kChannelProtocol_MethodA_Ordinal:
        try {
          final List<$fidl.MemberType> $types = _kChannelProtocol_MethodA_Type.request;
          $decoder.claimMemory(32);
          impl.methodA(
            $types[0].decode($decoder, 0),
            $types[1].decode($decoder, 0),
          );
        // ignore: avoid_catches_without_on_clauses
        } catch(_e) {
          close();
          final String _name = _kChannelProtocol_MethodA_Type.name;
          print('Exception handling method call $_name: $_e');
          rethrow;
        }
        break;
      case _kChannelProtocol_MethodB_Ordinal:
        try {
          final List<$fidl.MemberType> $types = _kChannelProtocol_MethodB_Type.request;
          $decoder.claimMemory(32);
          impl.methodB(
            $types[0].decode($decoder, 0),
            $types[1].decode($decoder, 0),
            _methodBResponder($respond, $message.txid),
          );
        // ignore: avoid_catches_without_on_clauses
        } catch(_e) {
          close();
          final String _name = _kChannelProtocol_MethodB_Type.name;
          print('Exception handling method call $_name: $_e');
          rethrow;
        }
        break;
      default:
        throw new $fidl.FidlError('Unexpected message name for ChannelProtocolBinding');
    }
  }
}


abstract class KitchenSink {
  static const String $serviceName = null;
  void methodA(int a, int b);
  void methodB(int a, int b, void callback(int result));
}


// methodA: (int a, int b)
const int _kKitchenSink_MethodA_Ordinal = 450577456;
const $fidl.MethodType _kKitchenSink_MethodA_Type = const $fidl.MethodType(
    request: const <$fidl.MemberType>[
      const $fidl.MemberType<int>(type: const $fidl.Int64Type(), offset: 16),
      const $fidl.MemberType<int>(type: const $fidl.Int64Type(), offset: 24),
    ],
	response: null,
	name: r"KitchenSink.MethodA",
  );
// eventA:  -> (int a, int b)
const int _kKitchenSink_EventA_Ordinal = 1795426833;
const $fidl.MethodType _kKitchenSink_EventA_Type = const $fidl.MethodType(
    request: null,
	response: const <$fidl.MemberType>[
      const $fidl.MemberType<int>(type: const $fidl.Int64Type(), offset: 16),
      const $fidl.MemberType<int>(type: const $fidl.Int64Type(), offset: 24),
    ],
	name: r"KitchenSink.EventA",
  );
// methodB: (int a, int b) -> (int result)
const int _kKitchenSink_MethodB_Ordinal = 1999489700;
const $fidl.MethodType _kKitchenSink_MethodB_Type = const $fidl.MethodType(
    request: const <$fidl.MemberType>[
      const $fidl.MemberType<int>(type: const $fidl.Int64Type(), offset: 16),
      const $fidl.MemberType<int>(type: const $fidl.Int64Type(), offset: 24),
    ],
	response: const <$fidl.MemberType>[
      const $fidl.MemberType<int>(type: const $fidl.Int64Type(), offset: 16),
    ],
	name: r"KitchenSink.MethodB",
  );


typedef void KitchenSinkEventACallback(int a, int b);

class KitchenSinkProxy extends $fidl.Proxy<KitchenSink>
    implements KitchenSink {

  KitchenSinkProxy() : super(new $fidl.ProxyController<KitchenSink>($serviceName: null, $interfaceName: r'KitchenSink')) {
    ctrl.onResponse = _handleResponse;
  }

  void _handleEvent($fidl.Message $message) {
    final $fidl.Decoder $decoder = new $fidl.Decoder($message);
    switch ($message.ordinal) {
      case _kKitchenSink_EventA_Ordinal:
        try {
          final Function $callback = eventA;
          if ($callback == null) {
            $message.closeHandles();
            return;
          }
          final List<$fidl.MemberType> $types = _kKitchenSink_EventA_Type.response;
          $decoder.claimMemory(32);
          $callback(
            $types[0].decode($decoder, 0),
            $types[1].decode($decoder, 0),
          );
        // ignore: avoid_catches_without_on_clauses
        } catch(_e) {
          final String _name = _kKitchenSink_EventA_Type.name;
          ctrl.proxyError('Exception handling event $_name: $_e');
          ctrl.close();
          rethrow;
        }
        break;
      default:
        ctrl.proxyError('Unexpected message ordinal: ${$message.ordinal}');
        ctrl.close();
        break;
    }
  }

  void _handleResponse($fidl.Message $message) {
    final int $txid = $message.txid;
    if ($txid == 0) {
      _handleEvent($message);
      return;
    }
    final Function $callback = ctrl.getCallback($txid);
    if ($callback == null) {
      $message.closeHandles();
      return;
    }
    final $fidl.Decoder $decoder = new $fidl.Decoder($message);
    switch ($message.ordinal) {
      case _kKitchenSink_MethodB_Ordinal:
        try {
          final List<$fidl.MemberType> $types = _kKitchenSink_MethodB_Type.response;
          $decoder.claimMemory(24);
          $callback(
            $types[0].decode($decoder, 0),
          );
        // ignore: avoid_catches_without_on_clauses
        } catch(_e) {
          final String _name = _kKitchenSink_MethodB_Type.name;
          ctrl.proxyError('Exception handling method response $_name: $_e');
          ctrl.close();
          rethrow;
        }
        break;
      default:
        ctrl.proxyError('Unexpected message ordinal: ${$message.ordinal}');
        ctrl.close();
        break;
    }
  }
  @override
  void methodA(int a, int b) {
    if (!ctrl.isBound) {
      ctrl.proxyError('The proxy is closed.');
      return;
    }

    final $fidl.Encoder $encoder = new $fidl.Encoder();
    $encoder.encodeMessageHeader(_kKitchenSink_MethodA_Ordinal, 0);
    $encoder.alloc(32 - $fidl.kMessageHeaderSize);
    final List<$fidl.MemberType> $types = _kKitchenSink_MethodA_Type.request;
    $types[0].encode($encoder, a, 0);
    $types[1].encode($encoder, b, 0);
    ctrl.sendMessage($encoder.message);
  }
  KitchenSinkEventACallback eventA;
  @override
  void methodB(int a, int b, void callback(int result)) {
    if (!ctrl.isBound) {
      ctrl.proxyError('The proxy is closed.');
      return;
    }

    final $fidl.Encoder $encoder = new $fidl.Encoder();
    $encoder.encodeMessageHeader(_kKitchenSink_MethodB_Ordinal, 0);
    $encoder.alloc(32 - $fidl.kMessageHeaderSize);
    final List<$fidl.MemberType> $types = _kKitchenSink_MethodB_Type.request;
    $types[0].encode($encoder, a, 0);
    $types[1].encode($encoder, b, 0);
    Function $zonedCallback;
    if ((callback == null) || identical(Zone.current, Zone.root)) {
      $zonedCallback = callback;
    } else {
      Zone $z = Zone.current;
      $zonedCallback = ((int result) {
        $z.bindCallback(() {
          callback(result,);
        })();
      });
    }
    ctrl.sendMessageWithResponse($encoder.message, $zonedCallback);
  }
}

class KitchenSinkEvents {
  $fidl.Binding<KitchenSink> _binding;
  void eventA(int a, int b)
 {
    final $fidl.Encoder $encoder = new $fidl.Encoder();
    $encoder.encodeMessageHeader(_kKitchenSink_EventA_Ordinal, 0);
    $encoder.alloc(32 - $fidl.kMessageHeaderSize);
    final List<$fidl.MemberType> $types = _kKitchenSink_EventA_Type.response;
    $types[0].encode($encoder, a, 0);
    $types[1].encode($encoder, b, 0);
    _binding.sendMessage($encoder.message);
  }
}

class KitchenSinkBinding extends $fidl.Binding<KitchenSink> {
  KitchenSinkBinding() {
    events._binding = this;
  }

  final KitchenSinkEvents events = new KitchenSinkEvents();


  Function _methodBResponder($fidl.MessageSink $respond, int $txid) {
    return (int result) {
      final $fidl.Encoder $encoder = new $fidl.Encoder();
      $encoder.encodeMessageHeader(_kKitchenSink_MethodB_Ordinal, $txid);
      $encoder.alloc(24 - $fidl.kMessageHeaderSize);
      final List<$fidl.MemberType> $types = _kKitchenSink_MethodB_Type.response;
      $types[0].encode($encoder, result, 0);
      $respond($encoder.message);
    };
  }

  @override
  void handleMessage($fidl.Message $message, $fidl.MessageSink $respond) {
    final $fidl.Decoder $decoder = new $fidl.Decoder($message);
    switch ($message.ordinal) {
      case _kKitchenSink_MethodA_Ordinal:
        try {
          final List<$fidl.MemberType> $types = _kKitchenSink_MethodA_Type.request;
          $decoder.claimMemory(32);
          impl.methodA(
            $types[0].decode($decoder, 0),
            $types[1].decode($decoder, 0),
          );
        // ignore: avoid_catches_without_on_clauses
        } catch(_e) {
          close();
          final String _name = _kKitchenSink_MethodA_Type.name;
          print('Exception handling method call $_name: $_e');
          rethrow;
        }
        break;
      case _kKitchenSink_MethodB_Ordinal:
        try {
          final List<$fidl.MemberType> $types = _kKitchenSink_MethodB_Type.request;
          $decoder.claimMemory(32);
          impl.methodB(
            $types[0].decode($decoder, 0),
            $types[1].decode($decoder, 0),
            _methodBResponder($respond, $message.txid),
          );
        // ignore: avoid_catches_without_on_clauses
        } catch(_e) {
          close();
          final String _name = _kKitchenSink_MethodB_Type.name;
          print('Exception handling method call $_name: $_e');
          rethrow;
        }
        break;
      default:
        throw new $fidl.FidlError('Unexpected message name for KitchenSinkBinding');
    }
  }
}


