15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Defining IPC Messages 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Your IPC messages will be defined by macros inside of an XXX_messages.h 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// header file. Most of the time, the system can automatically generate all 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// of messaging mechanism from these definitions, but sometimes some manual 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// coding is required. In these cases, you will also have an XXX_messages.cc 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// implemation file as well. 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The senders of your messages will include your XXX_messages.h file to 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// get the full set of definitions they need to send your messages. 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Each XXX_messages.h file must be registered with the IPC system. This 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// requires adding two things: 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - An XXXMsgStart value to the IPCMessageStart enum in ipc_message_start.h 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - An inclusion of XXX_messages.h file in a message generator .h file 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The XXXMsgStart value is an enumeration that ensures uniqueness for 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// each different message file. Later, you will use this inside your 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// XXX_messages.h file before invoking message declaration macros: 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// #define IPC_MESSAGE_START XXXMsgStart 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ( ... your macro invocations go here ... ) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Message Generator Files 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A message generator .h header file pulls in all other message-declaring 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// headers for a given component. It is included by a message generator 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// .cc file, which is where all the generated code will wind up. Typically, 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// you will use an existing generator (e.g. common_message_generator.cc 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// in /chrome/common), but there are circumstances where you may add a 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// new one. 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// In the rare cicrucmstances where you can't re-use an existing file, 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// your YYY_message_generator.cc file for a component YYY would contain 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the following code: 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// // Get basic type definitions. 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// #define IPC_MESSAGE_IMPL 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// #include "path/to/YYY_message_generator.h" 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// // Generate constructors. 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// #include "ipc/struct_constructor_macros.h" 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// #include "path/to/YYY_message_generator.h" 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// // Generate destructors. 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// #include "ipc/struct_destructor_macros.h" 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// #include "path/to/YYY_message_generator.h" 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// // Generate param traits write methods. 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// #include "ipc/param_traits_write_macros.h" 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// namespace IPC { 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// #include "path/to/YYY_message_generator.h" 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// } // namespace IPC 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// // Generate param traits read methods. 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// #include "ipc/param_traits_read_macros.h" 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// namespace IPC { 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// #include "path/to/YYY_message_generator.h" 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// } // namespace IPC 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// // Generate param traits log methods. 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// #include "ipc/param_traits_log_macros.h" 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// namespace IPC { 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// #include "path/to/YYY_message_generator.h" 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// } // namespace IPC 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// In cases where manual generation is required, in your XXX_messages.cc 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// file, put the following after all the includes for param types: 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// #define IPC_MESSAGE_IMPL 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// #include "XXX_messages.h" 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// (... implementation of traits not auto-generated ...) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Multiple Inclusion 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The XXX_messages.h file will be multiply-included by the 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// YYY_message_generator.cc file, so your XXX_messages file can't be 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// guarded in the usual manner. Ideally, there will be no need for any 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// inclusion guard, since the XXX_messages.h file should consist soley 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// of inclusions of other headers (which are self-guarding) and IPC 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// macros (which are multiply evaluating). 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Note that #pragma once cannot be used here; doing so would mark the whole 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// file as being singly-included. Since your XXX_messages.h file is only 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// partially-guarded, care must be taken to ensure that it is only included 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// by other .cc files (and the YYY_message_generator.h file). Including an 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// XXX_messages.h file in some other .h file may result in duplicate 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// declarations and a compilation failure. 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Type Declarations 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// It is generally a bad idea to have type definitions in a XXX_messages.h 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// file; most likely the typedef will then be used in the message, as opposed 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to the struct iself. Later, an IPC message dispatcher wil need to call 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// a function taking that type, and that function is declared in some other 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// header. Thus, in order to get the type definition, the other header 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// would have to include the XXX_messages.h file, violating the rule above 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// about not including XXX_messages.h file in other .h files. 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// One approach here is to move these type definitions to another (guarded) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// .h file and include this second .h in your XXX_messages.h file. This 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// is still less than ideal, because the dispatched function would have to 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// redeclare the typedef or include this second header. This may be 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// reasonable in a few cases. 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Failing all of the above, then you will want to bracket the smallest 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// possible section of your XXX_messages.h file containing these types 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// with an include guard macro. Be aware that providing an incomplete 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// class type declaration to avoid pulling in a long chain of headers is 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// acceptable when your XXX_messages.h header is being included by the 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// message sending caller's code, but not when the YYY_message_generator.c 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// is building the messages. In addtion, due to the multiple inclusion 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// restriction, these type ought to be guarded. Follow a convention like: 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// #ifndef SOME_GUARD_MACRO 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// #define SOME_GUARD_MACRO 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// class some_class; // One incomplete class declaration 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// class_some_other_class; // Another incomplete class declaration 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// #endif // SOME_GUARD_MACRO 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// #ifdef IPC_MESSAGE_IMPL 116f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// #include "path/to/some_class.h" // Full class declaration 117f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// #include "path/to/some_other_class.h" // Full class declaration 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// #endif // IPC_MESSAGE_IMPL 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// (.. IPC macros using some_class and some_other_class ...) 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Macro Invocations 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// You will use IPC message macro invocations for three things: 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - New struct definitions for IPC 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Registering existing struct and enum definitions with IPC 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Defining the messages themselves 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// New structs are defined with IPC_STRUCT_BEGIN(), IPC_STRUCT_MEMBER(), 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// IPC_STRUCT_END() family of macros. These cause the XXX_messages.h 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to proclaim equivalent struct declarations for use by callers, as well 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// as later registering the type with the message generation. Note that 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// IPC_STRUCT_MEMBER() is only permitted inside matching calls to 133868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// IPC_STRUCT_BEGIN() / IPC_STRUCT_END(). There is also an 134868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// IPC_STRUCT_BEGIN_WITH_PARENT(), which behaves like IPC_STRUCT_BEGIN(), 135868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// but also accomodates structs that inherit from other structs. 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Externally-defined structs are registered with IPC_STRUCT_TRAITS_BEGIN(), 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// IPC_STRUCT_TRAITS_MEMBER(), and IPC_STRUCT_TRAITS_END() macros. These 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// cause registration of the types with message generation only. 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// There's also IPC_STRUCT_TRAITS_PARENT, which is used to register a parent 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// class (whose own traits are already defined). Note that 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// IPC_STRUCT_TRAITS_MEMBER() and IPC_STRUCT_TRAITS_PARENT are only permitted 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// inside matching calls to IPC_STRUCT_TRAITS_BEGIN() / 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// IPC_STRUCT_TRAITS_END(). 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 146868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Enum types are registered with a single IPC_ENUM_TRAITS_VALIDATE() macro. 147868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// There is no need to enumerate each value to the IPC mechanism. Instead, 148868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// pass an expression in terms of the parameter |value| to provide 149868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// range-checking. For convenience, the IPC_ENUM_TRAITS() is provided which 150868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// performs no checking, passing everything including out-of-range values. 151868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Its use is discouraged. The IPC_ENUM_TRAITS_MAX_VALUE() macro can be used 152868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// for the typical case where the enum must be in the range 0..maxvalue 153868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// inclusive. The IPC_ENUM_TRAITS_MIN_MAX_VALUE() macro can be used for the 154868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// less typical case where the enum must be in the range minvalue..maxvalue 155868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// inclusive. 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Do not place semicolons following these IPC_ macro invocations. There 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// is no reason to expect that their expansion corresponds one-to-one with 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// C++ statements. 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Once the types have been declared / registered, message definitions follow. 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// "Sync" messages are just synchronous calls, the Send() call doesn't return 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// until a reply comes back. To declare a sync message, use the IPC_SYNC_ 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// macros. The numbers at the end show how many input/output parameters there 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// are (i.e. 1_2 is 1 in, 2 out). Input parameters are first, followed by 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// output parameters. The caller uses Send([route id, ], in1, &out1, &out2). 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The receiver's handler function will be 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// void OnSyncMessageName(const type1& in1, type2* out1, type3* out2) 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A caller can also send a synchronous message, while the receiver can respond 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// at a later time. This is transparent from the sender's side. The receiver 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// needs to use a different handler that takes in a IPC::Message* as the output 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// type, stash the message, and when it has the data it can Send the message. 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use the IPC_MESSAGE_HANDLER_DELAY_REPLY macro instead of IPC_MESSAGE_HANDLER 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// IPC_MESSAGE_HANDLER_DELAY_REPLY(ViewHostMsg_SyncMessageName, 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// OnSyncMessageName) 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The handler function will look like: 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// void OnSyncMessageName(const type1& in1, IPC::Message* reply_msg); 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Receiver stashes the IPC::Message* pointer, and when it's ready, it does: 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ViewHostMsg_SyncMessageName::WriteReplyParams(reply_msg, out1, out2); 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Send(reply_msg); 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Files that want to export their ipc messages should do 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// #undef IPC_MESSAGE_EXPORT 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// #define IPC_MESSAGE_EXPORT VISIBILITY_MACRO 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// after including this header, but before using any of the macros below. 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// (This needs to be before the include guard.) 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef IPC_MESSAGE_EXPORT 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_MESSAGE_EXPORT 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef IPC_IPC_MESSAGE_MACROS_H_ 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_IPC_MESSAGE_MACROS_H_ 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/profiler/scoped_profile.h" 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ipc/ipc_message_utils.h" 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ipc/param_traits_macros.h" 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(IPC_MESSAGE_IMPL) 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ipc/ipc_message_utils_impl.h" 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Convenience macro for defining structs without inheritance. Should not need 206868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// to be subsequently redefined. 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_STRUCT_BEGIN(struct_name) \ 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_STRUCT_BEGIN_WITH_PARENT(struct_name, IPC::NoParams) 209868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 210868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Macros for defining structs. Will be subsequently redefined. 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_STRUCT_BEGIN_WITH_PARENT(struct_name, parent) \ 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct struct_name; \ 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_STRUCT_TRAITS_BEGIN(struct_name) \ 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_STRUCT_TRAITS_END() \ 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct IPC_MESSAGE_EXPORT struct_name : parent { \ 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct_name(); \ 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~struct_name(); 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Optional variadic parameters specify the default value for this struct 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// member. They are passed through to the constructor for |type|. 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_STRUCT_MEMBER(type, name, ...) type name; 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_STRUCT_END() }; 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Message macros collect specific numbers of arguments and funnel them into 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the common message generation macro. These should never be redefined. 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_MESSAGE_CONTROL0(msg_class) \ 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_DECL(EMPTY, CONTROL, msg_class, 0, 0, (), ()) 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_MESSAGE_CONTROL1(msg_class, type1) \ 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_DECL(ASYNC, CONTROL, msg_class, 1, 0, (type1), ()) 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_MESSAGE_CONTROL2(msg_class, type1, type2) \ 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_DECL(ASYNC, CONTROL, msg_class, 2, 0, (type1, type2), ()) 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_MESSAGE_CONTROL3(msg_class, type1, type2, type3) \ 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_DECL(ASYNC, CONTROL, msg_class, 3, 0, (type1, type2, type3), ()) 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_MESSAGE_CONTROL4(msg_class, type1, type2, type3, type4) \ 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_DECL(ASYNC, CONTROL, msg_class, 4, 0, (type1, type2, type3, type4), ()) 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_MESSAGE_CONTROL5(msg_class, type1, type2, type3, type4, type5) \ 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_DECL(ASYNC, CONTROL, msg_class, 5, 0, (type1, type2, type3, type4, type5), ()) 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_MESSAGE_ROUTED0(msg_class) \ 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_DECL(EMPTY, ROUTED, msg_class, 0, 0, (), ()) 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_MESSAGE_ROUTED1(msg_class, type1) \ 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_DECL(ASYNC, ROUTED, msg_class, 1, 0, (type1), ()) 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_MESSAGE_ROUTED2(msg_class, type1, type2) \ 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_DECL(ASYNC, ROUTED, msg_class, 2, 0, (type1, type2), ()) 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_MESSAGE_ROUTED3(msg_class, type1, type2, type3) \ 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_DECL(ASYNC, ROUTED, msg_class, 3, 0, (type1, type2, type3), ()) 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_MESSAGE_ROUTED4(msg_class, type1, type2, type3, type4) \ 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_DECL(ASYNC, ROUTED, msg_class, 4, 0, (type1, type2, type3, type4), ()) 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_MESSAGE_ROUTED5(msg_class, type1, type2, type3, type4, type5) \ 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_DECL(ASYNC, ROUTED, msg_class, 5, 0, (type1, type2, type3, type4, type5), ()) 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_SYNC_MESSAGE_CONTROL0_0(msg_class) \ 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_DECL(SYNC, CONTROL, msg_class, 0, 0, (), ()) 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_SYNC_MESSAGE_CONTROL0_1(msg_class, type1_out) \ 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_DECL(SYNC, CONTROL, msg_class, 0, 1, (), (type1_out)) 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_SYNC_MESSAGE_CONTROL0_2(msg_class, type1_out, type2_out) \ 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_DECL(SYNC, CONTROL, msg_class, 0, 2, (), (type1_out, type2_out)) 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_SYNC_MESSAGE_CONTROL0_3(msg_class, type1_out, type2_out, type3_out) \ 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_DECL(SYNC, CONTROL, msg_class, 0, 3, (), (type1_out, type2_out, type3_out)) 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_SYNC_MESSAGE_CONTROL0_4(msg_class, type1_out, type2_out, type3_out, type4_out) \ 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_DECL(SYNC, CONTROL, msg_class, 0, 4, (), (type1_out, type2_out, type3_out, type4_out)) 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_SYNC_MESSAGE_CONTROL1_0(msg_class, type1_in) \ 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_DECL(SYNC, CONTROL, msg_class, 1, 0, (type1_in), ()) 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_SYNC_MESSAGE_CONTROL1_1(msg_class, type1_in, type1_out) \ 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_DECL(SYNC, CONTROL, msg_class, 1, 1, (type1_in), (type1_out)) 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_SYNC_MESSAGE_CONTROL1_2(msg_class, type1_in, type1_out, type2_out) \ 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_DECL(SYNC, CONTROL, msg_class, 1, 2, (type1_in), (type1_out, type2_out)) 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_SYNC_MESSAGE_CONTROL1_3(msg_class, type1_in, type1_out, type2_out, type3_out) \ 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_DECL(SYNC, CONTROL, msg_class, 1, 3, (type1_in), (type1_out, type2_out, type3_out)) 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_SYNC_MESSAGE_CONTROL1_4(msg_class, type1_in, type1_out, type2_out, type3_out, type4_out) \ 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_DECL(SYNC, CONTROL, msg_class, 1, 4, (type1_in), (type1_out, type2_out, type3_out, type4_out)) 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_SYNC_MESSAGE_CONTROL2_0(msg_class, type1_in, type2_in) \ 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_DECL(SYNC, CONTROL, msg_class, 2, 0, (type1_in, type2_in), ()) 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_SYNC_MESSAGE_CONTROL2_1(msg_class, type1_in, type2_in, type1_out) \ 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_DECL(SYNC, CONTROL, msg_class, 2, 1, (type1_in, type2_in), (type1_out)) 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_SYNC_MESSAGE_CONTROL2_2(msg_class, type1_in, type2_in, type1_out, type2_out) \ 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_DECL(SYNC, CONTROL, msg_class, 2, 2, (type1_in, type2_in), (type1_out, type2_out)) 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_SYNC_MESSAGE_CONTROL2_3(msg_class, type1_in, type2_in, type1_out, type2_out, type3_out) \ 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_DECL(SYNC, CONTROL, msg_class, 2, 3, (type1_in, type2_in), (type1_out, type2_out, type3_out)) 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_SYNC_MESSAGE_CONTROL2_4(msg_class, type1_in, type2_in, type1_out, type2_out, type3_out, type4_out) \ 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_DECL(SYNC, CONTROL, msg_class, 2, 4, (type1_in, type2_in), (type1_out, type2_out, type3_out, type4_out)) 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_SYNC_MESSAGE_CONTROL3_0(msg_class, type1_in, type2_in, type3_in) \ 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_DECL(SYNC, CONTROL, msg_class, 3, 0, (type1_in, type2_in, type3_in), ()) 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_SYNC_MESSAGE_CONTROL3_1(msg_class, type1_in, type2_in, type3_in, type1_out) \ 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_DECL(SYNC, CONTROL, msg_class, 3, 1, (type1_in, type2_in, type3_in), (type1_out)) 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_SYNC_MESSAGE_CONTROL3_2(msg_class, type1_in, type2_in, type3_in, type1_out, type2_out) \ 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_DECL(SYNC, CONTROL, msg_class, 3, 2, (type1_in, type2_in, type3_in), (type1_out, type2_out)) 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_SYNC_MESSAGE_CONTROL3_3(msg_class, type1_in, type2_in, type3_in, type1_out, type2_out, type3_out) \ 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_DECL(SYNC, CONTROL, msg_class, 3, 3, (type1_in, type2_in, type3_in), (type1_out, type2_out, type3_out)) 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_SYNC_MESSAGE_CONTROL3_4(msg_class, type1_in, type2_in, type3_in, type1_out, type2_out, type3_out, type4_out) \ 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_DECL(SYNC, CONTROL, msg_class, 3, 4, (type1_in, type2_in, type3_in), (type1_out, type2_out, type3_out, type4_out)) 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_SYNC_MESSAGE_CONTROL4_0(msg_class, type1_in, type2_in, type3_in, type4_in) \ 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_DECL(SYNC, CONTROL, msg_class, 4, 0, (type1_in, type2_in, type3_in, type4_in), ()) 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_SYNC_MESSAGE_CONTROL4_1(msg_class, type1_in, type2_in, type3_in, type4_in, type1_out) \ 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_DECL(SYNC, CONTROL, msg_class, 4, 1, (type1_in, type2_in, type3_in, type4_in), (type1_out)) 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_SYNC_MESSAGE_CONTROL4_2(msg_class, type1_in, type2_in, type3_in, type4_in, type1_out, type2_out) \ 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_DECL(SYNC, CONTROL, msg_class, 4, 2, (type1_in, type2_in, type3_in, type4_in), (type1_out, type2_out)) 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_SYNC_MESSAGE_CONTROL4_3(msg_class, type1_in, type2_in, type3_in, type4_in, type1_out, type2_out, type3_out) \ 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_DECL(SYNC, CONTROL, msg_class, 4, 3, (type1_in, type2_in, type3_in, type4_in), (type1_out, type2_out, type3_out)) 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_SYNC_MESSAGE_CONTROL4_4(msg_class, type1_in, type2_in, type3_in, type4_in, type1_out, type2_out, type3_out, type4_out) \ 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_DECL(SYNC, CONTROL, msg_class, 4, 4, (type1_in, type2_in, type3_in, type4_in), (type1_out, type2_out, type3_out, type4_out)) 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_SYNC_MESSAGE_CONTROL5_0(msg_class, type1_in, type2_in, type3_in, type4_in, type5_in) \ 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_DECL(SYNC, CONTROL, msg_class, 5, 0, (type1_in, type2_in, type3_in, type4_in, type5_in), ()) 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_SYNC_MESSAGE_CONTROL5_1(msg_class, type1_in, type2_in, type3_in, type4_in, type5_in, type1_out) \ 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_DECL(SYNC, CONTROL, msg_class, 5, 1, (type1_in, type2_in, type3_in, type4_in, type5_in), (type1_out)) 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_SYNC_MESSAGE_CONTROL5_2(msg_class, type1_in, type2_in, type3_in, type4_in, type5_in, type1_out, type2_out) \ 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_DECL(SYNC, CONTROL, msg_class, 5, 2, (type1_in, type2_in, type3_in, type4_in, type5_in), (type1_out, type2_out)) 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_SYNC_MESSAGE_CONTROL5_3(msg_class, type1_in, type2_in, type3_in, type4_in, type5_in, type1_out, type2_out, type3_out) \ 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_DECL(SYNC, CONTROL, msg_class, 5, 3, (type1_in, type2_in, type3_in, type4_in, type5_in), (type1_out, type2_out, type3_out)) 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_SYNC_MESSAGE_ROUTED0_0(msg_class) \ 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_DECL(SYNC, ROUTED, msg_class, 0, 0, (), ()) 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_SYNC_MESSAGE_ROUTED0_1(msg_class, type1_out) \ 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_DECL(SYNC, ROUTED, msg_class, 0, 1, (), (type1_out)) 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_SYNC_MESSAGE_ROUTED0_2(msg_class, type1_out, type2_out) \ 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_DECL(SYNC, ROUTED, msg_class, 0, 2, (), (type1_out, type2_out)) 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_SYNC_MESSAGE_ROUTED0_3(msg_class, type1_out, type2_out, type3_out) \ 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_DECL(SYNC, ROUTED, msg_class, 0, 3, (), (type1_out, type2_out, type3_out)) 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_SYNC_MESSAGE_ROUTED0_4(msg_class, type1_out, type2_out, type3_out, type4_out) \ 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_DECL(SYNC, ROUTED, msg_class, 0, 4, (), (type1_out, type2_out, type3_out, type4_out)) 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_SYNC_MESSAGE_ROUTED1_0(msg_class, type1_in) \ 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_DECL(SYNC, ROUTED, msg_class, 1, 0, (type1_in), ()) 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_SYNC_MESSAGE_ROUTED1_1(msg_class, type1_in, type1_out) \ 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_DECL(SYNC, ROUTED, msg_class, 1, 1, (type1_in), (type1_out)) 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_SYNC_MESSAGE_ROUTED1_2(msg_class, type1_in, type1_out, type2_out) \ 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_DECL(SYNC, ROUTED, msg_class, 1, 2, (type1_in), (type1_out, type2_out)) 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_SYNC_MESSAGE_ROUTED1_3(msg_class, type1_in, type1_out, type2_out, type3_out) \ 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_DECL(SYNC, ROUTED, msg_class, 1, 3, (type1_in), (type1_out, type2_out, type3_out)) 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_SYNC_MESSAGE_ROUTED1_4(msg_class, type1_in, type1_out, type2_out, type3_out, type4_out) \ 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_DECL(SYNC, ROUTED, msg_class, 1, 4, (type1_in), (type1_out, type2_out, type3_out, type4_out)) 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_SYNC_MESSAGE_ROUTED2_0(msg_class, type1_in, type2_in) \ 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_DECL(SYNC, ROUTED, msg_class, 2, 0, (type1_in, type2_in), ()) 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_SYNC_MESSAGE_ROUTED2_1(msg_class, type1_in, type2_in, type1_out) \ 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_DECL(SYNC, ROUTED, msg_class, 2, 1, (type1_in, type2_in), (type1_out)) 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_SYNC_MESSAGE_ROUTED2_2(msg_class, type1_in, type2_in, type1_out, type2_out) \ 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_DECL(SYNC, ROUTED, msg_class, 2, 2, (type1_in, type2_in), (type1_out, type2_out)) 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_SYNC_MESSAGE_ROUTED2_3(msg_class, type1_in, type2_in, type1_out, type2_out, type3_out) \ 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_DECL(SYNC, ROUTED, msg_class, 2, 3, (type1_in, type2_in), (type1_out, type2_out, type3_out)) 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_SYNC_MESSAGE_ROUTED2_4(msg_class, type1_in, type2_in, type1_out, type2_out, type3_out, type4_out) \ 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_DECL(SYNC, ROUTED, msg_class, 2, 4, (type1_in, type2_in), (type1_out, type2_out, type3_out, type4_out)) 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_SYNC_MESSAGE_ROUTED3_0(msg_class, type1_in, type2_in, type3_in) \ 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_DECL(SYNC, ROUTED, msg_class, 3, 0, (type1_in, type2_in, type3_in), ()) 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_SYNC_MESSAGE_ROUTED3_1(msg_class, type1_in, type2_in, type3_in, type1_out) \ 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_DECL(SYNC, ROUTED, msg_class, 3, 1, (type1_in, type2_in, type3_in), (type1_out)) 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_SYNC_MESSAGE_ROUTED3_2(msg_class, type1_in, type2_in, type3_in, type1_out, type2_out) \ 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_DECL(SYNC, ROUTED, msg_class, 3, 2, (type1_in, type2_in, type3_in), (type1_out, type2_out)) 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_SYNC_MESSAGE_ROUTED3_3(msg_class, type1_in, type2_in, type3_in, type1_out, type2_out, type3_out) \ 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_DECL(SYNC, ROUTED, msg_class, 3, 3, (type1_in, type2_in, type3_in), (type1_out, type2_out, type3_out)) 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_SYNC_MESSAGE_ROUTED3_4(msg_class, type1_in, type2_in, type3_in, type1_out, type2_out, type3_out, type4_out) \ 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_DECL(SYNC, ROUTED, msg_class, 3, 4, (type1_in, type2_in, type3_in), (type1_out, type2_out, type3_out, type4_out)) 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_SYNC_MESSAGE_ROUTED4_0(msg_class, type1_in, type2_in, type3_in, type4_in) \ 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_DECL(SYNC, ROUTED, msg_class, 4, 0, (type1_in, type2_in, type3_in, type4_in), ()) 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_SYNC_MESSAGE_ROUTED4_1(msg_class, type1_in, type2_in, type3_in, type4_in, type1_out) \ 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_DECL(SYNC, ROUTED, msg_class, 4, 1, (type1_in, type2_in, type3_in, type4_in), (type1_out)) 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_SYNC_MESSAGE_ROUTED4_2(msg_class, type1_in, type2_in, type3_in, type4_in, type1_out, type2_out) \ 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_DECL(SYNC, ROUTED, msg_class, 4, 2, (type1_in, type2_in, type3_in, type4_in), (type1_out, type2_out)) 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_SYNC_MESSAGE_ROUTED4_3(msg_class, type1_in, type2_in, type3_in, type4_in, type1_out, type2_out, type3_out) \ 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_DECL(SYNC, ROUTED, msg_class, 4, 3, (type1_in, type2_in, type3_in, type4_in), (type1_out, type2_out, type3_out)) 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_SYNC_MESSAGE_ROUTED4_4(msg_class, type1_in, type2_in, type3_in, type4_in, type1_out, type2_out, type3_out, type4_out) \ 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_DECL(SYNC, ROUTED, msg_class, 4, 4, (type1_in, type2_in, type3_in, type4_in), (type1_out, type2_out, type3_out, type4_out)) 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_SYNC_MESSAGE_ROUTED5_0(msg_class, type1_in, type2_in, type3_in, type4_in, type5_in) \ 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_DECL(SYNC, ROUTED, msg_class, 5, 0, (type1_in, type2_in, type3_in, type4_in, type5_in), ()) 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_SYNC_MESSAGE_ROUTED5_1(msg_class, type1_in, type2_in, type3_in, type4_in, type5_in, type1_out) \ 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_DECL(SYNC, ROUTED, msg_class, 5, 1, (type1_in, type2_in, type3_in, type4_in, type5_in), (type1_out)) 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_SYNC_MESSAGE_ROUTED5_2(msg_class, type1_in, type2_in, type3_in, type4_in, type5_in, type1_out, type2_out) \ 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_DECL(SYNC, ROUTED, msg_class, 5, 2, (type1_in, type2_in, type3_in, type4_in, type5_in), (type1_out, type2_out)) 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_SYNC_MESSAGE_ROUTED5_3(msg_class, type1_in, type2_in, type3_in, type4_in, type5_in, type1_out, type2_out, type3_out) \ 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_DECL(SYNC, ROUTED, msg_class, 5, 3, (type1_in, type2_in, type3_in, type4_in, type5_in), (type1_out, type2_out, type3_out)) 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The following macros define the common set of methods provided by ASYNC 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// message classes. 437cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// This macro is for all the async IPCs that don't pass an extra parameter using 438cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// IPC_BEGIN_MESSAGE_MAP_WITH_PARAM. 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_ASYNC_MESSAGE_METHODS_GENERIC \ 440cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) template<class T, class S, class P, class Method> \ 441cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) static bool Dispatch(const Message* msg, T* obj, S* sender, P* parameter, \ 442cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) Method func) { \ 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Schema::Param p; \ 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (Read(msg, &p)) { \ 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DispatchToMethod(obj, func, p); \ 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; \ 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } \ 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; \ 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 450cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 451cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// The following macros are for for async IPCs which have a dispatcher with an 452cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// extra parameter specified using IPC_BEGIN_MESSAGE_MAP_WITH_PARAM. 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_ASYNC_MESSAGE_METHODS_1 \ 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_ASYNC_MESSAGE_METHODS_GENERIC \ 455cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) template<class T, class S, class P, typename TA> \ 456cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) static bool Dispatch(const Message* msg, T* obj, S* sender, P* parameter, \ 457cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) void (T::*func)(P*, TA)) { \ 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Schema::Param p; \ 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (Read(msg, &p)) { \ 460cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) (obj->*func)(parameter, p.a); \ 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; \ 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } \ 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; \ 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_ASYNC_MESSAGE_METHODS_2 \ 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_ASYNC_MESSAGE_METHODS_GENERIC \ 467cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) template<class T, class S, class P, typename TA, typename TB> \ 468cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) static bool Dispatch(const Message* msg, T* obj, S* sender, P* parameter, \ 469cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) void (T::*func)(P*, TA, TB)) { \ 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Schema::Param p; \ 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (Read(msg, &p)) { \ 472cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) (obj->*func)(parameter, p.a, p.b); \ 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; \ 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } \ 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; \ 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_ASYNC_MESSAGE_METHODS_3 \ 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_ASYNC_MESSAGE_METHODS_GENERIC \ 479cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) template<class T, class S, class P, typename TA, typename TB, typename TC> \ 480cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) static bool Dispatch(const Message* msg, T* obj, S* sender, P* parameter, \ 481cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) void (T::*func)(P*, TA, TB, TC)) { \ 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Schema::Param p; \ 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (Read(msg, &p)) { \ 484cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) (obj->*func)(parameter, p.a, p.b, p.c); \ 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; \ 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } \ 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; \ 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_ASYNC_MESSAGE_METHODS_4 \ 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_ASYNC_MESSAGE_METHODS_GENERIC \ 491cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) template<class T, class S, class P, typename TA, typename TB, typename TC, \ 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename TD> \ 493cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) static bool Dispatch(const Message* msg, T* obj, S* sender, P* parameter, \ 494cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) void (T::*func)(P*, TA, TB, TC, TD)) { \ 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Schema::Param p; \ 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (Read(msg, &p)) { \ 497cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) (obj->*func)(parameter, p.a, p.b, p.c, p.d); \ 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; \ 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } \ 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; \ 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_ASYNC_MESSAGE_METHODS_5 \ 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_ASYNC_MESSAGE_METHODS_GENERIC \ 504cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) template<class T, class S, class P, typename TA, typename TB, typename TC, \ 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename TD, typename TE> \ 506cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) static bool Dispatch(const Message* msg, T* obj, S* sender, P* parameter, \ 507cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) void (T::*func)(P*, TA, TB, TC, TD, TE)) { \ 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Schema::Param p; \ 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (Read(msg, &p)) { \ 510cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) (obj->*func)(parameter, p.a, p.b, p.c, p.d, p.e); \ 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; \ 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } \ 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; \ 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The following macros define the common set of methods provided by SYNC 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// message classes. 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_SYNC_MESSAGE_METHODS_GENERIC \ 519cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) template<class T, class S, class P, class Method> \ 520cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) static bool Dispatch(const Message* msg, T* obj, S* sender, P* parameter, \ 521cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) Method func) { \ 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Schema::SendParam send_params; \ 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool ok = ReadSendParam(msg, &send_params); \ 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return Schema::DispatchWithSendParams(ok, send_params, msg, obj, sender, \ 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) func); \ 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } \ 527cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) template<class T, class P, class Method> \ 528cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) static bool DispatchDelayReply(const Message* msg, T* obj, P* parameter, \ 529cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) Method func) { \ 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Schema::SendParam send_params; \ 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool ok = ReadSendParam(msg, &send_params); \ 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return Schema::DispatchDelayReplyWithSendParams(ok, send_params, msg, \ 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) obj, func); \ 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_SYNC_MESSAGE_METHODS_0 \ 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_SYNC_MESSAGE_METHODS_GENERIC 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_SYNC_MESSAGE_METHODS_1 \ 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_SYNC_MESSAGE_METHODS_GENERIC \ 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template<typename TA> \ 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void WriteReplyParams(Message* reply, TA a) { \ 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Schema::WriteReplyParams(reply, a); \ 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_SYNC_MESSAGE_METHODS_2 \ 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_SYNC_MESSAGE_METHODS_GENERIC \ 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template<typename TA, typename TB> \ 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void WriteReplyParams(Message* reply, TA a, TB b) { \ 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Schema::WriteReplyParams(reply, a, b); \ 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_SYNC_MESSAGE_METHODS_3 \ 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_SYNC_MESSAGE_METHODS_GENERIC \ 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template<typename TA, typename TB, typename TC> \ 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void WriteReplyParams(Message* reply, TA a, TB b, TC c) { \ 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Schema::WriteReplyParams(reply, a, b, c); \ 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_SYNC_MESSAGE_METHODS_4 \ 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_SYNC_MESSAGE_METHODS_GENERIC \ 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template<typename TA, typename TB, typename TC, typename TD> \ 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void WriteReplyParams(Message* reply, TA a, TB b, TC c, TD d) { \ 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Schema::WriteReplyParams(reply, a, b, c, d); \ 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_SYNC_MESSAGE_METHODS_5 \ 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_SYNC_MESSAGE_METHODS_GENERIC \ 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template<typename TA, typename TB, typename TC, typename TD, typename TE> \ 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void WriteReplyParams(Message* reply, TA a, TB b, TC c, TD d, TE e) { \ 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Schema::WriteReplyParams(reply, a, b, c, d, e); \ 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Common message macro which dispatches into one of the 6 (sync x kind) 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// routines. There is a way that these 6 cases can be lumped together, 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// but the macros get very complicated in that case. 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Note: intended be redefined to generate other information. 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_MESSAGE_DECL(sync, kind, msg_class, \ 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) in_cnt, out_cnt, in_list, out_list) \ 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_##sync##_##kind##_DECL(msg_class, in_cnt, out_cnt, in_list, out_list) \ 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_EXTRA(sync, kind, msg_class, in_cnt, out_cnt, in_list, out_list) 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_EMPTY_CONTROL_DECL(msg_class, in_cnt, out_cnt, in_list, out_list) \ 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class IPC_MESSAGE_EXPORT msg_class : public IPC::Message { \ 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: \ 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef IPC::Message Schema; \ 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum { ID = IPC_MESSAGE_ID() }; \ 5820f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) msg_class() : IPC::Message(MSG_ROUTING_CONTROL, ID, PRIORITY_NORMAL) {} \ 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void Log(std::string* name, const Message* msg, std::string* l); \ 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_EMPTY_ROUTED_DECL(msg_class, in_cnt, out_cnt, in_list, out_list) \ 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class IPC_MESSAGE_EXPORT msg_class : public IPC::Message { \ 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: \ 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef IPC::Message Schema; \ 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum { ID = IPC_MESSAGE_ID() }; \ 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) msg_class(int32 routing_id) \ 5920f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) : IPC::Message(routing_id, ID, PRIORITY_NORMAL) {} \ 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void Log(std::string* name, const Message* msg, std::string* l); \ 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_ASYNC_CONTROL_DECL(msg_class, in_cnt, out_cnt, in_list, out_list) \ 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class IPC_MESSAGE_EXPORT msg_class : public IPC::Message { \ 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: \ 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef IPC::MessageSchema<IPC_TUPLE_IN_##in_cnt in_list> Schema; \ 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef Schema::Param Param; \ 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum { ID = IPC_MESSAGE_ID() }; \ 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) msg_class(IPC_TYPE_IN_##in_cnt in_list); \ 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~msg_class(); \ 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool Read(const Message* msg, Schema::Param* p); \ 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void Log(std::string* name, const Message* msg, std::string* l); \ 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_ASYNC_MESSAGE_METHODS_##in_cnt \ 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_ASYNC_ROUTED_DECL(msg_class, in_cnt, out_cnt, in_list, out_list) \ 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class IPC_MESSAGE_EXPORT msg_class : public IPC::Message { \ 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: \ 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef IPC::MessageSchema<IPC_TUPLE_IN_##in_cnt in_list> Schema; \ 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef Schema::Param Param; \ 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum { ID = IPC_MESSAGE_ID() }; \ 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) msg_class(int32 routing_id IPC_COMMA_##in_cnt \ 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_TYPE_IN_##in_cnt in_list); \ 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~msg_class(); \ 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool Read(const Message* msg, Schema::Param* p); \ 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void Log(std::string* name, const Message* msg, std::string* l); \ 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_ASYNC_MESSAGE_METHODS_##in_cnt \ 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_SYNC_CONTROL_DECL(msg_class, in_cnt, out_cnt, in_list, out_list) \ 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class IPC_MESSAGE_EXPORT msg_class : public IPC::SyncMessage { \ 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: \ 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef IPC::SyncMessageSchema<IPC_TUPLE_IN_##in_cnt in_list, \ 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_TUPLE_OUT_##out_cnt out_list> Schema; \ 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef Schema::ReplyParam ReplyParam; \ 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef Schema::SendParam SendParam; \ 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum { ID = IPC_MESSAGE_ID() }; \ 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) msg_class(IPC_TYPE_IN_##in_cnt in_list \ 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_COMMA_AND_##in_cnt(IPC_COMMA_##out_cnt) \ 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_TYPE_OUT_##out_cnt out_list); \ 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~msg_class(); \ 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool ReadSendParam(const Message* msg, Schema::SendParam* p); \ 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool ReadReplyParam( \ 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Message* msg, \ 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TupleTypes<ReplyParam>::ValueTuple* p); \ 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void Log(std::string* name, const Message* msg, std::string* l); \ 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_SYNC_MESSAGE_METHODS_##out_cnt \ 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_SYNC_ROUTED_DECL(msg_class, in_cnt, out_cnt, in_list, out_list) \ 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class IPC_MESSAGE_EXPORT msg_class : public IPC::SyncMessage { \ 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: \ 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef IPC::SyncMessageSchema<IPC_TUPLE_IN_##in_cnt in_list, \ 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_TUPLE_OUT_##out_cnt out_list> Schema; \ 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef Schema::ReplyParam ReplyParam; \ 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef Schema::SendParam SendParam; \ 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum { ID = IPC_MESSAGE_ID() }; \ 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) msg_class(int32 routing_id \ 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_COMMA_OR_##in_cnt(IPC_COMMA_##out_cnt) \ 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_TYPE_IN_##in_cnt in_list \ 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_COMMA_AND_##in_cnt(IPC_COMMA_##out_cnt) \ 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_TYPE_OUT_##out_cnt out_list); \ 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~msg_class(); \ 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool ReadSendParam(const Message* msg, Schema::SendParam* p); \ 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool ReadReplyParam( \ 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Message* msg, \ 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TupleTypes<ReplyParam>::ValueTuple* p); \ 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void Log(std::string* name, const Message* msg, std::string* l); \ 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_SYNC_MESSAGE_METHODS_##out_cnt \ 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(IPC_MESSAGE_IMPL) 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// "Implementation" inclusion produces constructors, destructors, and 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// logging functions, except for the no-arg special cases, where the 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// implementation occurs in the declaration, and there is no special 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// logging function. 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_MESSAGE_EXTRA(sync, kind, msg_class, \ 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) in_cnt, out_cnt, in_list, out_list) \ 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_##sync##_##kind##_IMPL(msg_class, in_cnt, out_cnt, in_list, out_list) \ 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_##sync##_MESSAGE_LOG(msg_class) 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_EMPTY_CONTROL_IMPL(msg_class, in_cnt, out_cnt, in_list, out_list) 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_EMPTY_ROUTED_IMPL(msg_class, in_cnt, out_cnt, in_list, out_list) 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_ASYNC_CONTROL_IMPL(msg_class, in_cnt, out_cnt, in_list, out_list) \ 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) msg_class::msg_class(IPC_TYPE_IN_##in_cnt in_list) : \ 6810f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) IPC::Message(MSG_ROUTING_CONTROL, ID, PRIORITY_NORMAL) { \ 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Schema::Write(this, IPC_NAME_IN_##in_cnt in_list); \ 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } \ 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) msg_class::~msg_class() {} \ 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool msg_class::Read(const Message* msg, Schema::Param* p) { \ 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return Schema::Read(msg, p); \ 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_ASYNC_ROUTED_IMPL(msg_class, in_cnt, out_cnt, in_list, out_list) \ 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) msg_class::msg_class(int32 routing_id IPC_COMMA_##in_cnt \ 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_TYPE_IN_##in_cnt in_list) : \ 6920f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) IPC::Message(routing_id, ID, PRIORITY_NORMAL) { \ 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Schema::Write(this, IPC_NAME_IN_##in_cnt in_list); \ 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } \ 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) msg_class::~msg_class() {} \ 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool msg_class::Read(const Message* msg, Schema::Param* p) { \ 6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return Schema::Read(msg, p); \ 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_SYNC_CONTROL_IMPL(msg_class, in_cnt, out_cnt, in_list, out_list) \ 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) msg_class::msg_class(IPC_TYPE_IN_##in_cnt in_list \ 7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_COMMA_AND_##in_cnt(IPC_COMMA_##out_cnt) \ 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_TYPE_OUT_##out_cnt out_list) : \ 7040f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) IPC::SyncMessage(MSG_ROUTING_CONTROL, ID, PRIORITY_NORMAL, \ 7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new IPC::ParamDeserializer<Schema::ReplyParam>( \ 7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_NAME_OUT_##out_cnt out_list)) { \ 7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Schema::Write(this, IPC_NAME_IN_##in_cnt in_list); \ 7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } \ 7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) msg_class::~msg_class() {} \ 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool msg_class::ReadSendParam(const Message* msg, Schema::SendParam* p) { \ 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return Schema::ReadSendParam(msg, p); \ 7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } \ 7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool msg_class::ReadReplyParam(const Message* msg, \ 7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TupleTypes<ReplyParam>::ValueTuple* p) { \ 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return Schema::ReadReplyParam(msg, p); \ 7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_SYNC_ROUTED_IMPL(msg_class, in_cnt, out_cnt, in_list, out_list) \ 7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) msg_class::msg_class(int32 routing_id \ 7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_COMMA_OR_##in_cnt(IPC_COMMA_##out_cnt) \ 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_TYPE_IN_##in_cnt in_list \ 7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_COMMA_AND_##in_cnt(IPC_COMMA_##out_cnt) \ 7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_TYPE_OUT_##out_cnt out_list) : \ 7240f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) IPC::SyncMessage(routing_id, ID, PRIORITY_NORMAL, \ 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new IPC::ParamDeserializer<Schema::ReplyParam>( \ 7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_NAME_OUT_##out_cnt out_list)) { \ 7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Schema::Write(this, IPC_NAME_IN_##in_cnt in_list); \ 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } \ 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) msg_class::~msg_class() {} \ 7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool msg_class::ReadSendParam(const Message* msg, Schema::SendParam* p) { \ 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return Schema::ReadSendParam(msg, p); \ 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } \ 7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool msg_class::ReadReplyParam(const Message* msg, \ 7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TupleTypes<ReplyParam>::ValueTuple* p) { \ 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return Schema::ReadReplyParam(msg, p); \ 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_EMPTY_MESSAGE_LOG(msg_class) \ 7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void msg_class::Log(std::string* name, \ 7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Message* msg, \ 7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string* l) { \ 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (name) \ 7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *name = #msg_class; \ 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_ASYNC_MESSAGE_LOG(msg_class) \ 7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void msg_class::Log(std::string* name, \ 7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Message* msg, \ 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string* l) { \ 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (name) \ 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *name = #msg_class; \ 7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!msg || !l) \ 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; \ 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Schema::Param p; \ 7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (Schema::Read(msg, &p)) \ 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC::LogParam(p, l); \ 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_SYNC_MESSAGE_LOG(msg_class) \ 7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void msg_class::Log(std::string* name, \ 7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Message* msg, \ 7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string* l) { \ 7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (name) \ 7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *name = #msg_class; \ 7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!msg || !l) \ 7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; \ 7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (msg->is_sync()) { \ 7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TupleTypes<Schema::SendParam>::ValueTuple p; \ 7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (Schema::ReadSendParam(msg, &p)) \ 7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC::LogParam(p, l); \ 7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddOutputParamsToLog(msg, l); \ 7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { \ 7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TupleTypes<Schema::ReplyParam>::ValueTuple p; \ 7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (Schema::ReadReplyParam(msg, &p)) \ 7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC::LogParam(p, l); \ 7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } \ 7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(IPC_MESSAGE_MACROS_LOG_ENABLED) 7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef IPC_LOG_TABLE_ADD_ENTRY 7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#error You need to define IPC_LOG_TABLE_ADD_ENTRY(msg_id, logger) 7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// "Log table" inclusion produces extra logging registration code. 7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_MESSAGE_EXTRA(sync, kind, msg_class, \ 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) in_cnt, out_cnt, in_list, out_list) \ 7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class LoggerRegisterHelper##msg_class { \ 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: \ 7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoggerRegisterHelper##msg_class() { \ 7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint32 msg_id = static_cast<uint32>(msg_class::ID); \ 7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_LOG_TABLE_ADD_ENTRY(msg_id, msg_class::Log); \ 7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } \ 7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; \ 7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoggerRegisterHelper##msg_class g_LoggerRegisterHelper##msg_class; 7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Normal inclusion produces nothing extra. 8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_MESSAGE_EXTRA(sync, kind, msg_class, \ 8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) in_cnt, out_cnt, in_list, out_list) 8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // defined(IPC_MESSAGE_IMPL) 8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Handle variable sized argument lists. These are usually invoked by token 8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// pasting against the argument counts. 8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_TYPE_IN_0() 8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_TYPE_IN_1(t1) const t1& arg1 8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_TYPE_IN_2(t1, t2) const t1& arg1, const t2& arg2 8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_TYPE_IN_3(t1, t2, t3) const t1& arg1, const t2& arg2, const t3& arg3 8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_TYPE_IN_4(t1, t2, t3, t4) const t1& arg1, const t2& arg2, const t3& arg3, const t4& arg4 8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_TYPE_IN_5(t1, t2, t3, t4, t5) const t1& arg1, const t2& arg2, const t3& arg3, const t4& arg4, const t5& arg5 8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_TYPE_OUT_0() 8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_TYPE_OUT_1(t1) t1* arg6 8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_TYPE_OUT_2(t1, t2) t1* arg6, t2* arg7 8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_TYPE_OUT_3(t1, t2, t3) t1* arg6, t2* arg7, t3* arg8 8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_TYPE_OUT_4(t1, t2, t3, t4) t1* arg6, t2* arg7, t3* arg8, t4* arg9 8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_TUPLE_IN_0() Tuple0 8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_TUPLE_IN_1(t1) Tuple1<t1> 8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_TUPLE_IN_2(t1, t2) Tuple2<t1, t2> 8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_TUPLE_IN_3(t1, t2, t3) Tuple3<t1, t2, t3> 8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_TUPLE_IN_4(t1, t2, t3, t4) Tuple4<t1, t2, t3, t4> 8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_TUPLE_IN_5(t1, t2, t3, t4, t5) Tuple5<t1, t2, t3, t4, t5> 8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_TUPLE_OUT_0() Tuple0 8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_TUPLE_OUT_1(t1) Tuple1<t1&> 8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_TUPLE_OUT_2(t1, t2) Tuple2<t1&, t2&> 8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_TUPLE_OUT_3(t1, t2, t3) Tuple3<t1&, t2&, t3&> 8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_TUPLE_OUT_4(t1, t2, t3, t4) Tuple4<t1&, t2&, t3&, t4&> 8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_NAME_IN_0() MakeTuple() 8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_NAME_IN_1(t1) MakeRefTuple(arg1) 8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_NAME_IN_2(t1, t2) MakeRefTuple(arg1, arg2) 8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_NAME_IN_3(t1, t2, t3) MakeRefTuple(arg1, arg2, arg3) 8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_NAME_IN_4(t1, t2, t3, t4) MakeRefTuple(arg1, arg2, arg3, arg4) 8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_NAME_IN_5(t1, t2, t3, t4, t5) MakeRefTuple(arg1, arg2, arg3, arg4, arg5) 8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_NAME_OUT_0() MakeTuple() 8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_NAME_OUT_1(t1) MakeRefTuple(*arg6) 8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_NAME_OUT_2(t1, t2) MakeRefTuple(*arg6, *arg7) 8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_NAME_OUT_3(t1, t2, t3) MakeRefTuple(*arg6, *arg7, *arg8) 8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_NAME_OUT_4(t1, t2, t3, t4) MakeRefTuple(*arg6, *arg7, *arg8, *arg9) 8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// There are places where the syntax requires a comma if there are input args, 8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// if there are input args and output args, or if there are input args or 8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// output args. These macros allow generation of the comma as needed; invoke 8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// by token pasting against the argument counts. 8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_COMMA_0 8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_COMMA_1 , 8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_COMMA_2 , 8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_COMMA_3 , 8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_COMMA_4 , 8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_COMMA_5 , 8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_COMMA_AND_0(x) 8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_COMMA_AND_1(x) x 8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_COMMA_AND_2(x) x 8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_COMMA_AND_3(x) x 8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_COMMA_AND_4(x) x 8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_COMMA_AND_5(x) x 8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_COMMA_OR_0(x) x 8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_COMMA_OR_1(x) , 8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_COMMA_OR_2(x) , 8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_COMMA_OR_3(x) , 8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_COMMA_OR_4(x) , 8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_COMMA_OR_5(x) , 8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Message IDs 8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Note: we currently use __LINE__ to give unique IDs to messages within 8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// a file. They're globally unique since each file defines its own 8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// IPC_MESSAGE_START. 8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_MESSAGE_ID() ((IPC_MESSAGE_START << 16) + __LINE__) 8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_MESSAGE_ID_CLASS(id) ((id) >> 16) 8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_MESSAGE_ID_LINE(id) ((id) & 0xffff) 8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 879cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Message crackers and handlers. Usage: 8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// bool MyClass::OnMessageReceived(const IPC::Message& msg) { 8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// bool handled = true; 883cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// IPC_BEGIN_MESSAGE_MAP(MyClass, msg) 8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// IPC_MESSAGE_HANDLER(MsgClassOne, OnMsgClassOne) 8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ...more handlers here ... 8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// IPC_MESSAGE_HANDLER(MsgClassTen, OnMsgClassTen) 8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// IPC_MESSAGE_UNHANDLED(handled = false) 888cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// IPC_END_MESSAGE_MAP() 8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// return handled; 8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// } 8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_BEGIN_MESSAGE_MAP(class_name, msg) \ 8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { \ 8955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) typedef class_name _IpcMessageHandlerClass ALLOW_UNUSED; \ 896cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) void* param__ = NULL; \ 8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const IPC::Message& ipc_message__ = msg; \ 898cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) switch (ipc_message__.type()) { 899cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 900cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// gcc gives the following error now when using decltype so type typeof there: 901cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// error: identifier 'decltype' will become a keyword in C++0x [-Werror=c++0x-compat] 902cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#if defined(OS_WIN) 903cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#define IPC_DECLTYPE decltype 904cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#else 905cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#define IPC_DECLTYPE typeof 906cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif 907cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 9085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#define IPC_BEGIN_MESSAGE_MAP_WITH_PARAM(class_name, msg, param) \ 9095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) { \ 9105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) typedef class_name _IpcMessageHandlerClass ALLOW_UNUSED; \ 9115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) IPC_DECLTYPE(param) param__ = param; \ 9125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const IPC::Message& ipc_message__ = msg; \ 913cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) switch (ipc_message__.type()) { 9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_MESSAGE_FORWARD(msg_class, obj, member_func) \ 9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case msg_class::ID: { \ 9171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TRACK_RUN_IN_THIS_SCOPED_REGION(member_func); \ 918cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!msg_class::Dispatch(&ipc_message__, obj, this, param__, \ 919cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) &member_func)) \ 920cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ipc_message__.set_dispatch_error(); \ 9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } \ 9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_MESSAGE_HANDLER(msg_class, member_func) \ 9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_FORWARD(msg_class, this, _IpcMessageHandlerClass::member_func) 9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_MESSAGE_FORWARD_DELAY_REPLY(msg_class, obj, member_func) \ 9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case msg_class::ID: { \ 9291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TRACK_RUN_IN_THIS_SCOPED_REGION(member_func); \ 930cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!msg_class::DispatchDelayReply(&ipc_message__, obj, param__, \ 931cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) &member_func)) \ 932cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ipc_message__.set_dispatch_error(); \ 9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } \ 9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_MESSAGE_HANDLER_DELAY_REPLY(msg_class, member_func) \ 9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_FORWARD_DELAY_REPLY(msg_class, this, \ 9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _IpcMessageHandlerClass::member_func) 9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(jar): fix chrome frame to always supply |code| argument. 9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_MESSAGE_HANDLER_GENERIC(msg_class, code) \ 9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case msg_class::ID: { \ 9431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* TRACK_RUN_IN_THIS_SCOPED_REGION(code); TODO(jar) */ \ 9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) code; \ 9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } \ 9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_REPLY_HANDLER(func) \ 9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IPC_REPLY_ID: { \ 9501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TRACK_RUN_IN_THIS_SCOPED_REGION(func); \ 9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) func(ipc_message__); \ 9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } \ 9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_MESSAGE_UNHANDLED(code) \ 9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: { \ 9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) code; \ 9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } \ 9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_MESSAGE_UNHANDLED_ERROR() \ 9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_UNHANDLED(NOTREACHED() << \ 9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Invalid message with type = " << \ 9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ipc_message__.type()) 9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_END_MESSAGE_MAP() \ 9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } \ 9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This corresponds to an enum value from IPCMessageStart. 9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_MESSAGE_CLASS(message) \ 9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_ID_CLASS(message.type()) 9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // IPC_IPC_MESSAGE_MACROS_H_ 9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// The following #ifdef cannot be removed. Although the code is semantically 9784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// equivalent without the #ifdef, VS2013 contains a bug where it is 9794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// over-aggressive in optimizing out #includes. Putting the #ifdef is a 9804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// workaround for this bug. See http://goo.gl/eGt2Fb for more details. 9814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// This can be removed once VS2013 is fixed. 9824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#ifdef IPC_MESSAGE_START 9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Clean up IPC_MESSAGE_START in this unguarded section so that the 9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// XXX_messages.h files need not do so themselves. This makes the 9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// XXX_messages.h files easier to write. 9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef IPC_MESSAGE_START 9874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif 988