blob: 34e7f08c2d8bee3586f69005da46a4683b1849ed [file] [log] [blame]
// Copyright 2013 The Flutter 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: native_function_body_in_non_sdk_code
// ignore_for_file: public_member_api_docs
@pragma('vm:entry-point')
class _Namespace {
// No public constructor - this only has static methods.
_Namespace._();
// Library private variable set by the embedder used to cache the
// namespace (as an fdio_ns_t*).
@pragma('vm:entry-point')
static int? _namespace;
}
/// An exception representing an error returned as an zx_status_t.
class ZxStatusException implements Exception {
final String? message;
final int status;
ZxStatusException(this.status, [this.message]);
@override
String toString() {
if (message == null)
return 'ZxStatusException: status = $status';
else
return 'ZxStatusException: status = $status, "$message"';
}
}
/// Users of the [_Result] subclasses should check the status before
/// trying to read any data. Attempting to use a value stored in a result
/// when the status in not OK will result in an exception.
class _Result {
final int status;
const _Result(this.status);
}
@pragma('vm:entry-point')
class HandleResult extends _Result {
final Handle? _handle;
Handle get handle => _handle!;
@pragma('vm:entry-point')
const HandleResult(final int status, [this._handle]) : super(status);
@override
String toString() => 'HandleResult(status=$status, handle=$_handle)';
}
@pragma('vm:entry-point')
class HandlePairResult extends _Result {
final Handle? _first;
final Handle? _second;
Handle get first => _first!;
Handle get second => _second!;
@pragma('vm:entry-point')
const HandlePairResult(final int status, [this._first, this._second])
: super(status);
@override
String toString() =>
'HandlePairResult(status=$status, first=$_first, second=$_second)';
}
@pragma('vm:entry-point')
class ReadResult extends _Result {
final ByteData? _bytes;
final int? _numBytes;
final List<Handle>? _handles;
ByteData get bytes => _bytes!;
int get numBytes => _numBytes!;
List<Handle> get handles => _handles!;
@pragma('vm:entry-point')
const ReadResult(final int status, [this._bytes, this._numBytes, this._handles])
: super(status);
/// Returns the bytes as a Uint8List. If status != OK this will throw
/// an exception.
Uint8List bytesAsUint8List() {
return _bytes!.buffer.asUint8List(_bytes!.offsetInBytes, _numBytes!);
}
/// Returns the bytes as a String. If status != OK this will throw
/// an exception.
String bytesAsUTF8String() => utf8.decode(bytesAsUint8List());
@override
String toString() =>
'ReadResult(status=$status, bytes=$_bytes, numBytes=$_numBytes, handles=$_handles)';
}
@pragma('vm:entry-point')
class HandleInfo {
final Handle handle;
final int type;
final int rights;
@pragma('vm:entry-point')
const HandleInfo(this.handle, this.type, this.rights);
@override
String toString() =>
'HandleInfo(handle=$handle, type=$type, rights=$rights)';
}
@pragma('vm:entry-point')
class ReadEtcResult extends _Result {
final ByteData? _bytes;
final int? _numBytes;
final List<HandleInfo>? _handleInfos;
ByteData get bytes => _bytes!;
int get numBytes => _numBytes!;
List<HandleInfo> get handleInfos => _handleInfos!;
@pragma('vm:entry-point')
const ReadEtcResult(final int status, [this._bytes, this._numBytes, this._handleInfos])
: super(status);
/// Returns the bytes as a Uint8List. If status != OK this will throw
/// an exception.
Uint8List bytesAsUint8List() {
return _bytes!.buffer.asUint8List(_bytes!.offsetInBytes, _numBytes!);
}
/// Returns the bytes as a String. If status != OK this will throw
/// an exception.
String bytesAsUTF8String() => utf8.decode(bytesAsUint8List());
@override
String toString() =>
'ReadEtcResult(status=$status, bytes=$_bytes, numBytes=$_numBytes, handleInfos=$_handleInfos)';
}
@pragma('vm:entry-point')
class WriteResult extends _Result {
final int? _numBytes;
int get numBytes => _numBytes!;
@pragma('vm:entry-point')
const WriteResult(final int status, [this._numBytes]) : super(status);
@override
String toString() => 'WriteResult(status=$status, numBytes=$_numBytes)';
}
@pragma('vm:entry-point')
class GetSizeResult extends _Result {
final int? _size;
int get size => _size!;
@pragma('vm:entry-point')
const GetSizeResult(final int status, [this._size]) : super(status);
@override
String toString() => 'GetSizeResult(status=$status, size=$_size)';
}
@pragma('vm:entry-point')
class FromFileResult extends _Result {
final Handle? _handle;
final int? _numBytes;
Handle get handle => _handle!;
int get numBytes => _numBytes!;
@pragma('vm:entry-point')
const FromFileResult(final int status, [this._handle, this._numBytes])
: super(status);
@override
String toString() =>
'FromFileResult(status=$status, handle=$_handle, numBytes=$_numBytes)';
}
@pragma('vm:entry-point')
class MapResult extends _Result {
final Uint8List? _data;
Uint8List get data => _data!;
@pragma('vm:entry-point')
const MapResult(final int status, [this._data]) : super(status);
@override
String toString() => 'MapResult(status=$status, data=$_data)';
}
@pragma('vm:entry-point')
class System extends NativeFieldWrapperClass1 {
// No public constructor - this only has static methods.
System._();
// Channel operations.
@pragma('vm:external-name', 'System_ChannelCreate')
external static HandlePairResult channelCreate([int options = 0]);
@pragma('vm:external-name', 'System_ChannelFromFile')
external static HandleResult channelFromFile(String path);
@pragma('vm:external-name', 'System_ConnectToService')
external static int connectToService(String path, Handle channel);
@pragma('vm:external-name', 'System_ChannelWrite')
external static int channelWrite(Handle channel, ByteData data, List<Handle> handles);
@pragma('vm:external-name', 'System_ChannelWriteEtc')
external static int channelWriteEtc(Handle channel, ByteData data, List<HandleDisposition> handleDispositions);
@pragma('vm:external-name', 'System_ChannelQueryAndRead')
external static ReadResult channelQueryAndRead(Handle channel);
@pragma('vm:external-name', 'System_ChannelQueryAndReadEtc')
external static ReadEtcResult channelQueryAndReadEtc(Handle channel);
// Eventpair operations.
@pragma('vm:external-name', 'System_EventpairCreate')
external static HandlePairResult eventpairCreate([int options = 0]);
// Socket operations.
@pragma('vm:external-name', 'System_SocketCreate')
external static HandlePairResult socketCreate([int options = 0]);
@pragma('vm:external-name', 'System_SocketWrite')
external static WriteResult socketWrite(Handle socket, ByteData data, int options);
@pragma('vm:external-name', 'System_SocketRead')
external static ReadResult socketRead(Handle socket, int size);
// Vmo operations.
@pragma('vm:external-name', 'System_VmoCreate')
external static HandleResult vmoCreate(int size, [int options = 0]);
@pragma('vm:external-name', 'System_VmoFromFile')
external static FromFileResult vmoFromFile(String path);
@pragma('vm:external-name', 'System_VmoGetSize')
external static GetSizeResult vmoGetSize(Handle vmo);
@pragma('vm:external-name', 'System_VmoSetSize')
external static int vmoSetSize(Handle vmo, int size);
@pragma('vm:external-name', 'System_VmoWrite')
external static int vmoWrite(Handle vmo, int offset, ByteData bytes);
@pragma('vm:external-name', 'System_VmoRead')
external static ReadResult vmoRead(Handle vmo, int offset, int size);
@pragma('vm:external-name', 'System_VmoMap')
external static MapResult vmoMap(Handle vmo);
// Time operations.
static int clockGetMonotonic() {
if (zirconFFIBindings == null) {
return _nativeClockGetMonotonic();
} else {
return zirconFFIBindings!.zircon_dart_clock_get_monotonic();
}
}
@pragma('vm:external-name', 'System_ClockGetMonotonic')
external static int _nativeClockGetMonotonic();
// TODO(edcoyne): Remove this, it is required to safely do an API transition across repos.
static int reboot() { return -2; /*ZX_ERR_NOT_SUPPORTED*/ }
}