Index: third_party/mojo/src/mojo/public/cpp/bindings/lib/control_message_proxy.cc |
diff --git a/third_party/mojo/src/mojo/public/cpp/bindings/lib/control_message_proxy.cc b/third_party/mojo/src/mojo/public/cpp/bindings/lib/control_message_proxy.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..11bfce996d94e660bc11acf679299b503e7920ad |
--- /dev/null |
+++ b/third_party/mojo/src/mojo/public/cpp/bindings/lib/control_message_proxy.cc |
@@ -0,0 +1,104 @@ |
+// Copyright 2015 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "mojo/public/cpp/bindings/lib/control_message_proxy.h" |
+ |
+#include "mojo/public/cpp/bindings/lib/message_builder.h" |
+#include "mojo/public/cpp/bindings/message.h" |
+#include "mojo/public/cpp/system/macros.h" |
+#include "mojo/public/interfaces/bindings/interface_control_messages.mojom.h" |
+ |
+namespace mojo { |
+namespace internal { |
+ |
+namespace { |
+ |
+using RunCallback = Callback<void(QueryVersionResultPtr)>; |
+ |
+class RunResponseForwardToCallback : public MessageReceiver { |
+ public: |
+ RunResponseForwardToCallback(const RunCallback& callback) |
+ : callback_(callback) {} |
+ bool Accept(Message* message) override; |
+ |
+ private: |
+ RunCallback callback_; |
+ MOJO_DISALLOW_COPY_AND_ASSIGN(RunResponseForwardToCallback); |
+}; |
+ |
+bool RunResponseForwardToCallback::Accept(Message* message) { |
+ RunResponseMessageParams_Data* params = |
+ reinterpret_cast<RunResponseMessageParams_Data*>( |
+ message->mutable_payload()); |
+ params->DecodePointersAndHandles(message->mutable_handles()); |
+ |
+ RunResponseMessageParamsPtr params_ptr; |
+ Deserialize_(params, ¶ms_ptr); |
+ |
+ callback_.Run(params_ptr->query_version_result.Pass()); |
+ return true; |
+} |
+ |
+void SendRunMessage(MessageReceiverWithResponder* receiver, |
+ QueryVersionPtr query_version, |
+ const RunCallback& callback) { |
+ RunMessageParamsPtr params_ptr(RunMessageParams::New()); |
+ params_ptr->reserved0 = 16u; |
+ params_ptr->reserved1 = 0u; |
+ params_ptr->query_version = query_version.Pass(); |
+ |
+ size_t size = GetSerializedSize_(params_ptr); |
+ RequestMessageBuilder builder(kRunMessageId, size); |
+ |
+ RunMessageParams_Data* params = nullptr; |
+ Serialize_(params_ptr.Pass(), builder.buffer(), ¶ms); |
+ Message message; |
+ params->EncodePointersAndHandles(message.mutable_handles()); |
+ builder.Finish(&message); |
+ MessageReceiver* responder = new RunResponseForwardToCallback(callback); |
+ if (!receiver->AcceptWithResponder(&message, responder)) |
+ delete responder; |
+} |
+ |
+void SendRunOrClosePipeMessage(MessageReceiverWithResponder* receiver, |
+ RequireVersionPtr require_version) { |
+ RunOrClosePipeMessageParamsPtr params_ptr(RunOrClosePipeMessageParams::New()); |
+ params_ptr->reserved0 = 16u; |
+ params_ptr->reserved1 = 0u; |
+ params_ptr->require_version = require_version.Pass(); |
+ |
+ size_t size = GetSerializedSize_(params_ptr); |
+ MessageBuilder builder(kRunOrClosePipeMessageId, size); |
+ |
+ RunOrClosePipeMessageParams_Data* params = nullptr; |
+ Serialize_(params_ptr.Pass(), builder.buffer(), ¶ms); |
+ Message message; |
+ params->EncodePointersAndHandles(message.mutable_handles()); |
+ builder.Finish(&message); |
+ bool ok = receiver->Accept(&message); |
+ MOJO_ALLOW_UNUSED_LOCAL(ok); |
+} |
+ |
+} // namespace |
+ |
+ControlMessageProxy::ControlMessageProxy(MessageReceiverWithResponder* receiver) |
+ : receiver_(receiver) { |
+} |
+ |
+void ControlMessageProxy::QueryVersion( |
+ const Callback<void(uint32_t)>& callback) { |
+ auto run_callback = [callback](QueryVersionResultPtr query_version_result) { |
+ callback.Run(query_version_result->version); |
+ }; |
+ SendRunMessage(receiver_, QueryVersion::New(), run_callback); |
+} |
+ |
+void ControlMessageProxy::RequireVersion(uint32_t version) { |
+ RequireVersionPtr require_version(RequireVersion::New()); |
+ require_version->version = version; |
+ SendRunOrClosePipeMessage(receiver_, require_version.Pass()); |
+} |
+ |
+} // namespace internal |
+} // namespace mojo |