| OLD | NEW |
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef IPC_IPC_MESSAGE_UTILS_H_ | 5 #ifndef IPC_IPC_MESSAGE_UTILS_H_ |
| 6 #define IPC_IPC_MESSAGE_UTILS_H_ | 6 #define IPC_IPC_MESSAGE_UTILS_H_ |
| 7 #pragma once | 7 #pragma once |
| 8 | 8 |
| 9 #include <algorithm> | 9 #include <algorithm> |
| 10 #include <string> | 10 #include <string> |
| (...skipping 903 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 914 | 914 |
| 915 // The constructor and the Read() method's templated implementations are in | 915 // The constructor and the Read() method's templated implementations are in |
| 916 // ipc_message_utils_impl.h. The subclass constructor and Log() methods call | 916 // ipc_message_utils_impl.h. The subclass constructor and Log() methods call |
| 917 // the templated versions of these and make sure there are instantiations in | 917 // the templated versions of these and make sure there are instantiations in |
| 918 // those translation units. | 918 // those translation units. |
| 919 MessageWithTuple(int32 routing_id, uint32 type, const RefParam& p); | 919 MessageWithTuple(int32 routing_id, uint32 type, const RefParam& p); |
| 920 | 920 |
| 921 static bool Read(const Message* msg, Param* p) IPC_MSG_NOINLINE; | 921 static bool Read(const Message* msg, Param* p) IPC_MSG_NOINLINE; |
| 922 | 922 |
| 923 // Generic dispatcher. Should cover most cases. | 923 // Generic dispatcher. Should cover most cases. |
| 924 template<class T, class Method> | 924 template<class T, class S, class Method> |
| 925 static bool Dispatch(const Message* msg, T* obj, Method func) { | 925 static bool Dispatch(const Message* msg, T* obj, S* sender, Method func) { |
| 926 Param p; | 926 Param p; |
| 927 if (Read(msg, &p)) { | 927 if (Read(msg, &p)) { |
| 928 DispatchToMethod(obj, func, p); | 928 DispatchToMethod(obj, func, p); |
| 929 return true; | 929 return true; |
| 930 } | 930 } |
| 931 return false; | 931 return false; |
| 932 } | 932 } |
| 933 | 933 |
| 934 // The following dispatchers exist for the case where the callback function | 934 // The following dispatchers exist for the case where the callback function |
| 935 // needs the message as well. They assume that "Param" is a type of Tuple | 935 // needs the message as well. They assume that "Param" is a type of Tuple |
| 936 // (except the one arg case, as there is no Tuple1). | 936 // (except the one arg case, as there is no Tuple1). |
| 937 template<class T, typename TA> | 937 template<class T, class S, typename TA> |
| 938 static bool Dispatch(const Message* msg, T* obj, | 938 static bool Dispatch(const Message* msg, T* obj, S* sender, |
| 939 void (T::*func)(const Message&, TA)) { | 939 void (T::*func)(const Message&, TA)) { |
| 940 Param p; | 940 Param p; |
| 941 if (Read(msg, &p)) { | 941 if (Read(msg, &p)) { |
| 942 (obj->*func)(*msg, p.a); | 942 (obj->*func)(*msg, p.a); |
| 943 return true; | 943 return true; |
| 944 } | 944 } |
| 945 return false; | 945 return false; |
| 946 } | 946 } |
| 947 | 947 |
| 948 template<class T, typename TA, typename TB> | 948 template<class T, class S, typename TA, typename TB> |
| 949 static bool Dispatch(const Message* msg, T* obj, | 949 static bool Dispatch(const Message* msg, T* obj, S* sender, |
| 950 void (T::*func)(const Message&, TA, TB)) { | 950 void (T::*func)(const Message&, TA, TB)) { |
| 951 Param p; | 951 Param p; |
| 952 if (Read(msg, &p)) { | 952 if (Read(msg, &p)) { |
| 953 (obj->*func)(*msg, p.a, p.b); | 953 (obj->*func)(*msg, p.a, p.b); |
| 954 return true; | 954 return true; |
| 955 } | 955 } |
| 956 return false; | 956 return false; |
| 957 } | 957 } |
| 958 | 958 |
| 959 template<class T, typename TA, typename TB, typename TC> | 959 template<class T, class S, typename TA, typename TB, typename TC> |
| 960 static bool Dispatch(const Message* msg, T* obj, | 960 static bool Dispatch(const Message* msg, T* obj, S* sender, |
| 961 void (T::*func)(const Message&, TA, TB, TC)) { | 961 void (T::*func)(const Message&, TA, TB, TC)) { |
| 962 Param p; | 962 Param p; |
| 963 if (Read(msg, &p)) { | 963 if (Read(msg, &p)) { |
| 964 (obj->*func)(*msg, p.a, p.b, p.c); | 964 (obj->*func)(*msg, p.a, p.b, p.c); |
| 965 return true; | 965 return true; |
| 966 } | 966 } |
| 967 return false; | 967 return false; |
| 968 } | 968 } |
| 969 | 969 |
| 970 template<class T, typename TA, typename TB, typename TC, typename TD> | 970 template<class T, class S, typename TA, typename TB, typename TC, typename TD> |
| 971 static bool Dispatch(const Message* msg, T* obj, | 971 static bool Dispatch(const Message* msg, T* obj, S* sender, |
| 972 void (T::*func)(const Message&, TA, TB, TC, TD)) { | 972 void (T::*func)(const Message&, TA, TB, TC, TD)) { |
| 973 Param p; | 973 Param p; |
| 974 if (Read(msg, &p)) { | 974 if (Read(msg, &p)) { |
| 975 (obj->*func)(*msg, p.a, p.b, p.c, p.d); | 975 (obj->*func)(*msg, p.a, p.b, p.c, p.d); |
| 976 return true; | 976 return true; |
| 977 } | 977 } |
| 978 return false; | 978 return false; |
| 979 } | 979 } |
| 980 | 980 |
| 981 template<class T, typename TA, typename TB, typename TC, typename TD, | 981 template<class T, class S, typename TA, typename TB, typename TC, typename TD, |
| 982 typename TE> | 982 typename TE> |
| 983 static bool Dispatch(const Message* msg, T* obj, | 983 static bool Dispatch(const Message* msg, T* obj, S* sender, |
| 984 void (T::*func)(const Message&, TA, TB, TC, TD, TE)) { | 984 void (T::*func)(const Message&, TA, TB, TC, TD, TE)) { |
| 985 Param p; | 985 Param p; |
| 986 if (Read(msg, &p)) { | 986 if (Read(msg, &p)) { |
| 987 (obj->*func)(*msg, p.a, p.b, p.c, p.d, p.e); | 987 (obj->*func)(*msg, p.a, p.b, p.c, p.d, p.e); |
| 988 return true; | 988 return true; |
| 989 } | 989 } |
| 990 return false; | 990 return false; |
| 991 } | 991 } |
| 992 | 992 |
| 993 // Functions used to do manual unpacking. Only used by the automation code, | 993 // Functions used to do manual unpacking. Only used by the automation code, |
| (...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1107 typedef typename TupleTypes<SendParam>::ParamTuple RefSendParam; | 1107 typedef typename TupleTypes<SendParam>::ParamTuple RefSendParam; |
| 1108 typedef ReplyParamType ReplyParam; | 1108 typedef ReplyParamType ReplyParam; |
| 1109 | 1109 |
| 1110 MessageWithReply(int32 routing_id, uint32 type, | 1110 MessageWithReply(int32 routing_id, uint32 type, |
| 1111 const RefSendParam& send, const ReplyParam& reply); | 1111 const RefSendParam& send, const ReplyParam& reply); |
| 1112 static bool ReadSendParam(const Message* msg, SendParam* p) IPC_MSG_NOINLINE; | 1112 static bool ReadSendParam(const Message* msg, SendParam* p) IPC_MSG_NOINLINE; |
| 1113 static bool ReadReplyParam( | 1113 static bool ReadReplyParam( |
| 1114 const Message* msg, | 1114 const Message* msg, |
| 1115 typename TupleTypes<ReplyParam>::ValueTuple* p) IPC_MSG_NOINLINE; | 1115 typename TupleTypes<ReplyParam>::ValueTuple* p) IPC_MSG_NOINLINE; |
| 1116 | 1116 |
| 1117 template<class T, class Method> | 1117 template<class T, class S, class Method> |
| 1118 static bool Dispatch(const Message* msg, T* obj, Method func) { | 1118 static bool Dispatch(const Message* msg, T* obj, S* sender, Method func) { |
| 1119 SendParam send_params; | 1119 SendParam send_params; |
| 1120 Message* reply = GenerateReply(msg); | 1120 Message* reply = GenerateReply(msg); |
| 1121 bool error; | 1121 bool error; |
| 1122 if (ReadSendParam(msg, &send_params)) { | 1122 if (ReadSendParam(msg, &send_params)) { |
| 1123 typename TupleTypes<ReplyParam>::ValueTuple reply_params; | 1123 typename TupleTypes<ReplyParam>::ValueTuple reply_params; |
| 1124 DispatchToMethod(obj, func, send_params, &reply_params); | 1124 DispatchToMethod(obj, func, send_params, &reply_params); |
| 1125 WriteParam(reply, reply_params); | 1125 WriteParam(reply, reply_params); |
| 1126 error = false; | 1126 error = false; |
| 1127 LogReplyParamsToMessage(reply_params, msg); | 1127 LogReplyParamsToMessage(reply_params, msg); |
| 1128 } else { | 1128 } else { |
| 1129 NOTREACHED() << "Error deserializing message " << msg->type(); | 1129 NOTREACHED() << "Error deserializing message " << msg->type(); |
| 1130 reply->set_reply_error(); | 1130 reply->set_reply_error(); |
| 1131 error = true; | 1131 error = true; |
| 1132 } | 1132 } |
| 1133 | 1133 |
| 1134 obj->Send(reply); | 1134 sender->Send(reply); |
| 1135 return !error; | 1135 return !error; |
| 1136 } | 1136 } |
| 1137 | 1137 |
| 1138 template<class T, class Method> | 1138 template<class T, class Method> |
| 1139 static bool DispatchDelayReply(const Message* msg, T* obj, Method func) { | 1139 static bool DispatchDelayReply(const Message* msg, T* obj, Method func) { |
| 1140 SendParam send_params; | 1140 SendParam send_params; |
| 1141 Message* reply = GenerateReply(msg); | 1141 Message* reply = GenerateReply(msg); |
| 1142 bool error; | 1142 bool error; |
| 1143 if (ReadSendParam(msg, &send_params)) { | 1143 if (ReadSendParam(msg, &send_params)) { |
| 1144 Tuple1<Message&> t = MakeRefTuple(*reply); | 1144 Tuple1<Message&> t = MakeRefTuple(*reply); |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1183 ReplyParam p(a, b, c, d, e); | 1183 ReplyParam p(a, b, c, d, e); |
| 1184 WriteParam(reply, p); | 1184 WriteParam(reply, p); |
| 1185 } | 1185 } |
| 1186 }; | 1186 }; |
| 1187 | 1187 |
| 1188 //----------------------------------------------------------------------------- | 1188 //----------------------------------------------------------------------------- |
| 1189 | 1189 |
| 1190 } // namespace IPC | 1190 } // namespace IPC |
| 1191 | 1191 |
| 1192 #endif // IPC_IPC_MESSAGE_UTILS_H_ | 1192 #endif // IPC_IPC_MESSAGE_UTILS_H_ |
| OLD | NEW |