summaryrefslogtreecommitdiffstats
path: root/mojo/public/bindings/lib/message.cc
diff options
context:
space:
mode:
Diffstat (limited to 'mojo/public/bindings/lib/message.cc')
-rw-r--r--mojo/public/bindings/lib/message.cc37
1 files changed, 37 insertions, 0 deletions
diff --git a/mojo/public/bindings/lib/message.cc b/mojo/public/bindings/lib/message.cc
index f33f250a..b57061d 100644
--- a/mojo/public/bindings/lib/message.cc
+++ b/mojo/public/bindings/lib/message.cc
@@ -44,4 +44,41 @@ void Message::Swap(Message* other) {
std::swap(handles_, other->handles_);
}
+MojoResult ReadAndDispatchMessage(MessagePipeHandle handle,
+ MessageReceiver* receiver,
+ bool* receiver_result) {
+ MojoResult rv;
+
+ uint32_t num_bytes = 0, num_handles = 0;
+ rv = ReadMessageRaw(handle,
+ NULL,
+ &num_bytes,
+ NULL,
+ &num_handles,
+ MOJO_READ_MESSAGE_FLAG_NONE);
+ if (rv != MOJO_RESULT_RESOURCE_EXHAUSTED)
+ return rv;
+
+ Message message;
+ message.AllocUninitializedData(num_bytes);
+ message.mutable_handles()->resize(num_handles);
+
+ rv = ReadMessageRaw(handle,
+ message.mutable_data(),
+ &num_bytes,
+ message.mutable_handles()->empty()
+ ? NULL
+ : reinterpret_cast<MojoHandle*>(
+ &message.mutable_handles()->front()),
+ &num_handles,
+ MOJO_READ_MESSAGE_FLAG_NONE);
+ if (receiver && rv == MOJO_RESULT_OK) {
+ bool result = receiver->Accept(&message);
+ if (receiver_result)
+ *receiver_result = result;
+ }
+
+ return rv;
+}
+
} // namespace mojo