ipc_message_templates_impl.h 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. // 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. #ifndef IPC_IPC_MESSAGE_TEMPLATES_IMPL_H_
  5. #define IPC_IPC_MESSAGE_TEMPLATES_IMPL_H_
  6. #include <tuple>
  7. namespace IPC {
  8. template <typename... Ts>
  9. class ParamDeserializer : public MessageReplyDeserializer {
  10. public:
  11. explicit ParamDeserializer(const std::tuple<Ts&...>& out) : out_(out) {}
  12. bool SerializeOutputParameters(const IPC::Message& msg,
  13. base::PickleIterator iter) override {
  14. return ReadParam(&msg, &iter, &out_);
  15. }
  16. std::tuple<Ts&...> out_;
  17. };
  18. template <typename Meta, typename... Ins>
  19. MessageT<Meta, std::tuple<Ins...>, void>::MessageT(Routing routing,
  20. const Ins&... ins)
  21. : Message(routing.id, ID, PRIORITY_NORMAL) {
  22. WriteParam(this, std::tie(ins...));
  23. }
  24. template <typename Meta, typename... Ins>
  25. bool MessageT<Meta, std::tuple<Ins...>, void>::Read(const Message* msg,
  26. Param* p) {
  27. base::PickleIterator iter(*msg);
  28. return ReadParam(msg, &iter, p);
  29. }
  30. template <typename Meta, typename... Ins>
  31. void MessageT<Meta, std::tuple<Ins...>, void>::Log(std::string* name,
  32. const Message* msg,
  33. std::string* l) {
  34. if (name)
  35. *name = Meta::kName;
  36. if (!msg || !l)
  37. return;
  38. Param p;
  39. if (Read(msg, &p))
  40. LogParam(p, l);
  41. }
  42. template <typename Meta, typename... Ins, typename... Outs>
  43. MessageT<Meta, std::tuple<Ins...>, std::tuple<Outs...>>::MessageT(
  44. Routing routing,
  45. const Ins&... ins,
  46. Outs*... outs)
  47. : SyncMessage(
  48. routing.id,
  49. ID,
  50. PRIORITY_NORMAL,
  51. new ParamDeserializer<Outs...>(std::tie(*outs...))) {
  52. WriteParam(this, std::tie(ins...));
  53. }
  54. template <typename Meta, typename... Ins, typename... Outs>
  55. bool MessageT<Meta, std::tuple<Ins...>, std::tuple<Outs...>>::ReadSendParam(
  56. const Message* msg,
  57. SendParam* p) {
  58. base::PickleIterator iter = SyncMessage::GetDataIterator(msg);
  59. return ReadParam(msg, &iter, p);
  60. }
  61. template <typename Meta, typename... Ins, typename... Outs>
  62. bool MessageT<Meta, std::tuple<Ins...>, std::tuple<Outs...>>::ReadReplyParam(
  63. const Message* msg,
  64. ReplyParam* p) {
  65. base::PickleIterator iter = SyncMessage::GetDataIterator(msg);
  66. return ReadParam(msg, &iter, p);
  67. }
  68. template <typename Meta, typename... Ins, typename... Outs>
  69. void MessageT<Meta,
  70. std::tuple<Ins...>,
  71. std::tuple<Outs...>>::WriteReplyParams(Message* reply,
  72. const Outs&... outs) {
  73. WriteParam(reply, std::tie(outs...));
  74. }
  75. template <typename Meta, typename... Ins, typename... Outs>
  76. void MessageT<Meta, std::tuple<Ins...>, std::tuple<Outs...>>::Log(
  77. std::string* name,
  78. const Message* msg,
  79. std::string* l) {
  80. if (name)
  81. *name = Meta::kName;
  82. if (!msg || !l)
  83. return;
  84. if (msg->is_sync()) {
  85. SendParam p;
  86. if (ReadSendParam(msg, &p))
  87. LogParam(p, l);
  88. AddOutputParamsToLog(msg, l);
  89. } else {
  90. ReplyParam p;
  91. if (ReadReplyParam(msg, &p))
  92. LogParam(p, l);
  93. }
  94. }
  95. } // namespace IPC
  96. #endif // IPC_IPC_MESSAGE_TEMPLATES_IMPL_H_