Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(515)

Side by Side Diff: mojo/public/cpp/bindings/lib/control_message_proxy.cc

Issue 2277853003: Use unions for interface control messages. (Closed)
Patch Set: Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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/macros.h" 12 #include "base/macros.h"
13 #include "mojo/public/cpp/bindings/lib/message_builder.h" 13 #include "mojo/public/cpp/bindings/lib/message_builder.h"
14 #include "mojo/public/cpp/bindings/lib/serialization.h" 14 #include "mojo/public/cpp/bindings/lib/serialization.h"
15 #include "mojo/public/cpp/bindings/message.h" 15 #include "mojo/public/cpp/bindings/message.h"
16 #include "mojo/public/interfaces/bindings/interface_control_messages.mojom.h" 16 #include "mojo/public/interfaces/bindings/interface_control_messages.mojom.h"
17 17
18 namespace mojo { 18 namespace mojo {
19 namespace internal { 19 namespace internal {
20 20
21 namespace { 21 namespace {
22 22
23 using RunCallback = base::Callback<void(QueryVersionResultPtr)>; 23 using RunCallback =
24 base::Callback<void(interface_control::RunResponseMessageParamsPtr)>;
24 25
25 class RunResponseForwardToCallback : public MessageReceiver { 26 class RunResponseForwardToCallback : public MessageReceiver {
26 public: 27 public:
27 RunResponseForwardToCallback(const RunCallback& callback) 28 explicit RunResponseForwardToCallback(const RunCallback& callback)
28 : callback_(callback) {} 29 : callback_(callback) {}
29 bool Accept(Message* message) override; 30 bool Accept(Message* message) override;
30 31
31 private: 32 private:
32 RunCallback callback_; 33 RunCallback callback_;
33 DISALLOW_COPY_AND_ASSIGN(RunResponseForwardToCallback); 34 DISALLOW_COPY_AND_ASSIGN(RunResponseForwardToCallback);
34 }; 35 };
35 36
36 bool RunResponseForwardToCallback::Accept(Message* message) { 37 bool RunResponseForwardToCallback::Accept(Message* message) {
37 RunResponseMessageParams_Data* params = 38 interface_control::internal::RunResponseMessageParams_Data* params =
38 reinterpret_cast<RunResponseMessageParams_Data*>( 39 reinterpret_cast<
40 interface_control::internal::RunResponseMessageParams_Data*>(
39 message->mutable_payload()); 41 message->mutable_payload());
40 RunResponseMessageParamsPtr params_ptr; 42 interface_control::RunResponseMessageParamsPtr params_ptr;
41 SerializationContext context; 43 SerializationContext context;
42 Deserialize<RunResponseMessageParamsDataView>(params, &params_ptr, &context); 44 Deserialize<interface_control::RunResponseMessageParamsDataView>(
45 params, &params_ptr, &context);
43 46
44 callback_.Run(std::move(params_ptr->query_version_result)); 47 callback_.Run(std::move(params_ptr));
45 return true; 48 return true;
46 } 49 }
47 50
48 void SendRunMessage(MessageReceiverWithResponder* receiver, 51 void SendRunMessage(MessageReceiverWithResponder* receiver,
49 QueryVersionPtr query_version, 52 interface_control::RunInputPtr input_ptr,
50 const RunCallback& callback, 53 const RunCallback& callback,
51 SerializationContext* context) { 54 SerializationContext* context) {
52 RunMessageParamsPtr params_ptr(RunMessageParams::New()); 55 auto params_ptr = interface_control::RunMessageParams::New();
53 params_ptr->reserved0 = 16u; 56 params_ptr->input = std::move(input_ptr);
54 params_ptr->reserved1 = 0u; 57 size_t size = PrepareToSerialize<interface_control::RunMessageParamsDataView>(
55 params_ptr->query_version = std::move(query_version); 58 params_ptr, context);
59 RequestMessageBuilder builder(interface_control::kRunMessageId, size);
56 60
57 size_t size = 61 interface_control::internal::RunMessageParams_Data* params = nullptr;
58 PrepareToSerialize<RunMessageParamsDataView>(params_ptr, context); 62 Serialize<interface_control::RunMessageParamsDataView>(
59 RequestMessageBuilder builder(kRunMessageId, size); 63 params_ptr, builder.buffer(), &params, context);
dcheng 2016/08/26 17:38:32 I'm not sure if it's possible (nor is it necessary
60
61 RunMessageParams_Data* params = nullptr;
62 Serialize<RunMessageParamsDataView>(params_ptr, builder.buffer(), &params,
63 context);
64 MessageReceiver* responder = new RunResponseForwardToCallback(callback); 64 MessageReceiver* responder = new RunResponseForwardToCallback(callback);
65 if (!receiver->AcceptWithResponder(builder.message(), responder)) 65 if (!receiver->AcceptWithResponder(builder.message(), responder))
66 delete responder; 66 delete responder;
67 } 67 }
68 68
69 void SendRunOrClosePipeMessage(MessageReceiverWithResponder* receiver, 69 void SendRunOrClosePipeMessage(
70 RequireVersionPtr require_version, 70 MessageReceiverWithResponder* receiver,
71 SerializationContext* context) { 71 interface_control::RunOrClosePipeInputPtr input_ptr,
72 RunOrClosePipeMessageParamsPtr params_ptr(RunOrClosePipeMessageParams::New()); 72 SerializationContext* context) {
73 params_ptr->reserved0 = 16u; 73 auto params_ptr = interface_control::RunOrClosePipeMessageParams::New();
74 params_ptr->reserved1 = 0u; 74 params_ptr->input = std::move(input_ptr);
75 params_ptr->require_version = std::move(require_version);
76 75
77 size_t size = PrepareToSerialize<RunOrClosePipeMessageParamsDataView>( 76 size_t size = PrepareToSerialize<
78 params_ptr, context); 77 interface_control::RunOrClosePipeMessageParamsDataView>(params_ptr,
79 MessageBuilder builder(kRunOrClosePipeMessageId, size); 78 context);
79 MessageBuilder builder(interface_control::kRunOrClosePipeMessageId, size);
80 80
81 RunOrClosePipeMessageParams_Data* params = nullptr; 81 interface_control::internal::RunOrClosePipeMessageParams_Data* params =
82 Serialize<RunOrClosePipeMessageParamsDataView>(params_ptr, builder.buffer(), 82 nullptr;
83 &params, context); 83 Serialize<interface_control::RunOrClosePipeMessageParamsDataView>(
84 params_ptr, builder.buffer(), &params, context);
84 bool ok = receiver->Accept(builder.message()); 85 bool ok = receiver->Accept(builder.message());
85 ALLOW_UNUSED_LOCAL(ok); 86 ALLOW_UNUSED_LOCAL(ok);
86 } 87 }
87 88
88 void RunVersionCallback(const base::Callback<void(uint32_t)>& callback, 89 void RunVersionCallback(
89 QueryVersionResultPtr query_version_result) { 90 const base::Callback<void(uint32_t)>& callback,
90 callback.Run(query_version_result->version); 91 interface_control::RunResponseMessageParamsPtr run_response) {
92 uint32_t version = 0u;
93 if (run_response->output && run_response->output->is_query_version_result())
94 version = run_response->output->get_query_version_result()->version;
95 callback.Run(version);
91 } 96 }
92 97
93 } // namespace 98 } // namespace
94 99
95 ControlMessageProxy::ControlMessageProxy(MessageReceiverWithResponder* receiver) 100 ControlMessageProxy::ControlMessageProxy(MessageReceiverWithResponder* receiver)
96 : receiver_(receiver) { 101 : receiver_(receiver) {
97 } 102 }
98 103
99 void ControlMessageProxy::QueryVersion( 104 void ControlMessageProxy::QueryVersion(
100 const base::Callback<void(uint32_t)>& callback) { 105 const base::Callback<void(uint32_t)>& callback) {
101 SendRunMessage(receiver_, QueryVersion::New(), 106 auto input_ptr = interface_control::RunInput::New();
107 input_ptr->set_query_version(interface_control::QueryVersion::New());
108 SendRunMessage(receiver_, std::move(input_ptr),
102 base::Bind(&RunVersionCallback, callback), &context_); 109 base::Bind(&RunVersionCallback, callback), &context_);
103 } 110 }
104 111
105 void ControlMessageProxy::RequireVersion(uint32_t version) { 112 void ControlMessageProxy::RequireVersion(uint32_t version) {
106 RequireVersionPtr require_version(RequireVersion::New()); 113 auto require_version = interface_control::RequireVersion::New();
107 require_version->version = version; 114 require_version->version = version;
108 SendRunOrClosePipeMessage(receiver_, std::move(require_version), &context_); 115 auto input_ptr = interface_control::RunOrClosePipeInput::New();
116 input_ptr->set_require_version(std::move(require_version));
117 SendRunOrClosePipeMessage(receiver_, std::move(input_ptr), &context_);
109 } 118 }
110 119
111 } // namespace internal 120 } // namespace internal
112 } // namespace mojo 121 } // namespace mojo
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698