xref: /aosp_15_r20/external/libchrome/ipc/ipc_message_templates_impl.h (revision 635a864187cb8b6c713ff48b7e790a6b21769273)
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