Index: ipc/ipc_message_templates_impl.h |
diff --git a/ipc/ipc_message_templates_impl.h b/ipc/ipc_message_templates_impl.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..bfcdad016fabaff7e751ce03025aba2551631e20 |
--- /dev/null |
+++ b/ipc/ipc_message_templates_impl.h |
@@ -0,0 +1,110 @@ |
+// Copyright 2015 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#ifndef IPC_IPC_MESSAGE_TEMPLATES_IMPL_H_ |
+#define IPC_IPC_MESSAGE_TEMPLATES_IMPL_H_ |
+ |
+namespace IPC { |
+ |
+template <typename... Ts> |
+class ParamDeserializer : public MessageReplyDeserializer { |
+ public: |
+ explicit ParamDeserializer(const base::Tuple<Ts&...>& out) : out_(out) {} |
+ |
+ bool SerializeOutputParameters(const IPC::Message& msg, |
+ base::PickleIterator iter) override { |
+ return ReadParam(&msg, &iter, &out_); |
+ } |
+ |
+ base::Tuple<Ts&...> out_; |
+}; |
+ |
+template <typename Meta, typename... Ins> |
+MessageT<Meta, base::Tuple<Ins...>, void>::MessageT(Routing routing, |
+ const Ins&... ins) |
+ : Message(routing.id, ID, PRIORITY_NORMAL) { |
+ WriteParam(this, base::MakeRefTuple(ins...)); |
+} |
+ |
+template <typename Meta, typename... Ins> |
+bool MessageT<Meta, base::Tuple<Ins...>, void>::Read(const Message* msg, |
+ Param* p) { |
+ base::PickleIterator iter(*msg); |
+ return ReadParam(msg, &iter, p); |
+} |
+ |
+template <typename Meta, typename... Ins> |
+void MessageT<Meta, base::Tuple<Ins...>, void>::Log(std::string* name, |
+ const Message* msg, |
+ std::string* l) { |
+ if (name) |
+ *name = Meta::kName; |
+ if (!msg || !l) |
+ return; |
+ Param p; |
+ if (Read(msg, &p)) |
+ LogParam(p, l); |
+} |
+ |
+template <typename Meta, typename... Ins, typename... Outs> |
+MessageT<Meta, base::Tuple<Ins...>, base::Tuple<Outs...>>::MessageT( |
+ Routing routing, |
+ const Ins&... ins, |
+ Outs*... outs) |
+ : SyncMessage( |
+ routing.id, |
+ ID, |
+ PRIORITY_NORMAL, |
+ new ParamDeserializer<Outs...>(base::MakeRefTuple(*outs...))) { |
+ WriteParam(this, base::MakeRefTuple(ins...)); |
+} |
+ |
+template <typename Meta, typename... Ins, typename... Outs> |
+bool MessageT<Meta, base::Tuple<Ins...>, base::Tuple<Outs...>>::ReadSendParam( |
+ const Message* msg, |
+ SendParam* p) { |
+ base::PickleIterator iter = SyncMessage::GetDataIterator(msg); |
+ return ReadParam(msg, &iter, p); |
+} |
+ |
+template <typename Meta, typename... Ins, typename... Outs> |
+bool MessageT<Meta, base::Tuple<Ins...>, base::Tuple<Outs...>>::ReadReplyParam( |
+ const Message* msg, |
+ ReplyParam* p) { |
+ base::PickleIterator iter = SyncMessage::GetDataIterator(msg); |
+ return ReadParam(msg, &iter, p); |
+} |
+ |
+template <typename Meta, typename... Ins, typename... Outs> |
+void MessageT<Meta, |
+ base::Tuple<Ins...>, |
+ base::Tuple<Outs...>>::WriteReplyParams(Message* reply, |
+ const Outs&... outs) { |
+ WriteParam(reply, base::MakeRefTuple(outs...)); |
+} |
+ |
+template <typename Meta, typename... Ins, typename... Outs> |
+void MessageT<Meta, base::Tuple<Ins...>, base::Tuple<Outs...>>::Log( |
+ std::string* name, |
+ const Message* msg, |
+ std::string* l) { |
+ if (name) |
+ *name = Meta::kName; |
+ if (!msg || !l) |
+ return; |
+ if (msg->is_sync()) { |
+ SendParam p; |
+ if (ReadSendParam(msg, &p)) |
+ LogParam(p, l); |
+ AddOutputParamsToLog(msg, l); |
+ } else { |
+ ReplyParam p; |
+ if (ReadReplyParam(msg, &p)) |
+ LogParam(p, l); |
+ } |
+} |
+ |
+} // namespace IPC |
+ |
+#endif // IPC_IPC_MESSAGE_TEMPLATES_IMPL_H_ |