Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(428)

Side by Side Diff: mojo/bindings/java/src/org/chromium/mojo/bindings/RouterImpl.java

Issue 371603003: Adding a router class to handle messages that expect responses. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix rebasing Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(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 package org.chromium.mojo.bindings;
6
7 import org.chromium.mojo.system.AsyncWaiter;
8 import org.chromium.mojo.system.MessagePipeHandle;
9
10 import java.util.HashMap;
11 import java.util.Map;
12
13 /**
14 * Implementation of Router.
rmcilroy 2014/07/10 19:03:59 {@link Router}
qsr 2014/07/11 11:42:08 Done.
15 */
16 public class RouterImpl implements Router {
17
18 /**
19 * {@link MessageReceiver} used as the {@link Connector} callback.
20 */
21 private class Thunk implements MessageReceiver {
rmcilroy 2014/07/10 19:03:59 Thunk is not a very clear name for what the class
qsr 2014/07/11 11:42:08 It is the name the C++ implementation use. I'd lik
22
23 /**
24 * @see MessageReceiver#accept(Message)
25 */
26 @Override
27 public boolean accept(Message message) {
28 return handleIncomingMessage(message);
29 }
30
31 }
32
33 /**
34 * The {@link Connector} connected to the handle.
rmcilroy 2014/07/10 19:03:59 /s/connected/which is connected
qsr 2014/07/11 11:42:08 Done.
35 */
36 private final Connector mConnector;
37
38 /**
39 * The {@link MessageReceiverWithResponder} that will deserialize and use th e message received
rmcilroy 2014/07/10 19:03:59 /s/deserialize and use/consume /s/message/messages
qsr 2014/07/11 11:42:08 Done.
40 * from the pipe.
41 */
42 private MessageReceiverWithResponder mIncomingMessageReceiver;
43
44 /**
45 * The id of the next request that needs a response. It is auto-incremented.
rmcilroy 2014/07/10 19:03:59 The next id to use for a request id which needs a
qsr 2014/07/11 11:42:09 Done.
46 */
47 private long mNextRequestId = 1;
48
49 /**
50 * The map from request ids to {@link MessageReceiver} of request currently in flight.
51 */
52 private Map<Long, MessageReceiver> mResponders = new HashMap<Long, MessageRe ceiver>();
53
54 /**
55 * Constructor.
rmcilroy 2014/07/10 19:03:59 Detail parameters and that it uses the default asy
qsr 2014/07/11 11:42:09 Done.
56 */
57 public RouterImpl(MessagePipeHandle messagePipeHandle) {
58 this(messagePipeHandle, BindingsHelper.getDefaultAsyncWaiterForHandle(me ssagePipeHandle));
59 }
60
61 /**
62 * Constructor.
rmcilroy 2014/07/10 19:03:59 Detail parameters
qsr 2014/07/11 11:42:08 Done.
63 */
64 public RouterImpl(MessagePipeHandle messagePipeHandle, AsyncWaiter asyncWait er) {
65 mConnector = new Connector(messagePipeHandle, asyncWaiter);
66 mConnector.setIncomingMessageReceiver(new Thunk());
67 }
68
69 /**
70 * @see org.chromium.mojo.bindings.Router#start()
71 */
72 @Override
73 public void start() {
74 mConnector.start();
75 }
76
77 /**
78 * @see Router#setIncomingMessageReceiver(MessageReceiverWithResponder)
79 */
80 @Override
81 public void setIncomingMessageReceiver(MessageReceiverWithResponder incoming MessageReceiver) {
82 this.mIncomingMessageReceiver = incomingMessageReceiver;
83 }
84
85 /**
86 * @see MessageReceiver#accept(Message)
87 */
88 @Override
89 public boolean accept(Message message) {
90 // A message without receiver is directly forwarded to the connector.
rmcilroy 2014/07/10 19:03:59 /s/receiever/a responder
qsr 2014/07/11 11:42:08 Done.
91 return mConnector.accept(message);
92 }
93
94 /**
95 * @see MessageReceiverWithResponder#acceptWithResponder(Message, MessageRec eiver)
96 */
97 @Override
98 public boolean acceptWithResponder(Message message, MessageReceiver receiver ) {
rmcilroy 2014/07/10 19:03:59 /s/receiver/responder
qsr 2014/07/11 11:42:09 Done.
99 // Checking the message expects a response.
100 assert message.getHeader().hasFlag(MessageHeader.MESSAGE_EXPECTS_RESPONS E_FLAG);
101
102 // Compute a request id for being able to route the response.
103 long requestId = mNextRequestId++;
104 // Reserve 0 in case we want it to convey special meaning in the future.
105 if (requestId == 0) {
106 requestId = mNextRequestId++;
107 }
108 assert !mResponders.containsKey(requestId);
rmcilroy 2014/07/10 19:03:59 I don't think it's enough to just assert this - ev
qsr 2014/07/11 11:42:09 Done. I don't think (famous last words) that it is
109 MessageHeader.setRequestId(message, requestId);
110 if (!mConnector.accept(message)) {
111 return false;
112 }
113 // Only keep the receiver is the message has been accepted.
rmcilroy 2014/07/10 19:03:59 /s/receiever/responder
qsr 2014/07/11 11:42:09 Done.
114 mResponders.put(requestId, receiver);
115 return true;
116 }
117
118 /**
119 * @see org.chromium.mojo.bindings.HandleOwner#passHandle()
120 */
121 @Override
122 public MessagePipeHandle passHandle() {
123 return mConnector.passHandle();
124 }
125
126 /**
127 * @see java.io.Closeable#close()
128 */
129 @Override
130 public void close() {
131 mConnector.close();
132 }
133
134 /**
135 * @see Router#setErrorHandler(ConnectionErrorHandler)
136 */
137 @Override
138 public void setErrorHandler(ConnectionErrorHandler errorHandler) {
139 mConnector.setErrorHandler(errorHandler);
140 }
141
142 /**
143 * Receive a message from the connector.
rmcilroy 2014/07/10 19:03:59 describe what's returned
qsr 2014/07/11 11:42:08 Done.
144 */
145 private boolean handleIncomingMessage(Message message) {
146 MessageHeader header = message.getHeader();
147 if (header.hasFlag(MessageHeader.MESSAGE_EXPECTS_RESPONSE_FLAG)) {
148 if (mIncomingMessageReceiver != null) {
149 return mIncomingMessageReceiver.acceptWithResponder(message, thi s);
150 }
151 // If we receive a request expecting a response when the client is n ot
152 // listening, then we have no choice but to tear down the pipe.
153 close();
154 return false;
155 } else if (header.hasFlag(MessageHeader.MESSAGE_IS_RESPONSE_FLAG)) {
156 long requestId = header.getRequestId();
157 MessageReceiver responder = mResponders.get(requestId);
158 if (responder == null) {
159 return false;
rmcilroy 2014/07/10 19:03:59 should we teardown here too?
qsr 2014/07/11 11:42:08 Not really. The message is routed, but the problem
160 }
161 return responder.accept(message);
162 } else {
163 if (mIncomingMessageReceiver != null) {
164 return mIncomingMessageReceiver.accept(message);
165 }
166 // OK to drop the message.
167 }
168 return false;
169 }
170
171 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698