| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 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 | 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 package org.chromium.mojo.bindings; | 5 package org.chromium.mojo.bindings; |
| 6 | 6 |
| 7 import org.chromium.mojo.system.AsyncWaiter; | 7 import org.chromium.mojo.system.AsyncWaiter; |
| 8 import org.chromium.mojo.system.Core; | 8 import org.chromium.mojo.system.Core; |
| 9 import org.chromium.mojo.system.MessagePipeHandle; | 9 import org.chromium.mojo.system.MessagePipeHandle; |
| 10 import org.chromium.mojo.system.MojoException; | 10 import org.chromium.mojo.system.MojoException; |
| 11 import org.chromium.mojo.system.MojoResult; | 11 import org.chromium.mojo.system.MojoResult; |
| 12 | 12 |
| 13 /** | 13 /** |
| 14 * A {@link Connector} owns a {@link MessagePipeHandle} and will send any receiv
ed messages to the | 14 * A {@link Connector} owns a {@link MessagePipeHandle} and will send any receiv
ed messages to the |
| 15 * registered {@link MessageReceiver}. It also acts as a {@link MessageReceiver}
and will send any | 15 * registered {@link MessageReceiver}. It also acts as a {@link MessageReceiver}
and will send any |
| 16 * message through the handle. | 16 * message through the handle. |
| 17 * <p> | 17 * <p> |
| 18 * The method |start| must be called before the {@link Connector} will start lis
tening to incoming | 18 * The method |start| must be called before the {@link Connector} will start lis
tening to incoming |
| 19 * messages. | 19 * messages. |
| 20 */ | 20 */ |
| 21 public class Connector implements MessageReceiver, HandleOwner<MessagePipeHandle
> { | 21 public class Connector implements MessageReceiver, HandleOwner<MessagePipeHandle
> { |
| 22 | 22 |
| 23 /** | 23 /** |
| 24 * An {@link ErrorHandler} is notified of error happening while using the me
ssage pipe. | |
| 25 */ | |
| 26 interface ErrorHandler { | |
| 27 public void onError(MojoException e); | |
| 28 } | |
| 29 | |
| 30 /** | |
| 31 * The callback that is notified when the state of the owned handle changes. | 24 * The callback that is notified when the state of the owned handle changes. |
| 32 */ | 25 */ |
| 33 private final AsyncWaiterCallback mAsyncWaiterCallback = new AsyncWaiterCall
back(); | 26 private final AsyncWaiterCallback mAsyncWaiterCallback = new AsyncWaiterCall
back(); |
| 34 | 27 |
| 35 /** | 28 /** |
| 36 * The owned message pipe. | 29 * The owned message pipe. |
| 37 */ | 30 */ |
| 38 private final MessagePipeHandle mMessagePipeHandle; | 31 private final MessagePipeHandle mMessagePipeHandle; |
| 39 | 32 |
| 40 /** | 33 /** |
| 41 * A waiter which is notified when a new message is available on the owned m
essage pipe. | 34 * A waiter which is notified when a new message is available on the owned m
essage pipe. |
| 42 */ | 35 */ |
| 43 private final AsyncWaiter mAsyncWaiter; | 36 private final AsyncWaiter mAsyncWaiter; |
| 44 | 37 |
| 45 /** | 38 /** |
| 46 * The {@link MessageReceiver} to which received messages are sent. | 39 * The {@link MessageReceiver} to which received messages are sent. |
| 47 */ | 40 */ |
| 48 private MessageReceiver mIncomingMessageReceiver; | 41 private MessageReceiver mIncomingMessageReceiver; |
| 49 | 42 |
| 50 /** | 43 /** |
| 51 * The Cancellable for the current wait. Is |null| when not currently waitin
g for new messages. | 44 * The Cancellable for the current wait. Is |null| when not currently waitin
g for new messages. |
| 52 */ | 45 */ |
| 53 private AsyncWaiter.Cancellable mCancellable; | 46 private AsyncWaiter.Cancellable mCancellable; |
| 54 | 47 |
| 55 /** | 48 /** |
| 56 * The error handler to notify of errors. | 49 * The error handler to notify of errors. |
| 57 */ | 50 */ |
| 58 private ErrorHandler mErrorHandler; | 51 private ConnectionErrorHandler mErrorHandler; |
| 59 | 52 |
| 60 /** | 53 /** |
| 61 * Create a new connector over a |messagePipeHandle|. The created connector
will use the default | 54 * Create a new connector over a |messagePipeHandle|. The created connector
will use the default |
| 62 * {@link AsyncWaiter} from the {@link Core} implementation of |messagePipeH
andle|. | 55 * {@link AsyncWaiter} from the {@link Core} implementation of |messagePipeH
andle|. |
| 63 */ | 56 */ |
| 64 public Connector(MessagePipeHandle messagePipeHandle) { | 57 public Connector(MessagePipeHandle messagePipeHandle) { |
| 65 this(messagePipeHandle, getDefaultAsyncWaiterForMessagePipe(messagePipeH
andle)); | 58 this(messagePipeHandle, BindingsHelper.getDefaultAsyncWaiterForHandle(me
ssagePipeHandle)); |
| 66 } | 59 } |
| 67 | 60 |
| 68 /** | 61 /** |
| 69 * Create a new connector over a |messagePipeHandle| using the given {@link
AsyncWaiter} to get | 62 * Create a new connector over a |messagePipeHandle| using the given {@link
AsyncWaiter} to get |
| 70 * notified of changes on the handle. | 63 * notified of changes on the handle. |
| 71 */ | 64 */ |
| 72 public Connector(MessagePipeHandle messagePipeHandle, AsyncWaiter asyncWaite
r) { | 65 public Connector(MessagePipeHandle messagePipeHandle, AsyncWaiter asyncWaite
r) { |
| 73 mCancellable = null; | 66 mCancellable = null; |
| 74 mMessagePipeHandle = messagePipeHandle; | 67 mMessagePipeHandle = messagePipeHandle; |
| 75 mAsyncWaiter = asyncWaiter; | 68 mAsyncWaiter = asyncWaiter; |
| 76 } | 69 } |
| 77 | 70 |
| 78 /** | 71 /** |
| 79 * Set the {@link MessageReceiver} that will receive message from the owned
message pipe. | 72 * Set the {@link MessageReceiver} that will receive message from the owned
message pipe. |
| 80 */ | 73 */ |
| 81 public void setIncomingMessageReceiver(MessageReceiver incomingMessageReceiv
er) { | 74 public void setIncomingMessageReceiver(MessageReceiver incomingMessageReceiv
er) { |
| 82 mIncomingMessageReceiver = incomingMessageReceiver; | 75 mIncomingMessageReceiver = incomingMessageReceiver; |
| 83 } | 76 } |
| 84 | 77 |
| 85 /** | 78 /** |
| 86 * Set the {@link ErrorHandler} that will be notified of errors on the owned
message pipe. | 79 * Set the {@link ConnectionErrorHandler} that will be notified of errors on
the owned message |
| 80 * pipe. |
| 87 */ | 81 */ |
| 88 public void setErrorHandler(ErrorHandler errorHandler) { | 82 public void setErrorHandler(ConnectionErrorHandler errorHandler) { |
| 89 mErrorHandler = errorHandler; | 83 mErrorHandler = errorHandler; |
| 90 } | 84 } |
| 91 | 85 |
| 92 /** | 86 /** |
| 93 * Start listening for incoming messages. | 87 * Start listening for incoming messages. |
| 94 */ | 88 */ |
| 95 public void start() { | 89 public void start() { |
| 96 assert mCancellable == null; | 90 assert mCancellable == null; |
| 97 registerAsyncWaiterForRead(); | 91 registerAsyncWaiterForRead(); |
| 98 } | 92 } |
| 99 | 93 |
| 100 /** | 94 /** |
| 101 * @see MessageReceiver#accept(Message) | 95 * @see MessageReceiver#accept(MessageWithHeader) |
| 102 */ | 96 */ |
| 103 @Override | 97 @Override |
| 104 public boolean accept(Message message) { | 98 public boolean accept(MessageWithHeader message) { |
| 105 try { | 99 try { |
| 106 mMessagePipeHandle.writeMessage(message.buffer, message.handles, | 100 mMessagePipeHandle.writeMessage(message.getMessage().buffer, |
| 107 MessagePipeHandle.WriteFlags.NONE); | 101 message.getMessage().handles, MessagePipeHandle.WriteFlags.N
ONE); |
| 108 return true; | 102 return true; |
| 109 } catch (MojoException e) { | 103 } catch (MojoException e) { |
| 110 onError(e); | 104 onError(e); |
| 111 return false; | 105 return false; |
| 112 } | 106 } |
| 113 } | 107 } |
| 114 | 108 |
| 115 /** | 109 /** |
| 116 * Pass the owned handle of the connector. After this, the connector is disc
onnected. It cannot | 110 * Pass the owned handle of the connector. After this, the connector is disc
onnected. It cannot |
| 117 * accept new message and it isn't listening to the handle anymore. | 111 * accept new message and it isn't listening to the handle anymore. |
| 118 * | 112 * |
| 119 * @see org.chromium.mojo.bindings.HandleOwner#passHandle() | 113 * @see org.chromium.mojo.bindings.HandleOwner#passHandle() |
| 120 */ | 114 */ |
| 121 @Override | 115 @Override |
| 122 public MessagePipeHandle passHandle() { | 116 public MessagePipeHandle passHandle() { |
| 123 cancelIfActive(); | 117 cancelIfActive(); |
| 124 return mMessagePipeHandle.pass(); | 118 return mMessagePipeHandle.pass(); |
| 125 } | 119 } |
| 126 | 120 |
| 127 /** | 121 /** |
| 128 * @see java.io.Closeable#close() | 122 * @see java.io.Closeable#close() |
| 129 */ | 123 */ |
| 130 @Override | 124 @Override |
| 131 public void close() { | 125 public void close() { |
| 132 cancelIfActive(); | 126 cancelIfActive(); |
| 133 mMessagePipeHandle.close(); | 127 mMessagePipeHandle.close(); |
| 134 } | 128 } |
| 135 | 129 |
| 136 private static AsyncWaiter getDefaultAsyncWaiterForMessagePipe( | |
| 137 MessagePipeHandle messagePipeHandle) { | |
| 138 if (messagePipeHandle.getCore() != null) { | |
| 139 return messagePipeHandle.getCore().getDefaultAsyncWaiter(); | |
| 140 } else { | |
| 141 return null; | |
| 142 } | |
| 143 } | |
| 144 | |
| 145 private class AsyncWaiterCallback implements AsyncWaiter.Callback { | 130 private class AsyncWaiterCallback implements AsyncWaiter.Callback { |
| 146 | 131 |
| 147 /** | 132 /** |
| 148 * @see org.chromium.mojo.system.AsyncWaiter.Callback#onResult(int) | 133 * @see org.chromium.mojo.system.AsyncWaiter.Callback#onResult(int) |
| 149 */ | 134 */ |
| 150 @Override | 135 @Override |
| 151 public void onResult(int result) { | 136 public void onResult(int result) { |
| 152 Connector.this.onAsyncWaiterResult(result); | 137 Connector.this.onAsyncWaiterResult(result); |
| 153 } | 138 } |
| 154 | 139 |
| (...skipping 16 matching lines...) Expand all Loading... |
| 171 readOutstandingMessages(); | 156 readOutstandingMessages(); |
| 172 } else { | 157 } else { |
| 173 onError(new MojoException(result)); | 158 onError(new MojoException(result)); |
| 174 } | 159 } |
| 175 } | 160 } |
| 176 | 161 |
| 177 private void onError(MojoException exception) { | 162 private void onError(MojoException exception) { |
| 178 mCancellable = null; | 163 mCancellable = null; |
| 179 close(); | 164 close(); |
| 180 if (mErrorHandler != null) { | 165 if (mErrorHandler != null) { |
| 181 mErrorHandler.onError(exception); | 166 mErrorHandler.onConnectionError(exception); |
| 182 } | 167 } |
| 183 } | 168 } |
| 184 | 169 |
| 185 /** | 170 /** |
| 186 * Register to be called back when a new message is available on the owned m
essage pipe. | 171 * Register to be called back when a new message is available on the owned m
essage pipe. |
| 187 */ | 172 */ |
| 188 private void registerAsyncWaiterForRead() { | 173 private void registerAsyncWaiterForRead() { |
| 189 assert mCancellable == null; | 174 assert mCancellable == null; |
| 190 if (mAsyncWaiter != null) { | 175 if (mAsyncWaiter != null) { |
| 191 mCancellable = mAsyncWaiter.asyncWait(mMessagePipeHandle, Core.Handl
eSignals.READABLE, | 176 mCancellable = mAsyncWaiter.asyncWait(mMessagePipeHandle, Core.Handl
eSignals.READABLE, |
| 192 Core.DEADLINE_INFINITE, mAsyncWaiterCallback); | 177 Core.DEADLINE_INFINITE, mAsyncWaiterCallback); |
| 193 } else { | 178 } else { |
| 194 onError(new MojoException(MojoResult.INVALID_ARGUMENT)); | 179 onError(new MojoException(MojoResult.INVALID_ARGUMENT)); |
| 195 } | 180 } |
| 196 } | 181 } |
| 197 | 182 |
| 198 /** | 183 /** |
| 199 * Read all available messages on the owned message pipe. | 184 * Read all available messages on the owned message pipe. |
| 200 */ | 185 */ |
| 201 private void readOutstandingMessages() { | 186 private void readOutstandingMessages() { |
| 202 int result; | 187 int result; |
| 203 do { | 188 do { |
| 204 try { | 189 try { |
| 205 result = Message.readAndDispatchMessage(mMessagePipeHandle, | 190 result = MessageWithHeader.readAndDispatchMessage(mMessagePipeHa
ndle, |
| 206 mIncomingMessageReceiver); | 191 mIncomingMessageReceiver); |
| 207 } catch (MojoException e) { | 192 } catch (MojoException e) { |
| 208 onError(e); | 193 onError(e); |
| 209 return; | 194 return; |
| 210 } | 195 } |
| 211 } while (result == MojoResult.OK); | 196 } while (result == MojoResult.OK); |
| 212 if (result == MojoResult.SHOULD_WAIT) { | 197 if (result == MojoResult.SHOULD_WAIT) { |
| 213 registerAsyncWaiterForRead(); | 198 registerAsyncWaiterForRead(); |
| 214 } else { | 199 } else { |
| 215 onError(new MojoException(result)); | 200 onError(new MojoException(result)); |
| 216 } | 201 } |
| 217 } | 202 } |
| 218 | 203 |
| 219 private void cancelIfActive() { | 204 private void cancelIfActive() { |
| 220 if (mCancellable != null) { | 205 if (mCancellable != null) { |
| 221 mCancellable.cancel(); | 206 mCancellable.cancel(); |
| 222 mCancellable = null; | 207 mCancellable = null; |
| 223 } | 208 } |
| 224 } | 209 } |
| 225 | |
| 226 } | 210 } |
| OLD | NEW |