blob: 23cfd1339b5cd2d382a371fa4a29eafdf1bb2f17 [file] [log] [blame]
amit@chromium.org37290742012-01-24 11:36:05 +09001// Copyright (c) 2012 The Chromium Authors. All rights reserved.
agl@chromium.org1c6dcf22009-07-23 08:57:21 +09002// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "ipc/ipc_message_utils.h"
6
avi42ebda42015-12-22 11:39:04 +09007#include <stddef.h>
8#include <stdint.h>
9
brettw@chromium.org59eef1f2013-02-24 14:40:52 +090010#include "base/files/file_path.h"
brettw@chromium.org7cd41eb2009-10-24 05:00:20 +090011#include "base/json/json_writer.h"
avi@chromium.orgd8179652013-06-13 22:47:46 +090012#include "base/strings/nullable_string16.h"
avi@chromium.orge7eaf392013-06-11 15:32:18 +090013#include "base/strings/string_number_conversions.h"
avi@chromium.org64535542013-06-08 07:40:45 +090014#include "base/strings/utf_string_conversions.h"
avi@chromium.org78a7e7b2013-06-29 00:20:02 +090015#include "base/time/time.h"
tguilbert76e690d2016-09-20 06:11:25 +090016#include "base/unguessable_token.h"
agl@chromium.org1c6dcf22009-07-23 08:57:21 +090017#include "base/values.h"
avi42ebda42015-12-22 11:39:04 +090018#include "build/build_config.h"
brettw@chromium.orgce352e52012-06-05 06:18:25 +090019#include "ipc/ipc_channel_handle.h"
morrita7d1bfcc2015-01-31 14:45:42 +090020#include "ipc/ipc_message_attachment.h"
morrita33a35902015-01-15 06:17:06 +090021#include "ipc/ipc_message_attachment_set.h"
amistry70d63572016-06-27 15:34:42 +090022#include "ipc/ipc_mojo_param_traits.h"
brettw@chromium.orgce352e52012-06-05 06:18:25 +090023
morrita7d1bfcc2015-01-31 14:45:42 +090024#if defined(OS_POSIX)
sammc5aeaa8a2016-11-14 12:29:08 +090025#include "base/file_descriptor_posix.h"
morrita7d1bfcc2015-01-31 14:45:42 +090026#include "ipc/ipc_platform_file_attachment_posix.h"
27#endif
28
erikchen18430e52015-09-26 07:34:31 +090029#if (defined(OS_MACOSX) && !defined(OS_IOS)) || defined(OS_WIN)
scottmg81491272015-06-20 07:51:00 +090030#include "base/memory/shared_memory_handle.h"
erikchen18430e52015-09-26 07:34:31 +090031#endif // (defined(OS_MACOSX) && !defined(OS_IOS)) || defined(OS_WIN)
scottmg81491272015-06-20 07:51:00 +090032
erikchenae16e0c2015-10-10 04:12:06 +090033#if defined(OS_MACOSX) && !defined(OS_IOS)
34#include "ipc/mach_port_mac.h"
35#endif
36
morrita33a35902015-01-15 06:17:06 +090037#if defined(OS_WIN)
jschuh@chromium.orgb9ee7d62012-11-21 09:58:00 +090038#include <tchar.h>
erikchen18430e52015-09-26 07:34:31 +090039#include "ipc/handle_win.h"
erg@google.come6ffcb52010-08-18 03:38:24 +090040#endif
agl@chromium.org1c6dcf22009-07-23 08:57:21 +090041
42namespace IPC {
43
brettw@chromium.orgce352e52012-06-05 06:18:25 +090044namespace {
45
joaodasilvaed61f4c2017-01-10 18:55:36 +090046const int kMaxRecursionDepth = 200;
agl@chromium.org1c6dcf22009-07-23 08:57:21 +090047
brettw@chromium.orgce352e52012-06-05 06:18:25 +090048template<typename CharType>
49void LogBytes(const std::vector<CharType>& data, std::string* out) {
50#if defined(OS_WIN)
51 // Windows has a GUI for logging, which can handle arbitrary binary data.
52 for (size_t i = 0; i < data.size(); ++i)
53 out->push_back(data[i]);
54#else
55 // On POSIX, we log to stdout, which we assume can display ASCII.
56 static const size_t kMaxBytesToLog = 100;
57 for (size_t i = 0; i < std::min(data.size(), kMaxBytesToLog); ++i) {
58 if (isprint(data[i]))
59 out->push_back(data[i]);
60 else
groby@chromium.org6b4dc5e2013-03-19 07:33:04 +090061 out->append(
62 base::StringPrintf("[%02X]", static_cast<unsigned char>(data[i])));
brettw@chromium.orgce352e52012-06-05 06:18:25 +090063 }
64 if (data.size() > kMaxBytesToLog) {
groby@chromium.org22e93982013-03-31 02:29:28 +090065 out->append(base::StringPrintf(
66 " and %u more bytes",
67 static_cast<unsigned>(data.size() - kMaxBytesToLog)));
brettw@chromium.orgce352e52012-06-05 06:18:25 +090068 }
69#endif
70}
agl@chromium.org1c6dcf22009-07-23 08:57:21 +090071
rockot6dbfea52016-02-04 05:20:16 +090072bool ReadValue(const base::Pickle* m,
brettwf3146202015-06-03 13:29:25 +090073 base::PickleIterator* iter,
74 base::Value** value,
brettw@chromium.orgce352e52012-06-05 06:18:25 +090075 int recursion);
agl@chromium.org1c6dcf22009-07-23 08:57:21 +090076
rockot15c8ac42016-02-05 11:12:32 +090077void GetValueSize(base::PickleSizer* sizer,
78 const base::Value* value,
79 int recursion) {
80 if (recursion > kMaxRecursionDepth) {
joaodasilvaed61f4c2017-01-10 18:55:36 +090081 LOG(ERROR) << "Max recursion depth hit in GetValueSize.";
rockot15c8ac42016-02-05 11:12:32 +090082 return;
83 }
84
85 sizer->AddInt();
86 switch (value->GetType()) {
jdoerrie89ee31a2016-12-08 00:43:28 +090087 case base::Value::Type::NONE:
rockot15c8ac42016-02-05 11:12:32 +090088 break;
jdoerrie89ee31a2016-12-08 00:43:28 +090089 case base::Value::Type::BOOLEAN:
rockot15c8ac42016-02-05 11:12:32 +090090 sizer->AddBool();
91 break;
jdoerrie89ee31a2016-12-08 00:43:28 +090092 case base::Value::Type::INTEGER:
rockot15c8ac42016-02-05 11:12:32 +090093 sizer->AddInt();
94 break;
jdoerrie89ee31a2016-12-08 00:43:28 +090095 case base::Value::Type::DOUBLE:
rockot15c8ac42016-02-05 11:12:32 +090096 sizer->AddDouble();
97 break;
jdoerrie89ee31a2016-12-08 00:43:28 +090098 case base::Value::Type::STRING: {
jdoerrie0d1295b2017-03-06 20:12:04 +090099 const base::Value* result;
rockot15c8ac42016-02-05 11:12:32 +0900100 value->GetAsString(&result);
amistry0bab7322016-04-08 13:21:54 +0900101 if (value->GetAsString(&result)) {
102 DCHECK(result);
103 GetParamSize(sizer, result->GetString());
104 } else {
105 std::string str;
106 bool as_string_result = value->GetAsString(&str);
107 DCHECK(as_string_result);
108 GetParamSize(sizer, str);
109 }
rockot15c8ac42016-02-05 11:12:32 +0900110 break;
111 }
jdoerrie89ee31a2016-12-08 00:43:28 +0900112 case base::Value::Type::BINARY: {
jdoerrie58325a42017-02-15 17:42:14 +0900113 sizer->AddData(static_cast<int>(value->GetSize()));
rockot15c8ac42016-02-05 11:12:32 +0900114 break;
115 }
jdoerrie89ee31a2016-12-08 00:43:28 +0900116 case base::Value::Type::DICTIONARY: {
rockot15c8ac42016-02-05 11:12:32 +0900117 sizer->AddInt();
118 const base::DictionaryValue* dict =
119 static_cast<const base::DictionaryValue*>(value);
120 for (base::DictionaryValue::Iterator it(*dict); !it.IsAtEnd();
121 it.Advance()) {
122 GetParamSize(sizer, it.key());
123 GetValueSize(sizer, &it.value(), recursion + 1);
124 }
125 break;
126 }
jdoerrie89ee31a2016-12-08 00:43:28 +0900127 case base::Value::Type::LIST: {
rockot15c8ac42016-02-05 11:12:32 +0900128 sizer->AddInt();
129 const base::ListValue* list = static_cast<const base::ListValue*>(value);
dcheng1fa44fb2016-05-26 03:30:47 +0900130 for (const auto& entry : *list) {
jdoerrie45184002017-04-12 03:09:14 +0900131 GetValueSize(sizer, &entry, recursion + 1);
rockot15c8ac42016-02-05 11:12:32 +0900132 }
133 break;
134 }
135 default:
136 NOTREACHED() << "Invalid base::Value type.";
137 }
138}
139
rockot6dbfea52016-02-04 05:20:16 +0900140void WriteValue(base::Pickle* m, const base::Value* value, int recursion) {
orenb@chromium.org88de3872012-07-26 10:29:21 +0900141 bool result;
agl@chromium.org1c6dcf22009-07-23 08:57:21 +0900142 if (recursion > kMaxRecursionDepth) {
joaodasilvaed61f4c2017-01-10 18:55:36 +0900143 LOG(ERROR) << "Max recursion depth hit in WriteValue.";
agl@chromium.org1c6dcf22009-07-23 08:57:21 +0900144 return;
145 }
146
jdoerrie89ee31a2016-12-08 00:43:28 +0900147 m->WriteInt(static_cast<int>(value->GetType()));
agl@chromium.org1c6dcf22009-07-23 08:57:21 +0900148
149 switch (value->GetType()) {
jdoerrie89ee31a2016-12-08 00:43:28 +0900150 case base::Value::Type::NONE:
agl@chromium.org1c6dcf22009-07-23 08:57:21 +0900151 break;
jdoerrie89ee31a2016-12-08 00:43:28 +0900152 case base::Value::Type::BOOLEAN: {
agl@chromium.org1c6dcf22009-07-23 08:57:21 +0900153 bool val;
orenb@chromium.org88de3872012-07-26 10:29:21 +0900154 result = value->GetAsBoolean(&val);
155 DCHECK(result);
agl@chromium.org1c6dcf22009-07-23 08:57:21 +0900156 WriteParam(m, val);
157 break;
158 }
jdoerrie89ee31a2016-12-08 00:43:28 +0900159 case base::Value::Type::INTEGER: {
agl@chromium.org1c6dcf22009-07-23 08:57:21 +0900160 int val;
orenb@chromium.org88de3872012-07-26 10:29:21 +0900161 result = value->GetAsInteger(&val);
162 DCHECK(result);
agl@chromium.org1c6dcf22009-07-23 08:57:21 +0900163 WriteParam(m, val);
164 break;
165 }
jdoerrie89ee31a2016-12-08 00:43:28 +0900166 case base::Value::Type::DOUBLE: {
agl@chromium.org1c6dcf22009-07-23 08:57:21 +0900167 double val;
orenb@chromium.org88de3872012-07-26 10:29:21 +0900168 result = value->GetAsDouble(&val);
169 DCHECK(result);
agl@chromium.org1c6dcf22009-07-23 08:57:21 +0900170 WriteParam(m, val);
171 break;
172 }
jdoerrie89ee31a2016-12-08 00:43:28 +0900173 case base::Value::Type::STRING: {
agl@chromium.org1c6dcf22009-07-23 08:57:21 +0900174 std::string val;
orenb@chromium.org88de3872012-07-26 10:29:21 +0900175 result = value->GetAsString(&val);
176 DCHECK(result);
agl@chromium.org1c6dcf22009-07-23 08:57:21 +0900177 WriteParam(m, val);
178 break;
179 }
jdoerrie89ee31a2016-12-08 00:43:28 +0900180 case base::Value::Type::BINARY: {
jdoerrie58325a42017-02-15 17:42:14 +0900181 m->WriteData(value->GetBuffer(), static_cast<int>(value->GetSize()));
mpcomplete@chromium.org554d4312009-10-07 03:15:58 +0900182 break;
agl@chromium.org1c6dcf22009-07-23 08:57:21 +0900183 }
jdoerrie89ee31a2016-12-08 00:43:28 +0900184 case base::Value::Type::DICTIONARY: {
brettw@chromium.orgccffb7d2013-06-14 07:50:27 +0900185 const base::DictionaryValue* dict =
186 static_cast<const base::DictionaryValue*>(value);
agl@chromium.org1c6dcf22009-07-23 08:57:21 +0900187
pkasting@chromium.org36515db2009-11-26 05:47:52 +0900188 WriteParam(m, static_cast<int>(dict->size()));
agl@chromium.org1c6dcf22009-07-23 08:57:21 +0900189
brettw@chromium.orgccffb7d2013-06-14 07:50:27 +0900190 for (base::DictionaryValue::Iterator it(*dict); !it.IsAtEnd();
191 it.Advance()) {
pneubeck@chromium.orga2fbefc2013-01-18 23:43:27 +0900192 WriteParam(m, it.key());
193 WriteValue(m, &it.value(), recursion + 1);
agl@chromium.org1c6dcf22009-07-23 08:57:21 +0900194 }
195 break;
196 }
jdoerrie89ee31a2016-12-08 00:43:28 +0900197 case base::Value::Type::LIST: {
brettw@chromium.orgccffb7d2013-06-14 07:50:27 +0900198 const base::ListValue* list = static_cast<const base::ListValue*>(value);
agl@chromium.org1c6dcf22009-07-23 08:57:21 +0900199 WriteParam(m, static_cast<int>(list->GetSize()));
dcheng1fa44fb2016-05-26 03:30:47 +0900200 for (const auto& entry : *list) {
jdoerrie45184002017-04-12 03:09:14 +0900201 WriteValue(m, &entry, recursion + 1);
agl@chromium.org1c6dcf22009-07-23 08:57:21 +0900202 }
203 break;
204 }
205 }
206}
207
208// Helper for ReadValue that reads a DictionaryValue into a pre-allocated
209// object.
rockot6dbfea52016-02-04 05:20:16 +0900210bool ReadDictionaryValue(const base::Pickle* m,
brettwf3146202015-06-03 13:29:25 +0900211 base::PickleIterator* iter,
212 base::DictionaryValue* value,
213 int recursion) {
agl@chromium.org1c6dcf22009-07-23 08:57:21 +0900214 int size;
215 if (!ReadParam(m, iter, &size))
216 return false;
217
218 for (int i = 0; i < size; ++i) {
viettrungluu@chromium.org178423d2010-07-31 04:47:47 +0900219 std::string key;
brettw@chromium.org32285192013-06-22 04:42:19 +0900220 base::Value* subval;
agl@chromium.org1c6dcf22009-07-23 08:57:21 +0900221 if (!ReadParam(m, iter, &key) ||
222 !ReadValue(m, iter, &subval, recursion + 1))
223 return false;
kalman@chromium.org9c8b5732011-08-19 14:59:57 +0900224 value->SetWithoutPathExpansion(key, subval);
agl@chromium.org1c6dcf22009-07-23 08:57:21 +0900225 }
226
227 return true;
228}
229
230// Helper for ReadValue that reads a ReadListValue into a pre-allocated
231// object.
rockot6dbfea52016-02-04 05:20:16 +0900232bool ReadListValue(const base::Pickle* m,
brettwf3146202015-06-03 13:29:25 +0900233 base::PickleIterator* iter,
234 base::ListValue* value,
235 int recursion) {
agl@chromium.org1c6dcf22009-07-23 08:57:21 +0900236 int size;
237 if (!ReadParam(m, iter, &size))
238 return false;
239
240 for (int i = 0; i < size; ++i) {
brettw@chromium.orgccffb7d2013-06-14 07:50:27 +0900241 base::Value* subval;
agl@chromium.org1c6dcf22009-07-23 08:57:21 +0900242 if (!ReadValue(m, iter, &subval, recursion + 1))
243 return false;
244 value->Set(i, subval);
245 }
246
247 return true;
248}
249
rockot6dbfea52016-02-04 05:20:16 +0900250bool ReadValue(const base::Pickle* m,
brettwf3146202015-06-03 13:29:25 +0900251 base::PickleIterator* iter,
252 base::Value** value,
brettw@chromium.orgce352e52012-06-05 06:18:25 +0900253 int recursion) {
agl@chromium.org1c6dcf22009-07-23 08:57:21 +0900254 if (recursion > kMaxRecursionDepth) {
joaodasilvaed61f4c2017-01-10 18:55:36 +0900255 LOG(ERROR) << "Max recursion depth hit in ReadValue.";
agl@chromium.org1c6dcf22009-07-23 08:57:21 +0900256 return false;
257 }
258
259 int type;
260 if (!ReadParam(m, iter, &type))
261 return false;
262
jdoerrie89ee31a2016-12-08 00:43:28 +0900263 switch (static_cast<base::Value::Type>(type)) {
264 case base::Value::Type::NONE:
jdoerriefcdbae72017-04-07 15:39:00 +0900265 *value = new base::Value();
266 break;
jdoerrie89ee31a2016-12-08 00:43:28 +0900267 case base::Value::Type::BOOLEAN: {
agl@chromium.org1c6dcf22009-07-23 08:57:21 +0900268 bool val;
269 if (!ReadParam(m, iter, &val))
270 return false;
jdoerriebfe825e2017-03-02 21:09:19 +0900271 *value = new base::Value(val);
agl@chromium.org1c6dcf22009-07-23 08:57:21 +0900272 break;
273 }
jdoerrie89ee31a2016-12-08 00:43:28 +0900274 case base::Value::Type::INTEGER: {
agl@chromium.org1c6dcf22009-07-23 08:57:21 +0900275 int val;
276 if (!ReadParam(m, iter, &val))
277 return false;
jdoerriebfe825e2017-03-02 21:09:19 +0900278 *value = new base::Value(val);
agl@chromium.org1c6dcf22009-07-23 08:57:21 +0900279 break;
280 }
jdoerrie89ee31a2016-12-08 00:43:28 +0900281 case base::Value::Type::DOUBLE: {
agl@chromium.org1c6dcf22009-07-23 08:57:21 +0900282 double val;
283 if (!ReadParam(m, iter, &val))
284 return false;
jdoerriebfe825e2017-03-02 21:09:19 +0900285 *value = new base::Value(val);
agl@chromium.org1c6dcf22009-07-23 08:57:21 +0900286 break;
287 }
jdoerrie89ee31a2016-12-08 00:43:28 +0900288 case base::Value::Type::STRING: {
agl@chromium.org1c6dcf22009-07-23 08:57:21 +0900289 std::string val;
290 if (!ReadParam(m, iter, &val))
291 return false;
jdoerrie0d1295b2017-03-06 20:12:04 +0900292 *value = new base::Value(val);
agl@chromium.org1c6dcf22009-07-23 08:57:21 +0900293 break;
294 }
jdoerrie89ee31a2016-12-08 00:43:28 +0900295 case base::Value::Type::BINARY: {
mpcomplete@chromium.org554d4312009-10-07 03:15:58 +0900296 const char* data;
297 int length;
avic9f0ad02014-12-29 08:31:48 +0900298 if (!iter->ReadData(&data, &length))
mpcomplete@chromium.org554d4312009-10-07 03:15:58 +0900299 return false;
jdoerriec56cc7f2017-04-11 16:45:50 +0900300 std::unique_ptr<base::Value> val =
301 base::Value::CreateWithCopiedBuffer(data, length);
dcheng03c8f322016-06-16 19:48:42 +0900302 *value = val.release();
agl@chromium.org1c6dcf22009-07-23 08:57:21 +0900303 break;
304 }
jdoerrie89ee31a2016-12-08 00:43:28 +0900305 case base::Value::Type::DICTIONARY: {
danakjc3fb6c52016-04-23 13:21:09 +0900306 std::unique_ptr<base::DictionaryValue> val(new base::DictionaryValue());
agl@chromium.org1c6dcf22009-07-23 08:57:21 +0900307 if (!ReadDictionaryValue(m, iter, val.get(), recursion))
308 return false;
309 *value = val.release();
310 break;
311 }
jdoerrie89ee31a2016-12-08 00:43:28 +0900312 case base::Value::Type::LIST: {
danakjc3fb6c52016-04-23 13:21:09 +0900313 std::unique_ptr<base::ListValue> val(new base::ListValue());
agl@chromium.org1c6dcf22009-07-23 08:57:21 +0900314 if (!ReadListValue(m, iter, val.get(), recursion))
315 return false;
316 *value = val.release();
317 break;
318 }
mpcomplete@chromium.org554d4312009-10-07 03:15:58 +0900319 default:
agl@chromium.org1c6dcf22009-07-23 08:57:21 +0900320 return false;
321 }
322
323 return true;
324}
325
brettw@chromium.orgce352e52012-06-05 06:18:25 +0900326} // namespace
327
328// -----------------------------------------------------------------------------
329
330LogData::LogData()
331 : routing_id(0),
332 type(0),
333 sent(0),
334 receive(0),
335 dispatch(0) {
336}
337
vmpstrd661bf72016-03-25 05:22:54 +0900338LogData::LogData(const LogData& other) = default;
339
brettw@chromium.orgce352e52012-06-05 06:18:25 +0900340LogData::~LogData() {
341}
342
brettw@chromium.orgce352e52012-06-05 06:18:25 +0900343void ParamTraits<bool>::Log(const param_type& p, std::string* l) {
344 l->append(p ? "true" : "false");
345}
346
rockot15c8ac42016-02-05 11:12:32 +0900347void ParamTraits<signed char>::GetSize(base::PickleSizer* sizer,
348 const param_type& p) {
349 sizer->AddBytes(sizeof(param_type));
350}
351
rockot6dbfea52016-02-04 05:20:16 +0900352void ParamTraits<signed char>::Write(base::Pickle* m, const param_type& p) {
ortuno6e3f7b32015-10-30 09:46:20 +0900353 m->WriteBytes(&p, sizeof(param_type));
354}
355
rockot6dbfea52016-02-04 05:20:16 +0900356bool ParamTraits<signed char>::Read(const base::Pickle* m,
357 base::PickleIterator* iter,
358 param_type* r) {
ortuno6e3f7b32015-10-30 09:46:20 +0900359 const char* data;
360 if (!iter->ReadBytes(&data, sizeof(param_type)))
361 return false;
362 memcpy(r, data, sizeof(param_type));
363 return true;
364}
365
366void ParamTraits<signed char>::Log(const param_type& p, std::string* l) {
367 l->append(base::IntToString(p));
368}
369
rockot15c8ac42016-02-05 11:12:32 +0900370void ParamTraits<unsigned char>::GetSize(base::PickleSizer* sizer,
371 const param_type& p) {
372 sizer->AddBytes(sizeof(param_type));
373}
374
rockot6dbfea52016-02-04 05:20:16 +0900375void ParamTraits<unsigned char>::Write(base::Pickle* m, const param_type& p) {
tsepez@chromium.org09eb95f2013-07-13 08:12:28 +0900376 m->WriteBytes(&p, sizeof(param_type));
377}
378
rockot6dbfea52016-02-04 05:20:16 +0900379bool ParamTraits<unsigned char>::Read(const base::Pickle* m,
brettwf3146202015-06-03 13:29:25 +0900380 base::PickleIterator* iter,
381 param_type* r) {
tsepez@chromium.org09eb95f2013-07-13 08:12:28 +0900382 const char* data;
avic9f0ad02014-12-29 08:31:48 +0900383 if (!iter->ReadBytes(&data, sizeof(param_type)))
tsepez@chromium.org09eb95f2013-07-13 08:12:28 +0900384 return false;
385 memcpy(r, data, sizeof(param_type));
386 return true;
387}
388
389void ParamTraits<unsigned char>::Log(const param_type& p, std::string* l) {
390 l->append(base::UintToString(p));
391}
392
rockot15c8ac42016-02-05 11:12:32 +0900393void ParamTraits<unsigned short>::GetSize(base::PickleSizer* sizer,
394 const param_type& p) {
395 sizer->AddBytes(sizeof(param_type));
396}
397
rockot6dbfea52016-02-04 05:20:16 +0900398void ParamTraits<unsigned short>::Write(base::Pickle* m, const param_type& p) {
tsepez@chromium.org09eb95f2013-07-13 08:12:28 +0900399 m->WriteBytes(&p, sizeof(param_type));
400}
401
rockot6dbfea52016-02-04 05:20:16 +0900402bool ParamTraits<unsigned short>::Read(const base::Pickle* m,
brettwf3146202015-06-03 13:29:25 +0900403 base::PickleIterator* iter,
tsepez@chromium.org09eb95f2013-07-13 08:12:28 +0900404 param_type* r) {
405 const char* data;
avic9f0ad02014-12-29 08:31:48 +0900406 if (!iter->ReadBytes(&data, sizeof(param_type)))
tsepez@chromium.org09eb95f2013-07-13 08:12:28 +0900407 return false;
408 memcpy(r, data, sizeof(param_type));
409 return true;
410}
411
412void ParamTraits<unsigned short>::Log(const param_type& p, std::string* l) {
413 l->append(base::UintToString(p));
414}
415
erg@google.com8aca7272010-08-19 03:33:57 +0900416void ParamTraits<int>::Log(const param_type& p, std::string* l) {
417 l->append(base::IntToString(p));
418}
419
420void ParamTraits<unsigned int>::Log(const param_type& p, std::string* l) {
421 l->append(base::UintToString(p));
422}
423
jam739d8d12016-02-11 09:50:28 +0900424#if defined(OS_WIN) || defined(OS_LINUX) || \
425 (defined(OS_ANDROID) && defined(ARCH_CPU_64_BITS))
erg@google.com8aca7272010-08-19 03:33:57 +0900426void ParamTraits<long>::Log(const param_type& p, std::string* l) {
tfarina1cbfa082015-09-05 03:47:57 +0900427 l->append(base::Int64ToString(static_cast<int64_t>(p)));
erg@google.com8aca7272010-08-19 03:33:57 +0900428}
429
430void ParamTraits<unsigned long>::Log(const param_type& p, std::string* l) {
tfarina1cbfa082015-09-05 03:47:57 +0900431 l->append(base::Uint64ToString(static_cast<uint64_t>(p)));
erg@google.com8aca7272010-08-19 03:33:57 +0900432}
jam923e5462016-02-11 05:13:39 +0900433#endif
erg@google.com8aca7272010-08-19 03:33:57 +0900434
435void ParamTraits<long long>::Log(const param_type& p, std::string* l) {
tfarina1cbfa082015-09-05 03:47:57 +0900436 l->append(base::Int64ToString(static_cast<int64_t>(p)));
erg@google.com8aca7272010-08-19 03:33:57 +0900437}
438
439void ParamTraits<unsigned long long>::Log(const param_type& p, std::string* l) {
440 l->append(base::Uint64ToString(p));
441}
erg@google.come6ffcb52010-08-18 03:38:24 +0900442
brettw@chromium.orgce352e52012-06-05 06:18:25 +0900443void ParamTraits<float>::Log(const param_type& p, std::string* l) {
groby@chromium.org6b4dc5e2013-03-19 07:33:04 +0900444 l->append(base::StringPrintf("%e", p));
erg@google.come6ffcb52010-08-18 03:38:24 +0900445}
446
rockot15c8ac42016-02-05 11:12:32 +0900447void ParamTraits<double>::GetSize(base::PickleSizer* sizer,
448 const param_type& p) {
449 sizer->AddBytes(sizeof(param_type));
450}
451
rockot6dbfea52016-02-04 05:20:16 +0900452void ParamTraits<double>::Write(base::Pickle* m, const param_type& p) {
piman@chromium.orgdd413b42013-10-31 18:27:31 +0900453 m->WriteBytes(reinterpret_cast<const char*>(&p), sizeof(param_type));
apatrick@chromium.org519c1c62010-10-22 07:04:52 +0900454}
455
rockot6dbfea52016-02-04 05:20:16 +0900456bool ParamTraits<double>::Read(const base::Pickle* m,
brettwf3146202015-06-03 13:29:25 +0900457 base::PickleIterator* iter,
brettw@chromium.orgce352e52012-06-05 06:18:25 +0900458 param_type* r) {
459 const char *data;
avic9f0ad02014-12-29 08:31:48 +0900460 if (!iter->ReadBytes(&data, sizeof(*r))) {
brettw@chromium.orgce352e52012-06-05 06:18:25 +0900461 NOTREACHED();
462 return false;
463 }
464 memcpy(r, data, sizeof(param_type));
465 return true;
apatrick@chromium.org519c1c62010-10-22 07:04:52 +0900466}
467
brettw@chromium.orgce352e52012-06-05 06:18:25 +0900468void ParamTraits<double>::Log(const param_type& p, std::string* l) {
groby@chromium.org6b4dc5e2013-03-19 07:33:04 +0900469 l->append(base::StringPrintf("%e", p));
isherman@chromium.org9952aaf2011-09-03 05:42:04 +0900470}
471
brettw@chromium.orgce352e52012-06-05 06:18:25 +0900472
473void ParamTraits<std::string>::Log(const param_type& p, std::string* l) {
474 l->append(p);
isherman@chromium.org9952aaf2011-09-03 05:42:04 +0900475}
476
brettw@chromium.org5b040852013-12-03 09:39:26 +0900477void ParamTraits<base::string16>::Log(const param_type& p, std::string* l) {
avi@chromium.org4f87d8f2013-12-26 03:18:01 +0900478 l->append(base::UTF16ToUTF8(p));
brettw@chromium.orgce352e52012-06-05 06:18:25 +0900479}
brettw@chromium.orgce352e52012-06-05 06:18:25 +0900480
rockot15c8ac42016-02-05 11:12:32 +0900481void ParamTraits<std::vector<char>>::GetSize(base::PickleSizer* sizer,
482 const param_type& p) {
483 sizer->AddData(static_cast<int>(p.size()));
484}
485
rockot6dbfea52016-02-04 05:20:16 +0900486void ParamTraits<std::vector<char>>::Write(base::Pickle* m,
487 const param_type& p) {
brettw@chromium.orgce352e52012-06-05 06:18:25 +0900488 if (p.empty()) {
489 m->WriteData(NULL, 0);
490 } else {
491 m->WriteData(&p.front(), static_cast<int>(p.size()));
492 }
493}
494
rockot6dbfea52016-02-04 05:20:16 +0900495bool ParamTraits<std::vector<char>>::Read(const base::Pickle* m,
brettwf3146202015-06-03 13:29:25 +0900496 base::PickleIterator* iter,
497 param_type* r) {
brettw@chromium.orgce352e52012-06-05 06:18:25 +0900498 const char *data;
499 int data_size = 0;
avic9f0ad02014-12-29 08:31:48 +0900500 if (!iter->ReadData(&data, &data_size) || data_size < 0)
brettw@chromium.orgce352e52012-06-05 06:18:25 +0900501 return false;
502 r->resize(data_size);
503 if (data_size)
504 memcpy(&r->front(), data, data_size);
505 return true;
506}
507
508void ParamTraits<std::vector<char> >::Log(const param_type& p, std::string* l) {
509 LogBytes(p, l);
510}
511
rockot15c8ac42016-02-05 11:12:32 +0900512void ParamTraits<std::vector<unsigned char>>::GetSize(base::PickleSizer* sizer,
513 const param_type& p) {
514 sizer->AddData(static_cast<int>(p.size()));
515}
516
rockot6dbfea52016-02-04 05:20:16 +0900517void ParamTraits<std::vector<unsigned char>>::Write(base::Pickle* m,
518 const param_type& p) {
brettw@chromium.orgce352e52012-06-05 06:18:25 +0900519 if (p.empty()) {
520 m->WriteData(NULL, 0);
521 } else {
522 m->WriteData(reinterpret_cast<const char*>(&p.front()),
523 static_cast<int>(p.size()));
524 }
525}
526
rockot6dbfea52016-02-04 05:20:16 +0900527bool ParamTraits<std::vector<unsigned char>>::Read(const base::Pickle* m,
brettwf3146202015-06-03 13:29:25 +0900528 base::PickleIterator* iter,
529 param_type* r) {
brettw@chromium.orgce352e52012-06-05 06:18:25 +0900530 const char *data;
531 int data_size = 0;
avic9f0ad02014-12-29 08:31:48 +0900532 if (!iter->ReadData(&data, &data_size) || data_size < 0)
brettw@chromium.orgce352e52012-06-05 06:18:25 +0900533 return false;
534 r->resize(data_size);
535 if (data_size)
536 memcpy(&r->front(), data, data_size);
537 return true;
538}
539
540void ParamTraits<std::vector<unsigned char> >::Log(const param_type& p,
541 std::string* l) {
542 LogBytes(p, l);
543}
544
rockot15c8ac42016-02-05 11:12:32 +0900545void ParamTraits<std::vector<bool>>::GetSize(base::PickleSizer* sizer,
546 const param_type& p) {
547 GetParamSize(sizer, static_cast<int>(p.size()));
548 for (size_t i = 0; i < p.size(); ++i)
549 GetParamSize(sizer, static_cast<bool>(p[i]));
550}
551
rockot6dbfea52016-02-04 05:20:16 +0900552void ParamTraits<std::vector<bool>>::Write(base::Pickle* m,
553 const param_type& p) {
brettw@chromium.orgce352e52012-06-05 06:18:25 +0900554 WriteParam(m, static_cast<int>(p.size()));
eugenis@chromium.org17085812013-03-21 05:25:00 +0900555 // Cast to bool below is required because libc++'s
556 // vector<bool>::const_reference is different from bool, and we want to avoid
557 // writing an extra specialization of ParamTraits for it.
brettw@chromium.orgce352e52012-06-05 06:18:25 +0900558 for (size_t i = 0; i < p.size(); i++)
eugenis@chromium.org17085812013-03-21 05:25:00 +0900559 WriteParam(m, static_cast<bool>(p[i]));
brettw@chromium.orgce352e52012-06-05 06:18:25 +0900560}
561
rockot6dbfea52016-02-04 05:20:16 +0900562bool ParamTraits<std::vector<bool>>::Read(const base::Pickle* m,
brettwf3146202015-06-03 13:29:25 +0900563 base::PickleIterator* iter,
564 param_type* r) {
brettw@chromium.orgce352e52012-06-05 06:18:25 +0900565 int size;
566 // ReadLength() checks for < 0 itself.
avic9f0ad02014-12-29 08:31:48 +0900567 if (!iter->ReadLength(&size))
brettw@chromium.orgce352e52012-06-05 06:18:25 +0900568 return false;
569 r->resize(size);
570 for (int i = 0; i < size; i++) {
571 bool value;
572 if (!ReadParam(m, iter, &value))
573 return false;
574 (*r)[i] = value;
575 }
576 return true;
577}
578
579void ParamTraits<std::vector<bool> >::Log(const param_type& p, std::string* l) {
580 for (size_t i = 0; i < p.size(); ++i) {
581 if (i != 0)
582 l->push_back(' ');
eugenis@chromium.org17085812013-03-21 05:25:00 +0900583 LogParam(static_cast<bool>(p[i]), l);
brettw@chromium.orgce352e52012-06-05 06:18:25 +0900584 }
apatrick@chromium.org519c1c62010-10-22 07:04:52 +0900585}
586
rockot15c8ac42016-02-05 11:12:32 +0900587void ParamTraits<base::DictionaryValue>::GetSize(base::PickleSizer* sizer,
588 const param_type& p) {
589 GetValueSize(sizer, &p, 0);
590}
591
rockot6dbfea52016-02-04 05:20:16 +0900592void ParamTraits<base::DictionaryValue>::Write(base::Pickle* m,
brettw@chromium.orgccffb7d2013-06-14 07:50:27 +0900593 const param_type& p) {
agl@chromium.org1c6dcf22009-07-23 08:57:21 +0900594 WriteValue(m, &p, 0);
595}
596
rockot6dbfea52016-02-04 05:20:16 +0900597bool ParamTraits<base::DictionaryValue>::Read(const base::Pickle* m,
brettwf3146202015-06-03 13:29:25 +0900598 base::PickleIterator* iter,
599 param_type* r) {
agl@chromium.org1c6dcf22009-07-23 08:57:21 +0900600 int type;
jdoerrie89ee31a2016-12-08 00:43:28 +0900601 if (!ReadParam(m, iter, &type) ||
602 type != static_cast<int>(base::Value::Type::DICTIONARY))
agl@chromium.org1c6dcf22009-07-23 08:57:21 +0900603 return false;
604
605 return ReadDictionaryValue(m, iter, r, 0);
606}
607
brettw@chromium.orgccffb7d2013-06-14 07:50:27 +0900608void ParamTraits<base::DictionaryValue>::Log(const param_type& p,
609 std::string* l) {
agl@chromium.org1c6dcf22009-07-23 08:57:21 +0900610 std::string json;
estadeb5f30dd2015-05-16 10:02:34 +0900611 base::JSONWriter::Write(p, &json);
erg@google.com8aca7272010-08-19 03:33:57 +0900612 l->append(json);
agl@chromium.org1c6dcf22009-07-23 08:57:21 +0900613}
614
erg@google.come6ffcb52010-08-18 03:38:24 +0900615#if defined(OS_POSIX)
jam7f5c5742016-05-12 06:05:05 +0900616void ParamTraits<base::FileDescriptor>::GetSize(base::PickleSizer* sizer,
617 const param_type& p) {
618 GetParamSize(sizer, p.fd >= 0);
amistry70d63572016-06-27 15:34:42 +0900619 if (p.fd >= 0)
620 sizer->AddAttachment();
jam7f5c5742016-05-12 06:05:05 +0900621}
622
rockot6dbfea52016-02-04 05:20:16 +0900623void ParamTraits<base::FileDescriptor>::Write(base::Pickle* m,
624 const param_type& p) {
erg@google.come6ffcb52010-08-18 03:38:24 +0900625 const bool valid = p.fd >= 0;
626 WriteParam(m, valid);
627
morritaab207252014-09-25 05:11:45 +0900628 if (!valid)
629 return;
630
631 if (p.auto_close) {
morrita7d1bfcc2015-01-31 14:45:42 +0900632 if (!m->WriteAttachment(
633 new internal::PlatformFileAttachment(base::ScopedFD(p.fd))))
morritaab207252014-09-25 05:11:45 +0900634 NOTREACHED();
635 } else {
morrita7d1bfcc2015-01-31 14:45:42 +0900636 if (!m->WriteAttachment(new internal::PlatformFileAttachment(p.fd)))
erg@google.come6ffcb52010-08-18 03:38:24 +0900637 NOTREACHED();
638 }
639}
640
rockot6dbfea52016-02-04 05:20:16 +0900641bool ParamTraits<base::FileDescriptor>::Read(const base::Pickle* m,
brettwf3146202015-06-03 13:29:25 +0900642 base::PickleIterator* iter,
erg@google.come6ffcb52010-08-18 03:38:24 +0900643 param_type* r) {
morritaab207252014-09-25 05:11:45 +0900644 *r = base::FileDescriptor();
645
erg@google.come6ffcb52010-08-18 03:38:24 +0900646 bool valid;
647 if (!ReadParam(m, iter, &valid))
648 return false;
649
morritaab207252014-09-25 05:11:45 +0900650 // TODO(morrita): Seems like this should return false.
651 if (!valid)
erg@google.come6ffcb52010-08-18 03:38:24 +0900652 return true;
erg@google.come6ffcb52010-08-18 03:38:24 +0900653
rockot6dbfea52016-02-04 05:20:16 +0900654 scoped_refptr<base::Pickle::Attachment> attachment;
morrita7d1bfcc2015-01-31 14:45:42 +0900655 if (!m->ReadAttachment(iter, &attachment))
morritaab207252014-09-25 05:11:45 +0900656 return false;
657
sammc14583362016-11-23 12:17:35 +0900658 if (static_cast<MessageAttachment*>(attachment.get())->GetType() !=
659 MessageAttachment::Type::PLATFORM_FILE) {
660 return false;
661 }
662
rockot6dbfea52016-02-04 05:20:16 +0900663 *r = base::FileDescriptor(
sammc14583362016-11-23 12:17:35 +0900664 static_cast<internal::PlatformFileAttachment*>(attachment.get())
665 ->TakePlatformFile(),
rockot6dbfea52016-02-04 05:20:16 +0900666 true);
morritaab207252014-09-25 05:11:45 +0900667 return true;
erg@google.come6ffcb52010-08-18 03:38:24 +0900668}
669
670void ParamTraits<base::FileDescriptor>::Log(const param_type& p,
erg@google.com8aca7272010-08-19 03:33:57 +0900671 std::string* l) {
erg@google.come6ffcb52010-08-18 03:38:24 +0900672 if (p.auto_close) {
groby@chromium.org6b4dc5e2013-03-19 07:33:04 +0900673 l->append(base::StringPrintf("FD(%d auto-close)", p.fd));
erg@google.come6ffcb52010-08-18 03:38:24 +0900674 } else {
groby@chromium.org6b4dc5e2013-03-19 07:33:04 +0900675 l->append(base::StringPrintf("FD(%d)", p.fd));
erg@google.come6ffcb52010-08-18 03:38:24 +0900676 }
677}
678#endif // defined(OS_POSIX)
679
scottmg81491272015-06-20 07:51:00 +0900680#if defined(OS_MACOSX) && !defined(OS_IOS)
jam7f5c5742016-05-12 06:05:05 +0900681void ParamTraits<base::SharedMemoryHandle>::GetSize(base::PickleSizer* sizer,
682 const param_type& p) {
683 GetParamSize(sizer, p.GetMemoryObject());
684 uint32_t dummy = 0;
685 GetParamSize(sizer, dummy);
686}
687
rockot6dbfea52016-02-04 05:20:16 +0900688void ParamTraits<base::SharedMemoryHandle>::Write(base::Pickle* m,
scottmg81491272015-06-20 07:51:00 +0900689 const param_type& p) {
erikchena355c822016-04-19 03:39:15 +0900690 MachPortMac mach_port_mac(p.GetMemoryObject());
691 ParamTraits<MachPortMac>::Write(m, mach_port_mac);
692 size_t size = 0;
693 bool result = p.GetSize(&size);
694 DCHECK(result);
695 ParamTraits<uint32_t>::Write(m, static_cast<uint32_t>(size));
scottmg81491272015-06-20 07:51:00 +0900696
erikchena355c822016-04-19 03:39:15 +0900697 // If the caller intended to pass ownership to the IPC stack, release a
698 // reference.
699 if (p.OwnershipPassesToIPC())
700 p.Close();
scottmg81491272015-06-20 07:51:00 +0900701}
702
rockot6dbfea52016-02-04 05:20:16 +0900703bool ParamTraits<base::SharedMemoryHandle>::Read(const base::Pickle* m,
scottmg81491272015-06-20 07:51:00 +0900704 base::PickleIterator* iter,
705 param_type* r) {
erikchena355c822016-04-19 03:39:15 +0900706 MachPortMac mach_port_mac;
707 if (!ParamTraits<MachPortMac>::Read(m, iter, &mach_port_mac))
scottmg81491272015-06-20 07:51:00 +0900708 return false;
709
erikchena355c822016-04-19 03:39:15 +0900710 uint32_t size;
711 if (!ParamTraits<uint32_t>::Read(m, iter, &size))
712 return false;
scottmg81491272015-06-20 07:51:00 +0900713
erikchena355c822016-04-19 03:39:15 +0900714 *r = base::SharedMemoryHandle(mach_port_mac.get_mach_port(),
715 static_cast<size_t>(size),
716 base::GetCurrentProcId());
717 return true;
scottmg81491272015-06-20 07:51:00 +0900718}
719
720void ParamTraits<base::SharedMemoryHandle>::Log(const param_type& p,
721 std::string* l) {
erikchena355c822016-04-19 03:39:15 +0900722 l->append("Mach port: ");
723 LogParam(p.GetMemoryObject(), l);
scottmg81491272015-06-20 07:51:00 +0900724}
erikchen347f5cb2015-10-03 08:49:26 +0900725
erikchen18430e52015-09-26 07:34:31 +0900726#elif defined(OS_WIN)
jam7f5c5742016-05-12 06:05:05 +0900727void ParamTraits<base::SharedMemoryHandle>::GetSize(base::PickleSizer* s,
728 const param_type& p) {
729 GetParamSize(s, p.NeedsBrokering());
730 if (p.NeedsBrokering()) {
731 GetParamSize(s, p.GetHandle());
732 } else {
733 GetParamSize(s, HandleToLong(p.GetHandle()));
734 }
735}
736
rockot6dbfea52016-02-04 05:20:16 +0900737void ParamTraits<base::SharedMemoryHandle>::Write(base::Pickle* m,
erikchen18430e52015-09-26 07:34:31 +0900738 const param_type& p) {
erikchen18430e52015-09-26 07:34:31 +0900739 m->WriteBool(p.NeedsBrokering());
740
741 if (p.NeedsBrokering()) {
742 HandleWin handle_win(p.GetHandle(), HandleWin::DUPLICATE);
743 ParamTraits<HandleWin>::Write(m, handle_win);
erikcheneeaf5f92016-02-02 07:14:28 +0900744
745 // If the caller intended to pass ownership to the IPC stack, release a
746 // reference.
erikchenb23e3a42016-03-30 07:26:42 +0900747 if (p.OwnershipPassesToIPC() && p.BelongsToCurrentProcess())
erikcheneeaf5f92016-02-02 07:14:28 +0900748 p.Close();
erikchen18430e52015-09-26 07:34:31 +0900749 } else {
750 m->WriteInt(HandleToLong(p.GetHandle()));
751 }
752}
753
rockot6dbfea52016-02-04 05:20:16 +0900754bool ParamTraits<base::SharedMemoryHandle>::Read(const base::Pickle* m,
erikchen18430e52015-09-26 07:34:31 +0900755 base::PickleIterator* iter,
756 param_type* r) {
erikchen18430e52015-09-26 07:34:31 +0900757 bool needs_brokering;
758 if (!iter->ReadBool(&needs_brokering))
759 return false;
760
761 if (needs_brokering) {
762 HandleWin handle_win;
763 if (!ParamTraits<HandleWin>::Read(m, iter, &handle_win))
764 return false;
erikchen97211e12016-01-08 11:17:04 +0900765 *r = base::SharedMemoryHandle(handle_win.get_handle(),
766 base::GetCurrentProcId());
erikchen18430e52015-09-26 07:34:31 +0900767 return true;
768 }
769
770 int handle_int;
771 if (!iter->ReadInt(&handle_int))
772 return false;
773 HANDLE handle = LongToHandle(handle_int);
erikchen97211e12016-01-08 11:17:04 +0900774 *r = base::SharedMemoryHandle(handle, base::GetCurrentProcId());
erikchen18430e52015-09-26 07:34:31 +0900775 return true;
776}
777
778void ParamTraits<base::SharedMemoryHandle>::Log(const param_type& p,
779 std::string* l) {
erikchen18430e52015-09-26 07:34:31 +0900780 LogParam(p.GetHandle(), l);
781 l->append(" needs brokering: ");
782 LogParam(p.NeedsBrokering(), l);
783}
scottmg81491272015-06-20 07:51:00 +0900784#endif // defined(OS_MACOSX) && !defined(OS_IOS)
785
rockot15c8ac42016-02-05 11:12:32 +0900786void ParamTraits<base::FilePath>::GetSize(base::PickleSizer* sizer,
787 const param_type& p) {
788 p.GetSizeForPickle(sizer);
789}
790
rockot6dbfea52016-02-04 05:20:16 +0900791void ParamTraits<base::FilePath>::Write(base::Pickle* m, const param_type& p) {
aedla@chromium.org51127b92013-01-28 22:47:55 +0900792 p.WriteToPickle(m);
brettw@chromium.orgce352e52012-06-05 06:18:25 +0900793}
794
rockot6dbfea52016-02-04 05:20:16 +0900795bool ParamTraits<base::FilePath>::Read(const base::Pickle* m,
brettwf3146202015-06-03 13:29:25 +0900796 base::PickleIterator* iter,
brettw@chromium.org22b3fda2013-02-10 13:49:30 +0900797 param_type* r) {
aedla@chromium.org51127b92013-01-28 22:47:55 +0900798 return r->ReadFromPickle(iter);
brettw@chromium.orgce352e52012-06-05 06:18:25 +0900799}
800
brettw@chromium.org22b3fda2013-02-10 13:49:30 +0900801void ParamTraits<base::FilePath>::Log(const param_type& p, std::string* l) {
802 ParamTraits<base::FilePath::StringType>::Log(p.value(), l);
brettw@chromium.orgce352e52012-06-05 06:18:25 +0900803}
804
rockot15c8ac42016-02-05 11:12:32 +0900805void ParamTraits<base::ListValue>::GetSize(base::PickleSizer* sizer,
806 const param_type& p) {
807 GetValueSize(sizer, &p, 0);
808}
809
rockot6dbfea52016-02-04 05:20:16 +0900810void ParamTraits<base::ListValue>::Write(base::Pickle* m, const param_type& p) {
brettw@chromium.orgce352e52012-06-05 06:18:25 +0900811 WriteValue(m, &p, 0);
812}
813
rockot6dbfea52016-02-04 05:20:16 +0900814bool ParamTraits<base::ListValue>::Read(const base::Pickle* m,
brettwf3146202015-06-03 13:29:25 +0900815 base::PickleIterator* iter,
816 param_type* r) {
brettw@chromium.orgce352e52012-06-05 06:18:25 +0900817 int type;
jdoerrie89ee31a2016-12-08 00:43:28 +0900818 if (!ReadParam(m, iter, &type) ||
819 type != static_cast<int>(base::Value::Type::LIST))
brettw@chromium.orgce352e52012-06-05 06:18:25 +0900820 return false;
821
822 return ReadListValue(m, iter, r, 0);
823}
824
brettw@chromium.orgccffb7d2013-06-14 07:50:27 +0900825void ParamTraits<base::ListValue>::Log(const param_type& p, std::string* l) {
brettw@chromium.orgce352e52012-06-05 06:18:25 +0900826 std::string json;
estadeb5f30dd2015-05-16 10:02:34 +0900827 base::JSONWriter::Write(p, &json);
brettw@chromium.orgce352e52012-06-05 06:18:25 +0900828 l->append(json);
829}
830
rockot15c8ac42016-02-05 11:12:32 +0900831void ParamTraits<base::NullableString16>::GetSize(base::PickleSizer* sizer,
832 const param_type& p) {
833 GetParamSize(sizer, p.string());
834 GetParamSize(sizer, p.is_null());
835}
836
rockot6dbfea52016-02-04 05:20:16 +0900837void ParamTraits<base::NullableString16>::Write(base::Pickle* m,
avi@chromium.orgd8179652013-06-13 22:47:46 +0900838 const param_type& p) {
brettw@chromium.orgce352e52012-06-05 06:18:25 +0900839 WriteParam(m, p.string());
840 WriteParam(m, p.is_null());
841}
842
rockot6dbfea52016-02-04 05:20:16 +0900843bool ParamTraits<base::NullableString16>::Read(const base::Pickle* m,
brettwf3146202015-06-03 13:29:25 +0900844 base::PickleIterator* iter,
avi@chromium.orgd8179652013-06-13 22:47:46 +0900845 param_type* r) {
brettw@chromium.org5b040852013-12-03 09:39:26 +0900846 base::string16 string;
brettw@chromium.orgce352e52012-06-05 06:18:25 +0900847 if (!ReadParam(m, iter, &string))
848 return false;
849 bool is_null;
850 if (!ReadParam(m, iter, &is_null))
851 return false;
avi@chromium.orgd8179652013-06-13 22:47:46 +0900852 *r = base::NullableString16(string, is_null);
brettw@chromium.orgce352e52012-06-05 06:18:25 +0900853 return true;
854}
855
avi@chromium.orgd8179652013-06-13 22:47:46 +0900856void ParamTraits<base::NullableString16>::Log(const param_type& p,
857 std::string* l) {
brettw@chromium.orgce352e52012-06-05 06:18:25 +0900858 l->append("(");
859 LogParam(p.string(), l);
860 l->append(", ");
861 LogParam(p.is_null(), l);
862 l->append(")");
863}
864
rockot15c8ac42016-02-05 11:12:32 +0900865void ParamTraits<base::File::Info>::GetSize(base::PickleSizer* sizer,
866 const param_type& p) {
867 GetParamSize(sizer, p.size);
868 GetParamSize(sizer, p.is_directory);
869 GetParamSize(sizer, p.last_modified.ToDoubleT());
870 GetParamSize(sizer, p.last_accessed.ToDoubleT());
871 GetParamSize(sizer, p.creation_time.ToDoubleT());
872}
873
rockot6dbfea52016-02-04 05:20:16 +0900874void ParamTraits<base::File::Info>::Write(base::Pickle* m,
rvargas@chromium.org9e469f62014-01-28 06:36:00 +0900875 const param_type& p) {
brettw@chromium.orgce352e52012-06-05 06:18:25 +0900876 WriteParam(m, p.size);
877 WriteParam(m, p.is_directory);
878 WriteParam(m, p.last_modified.ToDoubleT());
879 WriteParam(m, p.last_accessed.ToDoubleT());
880 WriteParam(m, p.creation_time.ToDoubleT());
881}
882
rockot6dbfea52016-02-04 05:20:16 +0900883bool ParamTraits<base::File::Info>::Read(const base::Pickle* m,
brettwf3146202015-06-03 13:29:25 +0900884 base::PickleIterator* iter,
rvargas@chromium.org9e469f62014-01-28 06:36:00 +0900885 param_type* p) {
pkasting@chromium.org150a8492014-07-18 10:40:47 +0900886 double last_modified, last_accessed, creation_time;
887 if (!ReadParam(m, iter, &p->size) ||
888 !ReadParam(m, iter, &p->is_directory) ||
889 !ReadParam(m, iter, &last_modified) ||
890 !ReadParam(m, iter, &last_accessed) ||
891 !ReadParam(m, iter, &creation_time))
892 return false;
893 p->last_modified = base::Time::FromDoubleT(last_modified);
894 p->last_accessed = base::Time::FromDoubleT(last_accessed);
895 p->creation_time = base::Time::FromDoubleT(creation_time);
896 return true;
brettw@chromium.orgce352e52012-06-05 06:18:25 +0900897}
898
rvargas@chromium.org9e469f62014-01-28 06:36:00 +0900899void ParamTraits<base::File::Info>::Log(const param_type& p,
900 std::string* l) {
brettw@chromium.orgce352e52012-06-05 06:18:25 +0900901 l->append("(");
902 LogParam(p.size, l);
903 l->append(",");
904 LogParam(p.is_directory, l);
905 l->append(",");
906 LogParam(p.last_modified.ToDoubleT(), l);
907 l->append(",");
908 LogParam(p.last_accessed.ToDoubleT(), l);
909 l->append(",");
910 LogParam(p.creation_time.ToDoubleT(), l);
911 l->append(")");
912}
913
rockot15c8ac42016-02-05 11:12:32 +0900914void ParamTraits<base::Time>::GetSize(base::PickleSizer* sizer,
915 const param_type& p) {
916 sizer->AddInt64();
917}
918
rockot6dbfea52016-02-04 05:20:16 +0900919void ParamTraits<base::Time>::Write(base::Pickle* m, const param_type& p) {
tfarina1cbfa082015-09-05 03:47:57 +0900920 ParamTraits<int64_t>::Write(m, p.ToInternalValue());
brettw@chromium.orgce352e52012-06-05 06:18:25 +0900921}
922
rockot6dbfea52016-02-04 05:20:16 +0900923bool ParamTraits<base::Time>::Read(const base::Pickle* m,
brettwf3146202015-06-03 13:29:25 +0900924 base::PickleIterator* iter,
brettw@chromium.orgce352e52012-06-05 06:18:25 +0900925 param_type* r) {
tfarina1cbfa082015-09-05 03:47:57 +0900926 int64_t value;
927 if (!ParamTraits<int64_t>::Read(m, iter, &value))
brettw@chromium.orgce352e52012-06-05 06:18:25 +0900928 return false;
929 *r = base::Time::FromInternalValue(value);
930 return true;
931}
932
933void ParamTraits<base::Time>::Log(const param_type& p, std::string* l) {
tfarina1cbfa082015-09-05 03:47:57 +0900934 ParamTraits<int64_t>::Log(p.ToInternalValue(), l);
brettw@chromium.orgce352e52012-06-05 06:18:25 +0900935}
936
rockot15c8ac42016-02-05 11:12:32 +0900937void ParamTraits<base::TimeDelta>::GetSize(base::PickleSizer* sizer,
938 const param_type& p) {
939 sizer->AddInt64();
940}
941
rockot6dbfea52016-02-04 05:20:16 +0900942void ParamTraits<base::TimeDelta>::Write(base::Pickle* m, const param_type& p) {
tfarina1cbfa082015-09-05 03:47:57 +0900943 ParamTraits<int64_t>::Write(m, p.ToInternalValue());
brettw@chromium.orgce352e52012-06-05 06:18:25 +0900944}
945
rockot6dbfea52016-02-04 05:20:16 +0900946bool ParamTraits<base::TimeDelta>::Read(const base::Pickle* m,
brettwf3146202015-06-03 13:29:25 +0900947 base::PickleIterator* iter,
brettw@chromium.orgce352e52012-06-05 06:18:25 +0900948 param_type* r) {
tfarina1cbfa082015-09-05 03:47:57 +0900949 int64_t value;
950 bool ret = ParamTraits<int64_t>::Read(m, iter, &value);
brettw@chromium.orgce352e52012-06-05 06:18:25 +0900951 if (ret)
952 *r = base::TimeDelta::FromInternalValue(value);
953
954 return ret;
955}
956
957void ParamTraits<base::TimeDelta>::Log(const param_type& p, std::string* l) {
tfarina1cbfa082015-09-05 03:47:57 +0900958 ParamTraits<int64_t>::Log(p.ToInternalValue(), l);
brettw@chromium.orgce352e52012-06-05 06:18:25 +0900959}
960
rockot15c8ac42016-02-05 11:12:32 +0900961void ParamTraits<base::TimeTicks>::GetSize(base::PickleSizer* sizer,
962 const param_type& p) {
963 sizer->AddInt64();
964}
965
rockot6dbfea52016-02-04 05:20:16 +0900966void ParamTraits<base::TimeTicks>::Write(base::Pickle* m, const param_type& p) {
tfarina1cbfa082015-09-05 03:47:57 +0900967 ParamTraits<int64_t>::Write(m, p.ToInternalValue());
brettw@chromium.orgce352e52012-06-05 06:18:25 +0900968}
969
rockot6dbfea52016-02-04 05:20:16 +0900970bool ParamTraits<base::TimeTicks>::Read(const base::Pickle* m,
brettwf3146202015-06-03 13:29:25 +0900971 base::PickleIterator* iter,
brettw@chromium.orgce352e52012-06-05 06:18:25 +0900972 param_type* r) {
tfarina1cbfa082015-09-05 03:47:57 +0900973 int64_t value;
974 bool ret = ParamTraits<int64_t>::Read(m, iter, &value);
brettw@chromium.orgce352e52012-06-05 06:18:25 +0900975 if (ret)
976 *r = base::TimeTicks::FromInternalValue(value);
977
978 return ret;
979}
980
981void ParamTraits<base::TimeTicks>::Log(const param_type& p, std::string* l) {
tfarina1cbfa082015-09-05 03:47:57 +0900982 ParamTraits<int64_t>::Log(p.ToInternalValue(), l);
brettw@chromium.orgce352e52012-06-05 06:18:25 +0900983}
984
tguilbert76e690d2016-09-20 06:11:25 +0900985// If base::UnguessableToken is no longer 128 bits, the IPC serialization logic
986// below should be updated.
987static_assert(sizeof(base::UnguessableToken) == 2 * sizeof(uint64_t),
988 "base::UnguessableToken should be of size 2 * sizeof(uint64_t).");
989
990void ParamTraits<base::UnguessableToken>::GetSize(base::PickleSizer* sizer,
991 const param_type& p) {
992 sizer->AddBytes(2 * sizeof(uint64_t));
993}
994
995void ParamTraits<base::UnguessableToken>::Write(base::Pickle* m,
996 const param_type& p) {
997 DCHECK(!p.is_empty());
998
999 ParamTraits<uint64_t>::Write(m, p.GetHighForSerialization());
1000 ParamTraits<uint64_t>::Write(m, p.GetLowForSerialization());
1001}
1002
1003bool ParamTraits<base::UnguessableToken>::Read(const base::Pickle* m,
1004 base::PickleIterator* iter,
1005 param_type* r) {
1006 uint64_t high, low;
1007 if (!ParamTraits<uint64_t>::Read(m, iter, &high) ||
1008 !ParamTraits<uint64_t>::Read(m, iter, &low))
1009 return false;
1010
1011 // Receiving a zeroed UnguessableToken is a security issue.
1012 if (high == 0 && low == 0)
1013 return false;
1014
1015 *r = base::UnguessableToken::Deserialize(high, low);
1016 return true;
1017}
1018
1019void ParamTraits<base::UnguessableToken>::Log(const param_type& p,
1020 std::string* l) {
1021 l->append(p.ToString());
1022}
1023
jam1ea1e0d2016-05-14 00:09:58 +09001024void ParamTraits<IPC::ChannelHandle>::GetSize(base::PickleSizer* sizer,
1025 const param_type& p) {
sammc5aeaa8a2016-11-14 12:29:08 +09001026#if defined(OS_NACL_SFI)
jam1ea1e0d2016-05-14 00:09:58 +09001027 GetParamSize(sizer, p.socket);
sammc5aeaa8a2016-11-14 12:29:08 +09001028#else
amistry70d63572016-06-27 15:34:42 +09001029 GetParamSize(sizer, p.mojo_handle);
sammc5aeaa8a2016-11-14 12:29:08 +09001030#endif
jam1ea1e0d2016-05-14 00:09:58 +09001031}
1032
rockot6dbfea52016-02-04 05:20:16 +09001033void ParamTraits<IPC::ChannelHandle>::Write(base::Pickle* m,
1034 const param_type& p) {
sammc5aeaa8a2016-11-14 12:29:08 +09001035#if defined(OS_NACL_SFI)
erg@google.come6ffcb52010-08-18 03:38:24 +09001036 WriteParam(m, p.socket);
sammc5aeaa8a2016-11-14 12:29:08 +09001037#else
amistry70d63572016-06-27 15:34:42 +09001038 WriteParam(m, p.mojo_handle);
sammc5aeaa8a2016-11-14 12:29:08 +09001039#endif
erg@google.come6ffcb52010-08-18 03:38:24 +09001040}
1041
rockot6dbfea52016-02-04 05:20:16 +09001042bool ParamTraits<IPC::ChannelHandle>::Read(const base::Pickle* m,
brettwf3146202015-06-03 13:29:25 +09001043 base::PickleIterator* iter,
erg@google.come6ffcb52010-08-18 03:38:24 +09001044 param_type* r) {
sammc5aeaa8a2016-11-14 12:29:08 +09001045#if defined(OS_NACL_SFI)
1046 return ReadParam(m, iter, &r->socket);
1047#else
1048 return ReadParam(m, iter, &r->mojo_handle);
erg@google.come6ffcb52010-08-18 03:38:24 +09001049#endif
erg@google.come6ffcb52010-08-18 03:38:24 +09001050}
1051
1052void ParamTraits<IPC::ChannelHandle>::Log(const param_type& p,
erg@google.com8aca7272010-08-19 03:33:57 +09001053 std::string* l) {
sammc5aeaa8a2016-11-14 12:29:08 +09001054 l->append("ChannelHandle(");
1055#if defined(OS_NACL_SFI)
erg@google.come6ffcb52010-08-18 03:38:24 +09001056 ParamTraits<base::FileDescriptor>::Log(p.socket, l);
sammc5aeaa8a2016-11-14 12:29:08 +09001057#else
amistry70d63572016-06-27 15:34:42 +09001058 LogParam(p.mojo_handle, l);
sammc5aeaa8a2016-11-14 12:29:08 +09001059#endif
erg@google.com8aca7272010-08-19 03:33:57 +09001060 l->append(")");
erg@google.come6ffcb52010-08-18 03:38:24 +09001061}
1062
rockot15c8ac42016-02-05 11:12:32 +09001063void ParamTraits<LogData>::GetSize(base::PickleSizer* sizer,
1064 const param_type& p) {
1065 GetParamSize(sizer, p.channel);
1066 GetParamSize(sizer, p.routing_id);
1067 GetParamSize(sizer, p.type);
1068 GetParamSize(sizer, p.flags);
1069 GetParamSize(sizer, p.sent);
1070 GetParamSize(sizer, p.receive);
1071 GetParamSize(sizer, p.dispatch);
1072 GetParamSize(sizer, p.message_name);
1073 GetParamSize(sizer, p.params);
1074}
1075
rockot6dbfea52016-02-04 05:20:16 +09001076void ParamTraits<LogData>::Write(base::Pickle* m, const param_type& p) {
erg@google.com20b66e32010-10-01 05:06:30 +09001077 WriteParam(m, p.channel);
1078 WriteParam(m, p.routing_id);
jam@chromium.org1d8d4d12011-10-18 07:15:27 +09001079 WriteParam(m, p.type);
erg@google.com20b66e32010-10-01 05:06:30 +09001080 WriteParam(m, p.flags);
1081 WriteParam(m, p.sent);
1082 WriteParam(m, p.receive);
1083 WriteParam(m, p.dispatch);
tsepez@chromium.org6639c182012-11-15 12:17:45 +09001084 WriteParam(m, p.message_name);
erg@google.com20b66e32010-10-01 05:06:30 +09001085 WriteParam(m, p.params);
1086}
1087
rockot6dbfea52016-02-04 05:20:16 +09001088bool ParamTraits<LogData>::Read(const base::Pickle* m,
brettwf3146202015-06-03 13:29:25 +09001089 base::PickleIterator* iter,
jbates@chromium.org0fc87362012-03-08 05:42:56 +09001090 param_type* r) {
jam@chromium.org1d8d4d12011-10-18 07:15:27 +09001091 return
erg@google.com20b66e32010-10-01 05:06:30 +09001092 ReadParam(m, iter, &r->channel) &&
1093 ReadParam(m, iter, &r->routing_id) &&
jam@chromium.org1d8d4d12011-10-18 07:15:27 +09001094 ReadParam(m, iter, &r->type) &&
erg@google.com20b66e32010-10-01 05:06:30 +09001095 ReadParam(m, iter, &r->flags) &&
1096 ReadParam(m, iter, &r->sent) &&
1097 ReadParam(m, iter, &r->receive) &&
1098 ReadParam(m, iter, &r->dispatch) &&
tsepez@chromium.org6639c182012-11-15 12:17:45 +09001099 ReadParam(m, iter, &r->message_name) &&
erg@google.com20b66e32010-10-01 05:06:30 +09001100 ReadParam(m, iter, &r->params);
erg@google.com20b66e32010-10-01 05:06:30 +09001101}
1102
brettw@chromium.orgce352e52012-06-05 06:18:25 +09001103void ParamTraits<LogData>::Log(const param_type& p, std::string* l) {
1104 // Doesn't make sense to implement this!
1105}
1106
rockot6dbfea52016-02-04 05:20:16 +09001107void ParamTraits<Message>::Write(base::Pickle* m, const Message& p) {
brettw@chromium.orgf48910a2012-06-29 09:05:04 +09001108#if defined(OS_POSIX)
1109 // We don't serialize the file descriptors in the nested message, so there
1110 // better not be any.
morrita7d1bfcc2015-01-31 14:45:42 +09001111 DCHECK(!p.HasAttachments());
brettw@chromium.orgf48910a2012-06-29 09:05:04 +09001112#endif
1113
1114 // Don't just write out the message. This is used to send messages between
1115 // NaCl (Posix environment) and the browser (could be on Windows). The message
1116 // header formats differ between these systems (so does handle sharing, but
1117 // we already asserted we don't have any handles). So just write out the
1118 // parts of the header we use.
1119 //
1120 // Be careful also to use only explicitly-sized types. The NaCl environment
1121 // could be 64-bit and the host browser could be 32-bits. The nested message
1122 // may or may not be safe to send between 32-bit and 64-bit systems, but we
1123 // leave that up to the code sending the message to ensure.
tfarina1cbfa082015-09-05 03:47:57 +09001124 m->WriteUInt32(static_cast<uint32_t>(p.routing_id()));
brettw@chromium.orgf48910a2012-06-29 09:05:04 +09001125 m->WriteUInt32(p.type());
1126 m->WriteUInt32(p.flags());
tfarina1cbfa082015-09-05 03:47:57 +09001127 m->WriteData(p.payload(), static_cast<uint32_t>(p.payload_size()));
brettw@chromium.orgce352e52012-06-05 06:18:25 +09001128}
1129
rockot6dbfea52016-02-04 05:20:16 +09001130bool ParamTraits<Message>::Read(const base::Pickle* m,
brettwf3146202015-06-03 13:29:25 +09001131 base::PickleIterator* iter,
brettw@chromium.orgce352e52012-06-05 06:18:25 +09001132 Message* r) {
tfarina1cbfa082015-09-05 03:47:57 +09001133 uint32_t routing_id, type, flags;
avic9f0ad02014-12-29 08:31:48 +09001134 if (!iter->ReadUInt32(&routing_id) ||
1135 !iter->ReadUInt32(&type) ||
1136 !iter->ReadUInt32(&flags))
brettw@chromium.orgce352e52012-06-05 06:18:25 +09001137 return false;
brettw@chromium.orgf48910a2012-06-29 09:05:04 +09001138
1139 int payload_size;
1140 const char* payload;
avic9f0ad02014-12-29 08:31:48 +09001141 if (!iter->ReadData(&payload, &payload_size))
brettw@chromium.orgce352e52012-06-05 06:18:25 +09001142 return false;
brettw@chromium.orgf48910a2012-06-29 09:05:04 +09001143
tfarina1cbfa082015-09-05 03:47:57 +09001144 r->SetHeaderValues(static_cast<int32_t>(routing_id), type, flags);
brettw@chromium.orgf48910a2012-06-29 09:05:04 +09001145 return r->WriteBytes(payload, payload_size);
brettw@chromium.orgce352e52012-06-05 06:18:25 +09001146}
1147
1148void ParamTraits<Message>::Log(const Message& p, std::string* l) {
1149 l->append("<IPC::Message>");
1150}
1151
1152#if defined(OS_WIN)
rockot15c8ac42016-02-05 11:12:32 +09001153void ParamTraits<HANDLE>::GetSize(base::PickleSizer* sizer,
1154 const param_type& p) {
1155 sizer->AddInt();
1156}
1157
brettw@chromium.orgce352e52012-06-05 06:18:25 +09001158// Note that HWNDs/HANDLE/HCURSOR/HACCEL etc are always 32 bits, even on 64
jschuh@chromium.orgfb87c342013-03-04 11:29:03 +09001159// bit systems. That's why we use the Windows macros to convert to 32 bits.
rockot6dbfea52016-02-04 05:20:16 +09001160void ParamTraits<HANDLE>::Write(base::Pickle* m, const param_type& p) {
jschuh@chromium.orgfb87c342013-03-04 11:29:03 +09001161 m->WriteInt(HandleToLong(p));
brettw@chromium.orgce352e52012-06-05 06:18:25 +09001162}
1163
rockot6dbfea52016-02-04 05:20:16 +09001164bool ParamTraits<HANDLE>::Read(const base::Pickle* m,
brettwf3146202015-06-03 13:29:25 +09001165 base::PickleIterator* iter,
brettw@chromium.orgce352e52012-06-05 06:18:25 +09001166 param_type* r) {
tfarina1cbfa082015-09-05 03:47:57 +09001167 int32_t temp;
avic9f0ad02014-12-29 08:31:48 +09001168 if (!iter->ReadInt(&temp))
brettw@chromium.orgce352e52012-06-05 06:18:25 +09001169 return false;
jschuh@chromium.orgfb87c342013-03-04 11:29:03 +09001170 *r = LongToHandle(temp);
brettw@chromium.orgce352e52012-06-05 06:18:25 +09001171 return true;
1172}
1173
1174void ParamTraits<HANDLE>::Log(const param_type& p, std::string* l) {
brucedawsond7e5dfd2015-10-07 04:22:00 +09001175 l->append(base::StringPrintf("0x%p", p));
brettw@chromium.orgce352e52012-06-05 06:18:25 +09001176}
1177
rockot15c8ac42016-02-05 11:12:32 +09001178void ParamTraits<LOGFONT>::GetSize(base::PickleSizer* sizer,
1179 const param_type& p) {
1180 sizer->AddData(sizeof(LOGFONT));
1181}
1182
rockot6dbfea52016-02-04 05:20:16 +09001183void ParamTraits<LOGFONT>::Write(base::Pickle* m, const param_type& p) {
brettw@chromium.orgce352e52012-06-05 06:18:25 +09001184 m->WriteData(reinterpret_cast<const char*>(&p), sizeof(LOGFONT));
1185}
1186
rockot6dbfea52016-02-04 05:20:16 +09001187bool ParamTraits<LOGFONT>::Read(const base::Pickle* m,
brettwf3146202015-06-03 13:29:25 +09001188 base::PickleIterator* iter,
brettw@chromium.orgce352e52012-06-05 06:18:25 +09001189 param_type* r) {
1190 const char *data;
1191 int data_size = 0;
avic9f0ad02014-12-29 08:31:48 +09001192 if (iter->ReadData(&data, &data_size) && data_size == sizeof(LOGFONT)) {
jschuh@chromium.orgb9ee7d62012-11-21 09:58:00 +09001193 const LOGFONT *font = reinterpret_cast<LOGFONT*>(const_cast<char*>(data));
1194 if (_tcsnlen(font->lfFaceName, LF_FACESIZE) < LF_FACESIZE) {
1195 memcpy(r, data, sizeof(LOGFONT));
1196 return true;
1197 }
brettw@chromium.orgce352e52012-06-05 06:18:25 +09001198 }
1199
jschuh@chromium.orgb9ee7d62012-11-21 09:58:00 +09001200 NOTREACHED();
1201 return false;
brettw@chromium.orgce352e52012-06-05 06:18:25 +09001202}
1203
1204void ParamTraits<LOGFONT>::Log(const param_type& p, std::string* l) {
groby@chromium.org6b4dc5e2013-03-19 07:33:04 +09001205 l->append(base::StringPrintf("<LOGFONT>"));
brettw@chromium.orgce352e52012-06-05 06:18:25 +09001206}
1207
rockot15c8ac42016-02-05 11:12:32 +09001208void ParamTraits<MSG>::GetSize(base::PickleSizer* sizer, const param_type& p) {
1209 sizer->AddData(sizeof(MSG));
1210}
1211
rockot6dbfea52016-02-04 05:20:16 +09001212void ParamTraits<MSG>::Write(base::Pickle* m, const param_type& p) {
brettw@chromium.orgce352e52012-06-05 06:18:25 +09001213 m->WriteData(reinterpret_cast<const char*>(&p), sizeof(MSG));
1214}
1215
rockot6dbfea52016-02-04 05:20:16 +09001216bool ParamTraits<MSG>::Read(const base::Pickle* m,
brettwf3146202015-06-03 13:29:25 +09001217 base::PickleIterator* iter,
brettw@chromium.orgce352e52012-06-05 06:18:25 +09001218 param_type* r) {
1219 const char *data;
1220 int data_size = 0;
avic9f0ad02014-12-29 08:31:48 +09001221 bool result = iter->ReadData(&data, &data_size);
brettw@chromium.orgce352e52012-06-05 06:18:25 +09001222 if (result && data_size == sizeof(MSG)) {
1223 memcpy(r, data, sizeof(MSG));
1224 } else {
1225 result = false;
1226 NOTREACHED();
1227 }
1228
1229 return result;
1230}
1231
1232void ParamTraits<MSG>::Log(const param_type& p, std::string* l) {
1233 l->append("<MSG>");
1234}
1235
1236#endif // OS_WIN
1237
agl@chromium.org1c6dcf22009-07-23 08:57:21 +09001238} // namespace IPC