OLD | NEW |
| (Empty) |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 part of application; | |
6 | |
7 class _ApplicationImpl implements application_mojom.Application { | |
8 application_mojom.ApplicationStub _stub; | |
9 shell_mojom.ShellProxy shell; | |
10 Application _application; | |
11 | |
12 _ApplicationImpl( | |
13 Application application, core.MojoMessagePipeEndpoint endpoint) { | |
14 _application = application; | |
15 _stub = new application_mojom.ApplicationStub.fromEndpoint(endpoint, this); | |
16 _stub.onError = close; | |
17 } | |
18 | |
19 _ApplicationImpl.fromHandle(Application application, core.MojoHandle handle) { | |
20 _application = application; | |
21 _stub = new application_mojom.ApplicationStub.fromHandle(handle, this); | |
22 _stub.onError = close; | |
23 } | |
24 | |
25 set onError(core.ErrorHandler f) { | |
26 _stub.onError = f; | |
27 } | |
28 | |
29 void initialize( | |
30 bindings.ProxyBase shellProxy, List<String> args, String url) { | |
31 assert(shell == null); | |
32 shell = shellProxy; | |
33 _application.initialize(args, url); | |
34 } | |
35 | |
36 @override | |
37 void acceptConnection(String requestorUrl, ServiceProviderStub services, | |
38 bindings.ProxyBase exposedServices, String resolvedUrl) => _application | |
39 ._acceptConnection(requestorUrl, services, exposedServices, resolvedUrl); | |
40 | |
41 @override | |
42 void requestQuit() => _application._requestQuitAndClose(); | |
43 | |
44 Future close({bool immediate: false}) { | |
45 if (shell != null) { | |
46 shell.close(immediate: immediate); | |
47 } | |
48 return _stub.close(immediate: immediate); | |
49 } | |
50 } | |
51 | |
52 // TODO(zra): Better documentation and examples. | |
53 // To implement, do the following: | |
54 // - Optionally override initialize() to process command-line args. | |
55 // - Optionally override acceptConnection() if services are to be provided. | |
56 // - Optionally override close() to clean up application resources. | |
57 abstract class Application { | |
58 _ApplicationImpl _applicationImpl; | |
59 List<ApplicationConnection> _applicationConnections; | |
60 Function onError; | |
61 | |
62 Application(core.MojoMessagePipeEndpoint endpoint) { | |
63 _applicationConnections = []; | |
64 _applicationImpl = new _ApplicationImpl(this, endpoint); | |
65 _applicationImpl.onError = _errorHandler; | |
66 } | |
67 | |
68 Application.fromHandle(core.MojoHandle appHandle) { | |
69 _applicationConnections = []; | |
70 _applicationImpl = new _ApplicationImpl.fromHandle(this, appHandle); | |
71 _applicationImpl.onError = _errorHandler; | |
72 } | |
73 | |
74 void initialize(List<String> args, String url) {} | |
75 | |
76 // TODO(skydart): This is a temporary fix to allow sky application to consume | |
77 // mojo services. Do not use for any other purpose. | |
78 void initializeFromShellProxy( | |
79 shell_mojom.ShellProxy shellProxy, List<String> args, String url) => | |
80 _applicationImpl.initialize(shellProxy, args, url); | |
81 | |
82 // Returns a connection to the app at |url|. | |
83 ApplicationConnection connectToApplication(String url) { | |
84 var proxy = new ServiceProviderProxy.unbound(); | |
85 var stub = new ServiceProviderStub.unbound(); | |
86 _applicationImpl.shell.ptr.connectToApplication(url, proxy, stub); | |
87 var connection = new ApplicationConnection(stub, proxy); | |
88 _applicationConnections.add(connection); | |
89 return connection; | |
90 } | |
91 | |
92 void connectToService(String url, bindings.ProxyBase proxy) { | |
93 connectToApplication(url).requestService(proxy); | |
94 } | |
95 | |
96 void requestQuit() {} | |
97 | |
98 void _requestQuitAndClose() { | |
99 requestQuit(); | |
100 close(); | |
101 } | |
102 | |
103 void _errorHandler() { | |
104 close().then((_) { | |
105 if (onError != null) onError(); | |
106 }); | |
107 } | |
108 | |
109 Future close({bool immediate: false}) { | |
110 assert(_applicationImpl != null); | |
111 _applicationConnections.forEach((c) => c.close(immediate: immediate)); | |
112 _applicationConnections.clear(); | |
113 return _applicationImpl.close(immediate: immediate); | |
114 } | |
115 | |
116 // This method closes all the application connections. Used during apptesting. | |
117 void resetConnections() { | |
118 assert(_applicationImpl != null); | |
119 _applicationConnections.forEach((c) => c.close()); | |
120 _applicationConnections.clear(); | |
121 } | |
122 | |
123 void _acceptConnection(String requestorUrl, ServiceProviderStub services, | |
124 ServiceProviderProxy exposedServices, String resolvedUrl) { | |
125 var connection = new ApplicationConnection(services, exposedServices); | |
126 _applicationConnections.add(connection); | |
127 acceptConnection(requestorUrl, resolvedUrl, connection); | |
128 } | |
129 | |
130 // Override this method to provide services on |connection|. | |
131 void acceptConnection(String requestorUrl, String resolvedUrl, | |
132 ApplicationConnection connection) {} | |
133 } | |
OLD | NEW |