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 3// found in the LICENSE file. 4 5#ifndef PPAPI_PROXY_PPAPI_MESSAGE_UTILS_H_ 6#define PPAPI_PROXY_PPAPI_MESSAGE_UTILS_H_ 7 8#include "base/basictypes.h" 9#include "base/pickle.h" 10#include "base/tuple.h" 11#include "ipc/ipc_message.h" 12#include "ipc/ipc_message_utils.h" 13 14namespace ppapi { 15 16namespace internal { 17 18// TupleTypeMatch* check whether a tuple type contains elements of the specified 19// types. They are used to make sure the output parameters of UnpackMessage() 20// match the corresponding message type. 21template <class TupleType, class A> 22struct TupleTypeMatch1 { 23 static const bool kValue = false; 24}; 25template <class A> 26struct TupleTypeMatch1<Tuple1<A>, A> { 27 static const bool kValue = true; 28}; 29 30template <class TupleType, class A, class B> 31struct TupleTypeMatch2 { 32 static const bool kValue = false; 33}; 34template <class A, class B> 35struct TupleTypeMatch2<Tuple2<A, B>, A, B> { 36 static const bool kValue = true; 37}; 38 39template <class TupleType, class A, class B, class C> 40struct TupleTypeMatch3 { 41 static const bool kValue = false; 42}; 43template <class A, class B, class C> 44struct TupleTypeMatch3<Tuple3<A, B, C>, A, B, C> { 45 static const bool kValue = true; 46}; 47 48template <class TupleType, class A, class B, class C, class D> 49struct TupleTypeMatch4 { 50 static const bool kValue = false; 51}; 52template <class A, class B, class C, class D> 53struct TupleTypeMatch4<Tuple4<A, B, C, D>, A, B, C, D> { 54 static const bool kValue = true; 55}; 56 57template <class TupleType, class A, class B, class C, class D, class E> 58struct TupleTypeMatch5 { 59 static const bool kValue = false; 60}; 61template <class A, class B, class C, class D, class E> 62struct TupleTypeMatch5<Tuple5<A, B, C, D, E>, A, B, C, D, E> { 63 static const bool kValue = true; 64}; 65 66} // namespace internal 67 68template <class MsgClass, class A> 69bool UnpackMessage(const IPC::Message& msg, A* a) { 70 COMPILE_ASSERT( 71 (internal::TupleTypeMatch1<typename MsgClass::Param, A>::kValue), 72 tuple_types_dont_match); 73 74 PickleIterator iter(msg); 75 return IPC::ReadParam(&msg, &iter, a); 76} 77 78template <class MsgClass, class A, class B> 79bool UnpackMessage(const IPC::Message& msg, A* a, B* b) { 80 COMPILE_ASSERT( 81 (internal::TupleTypeMatch2<typename MsgClass::Param, A, B>::kValue), 82 tuple_types_dont_match); 83 84 PickleIterator iter(msg); 85 return IPC::ReadParam(&msg, &iter, a) && IPC::ReadParam(&msg, &iter, b); 86} 87 88template <class MsgClass, class A, class B, class C> 89bool UnpackMessage(const IPC::Message& msg, A* a, B* b, C* c) { 90 COMPILE_ASSERT( 91 (internal::TupleTypeMatch3<typename MsgClass::Param, A, B, C>::kValue), 92 tuple_types_dont_match); 93 94 PickleIterator iter(msg); 95 return IPC::ReadParam(&msg, &iter, a) && 96 IPC::ReadParam(&msg, &iter, b) && 97 IPC::ReadParam(&msg, &iter, c); 98} 99 100template <class MsgClass, class A, class B, class C, class D> 101bool UnpackMessage(const IPC::Message& msg, A* a, B* b, C* c, D* d) { 102 COMPILE_ASSERT( 103 (internal::TupleTypeMatch4<typename MsgClass::Param, A, B, C, D>::kValue), 104 tuple_types_dont_match); 105 106 PickleIterator iter(msg); 107 return IPC::ReadParam(&msg, &iter, a) && 108 IPC::ReadParam(&msg, &iter, b) && 109 IPC::ReadParam(&msg, &iter, c) && 110 IPC::ReadParam(&msg, &iter, d); 111} 112 113template <class MsgClass, class A, class B, class C, class D, class E> 114bool UnpackMessage(const IPC::Message& msg, A* a, B* b, C* c, D* d, E* e) { 115 COMPILE_ASSERT( 116 (internal::TupleTypeMatch5< 117 typename MsgClass::Param, A, B, C, D, E>::kValue), 118 tuple_types_dont_match); 119 120 PickleIterator iter(msg); 121 return IPC::ReadParam(&msg, &iter, a) && 122 IPC::ReadParam(&msg, &iter, b) && 123 IPC::ReadParam(&msg, &iter, c) && 124 IPC::ReadParam(&msg, &iter, d) && 125 IPC::ReadParam(&msg, &iter, e); 126} 127 128} // namespace ppapi 129 130#endif // PPAPI_PROXY_PPAPI_MESSAGE_UTILS_H_ 131 132