Chromium Code Reviews| 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 #ifndef MOJO_PUBLIC_CPP_BINDINGS_MESSAGE_H_ | 5 #ifndef MOJO_PUBLIC_CPP_BINDINGS_MESSAGE_H_ |
| 6 #define MOJO_PUBLIC_CPP_BINDINGS_MESSAGE_H_ | 6 #define MOJO_PUBLIC_CPP_BINDINGS_MESSAGE_H_ |
| 7 | 7 |
| 8 #include <stddef.h> | 8 #include <stddef.h> |
| 9 #include <stdint.h> | 9 #include <stdint.h> |
| 10 | 10 |
| 11 #include <limits> | 11 #include <limits> |
| 12 #include <memory> | 12 #include <memory> |
| 13 #include <string> | |
| 13 #include <vector> | 14 #include <vector> |
| 14 | 15 |
| 15 #include "base/logging.h" | 16 #include "base/logging.h" |
| 16 #include "mojo/public/cpp/bindings/lib/message_buffer.h" | 17 #include "mojo/public/cpp/bindings/lib/message_buffer.h" |
| 17 #include "mojo/public/cpp/bindings/lib/message_internal.h" | 18 #include "mojo/public/cpp/bindings/lib/message_internal.h" |
| 18 #include "mojo/public/cpp/system/message.h" | 19 #include "mojo/public/cpp/system/message.h" |
| 19 | 20 |
| 20 namespace mojo { | 21 namespace mojo { |
| 21 | 22 |
| 22 // Message is a holder for the data and handles to be sent over a MessagePipe. | 23 // Message is a holder for the data and handles to be sent over a MessagePipe. |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 92 std::vector<Handle>* mutable_handles() { return &handles_; } | 93 std::vector<Handle>* mutable_handles() { return &handles_; } |
| 93 | 94 |
| 94 // Access the underlying Buffer interface. | 95 // Access the underlying Buffer interface. |
| 95 internal::Buffer* buffer() { return buffer_.get(); } | 96 internal::Buffer* buffer() { return buffer_.get(); } |
| 96 | 97 |
| 97 // Takes a scoped MessageHandle which may be passed to |WriteMessageNew()| for | 98 // Takes a scoped MessageHandle which may be passed to |WriteMessageNew()| for |
| 98 // transmission. Note that this invalidates this Message object, taking | 99 // transmission. Note that this invalidates this Message object, taking |
| 99 // ownership of its internal storage and any attached handles. | 100 // ownership of its internal storage and any attached handles. |
| 100 ScopedMessageHandle TakeMojoMessage(); | 101 ScopedMessageHandle TakeMojoMessage(); |
| 101 | 102 |
| 103 // Notifies the system that this message is "bad," in this case meaning it was | |
| 104 // rejected by bindings validation code. | |
| 105 void NotifyBadMessage(const std::string& error); | |
| 106 | |
| 102 private: | 107 private: |
| 103 void CloseHandles(); | 108 void CloseHandles(); |
| 104 | 109 |
| 105 std::unique_ptr<internal::MessageBuffer> buffer_; | 110 std::unique_ptr<internal::MessageBuffer> buffer_; |
| 106 std::vector<Handle> handles_; | 111 std::vector<Handle> handles_; |
| 107 | 112 |
| 108 DISALLOW_COPY_AND_ASSIGN(Message); | 113 DISALLOW_COPY_AND_ASSIGN(Message); |
| 109 }; | 114 }; |
| 110 | 115 |
| 111 class MessageReceiver { | 116 class MessageReceiver { |
| 112 public: | 117 public: |
| 118 // The result of an Accept() or related operation. | |
| 119 class Result { | |
| 120 public: | |
| 121 enum class Type { | |
| 122 // The message was accepted successfully. | |
| 123 SUCCESS, | |
| 124 | |
| 125 // A request was dropped because it didn't have a bound receiver after | |
| 126 // being read from a pipe. This may be raised on the receiving end of a | |
| 127 // request. | |
| 128 REQUEST_DROPPED, | |
| 129 | |
| 130 // A request expecting a response has become impossible to fulfill (i.e. | |
| 131 // a response callback was destroyed without being Run.) This may be | |
| 132 // raised on the receiving side of a request, i.e. the responder. | |
| 133 RESPONSE_DROPPED, | |
| 134 | |
| 135 // A message could not be sent for some reason, e.g., peer closure | |
| 136 // detected on a pipe. | |
| 137 SEND_FAILED, | |
| 138 | |
| 139 // An unexpected or malformed message was received. | |
| 140 BAD_MESSAGE, | |
| 141 | |
| 142 // An unknown error occurred. This may be raised in exceptional cases, | |
| 143 // e.g. when an code is reached which should be unreachable. | |
|
yzshen1
2016/06/15 16:22:33
nit: an code -> some code ?
| |
| 144 UNKNOWN_ERROR, | |
| 145 }; | |
| 146 | |
| 147 explicit Result(Type type); | |
| 148 Result(Type type, const std::string& details); | |
| 149 Result(Result&& other); | |
| 150 | |
| 151 ~Result(); | |
| 152 | |
| 153 Result& operator=(Result&& other); | |
| 154 | |
| 155 // Set the Message object associated with this result, if any. Takes | |
| 156 // ownership of the contents of |*message|. | |
| 157 void set_message(Message* message) { | |
| 158 DCHECK(message); | |
| 159 message->MoveTo(&message_); | |
| 160 } | |
| 161 | |
| 162 bool Succeeded() const { return type_ == Type::SUCCESS; } | |
| 163 | |
| 164 Type type() const { return type_; } | |
| 165 const std::string& details() const { return details_; } | |
| 166 Message& message() { return message_; } | |
| 167 | |
| 168 static Result ForSuccess() { return Result(Type::SUCCESS); } | |
| 169 static Result ForUnknownError() { return Result(Type::UNKNOWN_ERROR); } | |
| 170 | |
| 171 static Result ForBadMessage(const std::string& details, Message* message); | |
| 172 static Result ForBadRequest(const std::string& interface_name, | |
| 173 const std::string& method_name, | |
| 174 Message* message); | |
| 175 static Result ForBadResponse(const std::string& interface_name, | |
| 176 const std::string& method_name, | |
| 177 Message* message); | |
| 178 static Result ForUnexpectedRequest(const std::string& interface_name, | |
| 179 Message* message); | |
| 180 static Result ForUnexpectedResponse(const std::string& interface_name, | |
| 181 Message* message); | |
| 182 static Result ForBadControlMessage(const std::string& interface_name, | |
| 183 Message* message); | |
| 184 | |
| 185 private: | |
| 186 Type type_; | |
| 187 std::string details_; | |
| 188 Message message_; | |
| 189 | |
| 190 DISALLOW_COPY_AND_ASSIGN(Result); | |
| 191 }; | |
| 192 | |
| 113 virtual ~MessageReceiver() {} | 193 virtual ~MessageReceiver() {} |
| 114 | 194 |
| 115 // The receiver may mutate the given message. Returns true if the message | 195 // The receiver may mutate the given message. Returns true if the message |
|
yzshen1
2016/06/15 16:22:33
Please update the comment about the return value.
| |
| 116 // was accepted and false otherwise, indicating that the message was invalid | 196 // was accepted and false otherwise, indicating that the message was invalid |
| 117 // or malformed. | 197 // or malformed. |
| 118 virtual bool Accept(Message* message) WARN_UNUSED_RESULT = 0; | 198 virtual Result Accept(Message* message) WARN_UNUSED_RESULT = 0; |
| 119 }; | 199 }; |
| 120 | 200 |
| 121 class MessageReceiverWithResponder : public MessageReceiver { | 201 class MessageReceiverWithResponder : public MessageReceiver { |
| 122 public: | 202 public: |
| 123 ~MessageReceiverWithResponder() override {} | 203 ~MessageReceiverWithResponder() override {} |
| 124 | 204 |
| 125 // A variant on Accept that registers a MessageReceiver (known as the | 205 // A variant on Accept that registers a MessageReceiver (known as the |
| 126 // responder) to handle the response message generated from the given | 206 // responder) to handle the response message generated from the given |
| 127 // message. The responder's Accept method may be called during | 207 // message. The responder's Accept method may be called during |
| 128 // AcceptWithResponder or some time after its return. | 208 // AcceptWithResponder or some time after its return. |
| 129 // | 209 // |
| 130 // NOTE: Upon returning true, AcceptWithResponder assumes ownership of | 210 // NOTE: Upon returning true, AcceptWithResponder assumes ownership of |
| 131 // |responder| and will delete it after calling |responder->Accept| or upon | 211 // |responder| and will delete it after calling |responder->Accept| or upon |
| 132 // its own destruction. | 212 // its own destruction. |
| 133 // | 213 // |
| 134 // TODO(yzshen): consider changing |responder| to | 214 // TODO(yzshen): consider changing |responder| to |
| 135 // std::unique_ptr<MessageReceiver>. | 215 // std::unique_ptr<MessageReceiver>. |
| 136 virtual bool AcceptWithResponder(Message* message, MessageReceiver* responder) | 216 virtual Result AcceptWithResponder(Message* message, |
| 217 MessageReceiver* responder) | |
| 137 WARN_UNUSED_RESULT = 0; | 218 WARN_UNUSED_RESULT = 0; |
| 138 }; | 219 }; |
| 139 | 220 |
| 140 // A MessageReceiver that is also able to provide status about the state | 221 // A MessageReceiver that is also able to provide status about the state |
| 141 // of the underlying MessagePipe to which it will be forwarding messages | 222 // of the underlying MessagePipe to which it will be forwarding messages |
| 142 // received via the |Accept()| call. | 223 // received via the |Accept()| call. |
| 143 class MessageReceiverWithStatus : public MessageReceiver { | 224 class MessageReceiverWithStatus : public MessageReceiver { |
| 144 public: | 225 public: |
| 145 ~MessageReceiverWithStatus() override {} | 226 ~MessageReceiverWithStatus() override {} |
| 146 | 227 |
| (...skipping 18 matching lines...) Expand all Loading... | |
| 165 // the responder) to handle the response message generated from the given | 246 // the responder) to handle the response message generated from the given |
| 166 // message. Any of the responder's methods (Accept or IsValid) may be called | 247 // message. Any of the responder's methods (Accept or IsValid) may be called |
| 167 // during AcceptWithResponder or some time after its return. | 248 // during AcceptWithResponder or some time after its return. |
| 168 // | 249 // |
| 169 // NOTE: Upon returning true, AcceptWithResponder assumes ownership of | 250 // NOTE: Upon returning true, AcceptWithResponder assumes ownership of |
| 170 // |responder| and will delete it after calling |responder->Accept| or upon | 251 // |responder| and will delete it after calling |responder->Accept| or upon |
| 171 // its own destruction. | 252 // its own destruction. |
| 172 // | 253 // |
| 173 // TODO(yzshen): consider changing |responder| to | 254 // TODO(yzshen): consider changing |responder| to |
| 174 // std::unique_ptr<MessageReceiver>. | 255 // std::unique_ptr<MessageReceiver>. |
| 175 virtual bool AcceptWithResponder(Message* message, | 256 virtual Result AcceptWithResponder(Message* message, |
| 176 MessageReceiverWithStatus* responder) | 257 MessageReceiverWithStatus* responder) |
| 177 WARN_UNUSED_RESULT = 0; | 258 WARN_UNUSED_RESULT = 0; |
| 178 }; | 259 }; |
| 179 | 260 |
| 180 // Read a single message from the pipe. The caller should have created the | 261 // Read a single message from the pipe. The caller should have created the |
| 181 // Message, but not called Initialize(). Returns MOJO_RESULT_SHOULD_WAIT if | 262 // Message, but not called Initialize(). Returns MOJO_RESULT_SHOULD_WAIT if |
| 182 // the caller should wait on the handle to become readable. Returns | 263 // the caller should wait on the handle to become readable. Returns |
| 183 // MOJO_RESULT_OK if the message was read successfully and should be | 264 // MOJO_RESULT_OK if the message was read successfully and should be |
| 184 // dispatched, otherwise returns an error code if something went wrong. | 265 // dispatched, otherwise returns an error code if something went wrong. |
| 185 // | 266 // |
| 186 // NOTE: The message hasn't been validated and may be malformed! | 267 // NOTE: The message hasn't been validated and may be malformed! |
| 187 MojoResult ReadMessage(MessagePipeHandle handle, Message* message); | 268 MojoResult ReadMessage(MessagePipeHandle handle, Message* message); |
| 188 | 269 |
| 189 } // namespace mojo | 270 } // namespace mojo |
| 190 | 271 |
| 191 #endif // MOJO_PUBLIC_CPP_BINDINGS_MESSAGE_H_ | 272 #endif // MOJO_PUBLIC_CPP_BINDINGS_MESSAGE_H_ |
| OLD | NEW |