Index: mojo/dart/packages/mojo/lib/src/stub.dart |
diff --git a/mojo/dart/packages/mojo/lib/src/stub.dart b/mojo/dart/packages/mojo/lib/src/stub.dart |
index 2b95ea777ee2a5af60721d3833e2a60658e2b77f..a076533667d15204959653b14a2e9a07b44010f3 100644 |
--- a/mojo/dart/packages/mojo/lib/src/stub.dart |
+++ b/mojo/dart/packages/mojo/lib/src/stub.dart |
@@ -4,22 +4,61 @@ |
part of bindings; |
-abstract class Stub extends core.MojoEventHandler { |
+/// Generated StubControl classes implement this interface. |
+/// StubControl objects are accessible through the [ctrl] field on Stubs. |
+abstract class StubControl<T> implements StubMessageHandler { |
+ T impl; |
+} |
+ |
+/// Generated Stub classes extend this base class. |
+class Stub<T> { |
+ // In general it's probalby better to avoid adding fields and methods to this |
+ // class. Names added to this class have to be mangled by Mojo bindings |
+ // generation to avoid name conflicts. |
+ |
+ /// Proxies control the StubMessageHandler by way of this [StubControl] |
+ /// object. |
+ final StubControl<T> ctrl; |
+ |
+ Stub(this.ctrl); |
+ |
+ /// This is a convenience method that simply forwards to ctrl.close(). |
+ /// If a Mojo interface has a method 'close', its name will be mangled to be |
+ /// 'close_'. |
+ Future close({bool immediate: false}) => ctrl.close(immediate: immediate); |
+ |
+ /// This getter and setter pair is for convenience and simply forwards to |
+ /// ctrl.impl. If a Mojo interface has a method 'close', its name will be |
+ /// mangled to be 'impl_'. |
+ T get impl => ctrl.impl; |
+ set impl(T impl) { |
+ ctrl.impl = impl; |
+ } |
+} |
+ |
+abstract class StubMessageHandler extends core.MojoEventHandler { |
int _outstandingResponseFutures = 0; |
bool _isClosing = false; |
Completer _closeCompleter; |
- Stub.fromEndpoint(core.MojoMessagePipeEndpoint endpoint, |
- {bool autoBegin: true}) |
+ StubMessageHandler.fromEndpoint(core.MojoMessagePipeEndpoint endpoint, |
+ {bool autoBegin: true}) |
: super.fromEndpoint(endpoint, autoBegin: autoBegin); |
- Stub.fromHandle(core.MojoHandle handle, {bool autoBegin: true}) |
+ StubMessageHandler.fromHandle(core.MojoHandle handle, {bool autoBegin: true}) |
: super.fromHandle(handle, autoBegin: autoBegin); |
- Stub.unbound() : super.unbound(); |
+ StubMessageHandler.unbound() : super.unbound(); |
+ /// Generated StubControl classes implement this method to route messages to |
+ /// the correct implementation method. |
dynamic handleMessage(ServiceMessage message); |
+ /// Generated StubControl classes implement this getter to return the version |
+ /// of the mojom interface for which the bindings are generated. |
+ int get version; |
+ |
+ @override |
void handleRead() { |
var result = endpoint.queryAndRead(); |
if ((result.data == null) || (result.dataLength == 0)) { |
@@ -64,29 +103,7 @@ abstract class Stub extends core.MojoEventHandler { |
} |
} |
- void _sendResponse(Message response) { |
- if (isOpen) { |
- endpoint.write( |
- response.buffer, response.buffer.lengthInBytes, response.handles); |
- // FailedPrecondition is only used to indicate that the other end of |
- // the pipe has been closed. We can ignore the close here and wait for |
- // the PeerClosed signal on the event stream. |
- assert((endpoint.status == core.MojoResult.kOk) || |
- (endpoint.status == core.MojoResult.kFailedPrecondition)); |
- if (_isClosing && (_outstandingResponseFutures == 0)) { |
- // This was the final response future for which we needed to send |
- // a response. It is safe to close. |
- super.close().then((_) { |
- if (_isClosing) { |
- _isClosing = false; |
- _closeCompleter.complete(null); |
- _closeCompleter = null; |
- } |
- }); |
- } |
- } |
- } |
- |
+ @override |
void handleWrite() { |
throw 'Unexpected write signal in client.'; |
} |
@@ -128,15 +145,37 @@ abstract class Stub extends core.MojoEventHandler { |
return response.serializeWithHeader(header); |
} |
+ @override |
String toString() { |
var superString = super.toString(); |
- return "Stub(${superString})"; |
+ return "StubMessageHandler(${superString})"; |
} |
- int get version; |
- |
/// Returns a service description, which exposes the mojom type information |
/// of the service being stubbed. |
/// Note: The description is null or incomplete if type info is unavailable. |
service_describer.ServiceDescription get description => null; |
+ |
+ void _sendResponse(Message response) { |
+ if (isOpen) { |
+ endpoint.write( |
+ response.buffer, response.buffer.lengthInBytes, response.handles); |
+ // FailedPrecondition is only used to indicate that the other end of |
+ // the pipe has been closed. We can ignore the close here and wait for |
+ // the PeerClosed signal on the event stream. |
+ assert((endpoint.status == core.MojoResult.kOk) || |
+ (endpoint.status == core.MojoResult.kFailedPrecondition)); |
+ if (_isClosing && (_outstandingResponseFutures == 0)) { |
+ // This was the final response future for which we needed to send |
+ // a response. It is safe to close. |
+ super.close().then((_) { |
+ if (_isClosing) { |
+ _isClosing = false; |
+ _closeCompleter.complete(null); |
+ _closeCompleter = null; |
+ } |
+ }); |
+ } |
+ } |
+ } |
} |