Index: third_party/mojo/src/mojo/public/cpp/bindings/lib/control_message_handler.cc |
diff --git a/third_party/mojo/src/mojo/public/cpp/bindings/lib/control_message_handler.cc b/third_party/mojo/src/mojo/public/cpp/bindings/lib/control_message_handler.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..00cd3f5396e29905f2746440e4537af023729c96 |
--- /dev/null |
+++ b/third_party/mojo/src/mojo/public/cpp/bindings/lib/control_message_handler.cc |
@@ -0,0 +1,82 @@ |
+// 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_handler.h" |
+ |
+#include "mojo/public/cpp/bindings/lib/message_builder.h" |
+#include "mojo/public/cpp/environment/logging.h" |
+#include "mojo/public/interfaces/bindings/interface_control_messages.mojom.h" |
+ |
+namespace mojo { |
+namespace internal { |
+ |
+// static |
+bool ControlMessageHandler::IsControlMessage(const Message* message) { |
+ return message->header()->name == kRunMessageId || |
+ message->header()->name == kRunOrClosePipeMessageId; |
+} |
+ |
+ControlMessageHandler::ControlMessageHandler(uint32_t interface_version) |
+ : interface_version_(interface_version) { |
+} |
+ |
+ControlMessageHandler::~ControlMessageHandler() { |
+} |
+ |
+bool ControlMessageHandler::Accept(Message* message) { |
+ if (message->header()->name == kRunOrClosePipeMessageId) |
+ return RunOrClosePipe(message); |
+ |
+ MOJO_NOTREACHED(); |
+ return false; |
+} |
+ |
+bool ControlMessageHandler::AcceptWithResponder( |
+ Message* message, |
+ MessageReceiverWithStatus* responder) { |
+ if (message->header()->name == kRunMessageId) |
+ return Run(message, responder); |
+ |
+ MOJO_NOTREACHED(); |
+ return false; |
+} |
+ |
+bool ControlMessageHandler::Run(Message* message, |
+ MessageReceiverWithStatus* responder) { |
+ RunResponseMessageParamsPtr response_params_ptr( |
+ RunResponseMessageParams::New()); |
+ response_params_ptr->reserved0 = 16u; |
+ response_params_ptr->reserved1 = 0u; |
+ response_params_ptr->query_version_result = QueryVersionResult::New(); |
+ response_params_ptr->query_version_result->version = interface_version_; |
+ |
+ size_t size = GetSerializedSize_(response_params_ptr); |
+ ResponseMessageBuilder builder(kRunMessageId, size, message->request_id()); |
+ |
+ RunResponseMessageParams_Data* response_params = nullptr; |
+ Serialize_(response_params_ptr.Pass(), builder.buffer(), &response_params); |
+ Message response_message; |
+ response_params->EncodePointersAndHandles(response_message.mutable_handles()); |
+ builder.Finish(&response_message); |
+ bool ok = responder->Accept(&response_message); |
+ MOJO_ALLOW_UNUSED_LOCAL(ok); |
+ delete responder; |
+ |
+ return true; |
+} |
+ |
+bool ControlMessageHandler::RunOrClosePipe(Message* message) { |
+ RunOrClosePipeMessageParams_Data* params = |
+ reinterpret_cast<RunOrClosePipeMessageParams_Data*>( |
+ message->mutable_payload()); |
+ params->DecodePointersAndHandles(message->mutable_handles()); |
+ |
+ RunOrClosePipeMessageParamsPtr params_ptr; |
+ Deserialize_(params, ¶ms_ptr); |
+ |
+ return interface_version_ >= params_ptr->require_version->version; |
+} |
+ |
+} // namespace internal |
+} // namespace mojo |