blob: 192d2efb93e75c2e1598b9f8c1e1ab97868e77a8 [file] [log] [blame]
mdempsky8a519042016-02-09 05:41:471// Copyright 2015 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef IPC_IPC_MESSAGE_TEMPLATES_IMPL_H_
6#define IPC_IPC_MESSAGE_TEMPLATES_IMPL_H_
7
tzik55e3e4d2016-03-08 05:47:448#include <tuple>
9
mdempsky8a519042016-02-09 05:41:4710namespace IPC {
11
12template <typename... Ts>
13class ParamDeserializer : public MessageReplyDeserializer {
14 public:
tzik55e3e4d2016-03-08 05:47:4415 explicit ParamDeserializer(const std::tuple<Ts&...>& out) : out_(out) {}
mdempsky8a519042016-02-09 05:41:4716
17 bool SerializeOutputParameters(const IPC::Message& msg,
18 base::PickleIterator iter) override {
19 return ReadParam(&msg, &iter, &out_);
20 }
21
tzik55e3e4d2016-03-08 05:47:4422 std::tuple<Ts&...> out_;
mdempsky8a519042016-02-09 05:41:4723};
24
25template <typename Meta, typename... Ins>
tzik55e3e4d2016-03-08 05:47:4426MessageT<Meta, std::tuple<Ins...>, void>::MessageT(Routing routing,
mdempsky8a519042016-02-09 05:41:4727 const Ins&... ins)
28 : Message(routing.id, ID, PRIORITY_NORMAL) {
tzik55e3e4d2016-03-08 05:47:4429 WriteParam(this, std::tie(ins...));
mdempsky8a519042016-02-09 05:41:4730}
31
32template <typename Meta, typename... Ins>
tzik55e3e4d2016-03-08 05:47:4433bool MessageT<Meta, std::tuple<Ins...>, void>::Read(const Message* msg,
mdempsky8a519042016-02-09 05:41:4734 Param* p) {
35 base::PickleIterator iter(*msg);
36 return ReadParam(msg, &iter, p);
37}
38
39template <typename Meta, typename... Ins>
tzik55e3e4d2016-03-08 05:47:4440void MessageT<Meta, std::tuple<Ins...>, void>::Log(std::string* name,
mdempsky8a519042016-02-09 05:41:4741 const Message* msg,
42 std::string* l) {
43 if (name)
44 *name = Meta::kName;
45 if (!msg || !l)
46 return;
47 Param p;
48 if (Read(msg, &p))
49 LogParam(p, l);
50}
51
52template <typename Meta, typename... Ins, typename... Outs>
tzik55e3e4d2016-03-08 05:47:4453MessageT<Meta, std::tuple<Ins...>, std::tuple<Outs...>>::MessageT(
mdempsky8a519042016-02-09 05:41:4754 Routing routing,
55 const Ins&... ins,
56 Outs*... outs)
57 : SyncMessage(
58 routing.id,
59 ID,
60 PRIORITY_NORMAL,
tzik55e3e4d2016-03-08 05:47:4461 new ParamDeserializer<Outs...>(std::tie(*outs...))) {
62 WriteParam(this, std::tie(ins...));
mdempsky8a519042016-02-09 05:41:4763}
64
65template <typename Meta, typename... Ins, typename... Outs>
tzik55e3e4d2016-03-08 05:47:4466bool MessageT<Meta, std::tuple<Ins...>, std::tuple<Outs...>>::ReadSendParam(
mdempsky8a519042016-02-09 05:41:4767 const Message* msg,
68 SendParam* p) {
69 base::PickleIterator iter = SyncMessage::GetDataIterator(msg);
70 return ReadParam(msg, &iter, p);
71}
72
73template <typename Meta, typename... Ins, typename... Outs>
tzik55e3e4d2016-03-08 05:47:4474bool MessageT<Meta, std::tuple<Ins...>, std::tuple<Outs...>>::ReadReplyParam(
mdempsky8a519042016-02-09 05:41:4775 const Message* msg,
76 ReplyParam* p) {
77 base::PickleIterator iter = SyncMessage::GetDataIterator(msg);
78 return ReadParam(msg, &iter, p);
79}
80
81template <typename Meta, typename... Ins, typename... Outs>
82void MessageT<Meta,
tzik55e3e4d2016-03-08 05:47:4483 std::tuple<Ins...>,
84 std::tuple<Outs...>>::WriteReplyParams(Message* reply,
mdempsky8a519042016-02-09 05:41:4785 const Outs&... outs) {
tzik55e3e4d2016-03-08 05:47:4486 WriteParam(reply, std::tie(outs...));
mdempsky8a519042016-02-09 05:41:4787}
88
89template <typename Meta, typename... Ins, typename... Outs>
tzik55e3e4d2016-03-08 05:47:4490void MessageT<Meta, std::tuple<Ins...>, std::tuple<Outs...>>::Log(
mdempsky8a519042016-02-09 05:41:4791 std::string* name,
92 const Message* msg,
93 std::string* l) {
94 if (name)
95 *name = Meta::kName;
96 if (!msg || !l)
97 return;
98 if (msg->is_sync()) {
99 SendParam p;
100 if (ReadSendParam(msg, &p))
101 LogParam(p, l);
102 AddOutputParamsToLog(msg, l);
103 } else {
104 ReplyParam p;
105 if (ReadReplyParam(msg, &p))
106 LogParam(p, l);
107 }
108}
109
110} // namespace IPC
111
112#endif // IPC_IPC_MESSAGE_TEMPLATES_IMPL_H_