xref: /aosp_15_r20/external/cronet/ipc/ipc_message_templates_impl.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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