| // Copyright 2017 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. |
| |
| import 'dart:convert' show utf8; |
| import 'dart:typed_data'; |
| |
| import 'package:fidl/fidl.dart'; |
| import 'package:fidl_fuchsia_mem/fidl.dart' as fuchsia_mem; |
| import 'package:fidl_fuchsia_modular/fidl.dart'; |
| import 'package:meta/meta.dart'; |
| import 'package:zircon/zircon.dart'; |
| |
| /// Possible out-of-band error codes while using a message sender. |
| enum MessageSenderError { |
| /// Message sender is no longer available. This error happens if the message |
| /// queue was deleted, or the supplied token was not valid in the first place. |
| unavailable |
| } |
| |
| /// This is the function type that [MessageSenderClient] accepts for reporting |
| /// out-of-band errors. |
| typedef MessageSenderErrorCallback = void Function( |
| MessageSenderError reason, String errMsg); |
| |
| /// Wrapper class for the fuchsia.modular.MessageSender FIDL interface. This |
| /// class provides a more convenient interface for sending messages. |
| class MessageSenderClient { |
| MessageSenderProxy _messageSenderProxy; |
| MessageSenderErrorCallback _onConnectionError; |
| |
| /// The supplied error callback is called when the token or message queue |
| /// no longer exists, or if the token is invalid. |
| MessageSenderClient({@required MessageSenderErrorCallback onConnectionError}) |
| : assert(onConnectionError != null) { |
| _onConnectionError = onConnectionError; |
| } |
| |
| /// Will encode the given [message] as utf8 before sending the bytes over. |
| /// TODO(MI4-1106): In the future there will be error handling in case |
| /// [sendString] fails. |
| void sendString(String message) { |
| sendUint8List(Uint8List.fromList(utf8.encode(message))); |
| } |
| |
| /// Send the given [message]. |
| void sendUint8List(Uint8List message) { |
| _messageSenderProxy.send(fuchsia_mem.Buffer( |
| vmo: SizedVmo.fromUint8List(message), |
| size: message.length, |
| )); |
| } |
| |
| /// Close the underlying MessageSenderProxy. |
| void close() { |
| _messageSenderProxy?.ctrl?.close(); |
| } |
| |
| /// Binds a new MessageSenderProxy to this class and returns the request-side. |
| /// Closes the previously bound proxy if one exists. |
| InterfaceRequest<MessageSender> newRequest() { |
| if (_messageSenderProxy != null && _messageSenderProxy.ctrl.isBound) { |
| _messageSenderProxy.ctrl.close(); |
| } |
| |
| _messageSenderProxy = MessageSenderProxy(); |
| _messageSenderProxy.ctrl.error.then((ProxyError err) { |
| if (_onConnectionError != null) { |
| _onConnectionError(MessageSenderError.unavailable, |
| 'MessageSender not available for the provided token.'); |
| } |
| }); |
| return _messageSenderProxy.ctrl.request(); |
| } |
| } |