diff options
author | darin@chromium.org <darin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-03-05 06:07:35 +0000 |
---|---|---|
committer | darin@chromium.org <darin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-03-05 06:07:35 +0000 |
commit | eb692294cd856d59161cc4b48e453e4916bed0f9 (patch) | |
tree | 6020d859fa3ed51690b8d1c62fbc54d9a7d2cd97 /mojo/public/bindings/lib/message.cc | |
parent | a836fad35e581bc73de683bb468bef74c9984c76 (diff) | |
download | chromium_src-eb692294cd856d59161cc4b48e453e4916bed0f9.zip chromium_src-eb692294cd856d59161cc4b48e453e4916bed0f9.tar.gz chromium_src-eb692294cd856d59161cc4b48e453e4916bed0f9.tar.bz2 |
Mojo: share code between SyncDispatcher and Connector
R=piman@chromium.org
Review URL: https://codereview.chromium.org/185723003
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@254952 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'mojo/public/bindings/lib/message.cc')
-rw-r--r-- | mojo/public/bindings/lib/message.cc | 37 |
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 |