| Index: mojo/dart/embedder/io/mojo_patch.dart
|
| diff --git a/mojo/dart/embedder/io/mojo_patch.dart b/mojo/dart/embedder/io/mojo_patch.dart
|
| index 99da0cec06038eaf32e2c82e4aab3aaae50abb89..1a48f01565834e724c7f2e017198088e75d5d1ac 100644
|
| --- a/mojo/dart/embedder/io/mojo_patch.dart
|
| +++ b/mojo/dart/embedder/io/mojo_patch.dart
|
| @@ -16,7 +16,16 @@ import 'dart:_mojo_services/mojo/files/file.mojom.dart';
|
| import 'dart:_mojo_services/mojo/files/files.mojom.dart';
|
| import 'dart:_mojo_services/mojo/files/directory.mojom.dart';
|
| import 'dart:_mojo_services/mojo/files/ioctl.mojom.dart';
|
| -import 'dart:_mojo_services/mojo/files/types.mojom.dart';
|
| +import 'dart:_mojo_services/mojo/files/types.mojom.dart' as types;
|
| +
|
| +// When developing, set fileSystemDeveloper to true and the file system will
|
| +// persist under ~/MojoAppPersistentCaches/.
|
| +const bool fileSystemDeveloper = false;
|
| +const String fileSystemName =
|
| + fileSystemDeveloper ? 'app_persistent_cache' : null;
|
| +
|
| +// System temp path relative to the root directory.
|
| +const String systemTempPath = 'tmp';
|
|
|
| //
|
| // Mojo objects and helper functions used by the 'dart:io' library.
|
| @@ -26,6 +35,8 @@ int _filesServiceHandle;
|
| NetworkServiceProxy _networkService;
|
| HostResolverProxy _hostResolver;
|
| FilesProxy _files;
|
| +DirectoryProxy _rootDirectory;
|
| +DirectoryProxy _systemTempDirectory;
|
|
|
| void _initialize(int networkServiceHandle, int filesServiceHandle) {
|
| if (networkServiceHandle != MojoHandle.INVALID) {
|
| @@ -67,6 +78,14 @@ _closeProxies() {
|
| _files.close(immediate: true);
|
| _files = null;
|
| }
|
| + if (_rootDirectory != null) {
|
| + _rootDirectory.close(immediate: true);
|
| + _rootDirectory = null;
|
| + }
|
| + if (_systemTempDirectory != null) {
|
| + _systemTempDirectory.close(immediate: true);
|
| + _systemTempDirectory = null;
|
| + }
|
| }
|
|
|
| /// Get the singleton NetworkServiceProxy.
|
| @@ -108,6 +127,47 @@ FilesProxy _getFiles() {
|
| return _files;
|
| }
|
|
|
| +/// Get the singleton DirectoryProxy for the root directory.
|
| +Future<DirectoryProxy> _getRootDirectory() async {
|
| + if (_rootDirectory != null) {
|
| + return _rootDirectory;
|
| + }
|
| + FilesProxy files = _getFiles();
|
| + assert(files != null);
|
| + _rootDirectory = new DirectoryProxy.unbound();
|
| + var response =
|
| + await files.ptr.openFileSystem(fileSystemName, _rootDirectory);
|
| + // Remove the root directory's handle from the open set because it is not
|
| + // under application control and does not affect isolate shutdown.
|
| + _rootDirectory.impl.endpoint.handle.pass();
|
| +
|
| + // Ensure system temporary directory exists before returning the root
|
| + // directory.
|
| + await _getSystemTempDirectory();
|
| + return _rootDirectory;
|
| +}
|
| +
|
| +/// Get the singleton DirectoryProxy for the system temp directory.
|
| +Future<DirectoryProxy> _getSystemTempDirectory() async {
|
| + if (_systemTempDirectory != null) {
|
| + return _systempTempDirectory;
|
| + }
|
| + DirectoryProxy rootDirectory = await _getRootDirectory();
|
| + int flags = types.kOpenFlagRead |
|
| + types.kOpenFlagWrite |
|
| + types.kOpenFlagCreate;
|
| + _systemTempDirectory = new DirectoryProxy.unbound();
|
| + var response =
|
| + await rootDirectory.ptr.openDirectory(systemTempPath,
|
| + _systemTempDirectory,
|
| + flags);
|
| + assert(response.error == types.Error.ok);
|
| + // Remove the system temp directory's handle from the open set because it
|
| + // is not under application control and does not affect isolate shutdown.
|
| + _systemTempDirectory.impl.endpoint.handle.pass();
|
| + return _systemTempDirectory;
|
| +}
|
| +
|
| /// Static utility methods for converting between 'dart:io' and
|
| /// 'mojo:network_service' structs.
|
| class _NetworkServiceCodec {
|
|
|