1*6777b538SAndroid Build Coastguard Worker // Copyright 2015 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker
5*6777b538SAndroid Build Coastguard Worker #ifndef IPC_IPC_MESSAGE_TEMPLATES_IMPL_H_
6*6777b538SAndroid Build Coastguard Worker #define IPC_IPC_MESSAGE_TEMPLATES_IMPL_H_
7*6777b538SAndroid Build Coastguard Worker
8*6777b538SAndroid Build Coastguard Worker #include <tuple>
9*6777b538SAndroid Build Coastguard Worker
10*6777b538SAndroid Build Coastguard Worker namespace IPC {
11*6777b538SAndroid Build Coastguard Worker
12*6777b538SAndroid Build Coastguard Worker template <typename... Ts>
13*6777b538SAndroid Build Coastguard Worker class ParamDeserializer : public MessageReplyDeserializer {
14*6777b538SAndroid Build Coastguard Worker public:
ParamDeserializer(const std::tuple<Ts &...> & out)15*6777b538SAndroid Build Coastguard Worker explicit ParamDeserializer(const std::tuple<Ts&...>& out) : out_(out) {}
16*6777b538SAndroid Build Coastguard Worker
SerializeOutputParameters(const IPC::Message & msg,base::PickleIterator iter)17*6777b538SAndroid Build Coastguard Worker bool SerializeOutputParameters(const IPC::Message& msg,
18*6777b538SAndroid Build Coastguard Worker base::PickleIterator iter) override {
19*6777b538SAndroid Build Coastguard Worker return ReadParam(&msg, &iter, &out_);
20*6777b538SAndroid Build Coastguard Worker }
21*6777b538SAndroid Build Coastguard Worker
22*6777b538SAndroid Build Coastguard Worker std::tuple<Ts&...> out_;
23*6777b538SAndroid Build Coastguard Worker };
24*6777b538SAndroid Build Coastguard Worker
25*6777b538SAndroid Build Coastguard Worker template <typename Meta, typename... Ins>
MessageT(Routing routing,const Ins &...ins)26*6777b538SAndroid Build Coastguard Worker MessageT<Meta, std::tuple<Ins...>, void>::MessageT(Routing routing,
27*6777b538SAndroid Build Coastguard Worker const Ins&... ins)
28*6777b538SAndroid Build Coastguard Worker : Message(routing.id, ID, PRIORITY_NORMAL) {
29*6777b538SAndroid Build Coastguard Worker WriteParam(this, std::tie(ins...));
30*6777b538SAndroid Build Coastguard Worker }
31*6777b538SAndroid Build Coastguard Worker
32*6777b538SAndroid Build Coastguard Worker template <typename Meta, typename... Ins>
Read(const Message * msg,Param * p)33*6777b538SAndroid Build Coastguard Worker bool MessageT<Meta, std::tuple<Ins...>, void>::Read(const Message* msg,
34*6777b538SAndroid Build Coastguard Worker Param* p) {
35*6777b538SAndroid Build Coastguard Worker base::PickleIterator iter(*msg);
36*6777b538SAndroid Build Coastguard Worker return ReadParam(msg, &iter, p);
37*6777b538SAndroid Build Coastguard Worker }
38*6777b538SAndroid Build Coastguard Worker
39*6777b538SAndroid Build Coastguard Worker template <typename Meta, typename... Ins>
Log(std::string * name,const Message * msg,std::string * l)40*6777b538SAndroid Build Coastguard Worker void MessageT<Meta, std::tuple<Ins...>, void>::Log(std::string* name,
41*6777b538SAndroid Build Coastguard Worker const Message* msg,
42*6777b538SAndroid Build Coastguard Worker std::string* l) {
43*6777b538SAndroid Build Coastguard Worker if (name)
44*6777b538SAndroid Build Coastguard Worker *name = Meta::kName;
45*6777b538SAndroid Build Coastguard Worker if (!msg || !l)
46*6777b538SAndroid Build Coastguard Worker return;
47*6777b538SAndroid Build Coastguard Worker Param p;
48*6777b538SAndroid Build Coastguard Worker if (Read(msg, &p))
49*6777b538SAndroid Build Coastguard Worker LogParam(p, l);
50*6777b538SAndroid Build Coastguard Worker }
51*6777b538SAndroid Build Coastguard Worker
52*6777b538SAndroid Build Coastguard Worker template <typename Meta, typename... Ins, typename... Outs>
MessageT(Routing routing,const Ins &...ins,Outs * ...outs)53*6777b538SAndroid Build Coastguard Worker MessageT<Meta, std::tuple<Ins...>, std::tuple<Outs...>>::MessageT(
54*6777b538SAndroid Build Coastguard Worker Routing routing,
55*6777b538SAndroid Build Coastguard Worker const Ins&... ins,
56*6777b538SAndroid Build Coastguard Worker Outs*... outs)
57*6777b538SAndroid Build Coastguard Worker : SyncMessage(
58*6777b538SAndroid Build Coastguard Worker routing.id,
59*6777b538SAndroid Build Coastguard Worker ID,
60*6777b538SAndroid Build Coastguard Worker PRIORITY_NORMAL,
61*6777b538SAndroid Build Coastguard Worker std::make_unique<ParamDeserializer<Outs...>>(std::tie(*outs...))) {
62*6777b538SAndroid Build Coastguard Worker WriteParam(this, std::tie(ins...));
63*6777b538SAndroid Build Coastguard Worker }
64*6777b538SAndroid Build Coastguard Worker
65*6777b538SAndroid Build Coastguard Worker template <typename Meta, typename... Ins, typename... Outs>
ReadSendParam(const Message * msg,SendParam * p)66*6777b538SAndroid Build Coastguard Worker bool MessageT<Meta, std::tuple<Ins...>, std::tuple<Outs...>>::ReadSendParam(
67*6777b538SAndroid Build Coastguard Worker const Message* msg,
68*6777b538SAndroid Build Coastguard Worker SendParam* p) {
69*6777b538SAndroid Build Coastguard Worker base::PickleIterator iter = SyncMessage::GetDataIterator(msg);
70*6777b538SAndroid Build Coastguard Worker return ReadParam(msg, &iter, p);
71*6777b538SAndroid Build Coastguard Worker }
72*6777b538SAndroid Build Coastguard Worker
73*6777b538SAndroid Build Coastguard Worker template <typename Meta, typename... Ins, typename... Outs>
ReadReplyParam(const Message * msg,ReplyParam * p)74*6777b538SAndroid Build Coastguard Worker bool MessageT<Meta, std::tuple<Ins...>, std::tuple<Outs...>>::ReadReplyParam(
75*6777b538SAndroid Build Coastguard Worker const Message* msg,
76*6777b538SAndroid Build Coastguard Worker ReplyParam* p) {
77*6777b538SAndroid Build Coastguard Worker base::PickleIterator iter = SyncMessage::GetDataIterator(msg);
78*6777b538SAndroid Build Coastguard Worker return ReadParam(msg, &iter, p);
79*6777b538SAndroid Build Coastguard Worker }
80*6777b538SAndroid Build Coastguard Worker
81*6777b538SAndroid Build Coastguard Worker template <typename Meta, typename... Ins, typename... Outs>
82*6777b538SAndroid Build Coastguard Worker void MessageT<Meta,
83*6777b538SAndroid Build Coastguard Worker std::tuple<Ins...>,
WriteReplyParams(Message * reply,const Outs &...outs)84*6777b538SAndroid Build Coastguard Worker std::tuple<Outs...>>::WriteReplyParams(Message* reply,
85*6777b538SAndroid Build Coastguard Worker const Outs&... outs) {
86*6777b538SAndroid Build Coastguard Worker WriteParam(reply, std::tie(outs...));
87*6777b538SAndroid Build Coastguard Worker }
88*6777b538SAndroid Build Coastguard Worker
89*6777b538SAndroid Build Coastguard Worker template <typename Meta, typename... Ins, typename... Outs>
Log(std::string * name,const Message * msg,std::string * l)90*6777b538SAndroid Build Coastguard Worker void MessageT<Meta, std::tuple<Ins...>, std::tuple<Outs...>>::Log(
91*6777b538SAndroid Build Coastguard Worker std::string* name,
92*6777b538SAndroid Build Coastguard Worker const Message* msg,
93*6777b538SAndroid Build Coastguard Worker std::string* l) {
94*6777b538SAndroid Build Coastguard Worker if (name)
95*6777b538SAndroid Build Coastguard Worker *name = Meta::kName;
96*6777b538SAndroid Build Coastguard Worker if (!msg || !l)
97*6777b538SAndroid Build Coastguard Worker return;
98*6777b538SAndroid Build Coastguard Worker if (msg->is_sync()) {
99*6777b538SAndroid Build Coastguard Worker SendParam p;
100*6777b538SAndroid Build Coastguard Worker if (ReadSendParam(msg, &p))
101*6777b538SAndroid Build Coastguard Worker LogParam(p, l);
102*6777b538SAndroid Build Coastguard Worker AddOutputParamsToLog(msg, l);
103*6777b538SAndroid Build Coastguard Worker } else {
104*6777b538SAndroid Build Coastguard Worker ReplyParam p;
105*6777b538SAndroid Build Coastguard Worker if (ReadReplyParam(msg, &p))
106*6777b538SAndroid Build Coastguard Worker LogParam(p, l);
107*6777b538SAndroid Build Coastguard Worker }
108*6777b538SAndroid Build Coastguard Worker }
109*6777b538SAndroid Build Coastguard Worker
110*6777b538SAndroid Build Coastguard Worker } // namespace IPC
111*6777b538SAndroid Build Coastguard Worker
112*6777b538SAndroid Build Coastguard Worker #endif // IPC_IPC_MESSAGE_TEMPLATES_IMPL_H_
113