OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 import 'dart:nativewrappers'; | 5 import 'dart:nativewrappers'; |
6 | 6 |
7 import 'dart:_mojo/application.dart'; | 7 import 'dart:_mojo/application.dart'; |
8 import 'dart:_mojo/bindings.dart'; | 8 import 'dart:_mojo/bindings.dart'; |
9 import 'dart:_mojo/core.dart'; | 9 import 'dart:_mojo/core.dart'; |
10 import 'dart:_mojo/mojo/network_error.mojom.dart'; | 10 import 'dart:_mojo/mojo/network_error.mojom.dart'; |
11 import 'dart:_mojo_services/mojo/host_resolver.mojom.dart'; | 11 import 'dart:_mojo_services/mojo/host_resolver.mojom.dart'; |
12 import 'dart:_mojo_services/mojo/net_address.mojom.dart'; | 12 import 'dart:_mojo_services/mojo/net_address.mojom.dart'; |
13 import 'dart:_mojo_services/mojo/network_service.mojom.dart'; | 13 import 'dart:_mojo_services/mojo/network_service.mojom.dart'; |
14 import 'dart:_mojo_services/mojo/tcp_bound_socket.mojom.dart'; | 14 import 'dart:_mojo_services/mojo/tcp_bound_socket.mojom.dart'; |
15 import 'dart:_mojo_services/mojo/tcp_connected_socket.mojom.dart'; | 15 import 'dart:_mojo_services/mojo/tcp_connected_socket.mojom.dart'; |
16 import 'dart:_mojo_services/mojo/tcp_server_socket.mojom.dart'; | 16 import 'dart:_mojo_services/mojo/tcp_server_socket.mojom.dart'; |
17 import 'dart:_mojo_services/mojo/files/file.mojom.dart'; | 17 import 'dart:_mojo_services/mojo/files/file.mojom.dart'; |
18 import 'dart:_mojo_services/mojo/files/files.mojom.dart'; | 18 import 'dart:_mojo_services/mojo/files/files.mojom.dart'; |
19 import 'dart:_mojo_services/mojo/files/directory.mojom.dart'; | 19 import 'dart:_mojo_services/mojo/files/directory.mojom.dart'; |
20 import 'dart:_mojo_services/mojo/files/ioctl.mojom.dart'; | 20 import 'dart:_mojo_services/mojo/files/ioctl.mojom.dart'; |
21 import 'dart:_mojo_services/mojo/files/types.mojom.dart' as types; | 21 import 'dart:_mojo_services/mojo/files/types.mojom.dart' as types; |
22 | 22 |
| 23 class _NetworkServiceProxy extends FuturizedProxy<NetworkServiceProxy> { |
| 24 Map<Symbol, Function> _mojoMethods; |
| 25 NetworkServiceProxy _nsProxy; |
| 26 |
| 27 _NetworkServiceProxy(NetworkServiceProxy p) : super(p) { |
| 28 _mojoMethods = <Symbol, Function>{ |
| 29 #createTcpBoundSocket: p.createTcpBoundSocket, |
| 30 #createTcpConnectedSocket: p.createTcpConnectedSocket, |
| 31 #createHttpServer: p.createHttpServer, |
| 32 }; |
| 33 _nsProxy = p; |
| 34 } |
| 35 Map<Symbol, Function> get mojoMethods => _mojoMethods; |
| 36 |
| 37 Function get createUrlLoader => _nsProxy.createUrlLoader; |
| 38 Function get getCookieStore => _nsProxy.getCookieStore; |
| 39 Function get createWebSocket => _nsProxy.createWebSocket; |
| 40 Function get createUdpSocket => _nsProxy.createUdpSocket; |
| 41 Function get registerUrlLoaderInterceptor => |
| 42 _nsProxy.registerUrlLoaderInterceptor; |
| 43 Function get createHostResolver => _nsProxy.createHostResolver; |
| 44 |
| 45 static final Map<Symbol, Function> _mojoResponses = { |
| 46 #createTcpBoundSocket: |
| 47 new NetworkServiceCreateTcpBoundSocketResponseParams#init, |
| 48 #createTcpConnectedSocket: |
| 49 new NetworkServiceCreateTcpConnectedSocketResponseParams#init, |
| 50 #createHttpServer: |
| 51 new NetworkServiceCreateHttpServerResponseParams#init, |
| 52 }; |
| 53 Map<Symbol, Function> get mojoResponses => _mojoResponses; |
| 54 } |
| 55 |
| 56 class _HostResolverProxy extends FuturizedProxy<HostResolverProxy> { |
| 57 Map<Symbol, Function> _mojoMethods; |
| 58 |
| 59 _HostResolverProxy(HostResolverProxy proxy) : super(proxy) { |
| 60 _mojoMethods = <Symbol, Function>{ |
| 61 #getHostAddresses: proxy.getHostAddresses, |
| 62 }; |
| 63 } |
| 64 Map<Symbol, Function> get mojoMethods => _mojoMethods; |
| 65 |
| 66 _HostResolverProxy.unbound() : this(new HostResolverProxy.unbound()); |
| 67 |
| 68 static final Map<Symbol, Function> _mojoResponses = { |
| 69 #getHostAddresses: new HostResolverGetHostAddressesResponseParams#init, |
| 70 }; |
| 71 Map<Symbol, Function> get mojoResponses => _mojoResponses; |
| 72 } |
| 73 |
| 74 class _TcpBoundSocketProxy extends FuturizedProxy<TcpBoundSocketProxy> { |
| 75 Map<Symbol, Function> _mojoMethods; |
| 76 |
| 77 _TcpBoundSocketProxy(TcpBoundSocketProxy proxy) : super(proxy) { |
| 78 _mojoMethods = <Symbol, Function>{ |
| 79 #startListening: proxy.startListening, |
| 80 #connect: proxy.connect, |
| 81 }; |
| 82 } |
| 83 Map<Symbol, Function> get mojoMethods => _mojoMethods; |
| 84 |
| 85 _TcpBoundSocketProxy.unbound() : this(new TcpBoundSocketProxy.unbound()); |
| 86 |
| 87 static final Map<Symbol, Function> _mojoResponses = { |
| 88 #startListening: new TcpBoundSocketStartListeningResponseParams#init, |
| 89 #connect: new TcpBoundSocketConnectResponseParams#init, |
| 90 }; |
| 91 Map<Symbol, Function> get mojoResponses => _mojoResponses; |
| 92 } |
| 93 |
| 94 class _TcpServerSocketProxy extends FuturizedProxy<TcpServerSocketProxy> { |
| 95 Map<Symbol, Function> _mojoMethods; |
| 96 |
| 97 _TcpServerSocketProxy(TcpServerSocketProxy proxy) : super(proxy) { |
| 98 _mojoMethods = <Symbol, Function>{ |
| 99 #accept: proxy.accept, |
| 100 }; |
| 101 } |
| 102 Map<Symbol, Function> get mojoMethods => _mojoMethods; |
| 103 |
| 104 _TcpServerSocketProxy.unbound() : this(new TcpServerSocketProxy.unbound()); |
| 105 |
| 106 static final Map<Symbol, Function> _mojoResponses = { |
| 107 #accept: new TcpServerSocketAcceptResponseParams#init, |
| 108 }; |
| 109 Map<Symbol, Function> get mojoResponses => _mojoResponses; |
| 110 } |
| 111 |
| 112 class _FilesProxy extends FuturizedProxy<FilesProxy> { |
| 113 Map<Symbol, Function> _mojoMethods; |
| 114 |
| 115 _FilesProxy(FilesProxy proxy) : super(proxy) { |
| 116 _mojoMethods = <Symbol, Function>{ |
| 117 #openFileSystem: proxy.openFileSystem, |
| 118 }; |
| 119 } |
| 120 Map<Symbol, Function> get mojoMethods => _mojoMethods; |
| 121 |
| 122 static final Map<Symbol, Function> _mojoResponses = { |
| 123 #openFileSystem: new FilesOpenFileSystemResponseParams#init, |
| 124 }; |
| 125 Map<Symbol, Function> get mojoResponses => _mojoResponses; |
| 126 } |
| 127 |
| 128 class _FileProxy extends FuturizedProxy<FileProxy> { |
| 129 Map<Symbol, Function> _mojoMethods; |
| 130 |
| 131 _FileProxy(FileProxy proxy) : super(proxy) { |
| 132 _mojoMethods = <Symbol, Function>{ |
| 133 #close_: proxy.close_, |
| 134 #read: proxy.read, |
| 135 #write: proxy.write, |
| 136 #readToStream: proxy.readToStream, |
| 137 #writeFromStream: proxy.writeFromStream, |
| 138 #tell: proxy.tell, |
| 139 #seek: proxy.seek, |
| 140 #stat: proxy.stat, |
| 141 #truncate: proxy.truncate, |
| 142 #touch: proxy.touch, |
| 143 #dup: proxy.dup, |
| 144 #repoen: proxy.reopen, |
| 145 #asBuffer: proxy.asBuffer, |
| 146 #ioctl: proxy.ioctl, |
| 147 }; |
| 148 } |
| 149 Map<Symbol, Function> get mojoMethods => _mojoMethods; |
| 150 |
| 151 _FileProxy.unbound() : this(new FileProxy.unbound()); |
| 152 |
| 153 static final Map<Symbol, Function> _mojoResponses = { |
| 154 #close_: new FileCloseResponseParams#init, |
| 155 #read: new FileReadResponseParams#init, |
| 156 #write: new FileWriteResponseParams#init, |
| 157 #readToStream: new FileReadToStreamResponseParams#init, |
| 158 #writeFromStream: new FileWriteFromStreamResponseParams#init, |
| 159 #tell: new FileTellResponseParams#init, |
| 160 #seek: new FileSeekResponseParams#init, |
| 161 #stat: new FileStatResponseParams#init, |
| 162 #truncate: new FileTruncateResponseParams#init, |
| 163 #touch: new FileTouchResponseParams#init, |
| 164 #dup: new FileDupResponseParams#init, |
| 165 #repoen: new FileReopenResponseParams#init, |
| 166 #asBuffer: new FileAsBufferResponseParams#init, |
| 167 #ioctl: new FileIoctlResponseParams#init, |
| 168 }; |
| 169 Map<Symbol, Function> get mojoResponses => _mojoResponses; |
| 170 } |
| 171 |
| 172 class _DirectoryProxy extends FuturizedProxy<DirectoryProxy> { |
| 173 Map<Symbol, Function> _mojoMethods; |
| 174 |
| 175 _DirectoryProxy(DirectoryProxy proxy) : super(proxy) { |
| 176 _mojoMethods = <Symbol, Function>{ |
| 177 #read: proxy.read, |
| 178 #stat: proxy.stat, |
| 179 #touch: proxy.touch, |
| 180 #openFile: proxy.openFile, |
| 181 #openDirectory: proxy.openDirectory, |
| 182 #rename: proxy.rename, |
| 183 #delete: proxy.delete, |
| 184 }; |
| 185 } |
| 186 Map<Symbol, Function> get mojoMethods => _mojoMethods; |
| 187 |
| 188 _DirectoryProxy.unbound() : this(new DirectoryProxy.unbound()); |
| 189 |
| 190 static final Map<Symbol, Function> _mojoResponses = { |
| 191 #read: new DirectoryReadResponseParams#init, |
| 192 #stat: new DirectoryStatResponseParams#init, |
| 193 #touch: new DirectoryTouchResponseParams#init, |
| 194 #openFile: new DirectoryOpenFileResponseParams#init, |
| 195 #openDirectory: new DirectoryOpenDirectoryResponseParams#init, |
| 196 #rename: new DirectoryRenameResponseParams#init, |
| 197 #delete: new DirectoryDeleteResponseParams#init, |
| 198 }; |
| 199 Map<Symbol, Function> get mojoResponses => _mojoResponses; |
| 200 } |
| 201 |
23 // When developing, set fileSystemDeveloper to true and the file system will | 202 // When developing, set fileSystemDeveloper to true and the file system will |
24 // persist under ~/MojoAppPersistentCaches/. | 203 // persist under ~/MojoAppPersistentCaches/. |
25 const bool fileSystemDeveloper = false; | 204 const bool fileSystemDeveloper = false; |
26 const String fileSystemName = | 205 const String fileSystemName = |
27 fileSystemDeveloper ? 'app_persistent_cache' : null; | 206 fileSystemDeveloper ? 'app_persistent_cache' : null; |
28 | 207 |
29 // System temp path relative to the root directory. | 208 // System temp path relative to the root directory. |
30 const String systemTempPath = 'tmp'; | 209 const String systemTempPath = 'tmp'; |
31 | 210 |
32 // | 211 // |
33 // Mojo objects and helper functions used by the 'dart:io' library. | 212 // Mojo objects and helper functions used by the 'dart:io' library. |
34 // | 213 // |
35 int _networkServiceHandle; | 214 int _networkServiceHandle; |
36 int _filesServiceHandle; | 215 int _filesServiceHandle; |
37 NetworkServiceProxy _networkService; | 216 _NetworkServiceProxy _networkService; |
38 HostResolverProxy _hostResolver; | 217 _HostResolverProxy _hostResolver; |
39 FilesProxy _files; | 218 _FilesProxy _files; |
40 DirectoryProxy _rootDirectory; | 219 _DirectoryProxy _rootDirectory; |
41 DirectoryProxy _systemTempDirectory; | 220 _DirectoryProxy _systemTempDirectory; |
42 | 221 |
43 void _initialize( | 222 void _initialize( |
44 int networkServiceHandle, int filesServiceHandle, String scriptPath) { | 223 int networkServiceHandle, int filesServiceHandle, String scriptPath) { |
45 if (networkServiceHandle != MojoHandle.INVALID) { | 224 if (networkServiceHandle != MojoHandle.INVALID) { |
46 _networkServiceHandle = networkServiceHandle; | 225 _networkServiceHandle = networkServiceHandle; |
47 } | 226 } |
48 if (filesServiceHandle != MojoHandle.INVALID) { | 227 if (filesServiceHandle != MojoHandle.INVALID) { |
49 _filesServiceHandle = filesServiceHandle; | 228 _filesServiceHandle = filesServiceHandle; |
50 } | 229 } |
51 // TODO(floitsch): do this lazily once _Platform.script is a getter. | 230 // TODO(floitsch): do this lazily once _Platform.script is a getter. |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
87 _rootDirectory.close(immediate: true); | 266 _rootDirectory.close(immediate: true); |
88 _rootDirectory = null; | 267 _rootDirectory = null; |
89 } | 268 } |
90 if (_systemTempDirectory != null) { | 269 if (_systemTempDirectory != null) { |
91 _systemTempDirectory.close(immediate: true); | 270 _systemTempDirectory.close(immediate: true); |
92 _systemTempDirectory = null; | 271 _systemTempDirectory = null; |
93 } | 272 } |
94 } | 273 } |
95 | 274 |
96 /// Get the singleton NetworkServiceProxy. | 275 /// Get the singleton NetworkServiceProxy. |
97 NetworkServiceProxy _getNetworkService() { | 276 _NetworkServiceProxy _getNetworkService() { |
98 if (_networkService != null) { | 277 if (_networkService != null) { |
99 return _networkService; | 278 return _networkService; |
100 } | 279 } |
101 _networkService = new NetworkServiceProxy.fromHandle( | 280 var networkService = new NetworkServiceProxy.fromHandle( |
102 new MojoHandle(_networkServiceHandle).pass()); | 281 new MojoHandle(_networkServiceHandle).pass()); |
| 282 _networkService = new _NetworkServiceProxy(networkService); |
103 _networkServiceHandle = null; | 283 _networkServiceHandle = null; |
104 return _networkService; | 284 return _networkService; |
105 } | 285 } |
106 | 286 |
107 /// Get the singleton HostResolverProxy. | 287 /// Get the singleton HostResolverProxy. |
108 HostResolverProxy _getHostResolver() { | 288 _HostResolverProxy _getHostResolver() { |
109 if (_hostResolver != null) { | 289 if (_hostResolver != null) { |
110 return _hostResolver; | 290 return _hostResolver; |
111 } | 291 } |
112 var networkService = _getNetworkService(); | 292 _NetworkServiceProxy networkService = _getNetworkService(); |
113 if (networkService == null) { | 293 if (networkService == null) { |
114 return null; | 294 return null; |
115 } | 295 } |
116 _hostResolver = new HostResolverProxy.unbound(); | 296 _hostResolver = new _HostResolverProxy.unbound(); |
117 networkService.createHostResolver(_hostResolver); | 297 networkService.createHostResolver(_hostResolver.proxy); |
118 // Remove the host resolver's handle from the open set because it is not | 298 // Remove the host resolver's handle from the open set because it is not |
119 // under application control and does not affect isolate shutdown. | 299 // under application control and does not affect isolate shutdown. |
120 _hostResolver.ctrl.endpoint.handle.pass(); | 300 _hostResolver.proxy.ctrl.endpoint.handle.pass(); |
121 return _hostResolver; | 301 return _hostResolver; |
122 } | 302 } |
123 | 303 |
124 /// Get the singleton FilesProxy. | 304 /// Get the singleton FilesProxy. |
125 FilesProxy _getFiles() { | 305 _FilesProxy _getFiles() { |
126 if (_files != null) { | 306 if (_files != null) { |
127 return _files; | 307 return _files; |
128 } | 308 } |
129 _files = new FilesProxy.fromHandle( | 309 var files = new FilesProxy.fromHandle( |
130 new MojoHandle(_filesServiceHandle).pass()); | 310 new MojoHandle(_filesServiceHandle).pass()); |
| 311 _files = new _FilesProxy(files); |
131 _filesServiceHandle = null; | 312 _filesServiceHandle = null; |
132 return _files; | 313 return _files; |
133 } | 314 } |
134 | 315 |
135 /// Get the singleton DirectoryProxy for the root directory. | 316 /// Get the singleton DirectoryProxy for the root directory. |
136 Future<DirectoryProxy> _getRootDirectory() async { | 317 Future<_DirectoryProxy> _getRootDirectory() async { |
137 if (_rootDirectory != null) { | 318 if (_rootDirectory != null) { |
138 return _rootDirectory; | 319 return _rootDirectory; |
139 } | 320 } |
140 FilesProxy files = _getFiles(); | 321 _FilesProxy files = _getFiles(); |
141 assert(files != null); | 322 assert(files != null); |
142 _rootDirectory = new DirectoryProxy.unbound(); | 323 _rootDirectory = new _DirectoryProxy.unbound(); |
143 var response = | 324 var response = |
144 await files.openFileSystem(fileSystemName, _rootDirectory); | 325 await files.openFileSystem(fileSystemName, _rootDirectory.proxy); |
145 // Remove the root directory's handle from the open set because it is not | 326 // Remove the root directory's handle from the open set because it is not |
146 // under application control and does not affect isolate shutdown. | 327 // under application control and does not affect isolate shutdown. |
147 _rootDirectory.ctrl.endpoint.handle.pass(); | 328 _rootDirectory.proxy.ctrl.endpoint.handle.pass(); |
148 | 329 |
149 // Ensure system temporary directory exists before returning the root | 330 // Ensure system temporary directory exists before returning the root |
150 // directory. | 331 // directory. |
151 await _getSystemTempDirectory(); | 332 await _getSystemTempDirectory(); |
152 return _rootDirectory; | 333 return _rootDirectory; |
153 } | 334 } |
154 | 335 |
155 /// Get the singleton DirectoryProxy for the system temp directory. | 336 /// Get the singleton DirectoryProxy for the system temp directory. |
156 Future<DirectoryProxy> _getSystemTempDirectory() async { | 337 Future<_DirectoryProxy> _getSystemTempDirectory() async { |
157 if (_systemTempDirectory != null) { | 338 if (_systemTempDirectory != null) { |
158 return _systempTempDirectory; | 339 return _systempTempDirectory; |
159 } | 340 } |
160 DirectoryProxy rootDirectory = await _getRootDirectory(); | 341 _DirectoryProxy rootDirectory = await _getRootDirectory(); |
161 int flags = types.kOpenFlagRead | | 342 int flags = types.kOpenFlagRead | |
162 types.kOpenFlagWrite | | 343 types.kOpenFlagWrite | |
163 types.kOpenFlagCreate; | 344 types.kOpenFlagCreate; |
164 _systemTempDirectory = new DirectoryProxy.unbound(); | 345 _systemTempDirectory = new _DirectoryProxy.unbound(); |
165 var response = | 346 var response = |
166 await rootDirectory.openDirectory(systemTempPath, | 347 await rootDirectory.openDirectory(systemTempPath, |
167 _systemTempDirectory, | 348 _systemTempDirectory.proxy, |
168 flags); | 349 flags); |
169 assert(response.error == types.Error.ok); | 350 assert(response.error == types.Error.ok); |
170 // Remove the system temp directory's handle from the open set because it | 351 // Remove the system temp directory's handle from the open set because it |
171 // is not under application control and does not affect isolate shutdown. | 352 // is not under application control and does not affect isolate shutdown. |
172 _systemTempDirectory.ctrl.endpoint.handle.pass(); | 353 _systemTempDirectory.proxy.ctrl.endpoint.handle.pass(); |
173 return _systemTempDirectory; | 354 return _systemTempDirectory; |
174 } | 355 } |
175 | 356 |
176 /// Static utility methods for converting between 'dart:io' and | 357 /// Static utility methods for converting between 'dart:io' and |
177 /// 'mojo:network_service' structs. | 358 /// 'mojo:network_service' structs. |
178 class _NetworkServiceCodec { | 359 class _NetworkServiceCodec { |
179 /// Returns a string representation of an ip address encoded in [address]. | 360 /// Returns a string representation of an ip address encoded in [address]. |
180 /// Supports both IPv4 and IPv6. | 361 /// Supports both IPv4 and IPv6. |
181 static String _addressToString(List<int> address) { | 362 static String _addressToString(List<int> address) { |
182 String r = ''; | 363 String r = ''; |
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
294 } | 475 } |
295 | 476 |
296 static _throwOnError(NetworkError error) { | 477 static _throwOnError(NetworkError error) { |
297 if (_okay(error)) { | 478 if (_okay(error)) { |
298 return; | 479 return; |
299 } | 480 } |
300 throw new OSError(error.description, error.code); | 481 throw new OSError(error.description, error.code); |
301 } | 482 } |
302 } | 483 } |
303 | 484 |
OLD | NEW |