1645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// Use of this source code is governed by a BSD-style license that can be 3645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// found in the LICENSE file. 4645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 5645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#ifndef IPC_IPC_MESSAGE_UTILS_H_ 6645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#define IPC_IPC_MESSAGE_UTILS_H_ 7645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 8645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include <limits.h> 9645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include <stddef.h> 10645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include <stdint.h> 11645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 12645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include <algorithm> 13645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include <map> 14645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include <memory> 15645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include <set> 16645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include <string> 17645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include <tuple> 18645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include <vector> 19645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 20645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include "base/containers/small_map.h" 21645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include "base/containers/stack_container.h" 22645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include "base/files/file.h" 23645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include "base/format_macros.h" 24645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include "base/memory/scoped_vector.h" 25645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include "base/optional.h" 26645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include "base/strings/string16.h" 27645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include "base/strings/string_util.h" 28645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include "base/strings/stringprintf.h" 29645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include "build/build_config.h" 30645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include "ipc/brokerable_attachment.h" 31645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include "ipc/ipc_message_start.h" 32645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include "ipc/ipc_param_traits.h" 33645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include "ipc/ipc_sync_message.h" 34645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 35645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chaveznamespace base { 36645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezclass DictionaryValue; 37645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezclass FilePath; 38645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezclass ListValue; 39645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezclass NullableString16; 40645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezclass Time; 41645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezclass TimeDelta; 42645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezclass TimeTicks; 43645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezstruct FileDescriptor; 44645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 45645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#if (defined(OS_MACOSX) && !defined(OS_IOS)) || defined(OS_WIN) 46645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezclass SharedMemoryHandle; 47645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#endif // (defined(OS_MACOSX) && !defined(OS_IOS)) || defined(OS_WIN) 48645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez} 49645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 50645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chaveznamespace IPC { 51645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 52645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezstruct ChannelHandle; 53645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 54645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// ----------------------------------------------------------------------------- 55645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// How we send IPC message logs across channels. 56645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezstruct IPC_EXPORT LogData { 57645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez LogData(); 58645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez LogData(const LogData& other); 59645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez ~LogData(); 60645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 61645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez std::string channel; 62645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez int32_t routing_id; 63645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez uint32_t type; // "User-defined" message type, from ipc_message.h. 64645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez std::string flags; 65645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez int64_t sent; // Time that the message was sent (i.e. at Send()). 66645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez int64_t receive; // Time before it was dispatched (i.e. before calling 67645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez // OnMessageReceived). 68645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez int64_t dispatch; // Time after it was dispatched (i.e. after calling 69645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez // OnMessageReceived). 70645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez std::string message_name; 71645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez std::string params; 72645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez}; 73645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 74645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez//----------------------------------------------------------------------------- 75645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 76645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// A dummy struct to place first just to allow leading commas for all 77645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// members in the macro-generated constructor initializer lists. 78645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezstruct NoParams { 79645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez}; 80645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 81645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// Specializations are checked by 'IPC checker' part of find-bad-constructs 82645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// Clang plugin (see WriteParam() below for the details). 83645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chaveztemplate <typename... Ts> 84645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezstruct CheckedTuple { 85645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez typedef std::tuple<Ts...> Tuple; 86645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez}; 87645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 88645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chaveztemplate <class P> 89645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezstatic inline void GetParamSize(base::PickleSizer* sizer, const P& p) { 90645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez typedef typename SimilarTypeTraits<P>::Type Type; 91645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez ParamTraits<Type>::GetSize(sizer, static_cast<const Type&>(p)); 92645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez} 93645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 94645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// This function is checked by 'IPC checker' part of find-bad-constructs 95645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// Clang plugin to make it's not called on the following types: 96645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// 1. long / unsigned long (but not typedefs to) 97645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// 2. intmax_t, uintmax_t, intptr_t, uintptr_t, wint_t, 98645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// size_t, rsize_t, ssize_t, ptrdiff_t, dev_t, off_t, clock_t, 99645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// time_t, suseconds_t (including typedefs to) 100645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// 3. Any template referencing types above (e.g. std::vector<size_t>) 101645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chaveztemplate <class P> 102645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezstatic inline void WriteParam(base::Pickle* m, const P& p) { 103645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez typedef typename SimilarTypeTraits<P>::Type Type; 104645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez ParamTraits<Type>::Write(m, static_cast<const Type& >(p)); 105645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez} 106645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 107645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chaveztemplate <class P> 108645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezstatic inline bool WARN_UNUSED_RESULT ReadParam(const base::Pickle* m, 109645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez base::PickleIterator* iter, 110645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez P* p) { 111645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez typedef typename SimilarTypeTraits<P>::Type Type; 112645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return ParamTraits<Type>::Read(m, iter, reinterpret_cast<Type* >(p)); 113645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez} 114645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 115645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chaveztemplate <class P> 116645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezstatic inline void LogParam(const P& p, std::string* l) { 117645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez typedef typename SimilarTypeTraits<P>::Type Type; 118645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez ParamTraits<Type>::Log(static_cast<const Type& >(p), l); 119645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez} 120645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 121645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// Primitive ParamTraits ------------------------------------------------------- 122645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 123645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chaveztemplate <> 124645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezstruct ParamTraits<bool> { 125645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez typedef bool param_type; 126645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void GetSize(base::PickleSizer* sizer, const param_type& p) { 127645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez sizer->AddBool(); 128645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 129645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void Write(base::Pickle* m, const param_type& p) { m->WriteBool(p); } 130645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static bool Read(const base::Pickle* m, 131645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez base::PickleIterator* iter, 132645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez param_type* r) { 133645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return iter->ReadBool(r); 134645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 135645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez IPC_EXPORT static void Log(const param_type& p, std::string* l); 136645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez}; 137645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 138645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chaveztemplate <> 139645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezstruct IPC_EXPORT ParamTraits<signed char> { 140645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez typedef signed char param_type; 141645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void GetSize(base::PickleSizer* sizer, const param_type& p); 142645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void Write(base::Pickle* m, const param_type& p); 143645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static bool Read(const base::Pickle* m, 144645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez base::PickleIterator* iter, 145645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez param_type* r); 146645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void Log(const param_type& p, std::string* l); 147645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez}; 148645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 149645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chaveztemplate <> 150645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezstruct IPC_EXPORT ParamTraits<unsigned char> { 151645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez typedef unsigned char param_type; 152645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void GetSize(base::PickleSizer* sizer, const param_type& p); 153645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void Write(base::Pickle* m, const param_type& p); 154645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static bool Read(const base::Pickle* m, 155645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez base::PickleIterator* iter, 156645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez param_type* r); 157645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void Log(const param_type& p, std::string* l); 158645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez}; 159645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 160645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chaveztemplate <> 161645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezstruct IPC_EXPORT ParamTraits<unsigned short> { 162645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez typedef unsigned short param_type; 163645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void GetSize(base::PickleSizer* sizer, const param_type& p); 164645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void Write(base::Pickle* m, const param_type& p); 165645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static bool Read(const base::Pickle* m, 166645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez base::PickleIterator* iter, 167645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez param_type* r); 168645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void Log(const param_type& p, std::string* l); 169645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez}; 170645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 171645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chaveztemplate <> 172645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezstruct ParamTraits<int> { 173645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez typedef int param_type; 174645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void GetSize(base::PickleSizer* sizer, const param_type& p) { 175645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez sizer->AddInt(); 176645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 177645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void Write(base::Pickle* m, const param_type& p) { m->WriteInt(p); } 178645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static bool Read(const base::Pickle* m, 179645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez base::PickleIterator* iter, 180645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez param_type* r) { 181645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return iter->ReadInt(r); 182645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 183645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez IPC_EXPORT static void Log(const param_type& p, std::string* l); 184645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez}; 185645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 186645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chaveztemplate <> 187645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezstruct ParamTraits<unsigned int> { 188645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez typedef unsigned int param_type; 189645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void GetSize(base::PickleSizer* sizer, const param_type& p) { 190645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez sizer->AddInt(); 191645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 192645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void Write(base::Pickle* m, const param_type& p) { m->WriteInt(p); } 193645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static bool Read(const base::Pickle* m, 194645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez base::PickleIterator* iter, 195645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez param_type* r) { 196645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return iter->ReadInt(reinterpret_cast<int*>(r)); 197645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 198645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez IPC_EXPORT static void Log(const param_type& p, std::string* l); 199645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez}; 200645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 201645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// long isn't safe to send over IPC because it's 4 bytes on 32 bit builds but 202645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// 8 bytes on 64 bit builds. So if a 32 bit and 64 bit process have a channel 203645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// that would cause problem. 204645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// We need to keep this on for a few configs: 205645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// 1) Windows because DWORD is typedef'd to it, which is fine because we have 206645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// very few IPCs that cross this boundary. 207645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// 2) We also need to keep it for Linux for two reasons: int64_t is typedef'd 208645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// to long, and gfx::PluginWindow is long and is used in one GPU IPC. 209645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// 3) Android 64 bit also has int64_t typedef'd to long. 210645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// Since we want to support Android 32<>64 bit IPC, as long as we don't have 211645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// these traits for 32 bit ARM then that'll catch any errors. 212645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#if defined(OS_WIN) || defined(OS_LINUX) || \ 213645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez (defined(OS_ANDROID) && defined(ARCH_CPU_64_BITS)) 214645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chaveztemplate <> 215645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezstruct ParamTraits<long> { 216645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez typedef long param_type; 217645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void GetSize(base::PickleSizer* sizer, const param_type& p) { 218645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez sizer->AddLong(); 219645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 220645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void Write(base::Pickle* m, const param_type& p) { 221645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez m->WriteLong(p); 222645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 223645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static bool Read(const base::Pickle* m, 224645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez base::PickleIterator* iter, 225645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez param_type* r) { 226645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return iter->ReadLong(r); 227645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 228645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez IPC_EXPORT static void Log(const param_type& p, std::string* l); 229645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez}; 230645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 231645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chaveztemplate <> 232645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezstruct ParamTraits<unsigned long> { 233645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez typedef unsigned long param_type; 234645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void GetSize(base::PickleSizer* sizer, const param_type& p) { 235645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez sizer->AddLong(); 236645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 237645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void Write(base::Pickle* m, const param_type& p) { 238645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez m->WriteLong(p); 239645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 240645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static bool Read(const base::Pickle* m, 241645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez base::PickleIterator* iter, 242645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez param_type* r) { 243645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return iter->ReadLong(reinterpret_cast<long*>(r)); 244645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 245645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez IPC_EXPORT static void Log(const param_type& p, std::string* l); 246645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez}; 247645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#endif 248645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 249645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chaveztemplate <> 250645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezstruct ParamTraits<long long> { 251645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez typedef long long param_type; 252645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void GetSize(base::PickleSizer* sizer, const param_type& p) { 253645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez sizer->AddInt64(); 254645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 255645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void Write(base::Pickle* m, const param_type& p) { 256645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez m->WriteInt64(static_cast<int64_t>(p)); 257645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 258645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static bool Read(const base::Pickle* m, 259645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez base::PickleIterator* iter, 260645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez param_type* r) { 261645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return iter->ReadInt64(reinterpret_cast<int64_t*>(r)); 262645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 263645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez IPC_EXPORT static void Log(const param_type& p, std::string* l); 264645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez}; 265645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 266645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chaveztemplate <> 267645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezstruct ParamTraits<unsigned long long> { 268645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez typedef unsigned long long param_type; 269645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void GetSize(base::PickleSizer* sizer, const param_type& p) { 270645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez sizer->AddInt64(); 271645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 272645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void Write(base::Pickle* m, const param_type& p) { m->WriteInt64(p); } 273645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static bool Read(const base::Pickle* m, 274645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez base::PickleIterator* iter, 275645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez param_type* r) { 276645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return iter->ReadInt64(reinterpret_cast<int64_t*>(r)); 277645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 278645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez IPC_EXPORT static void Log(const param_type& p, std::string* l); 279645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez}; 280645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 281645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// Note that the IPC layer doesn't sanitize NaNs and +/- INF values. Clients 282645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// should be sure to check the sanity of these values after receiving them over 283645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// IPC. 284645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chaveztemplate <> 285645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezstruct IPC_EXPORT ParamTraits<float> { 286645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez typedef float param_type; 287645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void GetSize(base::PickleSizer* sizer, const param_type& p) { 288645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez sizer->AddFloat(); 289645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 290645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void Write(base::Pickle* m, const param_type& p) { m->WriteFloat(p); } 291645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static bool Read(const base::Pickle* m, 292645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez base::PickleIterator* iter, 293645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez param_type* r) { 294645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return iter->ReadFloat(r); 295645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 296645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void Log(const param_type& p, std::string* l); 297645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez}; 298645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 299645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chaveztemplate <> 300645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezstruct IPC_EXPORT ParamTraits<double> { 301645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez typedef double param_type; 302645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void GetSize(base::PickleSizer* sizer, const param_type& p); 303645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void Write(base::Pickle* m, const param_type& p); 304645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static bool Read(const base::Pickle* m, 305645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez base::PickleIterator* iter, 306645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez param_type* r); 307645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void Log(const param_type& p, std::string* l); 308645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez}; 309645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 310645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// STL ParamTraits ------------------------------------------------------------- 311645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 312645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chaveztemplate <> 313645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezstruct ParamTraits<std::string> { 314645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez typedef std::string param_type; 315645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void GetSize(base::PickleSizer* sizer, const param_type& p) { 316645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez sizer->AddString(p); 317645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 318645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void Write(base::Pickle* m, const param_type& p) { m->WriteString(p); } 319645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static bool Read(const base::Pickle* m, 320645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez base::PickleIterator* iter, 321645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez param_type* r) { 322645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return iter->ReadString(r); 323645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 324645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez IPC_EXPORT static void Log(const param_type& p, std::string* l); 325645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez}; 326645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 327645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chaveztemplate <> 328645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezstruct ParamTraits<base::string16> { 329645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez typedef base::string16 param_type; 330645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void GetSize(base::PickleSizer* sizer, const param_type& p) { 331645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez sizer->AddString16(p); 332645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 333645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void Write(base::Pickle* m, const param_type& p) { 334645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez m->WriteString16(p); 335645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 336645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static bool Read(const base::Pickle* m, 337645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez base::PickleIterator* iter, 338645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez param_type* r) { 339645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return iter->ReadString16(r); 340645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 341645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez IPC_EXPORT static void Log(const param_type& p, std::string* l); 342645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez}; 343645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 344645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chaveztemplate <> 345645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezstruct IPC_EXPORT ParamTraits<std::vector<char> > { 346645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez typedef std::vector<char> param_type; 347645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void GetSize(base::PickleSizer* sizer, const param_type& p); 348645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void Write(base::Pickle* m, const param_type& p); 349645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static bool Read(const base::Pickle*, 350645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez base::PickleIterator* iter, 351645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez param_type* r); 352645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void Log(const param_type& p, std::string* l); 353645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez}; 354645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 355645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chaveztemplate <> 356645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezstruct IPC_EXPORT ParamTraits<std::vector<unsigned char> > { 357645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez typedef std::vector<unsigned char> param_type; 358645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void GetSize(base::PickleSizer* sizer, const param_type& p); 359645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void Write(base::Pickle* m, const param_type& p); 360645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static bool Read(const base::Pickle* m, 361645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez base::PickleIterator* iter, 362645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez param_type* r); 363645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void Log(const param_type& p, std::string* l); 364645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez}; 365645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 366645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chaveztemplate <> 367645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezstruct IPC_EXPORT ParamTraits<std::vector<bool> > { 368645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez typedef std::vector<bool> param_type; 369645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void GetSize(base::PickleSizer* sizer, const param_type& p); 370645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void Write(base::Pickle* m, const param_type& p); 371645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static bool Read(const base::Pickle* m, 372645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez base::PickleIterator* iter, 373645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez param_type* r); 374645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void Log(const param_type& p, std::string* l); 375645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez}; 376645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 377645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chaveztemplate <class P> 378645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezstruct ParamTraits<std::vector<P>> { 379645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez typedef std::vector<P> param_type; 380645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void GetSize(base::PickleSizer* sizer, const param_type& p) { 381645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez GetParamSize(sizer, static_cast<int>(p.size())); 382645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez for (size_t i = 0; i < p.size(); i++) 383645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez GetParamSize(sizer, p[i]); 384645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 385645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void Write(base::Pickle* m, const param_type& p) { 386645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez WriteParam(m, static_cast<int>(p.size())); 387645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez for (size_t i = 0; i < p.size(); i++) 388645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez WriteParam(m, p[i]); 389645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 390645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static bool Read(const base::Pickle* m, 391645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez base::PickleIterator* iter, 392645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez param_type* r) { 393645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez int size; 394645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez // ReadLength() checks for < 0 itself. 395645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez if (!iter->ReadLength(&size)) 396645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return false; 397645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez // Resizing beforehand is not safe, see BUG 1006367 for details. 398645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez if (INT_MAX / sizeof(P) <= static_cast<size_t>(size)) 399645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return false; 400645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez r->resize(size); 401645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez for (int i = 0; i < size; i++) { 402645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez if (!ReadParam(m, iter, &(*r)[i])) 403645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return false; 404645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 405645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return true; 406645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 407645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void Log(const param_type& p, std::string* l) { 408645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez for (size_t i = 0; i < p.size(); ++i) { 409645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez if (i != 0) 410645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez l->append(" "); 411645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez LogParam((p[i]), l); 412645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 413645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 414645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez}; 415645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 416645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chaveztemplate <class P> 417645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezstruct ParamTraits<std::set<P> > { 418645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez typedef std::set<P> param_type; 419645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void GetSize(base::PickleSizer* sizer, const param_type& p) { 420645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez GetParamSize(sizer, static_cast<int>(p.size())); 421645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez typename param_type::const_iterator iter; 422645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez for (iter = p.begin(); iter != p.end(); ++iter) 423645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez GetParamSize(sizer, *iter); 424645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 425645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void Write(base::Pickle* m, const param_type& p) { 426645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez WriteParam(m, static_cast<int>(p.size())); 427645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez typename param_type::const_iterator iter; 428645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez for (iter = p.begin(); iter != p.end(); ++iter) 429645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez WriteParam(m, *iter); 430645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 431645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static bool Read(const base::Pickle* m, 432645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez base::PickleIterator* iter, 433645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez param_type* r) { 434645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez int size; 435645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez if (!iter->ReadLength(&size)) 436645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return false; 437645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez for (int i = 0; i < size; ++i) { 438645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez P item; 439645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez if (!ReadParam(m, iter, &item)) 440645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return false; 441645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez r->insert(item); 442645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 443645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return true; 444645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 445645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void Log(const param_type& p, std::string* l) { 446645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez l->append("<std::set>"); 447645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 448645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez}; 449645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 450645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chaveztemplate <class K, class V, class C, class A> 451645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezstruct ParamTraits<std::map<K, V, C, A> > { 452645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez typedef std::map<K, V, C, A> param_type; 453645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void GetSize(base::PickleSizer* sizer, const param_type& p) { 454645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez GetParamSize(sizer, static_cast<int>(p.size())); 455645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez typename param_type::const_iterator iter; 456645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez for (iter = p.begin(); iter != p.end(); ++iter) { 457645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez GetParamSize(sizer, iter->first); 458645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez GetParamSize(sizer, iter->second); 459645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 460645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 461645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void Write(base::Pickle* m, const param_type& p) { 462645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez WriteParam(m, static_cast<int>(p.size())); 463645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez typename param_type::const_iterator iter; 464645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez for (iter = p.begin(); iter != p.end(); ++iter) { 465645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez WriteParam(m, iter->first); 466645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez WriteParam(m, iter->second); 467645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 468645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 469645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static bool Read(const base::Pickle* m, 470645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez base::PickleIterator* iter, 471645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez param_type* r) { 472645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez int size; 473645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez if (!ReadParam(m, iter, &size) || size < 0) 474645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return false; 475645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez for (int i = 0; i < size; ++i) { 476645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez K k; 477645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez if (!ReadParam(m, iter, &k)) 478645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return false; 479645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez V& value = (*r)[k]; 480645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez if (!ReadParam(m, iter, &value)) 481645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return false; 482645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 483645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return true; 484645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 485645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void Log(const param_type& p, std::string* l) { 486645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez l->append("<std::map>"); 487645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 488645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez}; 489645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 490645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chaveztemplate <class A, class B> 491645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezstruct ParamTraits<std::pair<A, B> > { 492645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez typedef std::pair<A, B> param_type; 493645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void GetSize(base::PickleSizer* sizer, const param_type& p) { 494645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez GetParamSize(sizer, p.first); 495645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez GetParamSize(sizer, p.second); 496645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 497645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void Write(base::Pickle* m, const param_type& p) { 498645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez WriteParam(m, p.first); 499645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez WriteParam(m, p.second); 500645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 501645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static bool Read(const base::Pickle* m, 502645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez base::PickleIterator* iter, 503645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez param_type* r) { 504645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return ReadParam(m, iter, &r->first) && ReadParam(m, iter, &r->second); 505645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 506645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void Log(const param_type& p, std::string* l) { 507645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez l->append("("); 508645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez LogParam(p.first, l); 509645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez l->append(", "); 510645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez LogParam(p.second, l); 511645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez l->append(")"); 512645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 513645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez}; 514645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 515645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// IPC ParamTraits ------------------------------------------------------------- 516645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chaveztemplate <> 517645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezstruct IPC_EXPORT ParamTraits<BrokerableAttachment::AttachmentId> { 518645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez typedef BrokerableAttachment::AttachmentId param_type; 519645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void Write(base::Pickle* m, const param_type& p); 520645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static bool Read(const base::Pickle* m, 521645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez base::PickleIterator* iter, 522645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez param_type* r); 523645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void Log(const param_type& p, std::string* l); 524645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez}; 525645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 526645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// Base ParamTraits ------------------------------------------------------------ 527645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 528645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chaveztemplate <> 529645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezstruct IPC_EXPORT ParamTraits<base::DictionaryValue> { 530645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez typedef base::DictionaryValue param_type; 531645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void GetSize(base::PickleSizer* sizer, const param_type& p); 532645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void Write(base::Pickle* m, const param_type& p); 533645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static bool Read(const base::Pickle* m, 534645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez base::PickleIterator* iter, 535645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez param_type* r); 536645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void Log(const param_type& p, std::string* l); 537645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez}; 538645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 539645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#if defined(OS_POSIX) 540645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// FileDescriptors may be serialised over IPC channels on POSIX. On the 541645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// receiving side, the FileDescriptor is a valid duplicate of the file 542645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// descriptor which was transmitted: *it is not just a copy of the integer like 543645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// HANDLEs on Windows*. The only exception is if the file descriptor is < 0. In 544645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// this case, the receiving end will see a value of -1. *Zero is a valid file 545645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// descriptor*. 546645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// 547645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// The received file descriptor will have the |auto_close| flag set to true. The 548645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// code which handles the message is responsible for taking ownership of it. 549645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// File descriptors are OS resources and must be closed when no longer needed. 550645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// 551645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// When sending a file descriptor, the file descriptor must be valid at the time 552645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// of transmission. Since transmission is not synchronous, one should consider 553645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// dup()ing any file descriptors to be transmitted and setting the |auto_close| 554645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// flag, which causes the file descriptor to be closed after writing. 555645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chaveztemplate<> 556645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezstruct IPC_EXPORT ParamTraits<base::FileDescriptor> { 557645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez typedef base::FileDescriptor param_type; 558645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void GetSize(base::PickleSizer* sizer, const param_type& p); 559645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void Write(base::Pickle* m, const param_type& p); 560645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static bool Read(const base::Pickle* m, 561645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez base::PickleIterator* iter, 562645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez param_type* r); 563645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void Log(const param_type& p, std::string* l); 564645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez}; 565645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#endif // defined(OS_POSIX) 566645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 567645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#if (defined(OS_MACOSX) && !defined(OS_IOS)) || defined(OS_WIN) 568645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chaveztemplate <> 569645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezstruct IPC_EXPORT ParamTraits<base::SharedMemoryHandle> { 570645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez typedef base::SharedMemoryHandle param_type; 571645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void GetSize(base::PickleSizer* sizer, const param_type& p); 572645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void Write(base::Pickle* m, const param_type& p); 573645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static bool Read(const base::Pickle* m, 574645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez base::PickleIterator* iter, 575645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez param_type* r); 576645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void Log(const param_type& p, std::string* l); 577645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez}; 578645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#endif // (defined(OS_MACOSX) && !defined(OS_IOS)) || defined(OS_WIN) 579645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 580645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chaveztemplate <> 581645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezstruct IPC_EXPORT ParamTraits<base::FilePath> { 582645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez typedef base::FilePath param_type; 583645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void GetSize(base::PickleSizer* sizer, const param_type& p); 584645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void Write(base::Pickle* m, const param_type& p); 585645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static bool Read(const base::Pickle* m, 586645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez base::PickleIterator* iter, 587645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez param_type* r); 588645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void Log(const param_type& p, std::string* l); 589645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez}; 590645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 591645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chaveztemplate <> 592645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezstruct IPC_EXPORT ParamTraits<base::ListValue> { 593645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez typedef base::ListValue param_type; 594645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void GetSize(base::PickleSizer* sizer, const param_type& p); 595645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void Write(base::Pickle* m, const param_type& p); 596645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static bool Read(const base::Pickle* m, 597645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez base::PickleIterator* iter, 598645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez param_type* r); 599645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void Log(const param_type& p, std::string* l); 600645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez}; 601645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 602645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chaveztemplate <> 603645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezstruct IPC_EXPORT ParamTraits<base::NullableString16> { 604645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez typedef base::NullableString16 param_type; 605645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void GetSize(base::PickleSizer* sizer, const param_type& p); 606645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void Write(base::Pickle* m, const param_type& p); 607645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static bool Read(const base::Pickle* m, 608645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez base::PickleIterator* iter, 609645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez param_type* r); 610645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void Log(const param_type& p, std::string* l); 611645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez}; 612645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 613645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chaveztemplate <> 614645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezstruct IPC_EXPORT ParamTraits<base::File::Info> { 615645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez typedef base::File::Info param_type; 616645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void GetSize(base::PickleSizer* sizer, const param_type& p); 617645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void Write(base::Pickle* m, const param_type& p); 618645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static bool Read(const base::Pickle* m, 619645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez base::PickleIterator* iter, 620645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez param_type* r); 621645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void Log(const param_type& p, std::string* l); 622645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez}; 623645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 624645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chaveztemplate <> 625645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezstruct SimilarTypeTraits<base::File::Error> { 626645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez typedef int Type; 627645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez}; 628645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 629645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#if defined(OS_WIN) 630645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chaveztemplate <> 631645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezstruct SimilarTypeTraits<HWND> { 632645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez typedef HANDLE Type; 633645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez}; 634645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#endif // defined(OS_WIN) 635645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 636645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chaveztemplate <> 637645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezstruct IPC_EXPORT ParamTraits<base::Time> { 638645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez typedef base::Time param_type; 639645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void GetSize(base::PickleSizer* sizer, const param_type& p); 640645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void Write(base::Pickle* m, const param_type& p); 641645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static bool Read(const base::Pickle* m, 642645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez base::PickleIterator* iter, 643645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez param_type* r); 644645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void Log(const param_type& p, std::string* l); 645645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez}; 646645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 647645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chaveztemplate <> 648645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezstruct IPC_EXPORT ParamTraits<base::TimeDelta> { 649645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez typedef base::TimeDelta param_type; 650645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void GetSize(base::PickleSizer* sizer, const param_type& p); 651645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void Write(base::Pickle* m, const param_type& p); 652645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static bool Read(const base::Pickle* m, 653645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez base::PickleIterator* iter, 654645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez param_type* r); 655645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void Log(const param_type& p, std::string* l); 656645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez}; 657645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 658645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chaveztemplate <> 659645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezstruct IPC_EXPORT ParamTraits<base::TimeTicks> { 660645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez typedef base::TimeTicks param_type; 661645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void GetSize(base::PickleSizer* sizer, const param_type& p); 662645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void Write(base::Pickle* m, const param_type& p); 663645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static bool Read(const base::Pickle* m, 664645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez base::PickleIterator* iter, 665645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez param_type* r); 666645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void Log(const param_type& p, std::string* l); 667645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez}; 668645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 669645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chaveztemplate <> 670645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezstruct ParamTraits<std::tuple<>> { 671645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez typedef std::tuple<> param_type; 672645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void GetSize(base::PickleSizer* sizer, const param_type& p) {} 673645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void Write(base::Pickle* m, const param_type& p) {} 674645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static bool Read(const base::Pickle* m, 675645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez base::PickleIterator* iter, 676645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez param_type* r) { 677645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return true; 678645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 679645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void Log(const param_type& p, std::string* l) { 680645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 681645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez}; 682645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 683645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chaveztemplate <class A> 684645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezstruct ParamTraits<std::tuple<A>> { 685645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez typedef std::tuple<A> param_type; 686645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void GetSize(base::PickleSizer* sizer, const param_type& p) { 687645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez GetParamSize(sizer, std::get<0>(p)); 688645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 689645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void Write(base::Pickle* m, const param_type& p) { 690645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez WriteParam(m, std::get<0>(p)); 691645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 692645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static bool Read(const base::Pickle* m, 693645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez base::PickleIterator* iter, 694645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez param_type* r) { 695645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return ReadParam(m, iter, &std::get<0>(*r)); 696645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 697645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void Log(const param_type& p, std::string* l) { 698645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez LogParam(std::get<0>(p), l); 699645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 700645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez}; 701645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 702645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chaveztemplate <class A, class B> 703645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezstruct ParamTraits<std::tuple<A, B>> { 704645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez typedef std::tuple<A, B> param_type; 705645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void GetSize(base::PickleSizer* sizer, const param_type& p) { 706645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez GetParamSize(sizer, std::get<0>(p)); 707645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez GetParamSize(sizer, std::get<1>(p)); 708645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 709645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void Write(base::Pickle* m, const param_type& p) { 710645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez WriteParam(m, std::get<0>(p)); 711645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez WriteParam(m, std::get<1>(p)); 712645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 713645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static bool Read(const base::Pickle* m, 714645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez base::PickleIterator* iter, 715645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez param_type* r) { 716645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return (ReadParam(m, iter, &std::get<0>(*r)) && 717645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez ReadParam(m, iter, &std::get<1>(*r))); 718645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 719645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void Log(const param_type& p, std::string* l) { 720645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez LogParam(std::get<0>(p), l); 721645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez l->append(", "); 722645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez LogParam(std::get<1>(p), l); 723645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 724645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez}; 725645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 726645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chaveztemplate <class A, class B, class C> 727645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezstruct ParamTraits<std::tuple<A, B, C>> { 728645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez typedef std::tuple<A, B, C> param_type; 729645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void GetSize(base::PickleSizer* sizer, const param_type& p) { 730645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez GetParamSize(sizer, std::get<0>(p)); 731645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez GetParamSize(sizer, std::get<1>(p)); 732645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez GetParamSize(sizer, std::get<2>(p)); 733645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 734645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void Write(base::Pickle* m, const param_type& p) { 735645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez WriteParam(m, std::get<0>(p)); 736645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez WriteParam(m, std::get<1>(p)); 737645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez WriteParam(m, std::get<2>(p)); 738645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 739645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static bool Read(const base::Pickle* m, 740645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez base::PickleIterator* iter, 741645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez param_type* r) { 742645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return (ReadParam(m, iter, &std::get<0>(*r)) && 743645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez ReadParam(m, iter, &std::get<1>(*r)) && 744645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez ReadParam(m, iter, &std::get<2>(*r))); 745645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 746645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void Log(const param_type& p, std::string* l) { 747645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez LogParam(std::get<0>(p), l); 748645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez l->append(", "); 749645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez LogParam(std::get<1>(p), l); 750645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez l->append(", "); 751645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez LogParam(std::get<2>(p), l); 752645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 753645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez}; 754645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 755645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chaveztemplate <class A, class B, class C, class D> 756645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezstruct ParamTraits<std::tuple<A, B, C, D>> { 757645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez typedef std::tuple<A, B, C, D> param_type; 758645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void GetSize(base::PickleSizer* sizer, const param_type& p) { 759645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez GetParamSize(sizer, std::get<0>(p)); 760645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez GetParamSize(sizer, std::get<1>(p)); 761645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez GetParamSize(sizer, std::get<2>(p)); 762645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez GetParamSize(sizer, std::get<3>(p)); 763645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 764645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void Write(base::Pickle* m, const param_type& p) { 765645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez WriteParam(m, std::get<0>(p)); 766645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez WriteParam(m, std::get<1>(p)); 767645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez WriteParam(m, std::get<2>(p)); 768645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez WriteParam(m, std::get<3>(p)); 769645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 770645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static bool Read(const base::Pickle* m, 771645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez base::PickleIterator* iter, 772645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez param_type* r) { 773645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return (ReadParam(m, iter, &std::get<0>(*r)) && 774645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez ReadParam(m, iter, &std::get<1>(*r)) && 775645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez ReadParam(m, iter, &std::get<2>(*r)) && 776645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez ReadParam(m, iter, &std::get<3>(*r))); 777645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 778645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void Log(const param_type& p, std::string* l) { 779645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez LogParam(std::get<0>(p), l); 780645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez l->append(", "); 781645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez LogParam(std::get<1>(p), l); 782645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez l->append(", "); 783645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez LogParam(std::get<2>(p), l); 784645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez l->append(", "); 785645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez LogParam(std::get<3>(p), l); 786645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 787645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez}; 788645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 789645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chaveztemplate <class A, class B, class C, class D, class E> 790645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezstruct ParamTraits<std::tuple<A, B, C, D, E>> { 791645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez typedef std::tuple<A, B, C, D, E> param_type; 792645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void GetSize(base::PickleSizer* sizer, const param_type& p) { 793645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez GetParamSize(sizer, std::get<0>(p)); 794645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez GetParamSize(sizer, std::get<1>(p)); 795645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez GetParamSize(sizer, std::get<2>(p)); 796645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez GetParamSize(sizer, std::get<3>(p)); 797645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez GetParamSize(sizer, std::get<4>(p)); 798645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 799645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void Write(base::Pickle* m, const param_type& p) { 800645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez WriteParam(m, std::get<0>(p)); 801645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez WriteParam(m, std::get<1>(p)); 802645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez WriteParam(m, std::get<2>(p)); 803645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez WriteParam(m, std::get<3>(p)); 804645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez WriteParam(m, std::get<4>(p)); 805645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 806645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static bool Read(const base::Pickle* m, 807645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez base::PickleIterator* iter, 808645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez param_type* r) { 809645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return (ReadParam(m, iter, &std::get<0>(*r)) && 810645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez ReadParam(m, iter, &std::get<1>(*r)) && 811645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez ReadParam(m, iter, &std::get<2>(*r)) && 812645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez ReadParam(m, iter, &std::get<3>(*r)) && 813645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez ReadParam(m, iter, &std::get<4>(*r))); 814645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 815645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void Log(const param_type& p, std::string* l) { 816645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez LogParam(std::get<0>(p), l); 817645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez l->append(", "); 818645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez LogParam(std::get<1>(p), l); 819645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez l->append(", "); 820645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez LogParam(std::get<2>(p), l); 821645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez l->append(", "); 822645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez LogParam(std::get<3>(p), l); 823645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez l->append(", "); 824645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez LogParam(std::get<4>(p), l); 825645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 826645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez}; 827645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 828645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chaveztemplate<class P> 829645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezstruct ParamTraits<ScopedVector<P> > { 830645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez typedef ScopedVector<P> param_type; 831645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void Write(base::Pickle* m, const param_type& p) { 832645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez WriteParam(m, static_cast<int>(p.size())); 833645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez for (size_t i = 0; i < p.size(); i++) 834645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez WriteParam(m, *p[i]); 835645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 836645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static bool Read(const base::Pickle* m, 837645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez base::PickleIterator* iter, 838645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez param_type* r) { 839645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez int size = 0; 840645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez if (!iter->ReadLength(&size)) 841645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return false; 842645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez if (INT_MAX/sizeof(P) <= static_cast<size_t>(size)) 843645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return false; 844645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez r->resize(size); 845645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez for (int i = 0; i < size; i++) { 846645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez (*r)[i] = new P(); 847645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez if (!ReadParam(m, iter, (*r)[i])) 848645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return false; 849645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 850645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return true; 851645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 852645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void Log(const param_type& p, std::string* l) { 853645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez for (size_t i = 0; i < p.size(); ++i) { 854645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez if (i != 0) 855645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez l->append(" "); 856645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez LogParam(*p[i], l); 857645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 858645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 859645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez}; 860645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 861645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chaveztemplate <class P, size_t stack_capacity> 862645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezstruct ParamTraits<base::StackVector<P, stack_capacity> > { 863645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez typedef base::StackVector<P, stack_capacity> param_type; 864645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void GetSize(base::PickleSizer* sizer, const param_type& p) { 865645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez GetParamSize(sizer, static_cast<int>(p->size())); 866645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez for (size_t i = 0; i < p->size(); i++) 867645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez GetParamSize(sizer, p[i]); 868645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 869645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void Write(base::Pickle* m, const param_type& p) { 870645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez WriteParam(m, static_cast<int>(p->size())); 871645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez for (size_t i = 0; i < p->size(); i++) 872645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez WriteParam(m, p[i]); 873645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 874645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static bool Read(const base::Pickle* m, 875645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez base::PickleIterator* iter, 876645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez param_type* r) { 877645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez int size; 878645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez // ReadLength() checks for < 0 itself. 879645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez if (!iter->ReadLength(&size)) 880645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return false; 881645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez // Sanity check for the vector size. 882645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez if (INT_MAX / sizeof(P) <= static_cast<size_t>(size)) 883645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return false; 884645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez P value; 885645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez for (int i = 0; i < size; i++) { 886645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez if (!ReadParam(m, iter, &value)) 887645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return false; 888645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez (*r)->push_back(value); 889645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 890645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return true; 891645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 892645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void Log(const param_type& p, std::string* l) { 893645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez for (size_t i = 0; i < p->size(); ++i) { 894645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez if (i != 0) 895645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez l->append(" "); 896645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez LogParam((p[i]), l); 897645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 898645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 899645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez}; 900645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 901645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chaveztemplate <typename NormalMap, 902645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez int kArraySize, 903645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez typename EqualKey, 904645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez typename MapInit> 905645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezstruct ParamTraits<base::SmallMap<NormalMap, kArraySize, EqualKey, MapInit> > { 906645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez typedef base::SmallMap<NormalMap, kArraySize, EqualKey, MapInit> param_type; 907645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez typedef typename param_type::key_type K; 908645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez typedef typename param_type::data_type V; 909645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void GetSize(base::PickleSizer* sizer, const param_type& p) { 910645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez GetParamSize(sizer, static_cast<int>(p.size())); 911645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez typename param_type::const_iterator iter; 912645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez for (iter = p.begin(); iter != p.end(); ++iter) { 913645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez GetParamSize(sizer, iter->first); 914645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez GetParamSize(sizer, iter->second); 915645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 916645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 917645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void Write(base::Pickle* m, const param_type& p) { 918645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez WriteParam(m, static_cast<int>(p.size())); 919645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez typename param_type::const_iterator iter; 920645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez for (iter = p.begin(); iter != p.end(); ++iter) { 921645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez WriteParam(m, iter->first); 922645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez WriteParam(m, iter->second); 923645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 924645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 925645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static bool Read(const base::Pickle* m, 926645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez base::PickleIterator* iter, 927645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez param_type* r) { 928645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez int size; 929645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez if (!iter->ReadLength(&size)) 930645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return false; 931645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez for (int i = 0; i < size; ++i) { 932645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez K key; 933645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez if (!ReadParam(m, iter, &key)) 934645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return false; 935645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez V& value = (*r)[key]; 936645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez if (!ReadParam(m, iter, &value)) 937645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return false; 938645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 939645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return true; 940645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 941645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void Log(const param_type& p, std::string* l) { 942645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez l->append("<base::SmallMap>"); 943645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 944645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez}; 945645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 946645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chaveztemplate <class P> 947645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezstruct ParamTraits<std::unique_ptr<P>> { 948645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez typedef std::unique_ptr<P> param_type; 949645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void GetSize(base::PickleSizer* sizer, const param_type& p) { 950645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez bool valid = !!p; 951645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez GetParamSize(sizer, valid); 952645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez if (valid) 953645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez GetParamSize(sizer, *p); 954645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 955645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void Write(base::Pickle* m, const param_type& p) { 956645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez bool valid = !!p; 957645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez WriteParam(m, valid); 958645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez if (valid) 959645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez WriteParam(m, *p); 960645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 961645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static bool Read(const base::Pickle* m, 962645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez base::PickleIterator* iter, 963645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez param_type* r) { 964645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez bool valid = false; 965645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez if (!ReadParam(m, iter, &valid)) 966645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return false; 967645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 968645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez if (!valid) { 969645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez r->reset(); 970645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return true; 971645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 972645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 973645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez param_type temp(new P()); 974645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez if (!ReadParam(m, iter, temp.get())) 975645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return false; 976645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 977645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez r->swap(temp); 978645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return true; 979645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 980645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void Log(const param_type& p, std::string* l) { 981645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez if (p) 982645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez LogParam(*p, l); 983645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez else 984645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez l->append("NULL"); 985645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 986645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez}; 987645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 988645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chaveztemplate <class P> 989645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezstruct ParamTraits<base::Optional<P>> { 990645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez typedef base::Optional<P> param_type; 991645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void GetSize(base::PickleSizer* sizer, const param_type& p) { 992645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez const bool is_set = static_cast<bool>(p); 993645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez GetParamSize(sizer, is_set); 994645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez if (is_set) 995645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez GetParamSize(sizer, p.value()); 996645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 997645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void Write(base::Pickle* m, const param_type& p) { 998645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez const bool is_set = static_cast<bool>(p); 999645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez WriteParam(m, is_set); 1000645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez if (is_set) 1001645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez WriteParam(m, p.value()); 1002645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 1003645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static bool Read(const base::Pickle* m, 1004645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez base::PickleIterator* iter, 1005645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez param_type* r) { 1006645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez bool is_set = false; 1007645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez if (!iter->ReadBool(&is_set)) 1008645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return false; 1009645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez if (is_set) { 1010645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez P value; 1011645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez if (!ReadParam(m, iter, &value)) 1012645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return false; 1013645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez *r = std::move(value); 1014645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 1015645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return true; 1016645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 1017645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void Log(const param_type& p, std::string* l) { 1018645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez if (p) 1019645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez LogParam(p.value(), l); 1020645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez else 1021645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez l->append("(unset)"); 1022645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 1023645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez}; 1024645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 1025645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// IPC types ParamTraits ------------------------------------------------------- 1026645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 1027645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// A ChannelHandle is basically a platform-inspecific wrapper around the 1028645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// fact that IPC endpoints are handled specially on POSIX. See above comments 1029645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// on FileDescriptor for more background. 1030645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chaveztemplate<> 1031645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezstruct IPC_EXPORT ParamTraits<IPC::ChannelHandle> { 1032645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez typedef ChannelHandle param_type; 1033645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void GetSize(base::PickleSizer* sizer, const param_type& p); 1034645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void Write(base::Pickle* m, const param_type& p); 1035645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static bool Read(const base::Pickle* m, 1036645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez base::PickleIterator* iter, 1037645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez param_type* r); 1038645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void Log(const param_type& p, std::string* l); 1039645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez}; 1040645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 1041645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chaveztemplate <> 1042645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezstruct IPC_EXPORT ParamTraits<LogData> { 1043645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez typedef LogData param_type; 1044645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void GetSize(base::PickleSizer* sizer, const param_type& p); 1045645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void Write(base::Pickle* m, const param_type& p); 1046645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static bool Read(const base::Pickle* m, 1047645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez base::PickleIterator* iter, 1048645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez param_type* r); 1049645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void Log(const param_type& p, std::string* l); 1050645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez}; 1051645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 1052645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chaveztemplate <> 1053645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezstruct IPC_EXPORT ParamTraits<Message> { 1054645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void Write(base::Pickle* m, const Message& p); 1055645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static bool Read(const base::Pickle* m, 1056645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez base::PickleIterator* iter, 1057645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez Message* r); 1058645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void Log(const Message& p, std::string* l); 1059645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez}; 1060645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 1061645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// Windows ParamTraits --------------------------------------------------------- 1062645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 1063645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#if defined(OS_WIN) 1064645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chaveztemplate <> 1065645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezstruct IPC_EXPORT ParamTraits<HANDLE> { 1066645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez typedef HANDLE param_type; 1067645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void GetSize(base::PickleSizer* sizer, const param_type& p); 1068645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void Write(base::Pickle* m, const param_type& p); 1069645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static bool Read(const base::Pickle* m, 1070645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez base::PickleIterator* iter, 1071645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez param_type* r); 1072645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void Log(const param_type& p, std::string* l); 1073645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez}; 1074645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 1075645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chaveztemplate <> 1076645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezstruct IPC_EXPORT ParamTraits<LOGFONT> { 1077645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez typedef LOGFONT param_type; 1078645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void GetSize(base::PickleSizer* sizer, const param_type& p); 1079645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void Write(base::Pickle* m, const param_type& p); 1080645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static bool Read(const base::Pickle* m, 1081645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez base::PickleIterator* iter, 1082645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez param_type* r); 1083645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void Log(const param_type& p, std::string* l); 1084645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez}; 1085645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 1086645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chaveztemplate <> 1087645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezstruct IPC_EXPORT ParamTraits<MSG> { 1088645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez typedef MSG param_type; 1089645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void GetSize(base::PickleSizer* sizer, const param_type& p); 1090645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void Write(base::Pickle* m, const param_type& p); 1091645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static bool Read(const base::Pickle* m, 1092645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez base::PickleIterator* iter, 1093645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez param_type* r); 1094645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static void Log(const param_type& p, std::string* l); 1095645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez}; 1096645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#endif // defined(OS_WIN) 1097645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 1098645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez//----------------------------------------------------------------------------- 1099645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// Generic message subclasses 1100645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 1101645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// defined in ipc_logging.cc 1102645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector ChavezIPC_EXPORT void GenerateLogData(const std::string& channel, 1103645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez const Message& message, 1104645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez LogData* data, bool get_params); 1105645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 1106645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 1107645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#if defined(IPC_MESSAGE_LOG_ENABLED) 1108645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezinline void AddOutputParamsToLog(const Message* msg, std::string* l) { 1109645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez const std::string& output_params = msg->output_params(); 1110645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez if (!l->empty() && !output_params.empty()) 1111645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez l->append(", "); 1112645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 1113645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez l->append(output_params); 1114645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez} 1115645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 1116645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chaveztemplate <class ReplyParamType> 1117645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezinline void LogReplyParamsToMessage(const ReplyParamType& reply_params, 1118645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez const Message* msg) { 1119645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez if (msg->received_time() != 0) { 1120645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez std::string output_params; 1121645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez LogParam(reply_params, &output_params); 1122645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez msg->set_output_params(output_params); 1123645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 1124645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez} 1125645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 1126645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezinline void ConnectMessageAndReply(const Message* msg, Message* reply) { 1127645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez if (msg->sent_time()) { 1128645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez // Don't log the sync message after dispatch, as we don't have the 1129645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez // output parameters at that point. Instead, save its data and log it 1130645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez // with the outgoing reply message when it's sent. 1131645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez LogData* data = new LogData; 1132645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez GenerateLogData("", *msg, data, true); 1133645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez msg->set_dont_log(); 1134645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez reply->set_sync_log_data(data); 1135645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 1136645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez} 1137645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#else 1138645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezinline void AddOutputParamsToLog(const Message* msg, std::string* l) {} 1139645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 1140645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chaveztemplate <class ReplyParamType> 1141645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezinline void LogReplyParamsToMessage(const ReplyParamType& reply_params, 1142645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez const Message* msg) {} 1143645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 1144645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezinline void ConnectMessageAndReply(const Message* msg, Message* reply) {} 1145645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#endif 1146645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 1147645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez} // namespace IPC 1148645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 1149645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#endif // IPC_IPC_MESSAGE_UTILS_H_ 1150