| // Copyright 2019 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 'package:zircon/zircon.dart'; |
| import 'package:fidl_fuchsia_io/fidl_async.dart'; |
| |
| import 'pseudo_file.dart'; |
| |
| /// Specifies how a VMO wrapped by [VmoFile] may be shared. |
| enum VmoSharingMode { |
| /// The VMO may not be shared, the VMO file appears as a regular file. |
| noSharing, |
| |
| /// A duplicate of the VMO is shared. |
| shareDuplicate, |
| |
| // TODO(crjohns): Support cloning. |
| } |
| |
| /// A node which wraps a VMO that can be duplicated when opened. |
| /// |
| /// Reads when opening a [VmoFile] as a file are buffered, and repeated reads |
| /// will obtain the same information unless the connection is closed between |
| /// reads. |
| /// A duplicate of the underlying VMO is exposed through [Node.Describe] when |
| /// [VmoSharingMode] is [shareDuplicate]. |
| class VmoFile extends PseudoFile { |
| final Vmo _vmo; |
| final VmoSharingMode _sharingMode; |
| |
| /// Constructor for read-only [Vmo] |
| VmoFile.readOnly(this._vmo, this._sharingMode) |
| : assert(_vmo != null), |
| super.readOnly(() { |
| int size = _vmo.getSize().size; |
| return _vmo.read(size).bytesAsUint8List(); |
| }) { |
| if (_vmo == null) { |
| throw Exception('Vmo cannot be null'); |
| } |
| } |
| |
| // TODO(crjohns): Support writable vmo files. |
| |
| /// Describes this node. Returns null on error. |
| @override |
| NodeInfo describe() { |
| if (_sharingMode == VmoSharingMode.shareDuplicate) { |
| final Vmo duplicatedVmo = |
| _vmo.duplicate(ZX.RIGHTS_BASIC | ZX.RIGHT_READ | ZX.RIGHT_MAP); |
| |
| if (duplicatedVmo == null) { |
| return null; |
| } |
| |
| return NodeInfo.withVmofile(Vmofile( |
| vmo: duplicatedVmo, offset: 0, length: _vmo.getSize().size)); |
| } |
| |
| return NodeInfo.withFile(FileObject(event: null)); |
| } |
| } |