blob: 427bed815921ced11cc610e70c4b41f4ff85e13d [file] [log] [blame]
// 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.
part of zircon;
// ignore_for_file: constant_identifier_names
// ignore_for_file: public_member_api_docs
/// Typed wrapper around a Zircon channel object.
class Channel extends _HandleWrapper<Channel> {
Channel(Handle handle) : super(handle);
/// Gets a Channel for accessing the file at `path`.
///
/// The returned Channel supports read-only fdio operations on the file.
factory Channel.fromFile(String path) {
HandleResult r = System.channelFromFile(path);
if (r.status != ZX.OK) {
throw ZxStatusException(r.status, getStringForStatus(r.status));
}
return Channel(r.handle);
}
// Signals
static const int READABLE = ZX.CHANNEL_READABLE;
static const int WRITABLE = ZX.CHANNEL_WRITABLE;
static const int PEER_CLOSED = ZX.CHANNEL_PEER_CLOSED;
// Read options
static const int READ_MAY_DISCARD = ZX.CHANNEL_READ_MAY_DISCARD;
// Limits
static const int MAX_MSG_BYTES = ZX.CHANNEL_MAX_MSG_BYTES;
static const int MAX_MSG_HANDLES = ZX.CHANNEL_MAX_MSG_HANDLES;
int write(ByteData data, [List<Handle> handles]) {
if (handle == null) {
return ZX.ERR_INVALID_ARGS;
}
return System.channelWrite(handle, data, handles);
}
ReadResult queryAndRead() {
if (handle == null) {
return const ReadResult(ZX.ERR_INVALID_ARGS);
}
return System.channelQueryAndRead(handle);
}
}
/// Typed wrapper around a linked pair of channel objects and the
/// zx_channel_create() syscall used to create them.
class ChannelPair extends _HandleWrapperPair<Channel> {
factory ChannelPair() {
final HandlePairResult result = System.channelCreate();
if (result.status == ZX.OK) {
return ChannelPair._(
result.status, Channel(result.first), Channel(result.second));
} else {
return ChannelPair._(result.status, null, null);
}
}
ChannelPair._(int status, Channel first, Channel second)
: super._(status, first, second);
}