OLD | NEW |
1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 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 // This header is meant to be included in multiple passes, hence no traditional | 5 // This header is meant to be included in multiple passes, hence no traditional |
6 // header guard. | 6 // header guard. |
7 // | 7 // |
8 // In the first pass, IPC_MESSAGE_MACROS_ENUMS should be defined, which will | 8 // In the first pass, IPC_MESSAGE_MACROS_ENUMS should be defined, which will |
9 // create enums for each of the messages defined with the IPC_MESSAGE_* macros. | 9 // create enums for each of the messages defined with the IPC_MESSAGE_* macros. |
10 // | 10 // |
11 // In the second pass, either IPC_MESSAGE_MACROS_DEBUGSTRINGS or | 11 // In the second pass, either IPC_MESSAGE_MACROS_DEBUGSTRINGS or |
12 // IPC_MESSAGE_MACROS_CLASSES should be defined (if both, DEBUGSTRINGS takes | 12 // IPC_MESSAGE_MACROS_CLASSES should be defined (if both, DEBUGSTRINGS takes |
13 // precedence). Only one .cc file should have DEBUGSTRINGS defined, as this | 13 // precedence). Only one .cc file should have DEBUGSTRINGS defined, as this |
14 // will create helper functions mapping message types to strings. Having | 14 // will create helper functions mapping message types to strings. Having |
15 // CLASSES defined will create classes for each of the messages defined with | 15 // CLASSES defined will create classes for each of the messages defined with |
16 // the IPC_MESSAGE_* macros. | 16 // the IPC_MESSAGE_* macros. |
17 // | 17 // |
18 // "Sync" messages are just synchronous calls, the Send() call doesn't return | 18 // "Sync" messages are just synchronous calls, the Send() call doesn't return |
19 // until a reply comes back. Input parameters are first (const TYPE&), and | 19 // until a reply comes back. Input parameters are first (const TYPE&), and |
20 // To declare a sync message, use the IPC_SYNC_ macros. The numbers at the | 20 // To declare a sync message, use the IPC_SYNC_ macros. The numbers at the |
21 // end show how many input/output parameters there are (i.e. 1_2 is 1 in, 2 out)
. | 21 // end show how many input/output parameters there are (i.e. 1_2 is 1 in, 2 |
22 // The caller does a Send([route id, ], in1, &out1, &out2). | 22 // out). The caller does a Send([route id, ], in1, &out1, &out2). |
23 // The receiver's handler function will be | 23 // The receiver's handler function will be |
24 // void OnSyncMessageName(const type1& in1, type2* out1, type3* out2) | 24 // void OnSyncMessageName(const type1& in1, type2* out1, type3* out2) |
25 // | 25 // |
26 // | 26 // |
27 // A caller can also send a synchronous message, while the receiver can respond | 27 // A caller can also send a synchronous message, while the receiver can respond |
28 // at a later time. This is transparent from the sender's size. The receiver | 28 // at a later time. This is transparent from the sender's size. The receiver |
29 // needs to use a different handler that takes in a IPC::Message* as the output | 29 // needs to use a different handler that takes in a IPC::Message* as the output |
30 // type, stash the message, and when it has the data it can Send the message. | 30 // type, stash the message, and when it has the data it can Send the message. |
31 // | 31 // |
32 // Use the IPC_MESSAGE_HANDLER_DELAY_REPLY macro instead of IPC_MESSAGE_HANDLER | 32 // Use the IPC_MESSAGE_HANDLER_DELAY_REPLY macro instead of IPC_MESSAGE_HANDLER |
33 // IPC_MESSAGE_HANDLER_DELAY_REPLY(ViewHostMsg_SyncMessageName, OnSyncMessag
eName) | 33 // IPC_MESSAGE_HANDLER_DELAY_REPLY(ViewHostMsg_SyncMessageName, |
| 34 // OnSyncMessageName) |
34 // | 35 // |
35 // The handler function will look like: | 36 // The handler function will look like: |
36 // void OnSyncMessageName(const type1& in1, IPC::Message* reply_msg); | 37 // void OnSyncMessageName(const type1& in1, IPC::Message* reply_msg); |
37 // | 38 // |
38 // Receiver stashes the IPC::Message* pointer, and when it's ready, it does: | 39 // Receiver stashes the IPC::Message* pointer, and when it's ready, it does: |
39 // ViewHostMsg_SyncMessageName::WriteReplyParams(reply_msg, out1, out2); | 40 // ViewHostMsg_SyncMessageName::WriteReplyParams(reply_msg, out1, out2); |
40 // Send(reply_msg); | 41 // Send(reply_msg); |
41 | 42 |
42 #include "chrome/common/ipc_message_utils.h" | 43 #include "chrome/common/ipc_message_utils.h" |
43 | 44 |
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
133 #undef IPC_SYNC_MESSAGE_ROUTED4_2 | 134 #undef IPC_SYNC_MESSAGE_ROUTED4_2 |
134 | 135 |
135 #if defined(IPC_MESSAGE_MACROS_ENUMS) | 136 #if defined(IPC_MESSAGE_MACROS_ENUMS) |
136 #undef IPC_MESSAGE_MACROS_ENUMS | 137 #undef IPC_MESSAGE_MACROS_ENUMS |
137 | 138 |
138 // TODO(jabdelmalek): we're using the lowest 12 bits of type for the message | 139 // TODO(jabdelmalek): we're using the lowest 12 bits of type for the message |
139 // id, and the highest 4 bits for the channel type. This constrains us to | 140 // id, and the highest 4 bits for the channel type. This constrains us to |
140 // 16 channel types (currently using 8) and 4K messages per type. Should | 141 // 16 channel types (currently using 8) and 4K messages per type. Should |
141 // really make type be 32 bits, but then we break automation with older Chrome | 142 // really make type be 32 bits, but then we break automation with older Chrome |
142 // builds.. | 143 // builds.. |
143 | 144 // Do label##PreStart so that automation messages keep the same id as before. |
144 #define IPC_BEGIN_MESSAGES(label) \ | 145 #define IPC_BEGIN_MESSAGES(label) \ |
145 enum label##MsgType { \ | 146 enum label##MsgType { \ |
146 label##Start = label##MsgStart << 12, \ | 147 label##Start = label##MsgStart << 12, \ |
147 label##PreStart = (label##MsgStart << 12) - 1, // Do this so that automation
messages keep the same id as before | 148 label##PreStart = (label##MsgStart << 12) - 1, |
148 | 149 |
149 #define IPC_END_MESSAGES(label) \ | 150 #define IPC_END_MESSAGES(label) \ |
150 label##End \ | 151 label##End \ |
151 }; | 152 }; |
152 | 153 |
153 #define IPC_MESSAGE_CONTROL0(msg_class) \ | 154 #define IPC_MESSAGE_CONTROL0(msg_class) \ |
154 msg_class##__ID, | 155 msg_class##__ID, |
155 | 156 |
156 #define IPC_MESSAGE_CONTROL1(msg_class, type1) \ | 157 #define IPC_MESSAGE_CONTROL1(msg_class, type1) \ |
157 msg_class##__ID, | 158 msg_class##__ID, |
(...skipping 984 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1142 public: \ | 1143 public: \ |
1143 enum { ID = msg_class##__ID }; \ | 1144 enum { ID = msg_class##__ID }; \ |
1144 msg_class(int routing_id, const type1_in& arg1, const type2_in& arg2, const
type3_in& arg3, const type4_in& arg4, type1_out* arg5, type2_out* arg6) \ | 1145 msg_class(int routing_id, const type1_in& arg1, const type2_in& arg2, const
type3_in& arg3, const type4_in& arg4, type1_out* arg5, type2_out* arg6) \ |
1145 : IPC::MessageWithReply<Tuple4<type1_in, type2_in, type3_in, type4_in>,
\ | 1146 : IPC::MessageWithReply<Tuple4<type1_in, type2_in, type3_in, type4_in>,
\ |
1146 Tuple2<type1_out&, type2_out&> >(routing_id, ID, \ | 1147 Tuple2<type1_out&, type2_out&> >(routing_id, ID, \ |
1147 MakeTuple(arg1, arg2, arg3, arg4), MakeRefTuple(*arg5, *arg6)) {} \ | 1148 MakeTuple(arg1, arg2, arg3, arg4), MakeRefTuple(*arg5, *arg6)) {} \ |
1148 }; | 1149 }; |
1149 | 1150 |
1150 #endif // #if defined() | 1151 #endif // #if defined() |
1151 | 1152 |
OLD | NEW |