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 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// #inlcude "path/to/some_class.h" // Full class declaration 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// #inlcude "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. 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_ASYNC_MESSAGE_METHODS_GENERIC \ 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template<class T, class S, class Method> \ 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool Dispatch(const Message* msg, T* obj, S* sender, Method func) { \ 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Schema::Param p; \ 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (Read(msg, &p)) { \ 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DispatchToMethod(obj, func, p); \ 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; \ 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } \ 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; \ 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_ASYNC_MESSAGE_METHODS_1 \ 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_ASYNC_MESSAGE_METHODS_GENERIC \ 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template<class T, class S, typename TA> \ 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool Dispatch(const Message* msg, T* obj, S* sender, \ 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void (T::*func)(const Message&, TA)) { \ 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Schema::Param p; \ 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (Read(msg, &p)) { \ 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (obj->*func)(*msg, p.a); \ 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; \ 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } \ 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; \ 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_ASYNC_MESSAGE_METHODS_2 \ 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_ASYNC_MESSAGE_METHODS_GENERIC \ 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template<class T, class S, typename TA, typename TB> \ 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool Dispatch(const Message* msg, T* obj, S* sender, \ 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void (T::*func)(const Message&, TA, TB)) { \ 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Schema::Param p; \ 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (Read(msg, &p)) { \ 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (obj->*func)(*msg, p.a, p.b); \ 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; \ 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } \ 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; \ 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } \ 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template<typename TA, typename TB> \ 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool Read(const IPC::Message* msg, TA* a, TB* b) { \ 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Schema::Param p; \ 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!Read(msg, &p)) \ 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; \ 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *a = p.a; \ 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *b = p.b; \ 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; \ 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_ASYNC_MESSAGE_METHODS_3 \ 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_ASYNC_MESSAGE_METHODS_GENERIC \ 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template<class T, class S, typename TA, typename TB, typename TC> \ 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool Dispatch(const Message* msg, T* obj, S* sender, \ 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void (T::*func)(const Message&, TA, TB, TC)) { \ 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Schema::Param p; \ 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (Read(msg, &p)) { \ 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (obj->*func)(*msg, p.a, p.b, p.c); \ 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; \ 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } \ 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; \ 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } \ 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template<typename TA, typename TB, typename TC> \ 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool Read(const IPC::Message* msg, TA* a, TB* b, TC* c) { \ 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Schema::Param p; \ 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!Read(msg, &p)) \ 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; \ 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *a = p.a; \ 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *b = p.b; \ 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *c = p.c; \ 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; \ 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_ASYNC_MESSAGE_METHODS_4 \ 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_ASYNC_MESSAGE_METHODS_GENERIC \ 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template<class T, class S, typename TA, typename TB, typename TC, \ 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename TD> \ 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool Dispatch(const Message* msg, T* obj, S* sender, \ 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void (T::*func)(const Message&, TA, TB, TC, TD)) { \ 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Schema::Param p; \ 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (Read(msg, &p)) { \ 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (obj->*func)(*msg, p.a, p.b, p.c, p.d); \ 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; \ 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } \ 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; \ 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } \ 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template<typename TA, typename TB, typename TC, typename TD> \ 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool Read(const IPC::Message* msg, TA* a, TB* b, TC* c, TD* d) { \ 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Schema::Param p; \ 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!Read(msg, &p)) \ 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; \ 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *a = p.a; \ 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *b = p.b; \ 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *c = p.c; \ 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *d = p.d; \ 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; \ 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_ASYNC_MESSAGE_METHODS_5 \ 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_ASYNC_MESSAGE_METHODS_GENERIC \ 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template<class T, class S, typename TA, typename TB, typename TC, \ 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename TD, typename TE> \ 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool Dispatch(const Message* msg, T* obj, S* sender, \ 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void (T::*func)(const Message&, TA, TB, TC, TD, TE)) { \ 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Schema::Param p; \ 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (Read(msg, &p)) { \ 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (obj->*func)(*msg, p.a, p.b, p.c, p.d, p.e); \ 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; \ 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } \ 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; \ 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } \ 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template<typename TA, typename TB, typename TC, typename TD, typename TE> \ 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool Read(const IPC::Message* msg, TA* a, TB* b, TC* c, TD* d, \ 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TE* e) { \ 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Schema::Param p; \ 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!Read(msg, &p)) \ 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; \ 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *a = p.a; \ 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *b = p.b; \ 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *c = p.c; \ 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *d = p.d; \ 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *e = p.e; \ 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; \ 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The following macros define the common set of methods provided by SYNC 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// message classes. 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_SYNC_MESSAGE_METHODS_GENERIC \ 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template<class T, class S, class Method> \ 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool Dispatch(const Message* msg, T* obj, S* sender, Method func) { \ 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Schema::SendParam send_params; \ 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool ok = ReadSendParam(msg, &send_params); \ 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return Schema::DispatchWithSendParams(ok, send_params, msg, obj, sender, \ 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) func); \ 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } \ 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template<class T, class Method> \ 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool DispatchDelayReply(const Message* msg, T* obj, Method func) { \ 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Schema::SendParam send_params; \ 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool ok = ReadSendParam(msg, &send_params); \ 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return Schema::DispatchDelayReplyWithSendParams(ok, send_params, msg, \ 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) obj, func); \ 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_SYNC_MESSAGE_METHODS_0 \ 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_SYNC_MESSAGE_METHODS_GENERIC 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_SYNC_MESSAGE_METHODS_1 \ 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_SYNC_MESSAGE_METHODS_GENERIC \ 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template<typename TA> \ 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void WriteReplyParams(Message* reply, TA a) { \ 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Schema::WriteReplyParams(reply, a); \ 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_SYNC_MESSAGE_METHODS_2 \ 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_SYNC_MESSAGE_METHODS_GENERIC \ 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template<typename TA, typename TB> \ 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void WriteReplyParams(Message* reply, TA a, TB b) { \ 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Schema::WriteReplyParams(reply, a, b); \ 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_SYNC_MESSAGE_METHODS_3 \ 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_SYNC_MESSAGE_METHODS_GENERIC \ 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template<typename TA, typename TB, typename TC> \ 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void WriteReplyParams(Message* reply, TA a, TB b, TC c) { \ 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Schema::WriteReplyParams(reply, a, b, c); \ 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_SYNC_MESSAGE_METHODS_4 \ 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_SYNC_MESSAGE_METHODS_GENERIC \ 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template<typename TA, typename TB, typename TC, typename TD> \ 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void WriteReplyParams(Message* reply, TA a, TB b, TC c, TD d) { \ 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Schema::WriteReplyParams(reply, a, b, c, d); \ 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_SYNC_MESSAGE_METHODS_5 \ 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_SYNC_MESSAGE_METHODS_GENERIC \ 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template<typename TA, typename TB, typename TC, typename TD, typename TE> \ 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void WriteReplyParams(Message* reply, TA a, TB b, TC c, TD d, TE e) { \ 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Schema::WriteReplyParams(reply, a, b, c, d, e); \ 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Common message macro which dispatches into one of the 6 (sync x kind) 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// routines. There is a way that these 6 cases can be lumped together, 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// but the macros get very complicated in that case. 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Note: intended be redefined to generate other information. 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_MESSAGE_DECL(sync, kind, msg_class, \ 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) in_cnt, out_cnt, in_list, out_list) \ 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_##sync##_##kind##_DECL(msg_class, in_cnt, out_cnt, in_list, out_list) \ 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_EXTRA(sync, kind, msg_class, in_cnt, out_cnt, in_list, out_list) 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_EMPTY_CONTROL_DECL(msg_class, in_cnt, out_cnt, in_list, out_list) \ 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class IPC_MESSAGE_EXPORT msg_class : public IPC::Message { \ 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: \ 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef IPC::Message Schema; \ 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum { ID = IPC_MESSAGE_ID() }; \ 6170f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) msg_class() : IPC::Message(MSG_ROUTING_CONTROL, ID, PRIORITY_NORMAL) {} \ 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void Log(std::string* name, const Message* msg, std::string* l); \ 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_EMPTY_ROUTED_DECL(msg_class, in_cnt, out_cnt, in_list, out_list) \ 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class IPC_MESSAGE_EXPORT msg_class : public IPC::Message { \ 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: \ 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef IPC::Message Schema; \ 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum { ID = IPC_MESSAGE_ID() }; \ 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) msg_class(int32 routing_id) \ 6270f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) : IPC::Message(routing_id, ID, PRIORITY_NORMAL) {} \ 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void Log(std::string* name, const Message* msg, std::string* l); \ 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_ASYNC_CONTROL_DECL(msg_class, in_cnt, out_cnt, in_list, out_list) \ 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class IPC_MESSAGE_EXPORT msg_class : public IPC::Message { \ 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: \ 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef IPC::MessageSchema<IPC_TUPLE_IN_##in_cnt in_list> Schema; \ 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef Schema::Param Param; \ 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum { ID = IPC_MESSAGE_ID() }; \ 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) msg_class(IPC_TYPE_IN_##in_cnt in_list); \ 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~msg_class(); \ 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool Read(const Message* msg, Schema::Param* p); \ 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void Log(std::string* name, const Message* msg, std::string* l); \ 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_ASYNC_MESSAGE_METHODS_##in_cnt \ 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_ASYNC_ROUTED_DECL(msg_class, in_cnt, out_cnt, in_list, out_list) \ 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class IPC_MESSAGE_EXPORT msg_class : public IPC::Message { \ 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: \ 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef IPC::MessageSchema<IPC_TUPLE_IN_##in_cnt in_list> Schema; \ 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef Schema::Param Param; \ 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum { ID = IPC_MESSAGE_ID() }; \ 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) msg_class(int32 routing_id IPC_COMMA_##in_cnt \ 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_TYPE_IN_##in_cnt in_list); \ 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~msg_class(); \ 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool Read(const Message* msg, Schema::Param* p); \ 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void Log(std::string* name, const Message* msg, std::string* l); \ 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_ASYNC_MESSAGE_METHODS_##in_cnt \ 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_SYNC_CONTROL_DECL(msg_class, in_cnt, out_cnt, in_list, out_list) \ 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class IPC_MESSAGE_EXPORT msg_class : public IPC::SyncMessage { \ 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: \ 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef IPC::SyncMessageSchema<IPC_TUPLE_IN_##in_cnt in_list, \ 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_TUPLE_OUT_##out_cnt out_list> Schema; \ 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef Schema::ReplyParam ReplyParam; \ 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef Schema::SendParam SendParam; \ 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum { ID = IPC_MESSAGE_ID() }; \ 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) msg_class(IPC_TYPE_IN_##in_cnt in_list \ 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_COMMA_AND_##in_cnt(IPC_COMMA_##out_cnt) \ 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_TYPE_OUT_##out_cnt out_list); \ 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~msg_class(); \ 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool ReadSendParam(const Message* msg, Schema::SendParam* p); \ 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool ReadReplyParam( \ 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Message* msg, \ 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TupleTypes<ReplyParam>::ValueTuple* p); \ 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void Log(std::string* name, const Message* msg, std::string* l); \ 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_SYNC_MESSAGE_METHODS_##out_cnt \ 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_SYNC_ROUTED_DECL(msg_class, in_cnt, out_cnt, in_list, out_list) \ 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class IPC_MESSAGE_EXPORT msg_class : public IPC::SyncMessage { \ 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: \ 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef IPC::SyncMessageSchema<IPC_TUPLE_IN_##in_cnt in_list, \ 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_TUPLE_OUT_##out_cnt out_list> Schema; \ 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef Schema::ReplyParam ReplyParam; \ 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef Schema::SendParam SendParam; \ 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum { ID = IPC_MESSAGE_ID() }; \ 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) msg_class(int32 routing_id \ 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_COMMA_OR_##in_cnt(IPC_COMMA_##out_cnt) \ 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_TYPE_IN_##in_cnt in_list \ 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_COMMA_AND_##in_cnt(IPC_COMMA_##out_cnt) \ 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_TYPE_OUT_##out_cnt out_list); \ 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~msg_class(); \ 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool ReadSendParam(const Message* msg, Schema::SendParam* p); \ 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool ReadReplyParam( \ 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Message* msg, \ 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TupleTypes<ReplyParam>::ValueTuple* p); \ 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void Log(std::string* name, const Message* msg, std::string* l); \ 6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_SYNC_MESSAGE_METHODS_##out_cnt \ 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(IPC_MESSAGE_IMPL) 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// "Implementation" inclusion produces constructors, destructors, and 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// logging functions, except for the no-arg special cases, where the 7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// implementation occurs in the declaration, and there is no special 7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// logging function. 7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_MESSAGE_EXTRA(sync, kind, msg_class, \ 7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) in_cnt, out_cnt, in_list, out_list) \ 7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_##sync##_##kind##_IMPL(msg_class, in_cnt, out_cnt, in_list, out_list) \ 7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_##sync##_MESSAGE_LOG(msg_class) 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_EMPTY_CONTROL_IMPL(msg_class, in_cnt, out_cnt, in_list, out_list) 7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_EMPTY_ROUTED_IMPL(msg_class, in_cnt, out_cnt, in_list, out_list) 7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_ASYNC_CONTROL_IMPL(msg_class, in_cnt, out_cnt, in_list, out_list) \ 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) msg_class::msg_class(IPC_TYPE_IN_##in_cnt in_list) : \ 7160f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) IPC::Message(MSG_ROUTING_CONTROL, ID, PRIORITY_NORMAL) { \ 7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Schema::Write(this, IPC_NAME_IN_##in_cnt in_list); \ 7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } \ 7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) msg_class::~msg_class() {} \ 7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool msg_class::Read(const Message* msg, Schema::Param* p) { \ 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return Schema::Read(msg, p); \ 7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_ASYNC_ROUTED_IMPL(msg_class, in_cnt, out_cnt, in_list, out_list) \ 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) msg_class::msg_class(int32 routing_id IPC_COMMA_##in_cnt \ 7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_TYPE_IN_##in_cnt in_list) : \ 7270f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) IPC::Message(routing_id, ID, PRIORITY_NORMAL) { \ 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Schema::Write(this, IPC_NAME_IN_##in_cnt in_list); \ 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } \ 7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) msg_class::~msg_class() {} \ 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool msg_class::Read(const Message* msg, Schema::Param* p) { \ 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return Schema::Read(msg, p); \ 7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_SYNC_CONTROL_IMPL(msg_class, in_cnt, out_cnt, in_list, out_list) \ 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) msg_class::msg_class(IPC_TYPE_IN_##in_cnt in_list \ 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_COMMA_AND_##in_cnt(IPC_COMMA_##out_cnt) \ 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_TYPE_OUT_##out_cnt out_list) : \ 7390f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) IPC::SyncMessage(MSG_ROUTING_CONTROL, ID, PRIORITY_NORMAL, \ 7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new IPC::ParamDeserializer<Schema::ReplyParam>( \ 7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_NAME_OUT_##out_cnt out_list)) { \ 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Schema::Write(this, IPC_NAME_IN_##in_cnt in_list); \ 7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } \ 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) msg_class::~msg_class() {} \ 7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool msg_class::ReadSendParam(const Message* msg, Schema::SendParam* p) { \ 7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return Schema::ReadSendParam(msg, p); \ 7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } \ 7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool msg_class::ReadReplyParam(const Message* msg, \ 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TupleTypes<ReplyParam>::ValueTuple* p) { \ 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return Schema::ReadReplyParam(msg, p); \ 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_SYNC_ROUTED_IMPL(msg_class, in_cnt, out_cnt, in_list, out_list) \ 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) msg_class::msg_class(int32 routing_id \ 7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_COMMA_OR_##in_cnt(IPC_COMMA_##out_cnt) \ 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_TYPE_IN_##in_cnt in_list \ 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_COMMA_AND_##in_cnt(IPC_COMMA_##out_cnt) \ 7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_TYPE_OUT_##out_cnt out_list) : \ 7590f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) IPC::SyncMessage(routing_id, ID, PRIORITY_NORMAL, \ 7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new IPC::ParamDeserializer<Schema::ReplyParam>( \ 7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_NAME_OUT_##out_cnt out_list)) { \ 7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Schema::Write(this, IPC_NAME_IN_##in_cnt in_list); \ 7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } \ 7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) msg_class::~msg_class() {} \ 7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool msg_class::ReadSendParam(const Message* msg, Schema::SendParam* p) { \ 7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return Schema::ReadSendParam(msg, p); \ 7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } \ 7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool msg_class::ReadReplyParam(const Message* msg, \ 7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TupleTypes<ReplyParam>::ValueTuple* p) { \ 7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return Schema::ReadReplyParam(msg, p); \ 7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_EMPTY_MESSAGE_LOG(msg_class) \ 7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void msg_class::Log(std::string* name, \ 7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Message* msg, \ 7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string* l) { \ 7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (name) \ 7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *name = #msg_class; \ 7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_ASYNC_MESSAGE_LOG(msg_class) \ 7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void msg_class::Log(std::string* name, \ 7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Message* msg, \ 7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string* l) { \ 7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (name) \ 7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *name = #msg_class; \ 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!msg || !l) \ 7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; \ 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Schema::Param p; \ 7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (Schema::Read(msg, &p)) \ 7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC::LogParam(p, l); \ 7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_SYNC_MESSAGE_LOG(msg_class) \ 7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void msg_class::Log(std::string* name, \ 7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Message* msg, \ 7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string* l) { \ 7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (name) \ 7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *name = #msg_class; \ 8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!msg || !l) \ 8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; \ 8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (msg->is_sync()) { \ 8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TupleTypes<Schema::SendParam>::ValueTuple p; \ 8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (Schema::ReadSendParam(msg, &p)) \ 8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC::LogParam(p, l); \ 8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddOutputParamsToLog(msg, l); \ 8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { \ 8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TupleTypes<Schema::ReplyParam>::ValueTuple p; \ 8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (Schema::ReadReplyParam(msg, &p)) \ 8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC::LogParam(p, l); \ 8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } \ 8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(IPC_MESSAGE_MACROS_LOG_ENABLED) 8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef IPC_LOG_TABLE_ADD_ENTRY 8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#error You need to define IPC_LOG_TABLE_ADD_ENTRY(msg_id, logger) 8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// "Log table" inclusion produces extra logging registration code. 8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_MESSAGE_EXTRA(sync, kind, msg_class, \ 8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) in_cnt, out_cnt, in_list, out_list) \ 8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class LoggerRegisterHelper##msg_class { \ 8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: \ 8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoggerRegisterHelper##msg_class() { \ 8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint32 msg_id = static_cast<uint32>(msg_class::ID); \ 8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_LOG_TABLE_ADD_ENTRY(msg_id, msg_class::Log); \ 8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } \ 8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; \ 8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoggerRegisterHelper##msg_class g_LoggerRegisterHelper##msg_class; 8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Normal inclusion produces nothing extra. 8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_MESSAGE_EXTRA(sync, kind, msg_class, \ 8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) in_cnt, out_cnt, in_list, out_list) 8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // defined(IPC_MESSAGE_IMPL) 8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Handle variable sized argument lists. These are usually invoked by token 8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// pasting against the argument counts. 8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_TYPE_IN_0() 8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_TYPE_IN_1(t1) const t1& arg1 8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_TYPE_IN_2(t1, t2) const t1& arg1, const t2& arg2 8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_TYPE_IN_3(t1, t2, t3) const t1& arg1, const t2& arg2, const t3& arg3 8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_TYPE_IN_4(t1, t2, t3, t4) const t1& arg1, const t2& arg2, const t3& arg3, const t4& arg4 8475821806d5e7f356e8fa4b058a389a808ea183019Torne (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 8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_TYPE_OUT_0() 8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_TYPE_OUT_1(t1) t1* arg6 8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_TYPE_OUT_2(t1, t2) t1* arg6, t2* arg7 8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_TYPE_OUT_3(t1, t2, t3) t1* arg6, t2* arg7, t3* arg8 8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_TYPE_OUT_4(t1, t2, t3, t4) t1* arg6, t2* arg7, t3* arg8, t4* arg9 8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_TUPLE_IN_0() Tuple0 8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_TUPLE_IN_1(t1) Tuple1<t1> 8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_TUPLE_IN_2(t1, t2) Tuple2<t1, t2> 8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_TUPLE_IN_3(t1, t2, t3) Tuple3<t1, t2, t3> 8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_TUPLE_IN_4(t1, t2, t3, t4) Tuple4<t1, t2, t3, t4> 8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_TUPLE_IN_5(t1, t2, t3, t4, t5) Tuple5<t1, t2, t3, t4, t5> 8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_TUPLE_OUT_0() Tuple0 8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_TUPLE_OUT_1(t1) Tuple1<t1&> 8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_TUPLE_OUT_2(t1, t2) Tuple2<t1&, t2&> 8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_TUPLE_OUT_3(t1, t2, t3) Tuple3<t1&, t2&, t3&> 8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_TUPLE_OUT_4(t1, t2, t3, t4) Tuple4<t1&, t2&, t3&, t4&> 8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_NAME_IN_0() MakeTuple() 8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_NAME_IN_1(t1) MakeRefTuple(arg1) 8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_NAME_IN_2(t1, t2) MakeRefTuple(arg1, arg2) 8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_NAME_IN_3(t1, t2, t3) MakeRefTuple(arg1, arg2, arg3) 8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_NAME_IN_4(t1, t2, t3, t4) MakeRefTuple(arg1, arg2, arg3, arg4) 8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_NAME_IN_5(t1, t2, t3, t4, t5) MakeRefTuple(arg1, arg2, arg3, arg4, arg5) 8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_NAME_OUT_0() MakeTuple() 8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_NAME_OUT_1(t1) MakeRefTuple(*arg6) 8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_NAME_OUT_2(t1, t2) MakeRefTuple(*arg6, *arg7) 8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_NAME_OUT_3(t1, t2, t3) MakeRefTuple(*arg6, *arg7, *arg8) 8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_NAME_OUT_4(t1, t2, t3, t4) MakeRefTuple(*arg6, *arg7, *arg8, *arg9) 8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// There are places where the syntax requires a comma if there are input args, 8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// if there are input args and output args, or if there are input args or 8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// output args. These macros allow generation of the comma as needed; invoke 8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// by token pasting against the argument counts. 8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_COMMA_0 8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_COMMA_1 , 8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_COMMA_2 , 8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_COMMA_3 , 8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_COMMA_4 , 8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_COMMA_5 , 8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_COMMA_AND_0(x) 8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_COMMA_AND_1(x) x 8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_COMMA_AND_2(x) x 8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_COMMA_AND_3(x) x 8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_COMMA_AND_4(x) x 8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_COMMA_AND_5(x) x 8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_COMMA_OR_0(x) x 9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_COMMA_OR_1(x) , 9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_COMMA_OR_2(x) , 9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_COMMA_OR_3(x) , 9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_COMMA_OR_4(x) , 9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_COMMA_OR_5(x) , 9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Message IDs 9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Note: we currently use __LINE__ to give unique IDs to messages within 9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// a file. They're globally unique since each file defines its own 9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// IPC_MESSAGE_START. 9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_MESSAGE_ID() ((IPC_MESSAGE_START << 16) + __LINE__) 9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_MESSAGE_ID_CLASS(id) ((id) >> 16) 9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_MESSAGE_ID_LINE(id) ((id) & 0xffff) 9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Message crackers and handlers. 9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Prefer to use the IPC_BEGIN_MESSAGE_MAP_EX to the older macros since they 9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// allow you to detect when a message could not be de-serialized. Usage: 9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// bool MyClass::OnMessageReceived(const IPC::Message& msg) { 9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// bool handled = true; 9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// bool msg_is_good = false; 9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// IPC_BEGIN_MESSAGE_MAP_EX(MyClass, msg, msg_is_good) 9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// IPC_MESSAGE_HANDLER(MsgClassOne, OnMsgClassOne) 9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ...more handlers here ... 9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// IPC_MESSAGE_HANDLER(MsgClassTen, OnMsgClassTen) 9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// IPC_MESSAGE_UNHANDLED(handled = false) 9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// IPC_END_MESSAGE_MAP_EX() 9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// if (!msg_is_good) { 9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// // Signal error here or terminate offending process. 9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// } 9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// return handled; 9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// } 9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_BEGIN_MESSAGE_MAP_EX(class_name, msg, msg_is_ok) \ 9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { \ 9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef class_name _IpcMessageHandlerClass; \ 9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const IPC::Message& ipc_message__ = msg; \ 9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool& msg_is_ok__ = msg_is_ok; \ 9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (ipc_message__.type()) { \ 9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_BEGIN_MESSAGE_MAP(class_name, msg) \ 9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { \ 9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef class_name _IpcMessageHandlerClass; \ 9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const IPC::Message& ipc_message__ = msg; \ 9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool msg_is_ok__ = true; \ 9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (ipc_message__.type()) { \ 9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_MESSAGE_FORWARD(msg_class, obj, member_func) \ 9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case msg_class::ID: { \ 9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TRACK_RUN_IN_IPC_HANDLER(member_func); \ 9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) msg_is_ok__ = msg_class::Dispatch(&ipc_message__, obj, this, \ 9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &member_func); \ 9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } \ 9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_MESSAGE_HANDLER(msg_class, member_func) \ 9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_FORWARD(msg_class, this, _IpcMessageHandlerClass::member_func) 9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_MESSAGE_FORWARD_DELAY_REPLY(msg_class, obj, member_func) \ 9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case msg_class::ID: { \ 9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TRACK_RUN_IN_IPC_HANDLER(member_func); \ 9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) msg_is_ok__ = msg_class::DispatchDelayReply(&ipc_message__, obj, \ 9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &member_func); \ 9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } \ 9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_MESSAGE_HANDLER_DELAY_REPLY(msg_class, member_func) \ 9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_FORWARD_DELAY_REPLY(msg_class, this, \ 9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _IpcMessageHandlerClass::member_func) 9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(jar): fix chrome frame to always supply |code| argument. 9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_MESSAGE_HANDLER_GENERIC(msg_class, code) \ 9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case msg_class::ID: { \ 9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* TRACK_RUN_IN_IPC_HANDLER(code); TODO(jar) */ \ 9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) code; \ 9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } \ 9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_REPLY_HANDLER(func) \ 9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IPC_REPLY_ID: { \ 9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TRACK_RUN_IN_IPC_HANDLER(func); \ 9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) func(ipc_message__); \ 9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } \ 9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_MESSAGE_UNHANDLED(code) \ 9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: { \ 9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) code; \ 9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } \ 9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_MESSAGE_UNHANDLED_ERROR() \ 9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_UNHANDLED(NOTREACHED() << \ 9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Invalid message with type = " << \ 9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ipc_message__.type()) 9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_END_MESSAGE_MAP() \ 9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } \ 10001e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) DCHECK(msg_is_ok__); \ 10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_END_MESSAGE_MAP_EX() \ 10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } \ 10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This corresponds to an enum value from IPCMessageStart. 10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_MESSAGE_CLASS(message) \ 10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_ID_CLASS(message.type()) 10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // IPC_IPC_MESSAGE_MACROS_H_ 10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// The following #ifdef cannot be removed. Although the code is semantically 10144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// equivalent without the #ifdef, VS2013 contains a bug where it is 10154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// over-aggressive in optimizing out #includes. Putting the #ifdef is a 10164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// workaround for this bug. See http://goo.gl/eGt2Fb for more details. 10174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// This can be removed once VS2013 is fixed. 10184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#ifdef IPC_MESSAGE_START 10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Clean up IPC_MESSAGE_START in this unguarded section so that the 10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// XXX_messages.h files need not do so themselves. This makes the 10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// XXX_messages.h files easier to write. 10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef IPC_MESSAGE_START 10234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif 1024