Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(442)

Side by Side Diff: ipc/ipc_message_macros.h

Issue 283623002: Add support for passing an arbitrary parameter to an IPC message handler. The motivation is for Web… (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: sync Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « ipc/ipc_message.h ('k') | ipc/ipc_message_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 // Defining IPC Messages 5 // Defining IPC Messages
6 // 6 //
7 // Your IPC messages will be defined by macros inside of an XXX_messages.h 7 // Your IPC messages will be defined by macros inside of an XXX_messages.h
8 // header file. Most of the time, the system can automatically generate all 8 // header file. Most of the time, the system can automatically generate all
9 // of messaging mechanism from these definitions, but sometimes some manual 9 // of messaging mechanism from these definitions, but sometimes some manual
10 // coding is required. In these cases, you will also have an XXX_messages.cc 10 // coding is required. In these cases, you will also have an XXX_messages.cc
(...skipping 416 matching lines...) Expand 10 before | Expand all | Expand 10 after
427 IPC_MESSAGE_DECL(SYNC, ROUTED, msg_class, 5, 1, (type1_in, type2_in, type3_in, type4_in, type5_in), (type1_out)) 427 IPC_MESSAGE_DECL(SYNC, ROUTED, msg_class, 5, 1, (type1_in, type2_in, type3_in, type4_in, type5_in), (type1_out))
428 428
429 #define IPC_SYNC_MESSAGE_ROUTED5_2(msg_class, type1_in, type2_in, type3_in, type 4_in, type5_in, type1_out, type2_out) \ 429 #define IPC_SYNC_MESSAGE_ROUTED5_2(msg_class, type1_in, type2_in, type3_in, type 4_in, type5_in, type1_out, type2_out) \
430 IPC_MESSAGE_DECL(SYNC, ROUTED, msg_class, 5, 2, (type1_in, type2_in, type3_in, type4_in, type5_in), (type1_out, type2_out)) 430 IPC_MESSAGE_DECL(SYNC, ROUTED, msg_class, 5, 2, (type1_in, type2_in, type3_in, type4_in, type5_in), (type1_out, type2_out))
431 431
432 #define IPC_SYNC_MESSAGE_ROUTED5_3(msg_class, type1_in, type2_in, type3_in, type 4_in, type5_in, type1_out, type2_out, type3_out) \ 432 #define IPC_SYNC_MESSAGE_ROUTED5_3(msg_class, type1_in, type2_in, type3_in, type 4_in, type5_in, type1_out, type2_out, type3_out) \
433 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)) 433 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))
434 434
435 // The following macros define the common set of methods provided by ASYNC 435 // The following macros define the common set of methods provided by ASYNC
436 // message classes. 436 // message classes.
437 // This macro is for all the async IPCs that don't pass an extra parameter using
438 // IPC_BEGIN_MESSAGE_MAP_WITH_PARAM.
437 #define IPC_ASYNC_MESSAGE_METHODS_GENERIC \ 439 #define IPC_ASYNC_MESSAGE_METHODS_GENERIC \
438 template<class T, class S, class Method> \ 440 template<class T, class S, class P, class Method> \
439 static bool Dispatch(const Message* msg, T* obj, S* sender, Method func) { \ 441 static bool Dispatch(const Message* msg, T* obj, S* sender, P* parameter, \
442 Method func) { \
440 Schema::Param p; \ 443 Schema::Param p; \
441 if (Read(msg, &p)) { \ 444 if (Read(msg, &p)) { \
442 DispatchToMethod(obj, func, p); \ 445 DispatchToMethod(obj, func, p); \
443 return true; \ 446 return true; \
444 } \ 447 } \
445 return false; \ 448 return false; \
446 } 449 }
450
451 // The following macros are for for async IPCs which have a dispatcher with an
452 // extra parameter specified using IPC_BEGIN_MESSAGE_MAP_WITH_PARAM.
447 #define IPC_ASYNC_MESSAGE_METHODS_1 \ 453 #define IPC_ASYNC_MESSAGE_METHODS_1 \
448 IPC_ASYNC_MESSAGE_METHODS_GENERIC \ 454 IPC_ASYNC_MESSAGE_METHODS_GENERIC \
449 template<class T, class S, typename TA> \ 455 template<class T, class S, class P, typename TA> \
450 static bool Dispatch(const Message* msg, T* obj, S* sender, \ 456 static bool Dispatch(const Message* msg, T* obj, S* sender, P* parameter, \
451 void (T::*func)(const Message&, TA)) { \ 457 void (T::*func)(P*, TA)) { \
452 Schema::Param p; \ 458 Schema::Param p; \
453 if (Read(msg, &p)) { \ 459 if (Read(msg, &p)) { \
454 (obj->*func)(*msg, p.a); \ 460 (obj->*func)(parameter, p.a); \
455 return true; \ 461 return true; \
456 } \ 462 } \
457 return false; \ 463 return false; \
458 } 464 }
459 #define IPC_ASYNC_MESSAGE_METHODS_2 \ 465 #define IPC_ASYNC_MESSAGE_METHODS_2 \
460 IPC_ASYNC_MESSAGE_METHODS_GENERIC \ 466 IPC_ASYNC_MESSAGE_METHODS_GENERIC \
461 template<class T, class S, typename TA, typename TB> \ 467 template<class T, class S, class P, typename TA, typename TB> \
462 static bool Dispatch(const Message* msg, T* obj, S* sender, \ 468 static bool Dispatch(const Message* msg, T* obj, S* sender, P* parameter, \
463 void (T::*func)(const Message&, TA, TB)) { \ 469 void (T::*func)(P*, TA, TB)) { \
464 Schema::Param p; \ 470 Schema::Param p; \
465 if (Read(msg, &p)) { \ 471 if (Read(msg, &p)) { \
466 (obj->*func)(*msg, p.a, p.b); \ 472 (obj->*func)(parameter, p.a, p.b); \
467 return true; \ 473 return true; \
468 } \ 474 } \
469 return false; \ 475 return false; \
470 } \
471 template<typename TA, typename TB> \
472 static bool Read(const IPC::Message* msg, TA* a, TB* b) { \
473 Schema::Param p; \
474 if (!Read(msg, &p)) \
475 return false; \
476 *a = p.a; \
477 *b = p.b; \
478 return true; \
479 } 476 }
480 #define IPC_ASYNC_MESSAGE_METHODS_3 \ 477 #define IPC_ASYNC_MESSAGE_METHODS_3 \
481 IPC_ASYNC_MESSAGE_METHODS_GENERIC \ 478 IPC_ASYNC_MESSAGE_METHODS_GENERIC \
482 template<class T, class S, typename TA, typename TB, typename TC> \ 479 template<class T, class S, class P, typename TA, typename TB, typename TC> \
483 static bool Dispatch(const Message* msg, T* obj, S* sender, \ 480 static bool Dispatch(const Message* msg, T* obj, S* sender, P* parameter, \
484 void (T::*func)(const Message&, TA, TB, TC)) { \ 481 void (T::*func)(P*, TA, TB, TC)) { \
485 Schema::Param p; \ 482 Schema::Param p; \
486 if (Read(msg, &p)) { \ 483 if (Read(msg, &p)) { \
487 (obj->*func)(*msg, p.a, p.b, p.c); \ 484 (obj->*func)(parameter, p.a, p.b, p.c); \
488 return true; \ 485 return true; \
489 } \ 486 } \
490 return false; \ 487 return false; \
491 } \
492 template<typename TA, typename TB, typename TC> \
493 static bool Read(const IPC::Message* msg, TA* a, TB* b, TC* c) { \
494 Schema::Param p; \
495 if (!Read(msg, &p)) \
496 return false; \
497 *a = p.a; \
498 *b = p.b; \
499 *c = p.c; \
500 return true; \
501 } 488 }
502 #define IPC_ASYNC_MESSAGE_METHODS_4 \ 489 #define IPC_ASYNC_MESSAGE_METHODS_4 \
503 IPC_ASYNC_MESSAGE_METHODS_GENERIC \ 490 IPC_ASYNC_MESSAGE_METHODS_GENERIC \
504 template<class T, class S, typename TA, typename TB, typename TC, \ 491 template<class T, class S, class P, typename TA, typename TB, typename TC, \
505 typename TD> \ 492 typename TD> \
506 static bool Dispatch(const Message* msg, T* obj, S* sender, \ 493 static bool Dispatch(const Message* msg, T* obj, S* sender, P* parameter, \
507 void (T::*func)(const Message&, TA, TB, TC, TD)) { \ 494 void (T::*func)(P*, TA, TB, TC, TD)) { \
508 Schema::Param p; \ 495 Schema::Param p; \
509 if (Read(msg, &p)) { \ 496 if (Read(msg, &p)) { \
510 (obj->*func)(*msg, p.a, p.b, p.c, p.d); \ 497 (obj->*func)(parameter, p.a, p.b, p.c, p.d); \
511 return true; \ 498 return true; \
512 } \ 499 } \
513 return false; \ 500 return false; \
514 } \
515 template<typename TA, typename TB, typename TC, typename TD> \
516 static bool Read(const IPC::Message* msg, TA* a, TB* b, TC* c, TD* d) { \
517 Schema::Param p; \
518 if (!Read(msg, &p)) \
519 return false; \
520 *a = p.a; \
521 *b = p.b; \
522 *c = p.c; \
523 *d = p.d; \
524 return true; \
525 } 501 }
526 #define IPC_ASYNC_MESSAGE_METHODS_5 \ 502 #define IPC_ASYNC_MESSAGE_METHODS_5 \
527 IPC_ASYNC_MESSAGE_METHODS_GENERIC \ 503 IPC_ASYNC_MESSAGE_METHODS_GENERIC \
528 template<class T, class S, typename TA, typename TB, typename TC, \ 504 template<class T, class S, class P, typename TA, typename TB, typename TC, \
529 typename TD, typename TE> \ 505 typename TD, typename TE> \
530 static bool Dispatch(const Message* msg, T* obj, S* sender, \ 506 static bool Dispatch(const Message* msg, T* obj, S* sender, P* parameter, \
531 void (T::*func)(const Message&, TA, TB, TC, TD, TE)) { \ 507 void (T::*func)(P*, TA, TB, TC, TD, TE)) { \
532 Schema::Param p; \ 508 Schema::Param p; \
533 if (Read(msg, &p)) { \ 509 if (Read(msg, &p)) { \
534 (obj->*func)(*msg, p.a, p.b, p.c, p.d, p.e); \ 510 (obj->*func)(parameter, p.a, p.b, p.c, p.d, p.e); \
535 return true; \ 511 return true; \
536 } \ 512 } \
537 return false; \ 513 return false; \
538 } \
539 template<typename TA, typename TB, typename TC, typename TD, typename TE> \
540 static bool Read(const IPC::Message* msg, TA* a, TB* b, TC* c, TD* d, \
541 TE* e) { \
542 Schema::Param p; \
543 if (!Read(msg, &p)) \
544 return false; \
545 *a = p.a; \
546 *b = p.b; \
547 *c = p.c; \
548 *d = p.d; \
549 *e = p.e; \
550 return true; \
551 } 514 }
552 515
553 // The following macros define the common set of methods provided by SYNC 516 // The following macros define the common set of methods provided by SYNC
554 // message classes. 517 // message classes.
555 #define IPC_SYNC_MESSAGE_METHODS_GENERIC \ 518 #define IPC_SYNC_MESSAGE_METHODS_GENERIC \
556 template<class T, class S, class Method> \ 519 template<class T, class S, class P, class Method> \
557 static bool Dispatch(const Message* msg, T* obj, S* sender, Method func) { \ 520 static bool Dispatch(const Message* msg, T* obj, S* sender, P* parameter, \
521 Method func) { \
558 Schema::SendParam send_params; \ 522 Schema::SendParam send_params; \
559 bool ok = ReadSendParam(msg, &send_params); \ 523 bool ok = ReadSendParam(msg, &send_params); \
560 return Schema::DispatchWithSendParams(ok, send_params, msg, obj, sender, \ 524 return Schema::DispatchWithSendParams(ok, send_params, msg, obj, sender, \
561 func); \ 525 func); \
562 } \ 526 } \
563 template<class T, class Method> \ 527 template<class T, class P, class Method> \
564 static bool DispatchDelayReply(const Message* msg, T* obj, Method func) { \ 528 static bool DispatchDelayReply(const Message* msg, T* obj, P* parameter, \
529 Method func) { \
565 Schema::SendParam send_params; \ 530 Schema::SendParam send_params; \
566 bool ok = ReadSendParam(msg, &send_params); \ 531 bool ok = ReadSendParam(msg, &send_params); \
567 return Schema::DispatchDelayReplyWithSendParams(ok, send_params, msg, \ 532 return Schema::DispatchDelayReplyWithSendParams(ok, send_params, msg, \
568 obj, func); \ 533 obj, func); \
569 } 534 }
570 #define IPC_SYNC_MESSAGE_METHODS_0 \ 535 #define IPC_SYNC_MESSAGE_METHODS_0 \
571 IPC_SYNC_MESSAGE_METHODS_GENERIC 536 IPC_SYNC_MESSAGE_METHODS_GENERIC
572 #define IPC_SYNC_MESSAGE_METHODS_1 \ 537 #define IPC_SYNC_MESSAGE_METHODS_1 \
573 IPC_SYNC_MESSAGE_METHODS_GENERIC \ 538 IPC_SYNC_MESSAGE_METHODS_GENERIC \
574 template<typename TA> \ 539 template<typename TA> \
(...skipping 350 matching lines...) Expand 10 before | Expand all | Expand 10 after
925 // IPC_MESSAGE_UNHANDLED(handled = false) 890 // IPC_MESSAGE_UNHANDLED(handled = false)
926 // IPC_END_MESSAGE_MAP_EX() 891 // IPC_END_MESSAGE_MAP_EX()
927 // if (!msg_is_good) { 892 // if (!msg_is_good) {
928 // // Signal error here or terminate offending process. 893 // // Signal error here or terminate offending process.
929 // } 894 // }
930 // return handled; 895 // return handled;
931 // } 896 // }
932 897
933 898
934 #define IPC_BEGIN_MESSAGE_MAP_EX(class_name, msg, msg_is_ok) \ 899 #define IPC_BEGIN_MESSAGE_MAP_EX(class_name, msg, msg_is_ok) \
935 { \ 900 IPC_BEGIN_MESSAGE_MAP_WITH_PARAM(class_name, msg, msg_is_ok, void, NULL)
936 typedef class_name _IpcMessageHandlerClass; \
937 const IPC::Message& ipc_message__ = msg; \
938 bool& msg_is_ok__ = msg_is_ok; \
939 switch (ipc_message__.type()) { \
940 901
941 #define IPC_BEGIN_MESSAGE_MAP(class_name, msg) \ 902 #define IPC_BEGIN_MESSAGE_MAP(class_name, msg) \
942 { \ 903 { \
943 typedef class_name _IpcMessageHandlerClass; \ 904 typedef class_name _IpcMessageHandlerClass; \
905 typedef void _ParamClass; \
906 _ParamClass* param__ = NULL; \
944 const IPC::Message& ipc_message__ = msg; \ 907 const IPC::Message& ipc_message__ = msg; \
945 bool msg_is_ok__ = true; \ 908 bool msg_is_ok__ = true; \
946 switch (ipc_message__.type()) { \ 909 switch (ipc_message__.type()) { \
947 910
911 #define IPC_BEGIN_MESSAGE_MAP_WITH_PARAM(class_name, msg, msg_is_ok, \
912 param_type, param) \
913 { \
914 typedef class_name _IpcMessageHandlerClass; \
915 typedef param_type _ParamClass; \
916 _ParamClass* param__ = param; \
917 const IPC::Message& ipc_message__ = msg; \
918 bool& msg_is_ok__ = msg_is_ok; \
919 switch (ipc_message__.type()) { \
920
948 #define IPC_MESSAGE_FORWARD(msg_class, obj, member_func) \ 921 #define IPC_MESSAGE_FORWARD(msg_class, obj, member_func) \
949 case msg_class::ID: { \ 922 case msg_class::ID: { \
950 TRACK_RUN_IN_IPC_HANDLER(member_func); \ 923 TRACK_RUN_IN_IPC_HANDLER(member_func); \
951 msg_is_ok__ = msg_class::Dispatch(&ipc_message__, obj, this, \ 924 msg_is_ok__ = msg_class::Dispatch(&ipc_message__, obj, this, \
952 &member_func); \ 925 param__, &member_func); \
953 } \ 926 } \
954 break; 927 break;
955 928
956 #define IPC_MESSAGE_HANDLER(msg_class, member_func) \ 929 #define IPC_MESSAGE_HANDLER(msg_class, member_func) \
957 IPC_MESSAGE_FORWARD(msg_class, this, _IpcMessageHandlerClass::member_func) 930 IPC_MESSAGE_FORWARD(msg_class, this, _IpcMessageHandlerClass::member_func)
958 931
959 #define IPC_MESSAGE_FORWARD_DELAY_REPLY(msg_class, obj, member_func) \ 932 #define IPC_MESSAGE_FORWARD_DELAY_REPLY(msg_class, obj, member_func) \
960 case msg_class::ID: { \ 933 case msg_class::ID: { \
961 TRACK_RUN_IN_IPC_HANDLER(member_func); \ 934 TRACK_RUN_IN_IPC_HANDLER(member_func); \
962 msg_is_ok__ = msg_class::DispatchDelayReply(&ipc_message__, obj, \ 935 msg_is_ok__ = msg_class::DispatchDelayReply(&ipc_message__, obj, \
963 &member_func); \ 936 param__, &member_func); \
964 } \ 937 } \
965 break; 938 break;
966 939
967 #define IPC_MESSAGE_HANDLER_DELAY_REPLY(msg_class, member_func) \ 940 #define IPC_MESSAGE_HANDLER_DELAY_REPLY(msg_class, member_func) \
968 IPC_MESSAGE_FORWARD_DELAY_REPLY(msg_class, this, \ 941 IPC_MESSAGE_FORWARD_DELAY_REPLY(msg_class, this, \
969 _IpcMessageHandlerClass::member_func) 942 _IpcMessageHandlerClass::member_func)
970 943
971 // TODO(jar): fix chrome frame to always supply |code| argument. 944 // TODO(jar): fix chrome frame to always supply |code| argument.
972 #define IPC_MESSAGE_HANDLER_GENERIC(msg_class, code) \ 945 #define IPC_MESSAGE_HANDLER_GENERIC(msg_class, code) \
973 case msg_class::ID: { \ 946 case msg_class::ID: { \
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
1014 // equivalent without the #ifdef, VS2013 contains a bug where it is 987 // equivalent without the #ifdef, VS2013 contains a bug where it is
1015 // over-aggressive in optimizing out #includes. Putting the #ifdef is a 988 // over-aggressive in optimizing out #includes. Putting the #ifdef is a
1016 // workaround for this bug. See http://goo.gl/eGt2Fb for more details. 989 // workaround for this bug. See http://goo.gl/eGt2Fb for more details.
1017 // This can be removed once VS2013 is fixed. 990 // This can be removed once VS2013 is fixed.
1018 #ifdef IPC_MESSAGE_START 991 #ifdef IPC_MESSAGE_START
1019 // Clean up IPC_MESSAGE_START in this unguarded section so that the 992 // Clean up IPC_MESSAGE_START in this unguarded section so that the
1020 // XXX_messages.h files need not do so themselves. This makes the 993 // XXX_messages.h files need not do so themselves. This makes the
1021 // XXX_messages.h files easier to write. 994 // XXX_messages.h files easier to write.
1022 #undef IPC_MESSAGE_START 995 #undef IPC_MESSAGE_START
1023 #endif 996 #endif
OLDNEW
« no previous file with comments | « ipc/ipc_message.h ('k') | ipc/ipc_message_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698