Index: mojo/public/cpp/bindings/message.h |
diff --git a/mojo/public/cpp/bindings/message.h b/mojo/public/cpp/bindings/message.h |
index d8eed2bfc3ec00a96948954a86ade3b99fdc088c..cbd24461939c9f1f20e55bbfed83c2dc363904d2 100644 |
--- a/mojo/public/cpp/bindings/message.h |
+++ b/mojo/public/cpp/bindings/message.h |
@@ -10,6 +10,7 @@ |
#include <limits> |
#include <memory> |
+#include <string> |
#include <vector> |
#include "base/logging.h" |
@@ -99,6 +100,10 @@ class Message { |
// ownership of its internal storage and any attached handles. |
ScopedMessageHandle TakeMojoMessage(); |
+ // Notifies the system that this message is "bad," in this case meaning it was |
+ // rejected by bindings validation code. |
+ void NotifyBadMessage(const std::string& error); |
+ |
private: |
void CloseHandles(); |
@@ -110,12 +115,87 @@ class Message { |
class MessageReceiver { |
public: |
+ // The result of an Accept() or related operation. |
+ class Result { |
+ public: |
+ enum class Type { |
+ // The message was accepted successfully. |
+ SUCCESS, |
+ |
+ // A request was dropped because it didn't have a bound receiver after |
+ // being read from a pipe. This may be raised on the receiving end of a |
+ // request. |
+ REQUEST_DROPPED, |
+ |
+ // A request expecting a response has become impossible to fulfill (i.e. |
+ // a response callback was destroyed without being Run.) This may be |
+ // raised on the receiving side of a request, i.e. the responder. |
+ RESPONSE_DROPPED, |
+ |
+ // A message could not be sent for some reason, e.g., peer closure |
+ // detected on a pipe. |
+ SEND_FAILED, |
+ |
+ // An unexpected or malformed message was received. |
+ BAD_MESSAGE, |
+ |
+ // An unknown error occurred. This may be raised in exceptional cases, |
+ // e.g. when an code is reached which should be unreachable. |
yzshen1
2016/06/15 16:22:33
nit: an code -> some code ?
|
+ UNKNOWN_ERROR, |
+ }; |
+ |
+ explicit Result(Type type); |
+ Result(Type type, const std::string& details); |
+ Result(Result&& other); |
+ |
+ ~Result(); |
+ |
+ Result& operator=(Result&& other); |
+ |
+ // Set the Message object associated with this result, if any. Takes |
+ // ownership of the contents of |*message|. |
+ void set_message(Message* message) { |
+ DCHECK(message); |
+ message->MoveTo(&message_); |
+ } |
+ |
+ bool Succeeded() const { return type_ == Type::SUCCESS; } |
+ |
+ Type type() const { return type_; } |
+ const std::string& details() const { return details_; } |
+ Message& message() { return message_; } |
+ |
+ static Result ForSuccess() { return Result(Type::SUCCESS); } |
+ static Result ForUnknownError() { return Result(Type::UNKNOWN_ERROR); } |
+ |
+ static Result ForBadMessage(const std::string& details, Message* message); |
+ static Result ForBadRequest(const std::string& interface_name, |
+ const std::string& method_name, |
+ Message* message); |
+ static Result ForBadResponse(const std::string& interface_name, |
+ const std::string& method_name, |
+ Message* message); |
+ static Result ForUnexpectedRequest(const std::string& interface_name, |
+ Message* message); |
+ static Result ForUnexpectedResponse(const std::string& interface_name, |
+ Message* message); |
+ static Result ForBadControlMessage(const std::string& interface_name, |
+ Message* message); |
+ |
+ private: |
+ Type type_; |
+ std::string details_; |
+ Message message_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(Result); |
+ }; |
+ |
virtual ~MessageReceiver() {} |
// 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.
|
// was accepted and false otherwise, indicating that the message was invalid |
// or malformed. |
- virtual bool Accept(Message* message) WARN_UNUSED_RESULT = 0; |
+ virtual Result Accept(Message* message) WARN_UNUSED_RESULT = 0; |
}; |
class MessageReceiverWithResponder : public MessageReceiver { |
@@ -133,7 +213,8 @@ class MessageReceiverWithResponder : public MessageReceiver { |
// |
// TODO(yzshen): consider changing |responder| to |
// std::unique_ptr<MessageReceiver>. |
- virtual bool AcceptWithResponder(Message* message, MessageReceiver* responder) |
+ virtual Result AcceptWithResponder(Message* message, |
+ MessageReceiver* responder) |
WARN_UNUSED_RESULT = 0; |
}; |
@@ -172,8 +253,8 @@ class MessageReceiverWithResponderStatus : public MessageReceiver { |
// |
// TODO(yzshen): consider changing |responder| to |
// std::unique_ptr<MessageReceiver>. |
- virtual bool AcceptWithResponder(Message* message, |
- MessageReceiverWithStatus* responder) |
+ virtual Result AcceptWithResponder(Message* message, |
+ MessageReceiverWithStatus* responder) |
WARN_UNUSED_RESULT = 0; |
}; |