Index: mojo/public/cpp/bindings/lib/message.cc |
diff --git a/mojo/public/cpp/bindings/lib/message.cc b/mojo/public/cpp/bindings/lib/message.cc |
index 4274cc86cb12695c4d0bebd5ea3664e88d89a71c..ab82cbe8bf3bd6ad887ffaebec7818aa905e1f83 100644 |
--- a/mojo/public/cpp/bindings/lib/message.cc |
+++ b/mojo/public/cpp/bindings/lib/message.cc |
@@ -12,6 +12,7 @@ |
#include <utility> |
#include "base/logging.h" |
+#include "base/strings/stringprintf.h" |
namespace mojo { |
@@ -78,6 +79,10 @@ ScopedMessageHandle Message::TakeMojoMessage() { |
return new_message; |
} |
+void Message::NotifyBadMessage(const std::string& error) { |
+ buffer_->NotifyBadMessage(error); |
+} |
+ |
void Message::CloseHandles() { |
for (std::vector<Handle>::iterator it = handles_.begin(); |
it != handles_.end(); ++it) { |
@@ -86,6 +91,89 @@ void Message::CloseHandles() { |
} |
} |
+ |
+MessageReceiver::Result::Result(Type type) : Result(type, "") {} |
yzshen1
2016/06/15 16:22:33
nit: it is preferred to use a default constructed
|
+ |
+MessageReceiver::Result::Result(Type type, const std::string& details) |
+ : type_(type), details_(details) {} |
+ |
+MessageReceiver::Result::Result(Result&& other) { *this = std::move(other); } |
+ |
+MessageReceiver::Result::~Result() {} |
+ |
+MessageReceiver::Result& MessageReceiver::Result::operator=(Result&& other) { |
+ type_ = other.type_; |
+ details_ = std::move(other.details_); |
+ other.message_.MoveTo(&message_); |
+ return *this; |
+} |
+ |
+// static |
+MessageReceiver::Result MessageReceiver::Result::ForBadMessage( |
+ const std::string& details, |
+ Message* message) { |
+ Result error(Type::BAD_MESSAGE, details); |
+ error.set_message(message); |
+ return error; |
+} |
+ |
+// static |
+MessageReceiver::Result MessageReceiver::Result::ForBadRequest( |
+ const std::string& interface_name, |
+ const std::string& method_name, |
+ Message* message) { |
+ Result error(Type::BAD_MESSAGE, |
+ base::StringPrintf("%s::%s", interface_name.c_str(), |
+ method_name.c_str())); |
+ error.set_message(message); |
+ return error; |
+} |
+ |
+// static |
+MessageReceiver::Result MessageReceiver::Result::ForBadResponse( |
+ const std::string& interface_name, |
+ const std::string& method_name, |
+ Message* message) { |
+ Result error(Type::BAD_MESSAGE, |
+ base::StringPrintf("%s::%s", |
+ interface_name.c_str(), method_name.c_str())); |
+ error.set_message(message); |
+ return error; |
+} |
+ |
+// static |
+MessageReceiver::Result MessageReceiver::Result::ForUnexpectedRequest( |
+ const std::string& interface_name, |
+ Message* message) { |
+ Result error(Type::BAD_MESSAGE, |
yzshen1
2016/06/15 16:22:33
It seems the difference between unexpected request
|
+ base::StringPrintf("%s (unexpected request %u)", |
+ interface_name.c_str(), message->name())); |
+ error.set_message(message); |
+ return error; |
+} |
+ |
+// static |
+MessageReceiver::Result MessageReceiver::Result::ForUnexpectedResponse( |
+ const std::string& interface_name, |
+ Message* message) { |
+ Result error(Type::BAD_MESSAGE, |
+ base::StringPrintf("%s (unexpected response %u)", |
+ interface_name.c_str(), message->name())); |
+ error.set_message(message); |
+ return error; |
+} |
+ |
+// static |
+MessageReceiver::Result MessageReceiver::Result::ForBadControlMessage( |
yzshen1
2016/06/15 16:22:33
Does this also apply to "pipe-level" control messa
|
+ const std::string& interface_name, |
+ Message* message) { |
+ Result error(Type::BAD_MESSAGE, |
+ base::StringPrintf("%s (control message ID %u)", |
+ interface_name.c_str(), message->name())); |
+ error.set_message(message); |
+ return error; |
+} |
+ |
MojoResult ReadMessage(MessagePipeHandle handle, Message* message) { |
MojoResult rv; |