| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "mojo/public/cpp/bindings/lib/control_message_proxy.h" | 5 #include "mojo/public/cpp/bindings/lib/control_message_proxy.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 #include <stdint.h> | 8 #include <stdint.h> |
| 9 #include <utility> | 9 #include <utility> |
| 10 | 10 |
| 11 #include "base/bind.h" | 11 #include "base/bind.h" |
| 12 #include "base/callback_helpers.h" | 12 #include "base/callback_helpers.h" |
| 13 #include "base/macros.h" | 13 #include "base/macros.h" |
| 14 #include "base/run_loop.h" | 14 #include "base/run_loop.h" |
| 15 #include "mojo/public/cpp/bindings/lib/message_builder.h" | 15 #include "mojo/public/cpp/bindings/lib/message_builder.h" |
| 16 #include "mojo/public/cpp/bindings/lib/serialization.h" | 16 #include "mojo/public/cpp/bindings/lib/serialization.h" |
| 17 #include "mojo/public/cpp/bindings/lib/validation_util.h" | 17 #include "mojo/public/cpp/bindings/lib/validation_util.h" |
| 18 #include "mojo/public/cpp/bindings/message.h" | |
| 19 #include "mojo/public/interfaces/bindings/interface_control_messages.mojom.h" | 18 #include "mojo/public/interfaces/bindings/interface_control_messages.mojom.h" |
| 20 | 19 |
| 21 namespace mojo { | 20 namespace mojo { |
| 22 namespace internal { | 21 namespace internal { |
| 23 | 22 |
| 24 namespace { | 23 namespace { |
| 25 | 24 |
| 26 bool ValidateControlResponse(Message* message) { | 25 bool ValidateControlResponse(Message* message) { |
| 27 ValidationContext validation_context( | 26 ValidationContext validation_context( |
| 28 message->data(), message->data_num_bytes(), message->handles()->size(), | 27 message->data(), message->data_num_bytes(), message->handles()->size(), |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 65 SerializationContext context; | 64 SerializationContext context; |
| 66 Deserialize<interface_control::RunResponseMessageParamsDataView>( | 65 Deserialize<interface_control::RunResponseMessageParamsDataView>( |
| 67 params, ¶ms_ptr, &context); | 66 params, ¶ms_ptr, &context); |
| 68 | 67 |
| 69 callback_.Run(std::move(params_ptr)); | 68 callback_.Run(std::move(params_ptr)); |
| 70 return true; | 69 return true; |
| 71 } | 70 } |
| 72 | 71 |
| 73 void SendRunMessage(MessageReceiverWithResponder* receiver, | 72 void SendRunMessage(MessageReceiverWithResponder* receiver, |
| 74 interface_control::RunInputPtr input_ptr, | 73 interface_control::RunInputPtr input_ptr, |
| 75 const RunCallback& callback, | 74 const RunCallback& callback) { |
| 76 SerializationContext* context) { | 75 SerializationContext context; |
| 76 |
| 77 auto params_ptr = interface_control::RunMessageParams::New(); | 77 auto params_ptr = interface_control::RunMessageParams::New(); |
| 78 params_ptr->input = std::move(input_ptr); | 78 params_ptr->input = std::move(input_ptr); |
| 79 size_t size = PrepareToSerialize<interface_control::RunMessageParamsDataView>( | 79 size_t size = PrepareToSerialize<interface_control::RunMessageParamsDataView>( |
| 80 params_ptr, context); | 80 params_ptr, &context); |
| 81 RequestMessageBuilder builder(interface_control::kRunMessageId, size); | 81 RequestMessageBuilder builder(interface_control::kRunMessageId, size); |
| 82 | 82 |
| 83 interface_control::internal::RunMessageParams_Data* params = nullptr; | 83 interface_control::internal::RunMessageParams_Data* params = nullptr; |
| 84 Serialize<interface_control::RunMessageParamsDataView>( | 84 Serialize<interface_control::RunMessageParamsDataView>( |
| 85 params_ptr, builder.buffer(), ¶ms, context); | 85 params_ptr, builder.buffer(), ¶ms, &context); |
| 86 MessageReceiver* responder = new RunResponseForwardToCallback(callback); | 86 MessageReceiver* responder = new RunResponseForwardToCallback(callback); |
| 87 if (!receiver->AcceptWithResponder(builder.message(), responder)) | 87 if (!receiver->AcceptWithResponder(builder.message(), responder)) |
| 88 delete responder; | 88 delete responder; |
| 89 } | 89 } |
| 90 | 90 |
| 91 void SendRunOrClosePipeMessage( | 91 Message ConstructRunOrClosePipeMessage( |
| 92 MessageReceiverWithResponder* receiver, | 92 interface_control::RunOrClosePipeInputPtr input_ptr) { |
| 93 interface_control::RunOrClosePipeInputPtr input_ptr, | 93 SerializationContext context; |
| 94 SerializationContext* context) { | 94 |
| 95 auto params_ptr = interface_control::RunOrClosePipeMessageParams::New(); | 95 auto params_ptr = interface_control::RunOrClosePipeMessageParams::New(); |
| 96 params_ptr->input = std::move(input_ptr); | 96 params_ptr->input = std::move(input_ptr); |
| 97 | 97 |
| 98 size_t size = PrepareToSerialize< | 98 size_t size = PrepareToSerialize< |
| 99 interface_control::RunOrClosePipeMessageParamsDataView>(params_ptr, | 99 interface_control::RunOrClosePipeMessageParamsDataView>(params_ptr, |
| 100 context); | 100 &context); |
| 101 MessageBuilder builder(interface_control::kRunOrClosePipeMessageId, size); | 101 MessageBuilder builder(interface_control::kRunOrClosePipeMessageId, size); |
| 102 | 102 |
| 103 interface_control::internal::RunOrClosePipeMessageParams_Data* params = | 103 interface_control::internal::RunOrClosePipeMessageParams_Data* params = |
| 104 nullptr; | 104 nullptr; |
| 105 Serialize<interface_control::RunOrClosePipeMessageParamsDataView>( | 105 Serialize<interface_control::RunOrClosePipeMessageParamsDataView>( |
| 106 params_ptr, builder.buffer(), ¶ms, context); | 106 params_ptr, builder.buffer(), ¶ms, &context); |
| 107 bool ok = receiver->Accept(builder.message()); | 107 return std::move(*builder.message()); |
| 108 } |
| 109 |
| 110 void SendRunOrClosePipeMessage( |
| 111 MessageReceiverWithResponder* receiver, |
| 112 interface_control::RunOrClosePipeInputPtr input_ptr) { |
| 113 Message message(ConstructRunOrClosePipeMessage(std::move(input_ptr))); |
| 114 |
| 115 bool ok = receiver->Accept(&message); |
| 108 ALLOW_UNUSED_LOCAL(ok); | 116 ALLOW_UNUSED_LOCAL(ok); |
| 109 } | 117 } |
| 110 | 118 |
| 111 void RunVersionCallback( | 119 void RunVersionCallback( |
| 112 const base::Callback<void(uint32_t)>& callback, | 120 const base::Callback<void(uint32_t)>& callback, |
| 113 interface_control::RunResponseMessageParamsPtr run_response) { | 121 interface_control::RunResponseMessageParamsPtr run_response) { |
| 114 uint32_t version = 0u; | 122 uint32_t version = 0u; |
| 115 if (run_response->output && run_response->output->is_query_version_result()) | 123 if (run_response->output && run_response->output->is_query_version_result()) |
| 116 version = run_response->output->get_query_version_result()->version; | 124 version = run_response->output->get_query_version_result()->version; |
| 117 callback.Run(version); | 125 callback.Run(version); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 128 : receiver_(receiver) { | 136 : receiver_(receiver) { |
| 129 } | 137 } |
| 130 | 138 |
| 131 ControlMessageProxy::~ControlMessageProxy() = default; | 139 ControlMessageProxy::~ControlMessageProxy() = default; |
| 132 | 140 |
| 133 void ControlMessageProxy::QueryVersion( | 141 void ControlMessageProxy::QueryVersion( |
| 134 const base::Callback<void(uint32_t)>& callback) { | 142 const base::Callback<void(uint32_t)>& callback) { |
| 135 auto input_ptr = interface_control::RunInput::New(); | 143 auto input_ptr = interface_control::RunInput::New(); |
| 136 input_ptr->set_query_version(interface_control::QueryVersion::New()); | 144 input_ptr->set_query_version(interface_control::QueryVersion::New()); |
| 137 SendRunMessage(receiver_, std::move(input_ptr), | 145 SendRunMessage(receiver_, std::move(input_ptr), |
| 138 base::Bind(&RunVersionCallback, callback), &context_); | 146 base::Bind(&RunVersionCallback, callback)); |
| 139 } | 147 } |
| 140 | 148 |
| 141 void ControlMessageProxy::RequireVersion(uint32_t version) { | 149 void ControlMessageProxy::RequireVersion(uint32_t version) { |
| 142 auto require_version = interface_control::RequireVersion::New(); | 150 auto require_version = interface_control::RequireVersion::New(); |
| 143 require_version->version = version; | 151 require_version->version = version; |
| 144 auto input_ptr = interface_control::RunOrClosePipeInput::New(); | 152 auto input_ptr = interface_control::RunOrClosePipeInput::New(); |
| 145 input_ptr->set_require_version(std::move(require_version)); | 153 input_ptr->set_require_version(std::move(require_version)); |
| 146 SendRunOrClosePipeMessage(receiver_, std::move(input_ptr), &context_); | 154 SendRunOrClosePipeMessage(receiver_, std::move(input_ptr)); |
| 147 } | 155 } |
| 148 | 156 |
| 149 void ControlMessageProxy::FlushForTesting() { | 157 void ControlMessageProxy::FlushForTesting() { |
| 150 if (encountered_error_) | 158 if (encountered_error_) |
| 151 return; | 159 return; |
| 152 | 160 |
| 153 auto input_ptr = interface_control::RunInput::New(); | 161 auto input_ptr = interface_control::RunInput::New(); |
| 154 input_ptr->set_flush_for_testing(interface_control::FlushForTesting::New()); | 162 input_ptr->set_flush_for_testing(interface_control::FlushForTesting::New()); |
| 155 base::RunLoop run_loop; | 163 base::RunLoop run_loop; |
| 156 run_loop_quit_closure_ = run_loop.QuitClosure(); | 164 run_loop_quit_closure_ = run_loop.QuitClosure(); |
| 157 SendRunMessage( | 165 SendRunMessage( |
| 158 receiver_, std::move(input_ptr), | 166 receiver_, std::move(input_ptr), |
| 159 base::Bind(&RunClosure, | 167 base::Bind(&RunClosure, |
| 160 base::Bind(&ControlMessageProxy::RunFlushForTestingClosure, | 168 base::Bind(&ControlMessageProxy::RunFlushForTestingClosure, |
| 161 base::Unretained(this))), | 169 base::Unretained(this)))); |
| 162 &context_); | |
| 163 run_loop.Run(); | 170 run_loop.Run(); |
| 164 } | 171 } |
| 165 | 172 |
| 166 void ControlMessageProxy::SendDisconnectReason(uint32_t custom_reason, | 173 void ControlMessageProxy::SendDisconnectReason(uint32_t custom_reason, |
| 167 const std::string& description) { | 174 const std::string& description) { |
| 168 auto send_disconnect_reason = interface_control::SendDisconnectReason::New(); | 175 Message message = |
| 169 send_disconnect_reason->custom_reason = custom_reason; | 176 ConstructDisconnectReasonMessage(custom_reason, description); |
| 170 send_disconnect_reason->description = description; | 177 bool ok = receiver_->Accept(&message); |
| 171 auto input_ptr = interface_control::RunOrClosePipeInput::New(); | 178 ALLOW_UNUSED_LOCAL(ok); |
| 172 input_ptr->set_send_disconnect_reason(std::move(send_disconnect_reason)); | |
| 173 SendRunOrClosePipeMessage(receiver_, std::move(input_ptr), &context_); | |
| 174 } | 179 } |
| 175 | 180 |
| 176 void ControlMessageProxy::RunFlushForTestingClosure() { | 181 void ControlMessageProxy::RunFlushForTestingClosure() { |
| 177 DCHECK(!run_loop_quit_closure_.is_null()); | 182 DCHECK(!run_loop_quit_closure_.is_null()); |
| 178 base::ResetAndReturn(&run_loop_quit_closure_).Run(); | 183 base::ResetAndReturn(&run_loop_quit_closure_).Run(); |
| 179 } | 184 } |
| 180 | 185 |
| 181 void ControlMessageProxy::OnConnectionError() { | 186 void ControlMessageProxy::OnConnectionError() { |
| 182 encountered_error_ = true; | 187 encountered_error_ = true; |
| 183 if (!run_loop_quit_closure_.is_null()) | 188 if (!run_loop_quit_closure_.is_null()) |
| 184 RunFlushForTestingClosure(); | 189 RunFlushForTestingClosure(); |
| 185 } | 190 } |
| 186 | 191 |
| 192 // static |
| 193 Message ControlMessageProxy::ConstructDisconnectReasonMessage( |
| 194 uint32_t custom_reason, |
| 195 const std::string& description) { |
| 196 auto send_disconnect_reason = interface_control::SendDisconnectReason::New(); |
| 197 send_disconnect_reason->custom_reason = custom_reason; |
| 198 send_disconnect_reason->description = description; |
| 199 auto input_ptr = interface_control::RunOrClosePipeInput::New(); |
| 200 input_ptr->set_send_disconnect_reason(std::move(send_disconnect_reason)); |
| 201 return ConstructRunOrClosePipeMessage(std::move(input_ptr)); |
| 202 } |
| 203 |
| 187 } // namespace internal | 204 } // namespace internal |
| 188 } // namespace mojo | 205 } // namespace mojo |
| OLD | NEW |