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