Chromium Code Reviews| 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..f89427f46e5d93d6b4dea904a5b2e10d0b00bace 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 = true; |
| +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,46 @@ 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('app_persistent_cache', _rootDirectory); |
|
zra
2015/12/18 22:51:46
long line
Cutch
2015/12/18 23:05:20
Done.
|
| + // 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 { |