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