// 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_ #include namespace IPC { template class ParamDeserializer : public MessageReplyDeserializer { public: explicit ParamDeserializer(const std::tuple& out) : out_(out) {} bool SerializeOutputParameters(const IPC::Message& msg, base::PickleIterator iter) override { return ReadParam(&msg, &iter, &out_); } std::tuple out_; }; template MessageT, void>::MessageT(Routing routing, const Ins&... ins) : Message(routing.id, ID, PRIORITY_NORMAL) { WriteParam(this, std::tie(ins...)); } template bool MessageT, void>::Read(const Message* msg, Param* p) { base::PickleIterator iter(*msg); return ReadParam(msg, &iter, p); } template void MessageT, 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 MessageT, std::tuple>::MessageT( Routing routing, const Ins&... ins, Outs*... outs) : SyncMessage( routing.id, ID, PRIORITY_NORMAL, new ParamDeserializer(std::tie(*outs...))) { WriteParam(this, std::tie(ins...)); } template bool MessageT, std::tuple>::ReadSendParam( const Message* msg, SendParam* p) { base::PickleIterator iter = SyncMessage::GetDataIterator(msg); return ReadParam(msg, &iter, p); } template bool MessageT, std::tuple>::ReadReplyParam( const Message* msg, ReplyParam* p) { base::PickleIterator iter = SyncMessage::GetDataIterator(msg); return ReadParam(msg, &iter, p); } template void MessageT, std::tuple>::WriteReplyParams(Message* reply, const Outs&... outs) { WriteParam(reply, std::tie(outs...)); } template void MessageT, std::tuple>::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_