1*6777b538SAndroid Build Coastguard Worker // Copyright 2012 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker
5*6777b538SAndroid Build Coastguard Worker #include "ipc/ipc_message_utils.h"
6*6777b538SAndroid Build Coastguard Worker
7*6777b538SAndroid Build Coastguard Worker #include <stddef.h>
8*6777b538SAndroid Build Coastguard Worker #include <stdint.h>
9*6777b538SAndroid Build Coastguard Worker
10*6777b538SAndroid Build Coastguard Worker #include <string_view>
11*6777b538SAndroid Build Coastguard Worker #include <type_traits>
12*6777b538SAndroid Build Coastguard Worker
13*6777b538SAndroid Build Coastguard Worker #include "base/files/file_path.h"
14*6777b538SAndroid Build Coastguard Worker #include "base/json/json_writer.h"
15*6777b538SAndroid Build Coastguard Worker #include "base/logging.h"
16*6777b538SAndroid Build Coastguard Worker #include "base/memory/ptr_util.h"
17*6777b538SAndroid Build Coastguard Worker #include "base/notreached.h"
18*6777b538SAndroid Build Coastguard Worker #include "base/strings/string_number_conversions.h"
19*6777b538SAndroid Build Coastguard Worker #include "base/strings/stringprintf.h"
20*6777b538SAndroid Build Coastguard Worker #include "base/strings/utf_string_conversions.h"
21*6777b538SAndroid Build Coastguard Worker #include "base/time/time.h"
22*6777b538SAndroid Build Coastguard Worker #include "base/unguessable_token.h"
23*6777b538SAndroid Build Coastguard Worker #include "build/build_config.h"
24*6777b538SAndroid Build Coastguard Worker #include "ipc/ipc_channel_handle.h"
25*6777b538SAndroid Build Coastguard Worker #include "ipc/ipc_message.h"
26*6777b538SAndroid Build Coastguard Worker #include "ipc/ipc_message_attachment.h"
27*6777b538SAndroid Build Coastguard Worker #include "ipc/ipc_message_attachment_set.h"
28*6777b538SAndroid Build Coastguard Worker #include "ipc/ipc_mojo_param_traits.h"
29*6777b538SAndroid Build Coastguard Worker #include "third_party/abseil-cpp/absl/strings/ascii.h"
30*6777b538SAndroid Build Coastguard Worker
31*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_APPLE)
32*6777b538SAndroid Build Coastguard Worker #include "ipc/mach_port_mac.h"
33*6777b538SAndroid Build Coastguard Worker #endif
34*6777b538SAndroid Build Coastguard Worker
35*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN)
36*6777b538SAndroid Build Coastguard Worker #include <tchar.h>
37*6777b538SAndroid Build Coastguard Worker
38*6777b538SAndroid Build Coastguard Worker #include "ipc/handle_win.h"
39*6777b538SAndroid Build Coastguard Worker #include "ipc/ipc_platform_file.h"
40*6777b538SAndroid Build Coastguard Worker #elif BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA)
41*6777b538SAndroid Build Coastguard Worker #include "base/file_descriptor_posix.h"
42*6777b538SAndroid Build Coastguard Worker #include "ipc/ipc_platform_file_attachment_posix.h"
43*6777b538SAndroid Build Coastguard Worker #endif
44*6777b538SAndroid Build Coastguard Worker
45*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_FUCHSIA)
46*6777b538SAndroid Build Coastguard Worker #include "base/fuchsia/fuchsia_logging.h"
47*6777b538SAndroid Build Coastguard Worker #include "ipc/handle_attachment_fuchsia.h"
48*6777b538SAndroid Build Coastguard Worker #endif
49*6777b538SAndroid Build Coastguard Worker
50*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_ANDROID)
51*6777b538SAndroid Build Coastguard Worker #include "base/android/scoped_hardware_buffer_handle.h"
52*6777b538SAndroid Build Coastguard Worker #include "ipc/ipc_mojo_handle_attachment.h"
53*6777b538SAndroid Build Coastguard Worker #include "mojo/public/cpp/system/message_pipe.h"
54*6777b538SAndroid Build Coastguard Worker #include "mojo/public/cpp/system/scope_to_message_pipe.h"
55*6777b538SAndroid Build Coastguard Worker #endif
56*6777b538SAndroid Build Coastguard Worker
57*6777b538SAndroid Build Coastguard Worker namespace IPC {
58*6777b538SAndroid Build Coastguard Worker
59*6777b538SAndroid Build Coastguard Worker namespace {
60*6777b538SAndroid Build Coastguard Worker
61*6777b538SAndroid Build Coastguard Worker const int kMaxRecursionDepth = 200;
62*6777b538SAndroid Build Coastguard Worker
63*6777b538SAndroid Build Coastguard Worker template<typename CharType>
LogBytes(const std::vector<CharType> & data,std::string * out)64*6777b538SAndroid Build Coastguard Worker void LogBytes(const std::vector<CharType>& data, std::string* out) {
65*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN)
66*6777b538SAndroid Build Coastguard Worker // Windows has a GUI for logging, which can handle arbitrary binary data.
67*6777b538SAndroid Build Coastguard Worker for (size_t i = 0; i < data.size(); ++i)
68*6777b538SAndroid Build Coastguard Worker out->push_back(data[i]);
69*6777b538SAndroid Build Coastguard Worker #elif BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA)
70*6777b538SAndroid Build Coastguard Worker // On POSIX, we log to stdout, which we assume can display ASCII.
71*6777b538SAndroid Build Coastguard Worker static const size_t kMaxBytesToLog = 100;
72*6777b538SAndroid Build Coastguard Worker for (size_t i = 0; i < std::min(data.size(), kMaxBytesToLog); ++i) {
73*6777b538SAndroid Build Coastguard Worker if (absl::ascii_isprint(static_cast<unsigned char>(data[i]))) {
74*6777b538SAndroid Build Coastguard Worker out->push_back(data[i]);
75*6777b538SAndroid Build Coastguard Worker } else {
76*6777b538SAndroid Build Coastguard Worker out->append(
77*6777b538SAndroid Build Coastguard Worker base::StringPrintf("[%02X]", static_cast<unsigned char>(data[i])));
78*6777b538SAndroid Build Coastguard Worker }
79*6777b538SAndroid Build Coastguard Worker }
80*6777b538SAndroid Build Coastguard Worker if (data.size() > kMaxBytesToLog) {
81*6777b538SAndroid Build Coastguard Worker out->append(base::StringPrintf(
82*6777b538SAndroid Build Coastguard Worker " and %u more bytes",
83*6777b538SAndroid Build Coastguard Worker static_cast<unsigned>(data.size() - kMaxBytesToLog)));
84*6777b538SAndroid Build Coastguard Worker }
85*6777b538SAndroid Build Coastguard Worker #endif
86*6777b538SAndroid Build Coastguard Worker }
87*6777b538SAndroid Build Coastguard Worker
88*6777b538SAndroid Build Coastguard Worker template <typename CharType>
WriteCharVector(base::Pickle * m,const std::vector<CharType> & p)89*6777b538SAndroid Build Coastguard Worker void WriteCharVector(base::Pickle* m, const std::vector<CharType>& p) {
90*6777b538SAndroid Build Coastguard Worker static_assert(sizeof(CharType) == 1);
91*6777b538SAndroid Build Coastguard Worker static_assert(std::is_integral_v<CharType>);
92*6777b538SAndroid Build Coastguard Worker if (p.empty()) {
93*6777b538SAndroid Build Coastguard Worker m->WriteData(nullptr, 0);
94*6777b538SAndroid Build Coastguard Worker } else {
95*6777b538SAndroid Build Coastguard Worker const char* data = reinterpret_cast<const char*>(p.data());
96*6777b538SAndroid Build Coastguard Worker m->WriteData(data, p.size());
97*6777b538SAndroid Build Coastguard Worker }
98*6777b538SAndroid Build Coastguard Worker }
99*6777b538SAndroid Build Coastguard Worker
100*6777b538SAndroid Build Coastguard Worker template <typename CharType>
ReadCharVector(const base::Pickle * m,base::PickleIterator * iter,std::vector<CharType> * r)101*6777b538SAndroid Build Coastguard Worker bool ReadCharVector(const base::Pickle* m,
102*6777b538SAndroid Build Coastguard Worker base::PickleIterator* iter,
103*6777b538SAndroid Build Coastguard Worker std::vector<CharType>* r) {
104*6777b538SAndroid Build Coastguard Worker static_assert(sizeof(CharType) == 1);
105*6777b538SAndroid Build Coastguard Worker static_assert(std::is_integral_v<CharType>);
106*6777b538SAndroid Build Coastguard Worker const char* data;
107*6777b538SAndroid Build Coastguard Worker size_t data_size = 0;
108*6777b538SAndroid Build Coastguard Worker if (!iter->ReadData(&data, &data_size)) {
109*6777b538SAndroid Build Coastguard Worker return false;
110*6777b538SAndroid Build Coastguard Worker }
111*6777b538SAndroid Build Coastguard Worker const CharType* begin = reinterpret_cast<const CharType*>(data);
112*6777b538SAndroid Build Coastguard Worker const CharType* end = begin + data_size;
113*6777b538SAndroid Build Coastguard Worker r->assign(begin, end);
114*6777b538SAndroid Build Coastguard Worker return true;
115*6777b538SAndroid Build Coastguard Worker }
116*6777b538SAndroid Build Coastguard Worker
117*6777b538SAndroid Build Coastguard Worker void WriteValue(const base::Value& value, int recursion, base::Pickle* pickle);
118*6777b538SAndroid Build Coastguard Worker
WriteDictValue(const base::Value::Dict & value,int recursion,base::Pickle * pickle)119*6777b538SAndroid Build Coastguard Worker void WriteDictValue(const base::Value::Dict& value,
120*6777b538SAndroid Build Coastguard Worker int recursion,
121*6777b538SAndroid Build Coastguard Worker base::Pickle* pickle) {
122*6777b538SAndroid Build Coastguard Worker WriteParam(pickle, base::checked_cast<int>(value.size()));
123*6777b538SAndroid Build Coastguard Worker for (const auto entry : value) {
124*6777b538SAndroid Build Coastguard Worker WriteParam(pickle, entry.first);
125*6777b538SAndroid Build Coastguard Worker WriteValue(entry.second, recursion + 1, pickle);
126*6777b538SAndroid Build Coastguard Worker }
127*6777b538SAndroid Build Coastguard Worker }
128*6777b538SAndroid Build Coastguard Worker
WriteListValue(const base::Value::List & value,int recursion,base::Pickle * pickle)129*6777b538SAndroid Build Coastguard Worker void WriteListValue(const base::Value::List& value,
130*6777b538SAndroid Build Coastguard Worker int recursion,
131*6777b538SAndroid Build Coastguard Worker base::Pickle* pickle) {
132*6777b538SAndroid Build Coastguard Worker WriteParam(pickle, base::checked_cast<int>(value.size()));
133*6777b538SAndroid Build Coastguard Worker for (const auto& entry : value) {
134*6777b538SAndroid Build Coastguard Worker WriteValue(entry, recursion + 1, pickle);
135*6777b538SAndroid Build Coastguard Worker }
136*6777b538SAndroid Build Coastguard Worker }
137*6777b538SAndroid Build Coastguard Worker
WriteValue(const base::Value & value,int recursion,base::Pickle * pickle)138*6777b538SAndroid Build Coastguard Worker void WriteValue(const base::Value& value, int recursion, base::Pickle* pickle) {
139*6777b538SAndroid Build Coastguard Worker bool result;
140*6777b538SAndroid Build Coastguard Worker if (recursion > kMaxRecursionDepth) {
141*6777b538SAndroid Build Coastguard Worker LOG(ERROR) << "Max recursion depth hit in WriteValue.";
142*6777b538SAndroid Build Coastguard Worker return;
143*6777b538SAndroid Build Coastguard Worker }
144*6777b538SAndroid Build Coastguard Worker
145*6777b538SAndroid Build Coastguard Worker pickle->WriteInt(static_cast<int>(value.type()));
146*6777b538SAndroid Build Coastguard Worker
147*6777b538SAndroid Build Coastguard Worker switch (value.type()) {
148*6777b538SAndroid Build Coastguard Worker case base::Value::Type::NONE:
149*6777b538SAndroid Build Coastguard Worker break;
150*6777b538SAndroid Build Coastguard Worker case base::Value::Type::BOOLEAN: {
151*6777b538SAndroid Build Coastguard Worker WriteParam(pickle, value.GetBool());
152*6777b538SAndroid Build Coastguard Worker break;
153*6777b538SAndroid Build Coastguard Worker }
154*6777b538SAndroid Build Coastguard Worker case base::Value::Type::INTEGER: {
155*6777b538SAndroid Build Coastguard Worker DCHECK(value.is_int());
156*6777b538SAndroid Build Coastguard Worker WriteParam(pickle, value.GetInt());
157*6777b538SAndroid Build Coastguard Worker break;
158*6777b538SAndroid Build Coastguard Worker }
159*6777b538SAndroid Build Coastguard Worker case base::Value::Type::DOUBLE: {
160*6777b538SAndroid Build Coastguard Worker DCHECK(value.is_int() || value.is_double());
161*6777b538SAndroid Build Coastguard Worker WriteParam(pickle, value.GetDouble());
162*6777b538SAndroid Build Coastguard Worker break;
163*6777b538SAndroid Build Coastguard Worker }
164*6777b538SAndroid Build Coastguard Worker case base::Value::Type::STRING: {
165*6777b538SAndroid Build Coastguard Worker const std::string* val = value.GetIfString();
166*6777b538SAndroid Build Coastguard Worker result = !!val;
167*6777b538SAndroid Build Coastguard Worker DCHECK(result);
168*6777b538SAndroid Build Coastguard Worker WriteParam(pickle, *val);
169*6777b538SAndroid Build Coastguard Worker break;
170*6777b538SAndroid Build Coastguard Worker }
171*6777b538SAndroid Build Coastguard Worker case base::Value::Type::BINARY: {
172*6777b538SAndroid Build Coastguard Worker pickle->WriteData(reinterpret_cast<const char*>(value.GetBlob().data()),
173*6777b538SAndroid Build Coastguard Worker value.GetBlob().size());
174*6777b538SAndroid Build Coastguard Worker break;
175*6777b538SAndroid Build Coastguard Worker }
176*6777b538SAndroid Build Coastguard Worker case base::Value::Type::DICT: {
177*6777b538SAndroid Build Coastguard Worker DCHECK(value.is_dict());
178*6777b538SAndroid Build Coastguard Worker WriteDictValue(value.GetDict(), recursion, pickle);
179*6777b538SAndroid Build Coastguard Worker break;
180*6777b538SAndroid Build Coastguard Worker }
181*6777b538SAndroid Build Coastguard Worker case base::Value::Type::LIST: {
182*6777b538SAndroid Build Coastguard Worker DCHECK(value.is_list());
183*6777b538SAndroid Build Coastguard Worker WriteListValue(value.GetList(), recursion, pickle);
184*6777b538SAndroid Build Coastguard Worker break;
185*6777b538SAndroid Build Coastguard Worker }
186*6777b538SAndroid Build Coastguard Worker }
187*6777b538SAndroid Build Coastguard Worker }
188*6777b538SAndroid Build Coastguard Worker
189*6777b538SAndroid Build Coastguard Worker bool ReadValue(const base::Pickle* pickle,
190*6777b538SAndroid Build Coastguard Worker base::PickleIterator* iter,
191*6777b538SAndroid Build Coastguard Worker int recursion,
192*6777b538SAndroid Build Coastguard Worker base::Value* value);
193*6777b538SAndroid Build Coastguard Worker
194*6777b538SAndroid Build Coastguard Worker // Helper for ReadValue that reads a Value::Dict into a pre-allocated object.
ReadDictValue(const base::Pickle * pickle,base::PickleIterator * iter,int recursion,base::Value::Dict * value)195*6777b538SAndroid Build Coastguard Worker bool ReadDictValue(const base::Pickle* pickle,
196*6777b538SAndroid Build Coastguard Worker base::PickleIterator* iter,
197*6777b538SAndroid Build Coastguard Worker int recursion,
198*6777b538SAndroid Build Coastguard Worker base::Value::Dict* value) {
199*6777b538SAndroid Build Coastguard Worker int size;
200*6777b538SAndroid Build Coastguard Worker if (!ReadParam(pickle, iter, &size))
201*6777b538SAndroid Build Coastguard Worker return false;
202*6777b538SAndroid Build Coastguard Worker
203*6777b538SAndroid Build Coastguard Worker for (int i = 0; i < size; i++) {
204*6777b538SAndroid Build Coastguard Worker std::string key;
205*6777b538SAndroid Build Coastguard Worker base::Value subvalue;
206*6777b538SAndroid Build Coastguard Worker if (!ReadParam(pickle, iter, &key) ||
207*6777b538SAndroid Build Coastguard Worker !ReadValue(pickle, iter, recursion + 1, &subvalue)) {
208*6777b538SAndroid Build Coastguard Worker return false;
209*6777b538SAndroid Build Coastguard Worker }
210*6777b538SAndroid Build Coastguard Worker value->Set(key, std::move(subvalue));
211*6777b538SAndroid Build Coastguard Worker }
212*6777b538SAndroid Build Coastguard Worker
213*6777b538SAndroid Build Coastguard Worker return true;
214*6777b538SAndroid Build Coastguard Worker }
215*6777b538SAndroid Build Coastguard Worker
216*6777b538SAndroid Build Coastguard Worker // Helper for ReadValue that reads a Value::List into a pre-allocated object.
ReadListValue(const base::Pickle * pickle,base::PickleIterator * iter,int recursion,base::Value::List * value)217*6777b538SAndroid Build Coastguard Worker bool ReadListValue(const base::Pickle* pickle,
218*6777b538SAndroid Build Coastguard Worker base::PickleIterator* iter,
219*6777b538SAndroid Build Coastguard Worker int recursion,
220*6777b538SAndroid Build Coastguard Worker base::Value::List* value) {
221*6777b538SAndroid Build Coastguard Worker int size;
222*6777b538SAndroid Build Coastguard Worker if (!ReadParam(pickle, iter, &size))
223*6777b538SAndroid Build Coastguard Worker return false;
224*6777b538SAndroid Build Coastguard Worker
225*6777b538SAndroid Build Coastguard Worker value->reserve(size);
226*6777b538SAndroid Build Coastguard Worker for (int i = 0; i < size; i++) {
227*6777b538SAndroid Build Coastguard Worker base::Value subval;
228*6777b538SAndroid Build Coastguard Worker if (!ReadValue(pickle, iter, recursion + 1, &subval))
229*6777b538SAndroid Build Coastguard Worker return false;
230*6777b538SAndroid Build Coastguard Worker value->Append(std::move(subval));
231*6777b538SAndroid Build Coastguard Worker }
232*6777b538SAndroid Build Coastguard Worker return true;
233*6777b538SAndroid Build Coastguard Worker }
234*6777b538SAndroid Build Coastguard Worker
ReadValue(const base::Pickle * pickle,base::PickleIterator * iter,int recursion,base::Value * value)235*6777b538SAndroid Build Coastguard Worker bool ReadValue(const base::Pickle* pickle,
236*6777b538SAndroid Build Coastguard Worker base::PickleIterator* iter,
237*6777b538SAndroid Build Coastguard Worker int recursion,
238*6777b538SAndroid Build Coastguard Worker base::Value* value) {
239*6777b538SAndroid Build Coastguard Worker if (recursion > kMaxRecursionDepth) {
240*6777b538SAndroid Build Coastguard Worker LOG(ERROR) << "Max recursion depth hit in ReadValue.";
241*6777b538SAndroid Build Coastguard Worker return false;
242*6777b538SAndroid Build Coastguard Worker }
243*6777b538SAndroid Build Coastguard Worker
244*6777b538SAndroid Build Coastguard Worker int type;
245*6777b538SAndroid Build Coastguard Worker if (!ReadParam(pickle, iter, &type))
246*6777b538SAndroid Build Coastguard Worker return false;
247*6777b538SAndroid Build Coastguard Worker
248*6777b538SAndroid Build Coastguard Worker constexpr int kMinValueType = static_cast<int>(base::Value::Type::NONE);
249*6777b538SAndroid Build Coastguard Worker constexpr int kMaxValueType = static_cast<int>(base::Value::Type::LIST);
250*6777b538SAndroid Build Coastguard Worker if (type > kMaxValueType || type < kMinValueType)
251*6777b538SAndroid Build Coastguard Worker return false;
252*6777b538SAndroid Build Coastguard Worker
253*6777b538SAndroid Build Coastguard Worker switch (static_cast<base::Value::Type>(type)) {
254*6777b538SAndroid Build Coastguard Worker case base::Value::Type::NONE:
255*6777b538SAndroid Build Coastguard Worker *value = base::Value();
256*6777b538SAndroid Build Coastguard Worker break;
257*6777b538SAndroid Build Coastguard Worker case base::Value::Type::BOOLEAN: {
258*6777b538SAndroid Build Coastguard Worker bool val;
259*6777b538SAndroid Build Coastguard Worker if (!ReadParam(pickle, iter, &val))
260*6777b538SAndroid Build Coastguard Worker return false;
261*6777b538SAndroid Build Coastguard Worker *value = base::Value(val);
262*6777b538SAndroid Build Coastguard Worker break;
263*6777b538SAndroid Build Coastguard Worker }
264*6777b538SAndroid Build Coastguard Worker case base::Value::Type::INTEGER: {
265*6777b538SAndroid Build Coastguard Worker int val;
266*6777b538SAndroid Build Coastguard Worker if (!ReadParam(pickle, iter, &val))
267*6777b538SAndroid Build Coastguard Worker return false;
268*6777b538SAndroid Build Coastguard Worker *value = base::Value(val);
269*6777b538SAndroid Build Coastguard Worker break;
270*6777b538SAndroid Build Coastguard Worker }
271*6777b538SAndroid Build Coastguard Worker case base::Value::Type::DOUBLE: {
272*6777b538SAndroid Build Coastguard Worker double val;
273*6777b538SAndroid Build Coastguard Worker if (!ReadParam(pickle, iter, &val))
274*6777b538SAndroid Build Coastguard Worker return false;
275*6777b538SAndroid Build Coastguard Worker *value = base::Value(val);
276*6777b538SAndroid Build Coastguard Worker break;
277*6777b538SAndroid Build Coastguard Worker }
278*6777b538SAndroid Build Coastguard Worker case base::Value::Type::STRING: {
279*6777b538SAndroid Build Coastguard Worker std::string val;
280*6777b538SAndroid Build Coastguard Worker if (!ReadParam(pickle, iter, &val))
281*6777b538SAndroid Build Coastguard Worker return false;
282*6777b538SAndroid Build Coastguard Worker *value = base::Value(std::move(val));
283*6777b538SAndroid Build Coastguard Worker break;
284*6777b538SAndroid Build Coastguard Worker }
285*6777b538SAndroid Build Coastguard Worker case base::Value::Type::BINARY: {
286*6777b538SAndroid Build Coastguard Worker std::optional<base::span<const uint8_t>> data = iter->ReadData();
287*6777b538SAndroid Build Coastguard Worker if (!data) {
288*6777b538SAndroid Build Coastguard Worker return false;
289*6777b538SAndroid Build Coastguard Worker }
290*6777b538SAndroid Build Coastguard Worker *value = base::Value(*data);
291*6777b538SAndroid Build Coastguard Worker break;
292*6777b538SAndroid Build Coastguard Worker }
293*6777b538SAndroid Build Coastguard Worker case base::Value::Type::DICT: {
294*6777b538SAndroid Build Coastguard Worker base::Value::Dict val;
295*6777b538SAndroid Build Coastguard Worker if (!ReadDictValue(pickle, iter, recursion, &val))
296*6777b538SAndroid Build Coastguard Worker return false;
297*6777b538SAndroid Build Coastguard Worker *value = base::Value(std::move(val));
298*6777b538SAndroid Build Coastguard Worker break;
299*6777b538SAndroid Build Coastguard Worker }
300*6777b538SAndroid Build Coastguard Worker case base::Value::Type::LIST: {
301*6777b538SAndroid Build Coastguard Worker base::Value::List val;
302*6777b538SAndroid Build Coastguard Worker if (!ReadListValue(pickle, iter, recursion, &val))
303*6777b538SAndroid Build Coastguard Worker return false;
304*6777b538SAndroid Build Coastguard Worker *value = base::Value(std::move(val));
305*6777b538SAndroid Build Coastguard Worker break;
306*6777b538SAndroid Build Coastguard Worker }
307*6777b538SAndroid Build Coastguard Worker default:
308*6777b538SAndroid Build Coastguard Worker NOTREACHED();
309*6777b538SAndroid Build Coastguard Worker return false;
310*6777b538SAndroid Build Coastguard Worker }
311*6777b538SAndroid Build Coastguard Worker
312*6777b538SAndroid Build Coastguard Worker return true;
313*6777b538SAndroid Build Coastguard Worker }
314*6777b538SAndroid Build Coastguard Worker
315*6777b538SAndroid Build Coastguard Worker } // namespace
316*6777b538SAndroid Build Coastguard Worker
317*6777b538SAndroid Build Coastguard Worker // -----------------------------------------------------------------------------
318*6777b538SAndroid Build Coastguard Worker
LogData()319*6777b538SAndroid Build Coastguard Worker LogData::LogData()
320*6777b538SAndroid Build Coastguard Worker : routing_id(0),
321*6777b538SAndroid Build Coastguard Worker type(0),
322*6777b538SAndroid Build Coastguard Worker sent(0),
323*6777b538SAndroid Build Coastguard Worker receive(0),
324*6777b538SAndroid Build Coastguard Worker dispatch(0) {
325*6777b538SAndroid Build Coastguard Worker }
326*6777b538SAndroid Build Coastguard Worker
327*6777b538SAndroid Build Coastguard Worker LogData::LogData(const LogData& other) = default;
328*6777b538SAndroid Build Coastguard Worker
329*6777b538SAndroid Build Coastguard Worker LogData::~LogData() = default;
330*6777b538SAndroid Build Coastguard Worker
Log(const param_type & p,std::string * l)331*6777b538SAndroid Build Coastguard Worker void ParamTraits<bool>::Log(const param_type& p, std::string* l) {
332*6777b538SAndroid Build Coastguard Worker l->append(p ? "true" : "false");
333*6777b538SAndroid Build Coastguard Worker }
334*6777b538SAndroid Build Coastguard Worker
Write(base::Pickle * m,const param_type & p)335*6777b538SAndroid Build Coastguard Worker void ParamTraits<signed char>::Write(base::Pickle* m, const param_type& p) {
336*6777b538SAndroid Build Coastguard Worker m->WriteBytes(&p, sizeof(param_type));
337*6777b538SAndroid Build Coastguard Worker }
338*6777b538SAndroid Build Coastguard Worker
Read(const base::Pickle * m,base::PickleIterator * iter,param_type * r)339*6777b538SAndroid Build Coastguard Worker bool ParamTraits<signed char>::Read(const base::Pickle* m,
340*6777b538SAndroid Build Coastguard Worker base::PickleIterator* iter,
341*6777b538SAndroid Build Coastguard Worker param_type* r) {
342*6777b538SAndroid Build Coastguard Worker const char* data;
343*6777b538SAndroid Build Coastguard Worker if (!iter->ReadBytes(&data, sizeof(param_type)))
344*6777b538SAndroid Build Coastguard Worker return false;
345*6777b538SAndroid Build Coastguard Worker memcpy(r, data, sizeof(param_type));
346*6777b538SAndroid Build Coastguard Worker return true;
347*6777b538SAndroid Build Coastguard Worker }
348*6777b538SAndroid Build Coastguard Worker
Log(const param_type & p,std::string * l)349*6777b538SAndroid Build Coastguard Worker void ParamTraits<signed char>::Log(const param_type& p, std::string* l) {
350*6777b538SAndroid Build Coastguard Worker l->append(base::NumberToString(p));
351*6777b538SAndroid Build Coastguard Worker }
352*6777b538SAndroid Build Coastguard Worker
Write(base::Pickle * m,const param_type & p)353*6777b538SAndroid Build Coastguard Worker void ParamTraits<unsigned char>::Write(base::Pickle* m, const param_type& p) {
354*6777b538SAndroid Build Coastguard Worker m->WriteBytes(&p, sizeof(param_type));
355*6777b538SAndroid Build Coastguard Worker }
356*6777b538SAndroid Build Coastguard Worker
Read(const base::Pickle * m,base::PickleIterator * iter,param_type * r)357*6777b538SAndroid Build Coastguard Worker bool ParamTraits<unsigned char>::Read(const base::Pickle* m,
358*6777b538SAndroid Build Coastguard Worker base::PickleIterator* iter,
359*6777b538SAndroid Build Coastguard Worker param_type* r) {
360*6777b538SAndroid Build Coastguard Worker const char* data;
361*6777b538SAndroid Build Coastguard Worker if (!iter->ReadBytes(&data, sizeof(param_type)))
362*6777b538SAndroid Build Coastguard Worker return false;
363*6777b538SAndroid Build Coastguard Worker memcpy(r, data, sizeof(param_type));
364*6777b538SAndroid Build Coastguard Worker return true;
365*6777b538SAndroid Build Coastguard Worker }
366*6777b538SAndroid Build Coastguard Worker
Log(const param_type & p,std::string * l)367*6777b538SAndroid Build Coastguard Worker void ParamTraits<unsigned char>::Log(const param_type& p, std::string* l) {
368*6777b538SAndroid Build Coastguard Worker l->append(base::NumberToString(p));
369*6777b538SAndroid Build Coastguard Worker }
370*6777b538SAndroid Build Coastguard Worker
Write(base::Pickle * m,const param_type & p)371*6777b538SAndroid Build Coastguard Worker void ParamTraits<unsigned short>::Write(base::Pickle* m, const param_type& p) {
372*6777b538SAndroid Build Coastguard Worker m->WriteBytes(&p, sizeof(param_type));
373*6777b538SAndroid Build Coastguard Worker }
374*6777b538SAndroid Build Coastguard Worker
Read(const base::Pickle * m,base::PickleIterator * iter,param_type * r)375*6777b538SAndroid Build Coastguard Worker bool ParamTraits<unsigned short>::Read(const base::Pickle* m,
376*6777b538SAndroid Build Coastguard Worker base::PickleIterator* iter,
377*6777b538SAndroid Build Coastguard Worker param_type* r) {
378*6777b538SAndroid Build Coastguard Worker const char* data;
379*6777b538SAndroid Build Coastguard Worker if (!iter->ReadBytes(&data, sizeof(param_type)))
380*6777b538SAndroid Build Coastguard Worker return false;
381*6777b538SAndroid Build Coastguard Worker memcpy(r, data, sizeof(param_type));
382*6777b538SAndroid Build Coastguard Worker return true;
383*6777b538SAndroid Build Coastguard Worker }
384*6777b538SAndroid Build Coastguard Worker
Log(const param_type & p,std::string * l)385*6777b538SAndroid Build Coastguard Worker void ParamTraits<unsigned short>::Log(const param_type& p, std::string* l) {
386*6777b538SAndroid Build Coastguard Worker l->append(base::NumberToString(p));
387*6777b538SAndroid Build Coastguard Worker }
388*6777b538SAndroid Build Coastguard Worker
Log(const param_type & p,std::string * l)389*6777b538SAndroid Build Coastguard Worker void ParamTraits<int>::Log(const param_type& p, std::string* l) {
390*6777b538SAndroid Build Coastguard Worker l->append(base::NumberToString(p));
391*6777b538SAndroid Build Coastguard Worker }
392*6777b538SAndroid Build Coastguard Worker
Log(const param_type & p,std::string * l)393*6777b538SAndroid Build Coastguard Worker void ParamTraits<unsigned int>::Log(const param_type& p, std::string* l) {
394*6777b538SAndroid Build Coastguard Worker l->append(base::NumberToString(p));
395*6777b538SAndroid Build Coastguard Worker }
396*6777b538SAndroid Build Coastguard Worker
397*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || \
398*6777b538SAndroid Build Coastguard Worker BUILDFLAG(IS_FUCHSIA) || \
399*6777b538SAndroid Build Coastguard Worker (BUILDFLAG(IS_ANDROID) && defined(ARCH_CPU_64_BITS))
Log(const param_type & p,std::string * l)400*6777b538SAndroid Build Coastguard Worker void ParamTraits<long>::Log(const param_type& p, std::string* l) {
401*6777b538SAndroid Build Coastguard Worker l->append(base::NumberToString(p));
402*6777b538SAndroid Build Coastguard Worker }
403*6777b538SAndroid Build Coastguard Worker
Log(const param_type & p,std::string * l)404*6777b538SAndroid Build Coastguard Worker void ParamTraits<unsigned long>::Log(const param_type& p, std::string* l) {
405*6777b538SAndroid Build Coastguard Worker l->append(base::NumberToString(p));
406*6777b538SAndroid Build Coastguard Worker }
407*6777b538SAndroid Build Coastguard Worker #endif
408*6777b538SAndroid Build Coastguard Worker
Log(const param_type & p,std::string * l)409*6777b538SAndroid Build Coastguard Worker void ParamTraits<long long>::Log(const param_type& p, std::string* l) {
410*6777b538SAndroid Build Coastguard Worker l->append(base::NumberToString(p));
411*6777b538SAndroid Build Coastguard Worker }
412*6777b538SAndroid Build Coastguard Worker
Log(const param_type & p,std::string * l)413*6777b538SAndroid Build Coastguard Worker void ParamTraits<unsigned long long>::Log(const param_type& p, std::string* l) {
414*6777b538SAndroid Build Coastguard Worker l->append(base::NumberToString(p));
415*6777b538SAndroid Build Coastguard Worker }
416*6777b538SAndroid Build Coastguard Worker
Log(const param_type & p,std::string * l)417*6777b538SAndroid Build Coastguard Worker void ParamTraits<float>::Log(const param_type& p, std::string* l) {
418*6777b538SAndroid Build Coastguard Worker l->append(base::StringPrintf("%e", p));
419*6777b538SAndroid Build Coastguard Worker }
420*6777b538SAndroid Build Coastguard Worker
Write(base::Pickle * m,const param_type & p)421*6777b538SAndroid Build Coastguard Worker void ParamTraits<double>::Write(base::Pickle* m, const param_type& p) {
422*6777b538SAndroid Build Coastguard Worker m->WriteBytes(reinterpret_cast<const char*>(&p), sizeof(param_type));
423*6777b538SAndroid Build Coastguard Worker }
424*6777b538SAndroid Build Coastguard Worker
Read(const base::Pickle * m,base::PickleIterator * iter,param_type * r)425*6777b538SAndroid Build Coastguard Worker bool ParamTraits<double>::Read(const base::Pickle* m,
426*6777b538SAndroid Build Coastguard Worker base::PickleIterator* iter,
427*6777b538SAndroid Build Coastguard Worker param_type* r) {
428*6777b538SAndroid Build Coastguard Worker const char *data;
429*6777b538SAndroid Build Coastguard Worker if (!iter->ReadBytes(&data, sizeof(*r))) {
430*6777b538SAndroid Build Coastguard Worker NOTREACHED();
431*6777b538SAndroid Build Coastguard Worker return false;
432*6777b538SAndroid Build Coastguard Worker }
433*6777b538SAndroid Build Coastguard Worker memcpy(r, data, sizeof(param_type));
434*6777b538SAndroid Build Coastguard Worker return true;
435*6777b538SAndroid Build Coastguard Worker }
436*6777b538SAndroid Build Coastguard Worker
Log(const param_type & p,std::string * l)437*6777b538SAndroid Build Coastguard Worker void ParamTraits<double>::Log(const param_type& p, std::string* l) {
438*6777b538SAndroid Build Coastguard Worker l->append(base::StringPrintf("%e", p));
439*6777b538SAndroid Build Coastguard Worker }
440*6777b538SAndroid Build Coastguard Worker
441*6777b538SAndroid Build Coastguard Worker
Log(const param_type & p,std::string * l)442*6777b538SAndroid Build Coastguard Worker void ParamTraits<std::string>::Log(const param_type& p, std::string* l) {
443*6777b538SAndroid Build Coastguard Worker l->append(p);
444*6777b538SAndroid Build Coastguard Worker }
445*6777b538SAndroid Build Coastguard Worker
Log(const param_type & p,std::string * l)446*6777b538SAndroid Build Coastguard Worker void ParamTraits<std::u16string>::Log(const param_type& p, std::string* l) {
447*6777b538SAndroid Build Coastguard Worker l->append(base::UTF16ToUTF8(p));
448*6777b538SAndroid Build Coastguard Worker }
449*6777b538SAndroid Build Coastguard Worker
450*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN)
Read(const base::Pickle * m,base::PickleIterator * iter,param_type * r)451*6777b538SAndroid Build Coastguard Worker bool ParamTraits<std::wstring>::Read(const base::Pickle* m,
452*6777b538SAndroid Build Coastguard Worker base::PickleIterator* iter,
453*6777b538SAndroid Build Coastguard Worker param_type* r) {
454*6777b538SAndroid Build Coastguard Worker std::u16string_view piece16;
455*6777b538SAndroid Build Coastguard Worker if (!iter->ReadStringPiece16(&piece16))
456*6777b538SAndroid Build Coastguard Worker return false;
457*6777b538SAndroid Build Coastguard Worker
458*6777b538SAndroid Build Coastguard Worker *r = base::AsWString(piece16);
459*6777b538SAndroid Build Coastguard Worker return true;
460*6777b538SAndroid Build Coastguard Worker }
461*6777b538SAndroid Build Coastguard Worker
Log(const param_type & p,std::string * l)462*6777b538SAndroid Build Coastguard Worker void ParamTraits<std::wstring>::Log(const param_type& p, std::string* l) {
463*6777b538SAndroid Build Coastguard Worker l->append(base::WideToUTF8(p));
464*6777b538SAndroid Build Coastguard Worker }
465*6777b538SAndroid Build Coastguard Worker #endif
466*6777b538SAndroid Build Coastguard Worker
Write(base::Pickle * m,const param_type & p)467*6777b538SAndroid Build Coastguard Worker void ParamTraits<std::vector<char>>::Write(base::Pickle* m,
468*6777b538SAndroid Build Coastguard Worker const param_type& p) {
469*6777b538SAndroid Build Coastguard Worker WriteCharVector(m, p);
470*6777b538SAndroid Build Coastguard Worker }
471*6777b538SAndroid Build Coastguard Worker
Read(const base::Pickle * m,base::PickleIterator * iter,param_type * r)472*6777b538SAndroid Build Coastguard Worker bool ParamTraits<std::vector<char>>::Read(const base::Pickle* m,
473*6777b538SAndroid Build Coastguard Worker base::PickleIterator* iter,
474*6777b538SAndroid Build Coastguard Worker param_type* r) {
475*6777b538SAndroid Build Coastguard Worker return ReadCharVector(m, iter, r);
476*6777b538SAndroid Build Coastguard Worker }
477*6777b538SAndroid Build Coastguard Worker
Log(const param_type & p,std::string * l)478*6777b538SAndroid Build Coastguard Worker void ParamTraits<std::vector<char>>::Log(const param_type& p, std::string* l) {
479*6777b538SAndroid Build Coastguard Worker LogBytes(p, l);
480*6777b538SAndroid Build Coastguard Worker }
481*6777b538SAndroid Build Coastguard Worker
Write(base::Pickle * m,const param_type & p)482*6777b538SAndroid Build Coastguard Worker void ParamTraits<std::vector<unsigned char>>::Write(base::Pickle* m,
483*6777b538SAndroid Build Coastguard Worker const param_type& p) {
484*6777b538SAndroid Build Coastguard Worker WriteCharVector(m, p);
485*6777b538SAndroid Build Coastguard Worker }
486*6777b538SAndroid Build Coastguard Worker
Read(const base::Pickle * m,base::PickleIterator * iter,param_type * r)487*6777b538SAndroid Build Coastguard Worker bool ParamTraits<std::vector<unsigned char>>::Read(const base::Pickle* m,
488*6777b538SAndroid Build Coastguard Worker base::PickleIterator* iter,
489*6777b538SAndroid Build Coastguard Worker param_type* r) {
490*6777b538SAndroid Build Coastguard Worker return ReadCharVector(m, iter, r);
491*6777b538SAndroid Build Coastguard Worker }
492*6777b538SAndroid Build Coastguard Worker
Log(const param_type & p,std::string * l)493*6777b538SAndroid Build Coastguard Worker void ParamTraits<std::vector<unsigned char> >::Log(const param_type& p,
494*6777b538SAndroid Build Coastguard Worker std::string* l) {
495*6777b538SAndroid Build Coastguard Worker LogBytes(p, l);
496*6777b538SAndroid Build Coastguard Worker }
497*6777b538SAndroid Build Coastguard Worker
Write(base::Pickle * m,const param_type & p)498*6777b538SAndroid Build Coastguard Worker void ParamTraits<std::vector<bool>>::Write(base::Pickle* m,
499*6777b538SAndroid Build Coastguard Worker const param_type& p) {
500*6777b538SAndroid Build Coastguard Worker WriteParam(m, base::checked_cast<int>(p.size()));
501*6777b538SAndroid Build Coastguard Worker // Cast to bool below is required because libc++'s
502*6777b538SAndroid Build Coastguard Worker // vector<bool>::const_reference is different from bool, and we want to avoid
503*6777b538SAndroid Build Coastguard Worker // writing an extra specialization of ParamTraits for it.
504*6777b538SAndroid Build Coastguard Worker for (size_t i = 0; i < p.size(); i++)
505*6777b538SAndroid Build Coastguard Worker WriteParam(m, static_cast<bool>(p[i]));
506*6777b538SAndroid Build Coastguard Worker }
507*6777b538SAndroid Build Coastguard Worker
Read(const base::Pickle * m,base::PickleIterator * iter,param_type * r)508*6777b538SAndroid Build Coastguard Worker bool ParamTraits<std::vector<bool>>::Read(const base::Pickle* m,
509*6777b538SAndroid Build Coastguard Worker base::PickleIterator* iter,
510*6777b538SAndroid Build Coastguard Worker param_type* r) {
511*6777b538SAndroid Build Coastguard Worker size_t size;
512*6777b538SAndroid Build Coastguard Worker if (!iter->ReadLength(&size))
513*6777b538SAndroid Build Coastguard Worker return false;
514*6777b538SAndroid Build Coastguard Worker r->resize(size);
515*6777b538SAndroid Build Coastguard Worker for (size_t i = 0; i < size; i++) {
516*6777b538SAndroid Build Coastguard Worker bool value;
517*6777b538SAndroid Build Coastguard Worker if (!ReadParam(m, iter, &value))
518*6777b538SAndroid Build Coastguard Worker return false;
519*6777b538SAndroid Build Coastguard Worker (*r)[i] = value;
520*6777b538SAndroid Build Coastguard Worker }
521*6777b538SAndroid Build Coastguard Worker return true;
522*6777b538SAndroid Build Coastguard Worker }
523*6777b538SAndroid Build Coastguard Worker
Log(const param_type & p,std::string * l)524*6777b538SAndroid Build Coastguard Worker void ParamTraits<std::vector<bool> >::Log(const param_type& p, std::string* l) {
525*6777b538SAndroid Build Coastguard Worker for (size_t i = 0; i < p.size(); ++i) {
526*6777b538SAndroid Build Coastguard Worker if (i != 0)
527*6777b538SAndroid Build Coastguard Worker l->push_back(' ');
528*6777b538SAndroid Build Coastguard Worker LogParam(static_cast<bool>(p[i]), l);
529*6777b538SAndroid Build Coastguard Worker }
530*6777b538SAndroid Build Coastguard Worker }
531*6777b538SAndroid Build Coastguard Worker
Write(base::Pickle * m,const param_type & p)532*6777b538SAndroid Build Coastguard Worker void ParamTraits<base::Value::Dict>::Write(base::Pickle* m,
533*6777b538SAndroid Build Coastguard Worker const param_type& p) {
534*6777b538SAndroid Build Coastguard Worker WriteDictValue(p, 0, m);
535*6777b538SAndroid Build Coastguard Worker }
536*6777b538SAndroid Build Coastguard Worker
Read(const base::Pickle * m,base::PickleIterator * iter,param_type * r)537*6777b538SAndroid Build Coastguard Worker bool ParamTraits<base::Value::Dict>::Read(const base::Pickle* m,
538*6777b538SAndroid Build Coastguard Worker base::PickleIterator* iter,
539*6777b538SAndroid Build Coastguard Worker param_type* r) {
540*6777b538SAndroid Build Coastguard Worker return ReadDictValue(m, iter, 0, r);
541*6777b538SAndroid Build Coastguard Worker }
542*6777b538SAndroid Build Coastguard Worker
Log(const param_type & p,std::string * l)543*6777b538SAndroid Build Coastguard Worker void ParamTraits<base::Value::Dict>::Log(const param_type& p, std::string* l) {
544*6777b538SAndroid Build Coastguard Worker std::string json;
545*6777b538SAndroid Build Coastguard Worker base::JSONWriter::Write(p, &json);
546*6777b538SAndroid Build Coastguard Worker l->append(json);
547*6777b538SAndroid Build Coastguard Worker }
548*6777b538SAndroid Build Coastguard Worker
549*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA)
Write(base::Pickle * m,const param_type & p)550*6777b538SAndroid Build Coastguard Worker void ParamTraits<base::FileDescriptor>::Write(base::Pickle* m,
551*6777b538SAndroid Build Coastguard Worker const param_type& p) {
552*6777b538SAndroid Build Coastguard Worker // This serialization must be kept in sync with
553*6777b538SAndroid Build Coastguard Worker // nacl_message_scanner.cc:WriteHandle().
554*6777b538SAndroid Build Coastguard Worker const bool valid = p.fd >= 0;
555*6777b538SAndroid Build Coastguard Worker WriteParam(m, valid);
556*6777b538SAndroid Build Coastguard Worker
557*6777b538SAndroid Build Coastguard Worker if (!valid)
558*6777b538SAndroid Build Coastguard Worker return;
559*6777b538SAndroid Build Coastguard Worker
560*6777b538SAndroid Build Coastguard Worker if (p.auto_close) {
561*6777b538SAndroid Build Coastguard Worker if (!m->WriteAttachment(
562*6777b538SAndroid Build Coastguard Worker new internal::PlatformFileAttachment(base::ScopedFD(p.fd))))
563*6777b538SAndroid Build Coastguard Worker NOTREACHED();
564*6777b538SAndroid Build Coastguard Worker } else {
565*6777b538SAndroid Build Coastguard Worker if (!m->WriteAttachment(new internal::PlatformFileAttachment(p.fd)))
566*6777b538SAndroid Build Coastguard Worker NOTREACHED();
567*6777b538SAndroid Build Coastguard Worker }
568*6777b538SAndroid Build Coastguard Worker }
569*6777b538SAndroid Build Coastguard Worker
Read(const base::Pickle * m,base::PickleIterator * iter,param_type * r)570*6777b538SAndroid Build Coastguard Worker bool ParamTraits<base::FileDescriptor>::Read(const base::Pickle* m,
571*6777b538SAndroid Build Coastguard Worker base::PickleIterator* iter,
572*6777b538SAndroid Build Coastguard Worker param_type* r) {
573*6777b538SAndroid Build Coastguard Worker *r = base::FileDescriptor();
574*6777b538SAndroid Build Coastguard Worker
575*6777b538SAndroid Build Coastguard Worker bool valid;
576*6777b538SAndroid Build Coastguard Worker if (!ReadParam(m, iter, &valid))
577*6777b538SAndroid Build Coastguard Worker return false;
578*6777b538SAndroid Build Coastguard Worker
579*6777b538SAndroid Build Coastguard Worker if (!valid)
580*6777b538SAndroid Build Coastguard Worker return true;
581*6777b538SAndroid Build Coastguard Worker
582*6777b538SAndroid Build Coastguard Worker scoped_refptr<base::Pickle::Attachment> attachment;
583*6777b538SAndroid Build Coastguard Worker if (!m->ReadAttachment(iter, &attachment))
584*6777b538SAndroid Build Coastguard Worker return false;
585*6777b538SAndroid Build Coastguard Worker
586*6777b538SAndroid Build Coastguard Worker if (static_cast<MessageAttachment*>(attachment.get())->GetType() !=
587*6777b538SAndroid Build Coastguard Worker MessageAttachment::Type::PLATFORM_FILE) {
588*6777b538SAndroid Build Coastguard Worker return false;
589*6777b538SAndroid Build Coastguard Worker }
590*6777b538SAndroid Build Coastguard Worker
591*6777b538SAndroid Build Coastguard Worker *r = base::FileDescriptor(
592*6777b538SAndroid Build Coastguard Worker static_cast<internal::PlatformFileAttachment*>(attachment.get())
593*6777b538SAndroid Build Coastguard Worker ->TakePlatformFile(),
594*6777b538SAndroid Build Coastguard Worker true);
595*6777b538SAndroid Build Coastguard Worker return true;
596*6777b538SAndroid Build Coastguard Worker }
597*6777b538SAndroid Build Coastguard Worker
Log(const param_type & p,std::string * l)598*6777b538SAndroid Build Coastguard Worker void ParamTraits<base::FileDescriptor>::Log(const param_type& p,
599*6777b538SAndroid Build Coastguard Worker std::string* l) {
600*6777b538SAndroid Build Coastguard Worker if (p.auto_close) {
601*6777b538SAndroid Build Coastguard Worker l->append(base::StringPrintf("FD(%d auto-close)", p.fd));
602*6777b538SAndroid Build Coastguard Worker } else {
603*6777b538SAndroid Build Coastguard Worker l->append(base::StringPrintf("FD(%d)", p.fd));
604*6777b538SAndroid Build Coastguard Worker }
605*6777b538SAndroid Build Coastguard Worker }
606*6777b538SAndroid Build Coastguard Worker
Write(base::Pickle * m,const param_type & p)607*6777b538SAndroid Build Coastguard Worker void ParamTraits<base::ScopedFD>::Write(base::Pickle* m, const param_type& p) {
608*6777b538SAndroid Build Coastguard Worker // This serialization must be kept in sync with
609*6777b538SAndroid Build Coastguard Worker // nacl_message_scanner.cc:WriteHandle().
610*6777b538SAndroid Build Coastguard Worker const bool valid = p.is_valid();
611*6777b538SAndroid Build Coastguard Worker WriteParam(m, valid);
612*6777b538SAndroid Build Coastguard Worker
613*6777b538SAndroid Build Coastguard Worker if (!valid)
614*6777b538SAndroid Build Coastguard Worker return;
615*6777b538SAndroid Build Coastguard Worker
616*6777b538SAndroid Build Coastguard Worker if (!m->WriteAttachment(new internal::PlatformFileAttachment(
617*6777b538SAndroid Build Coastguard Worker std::move(const_cast<param_type&>(p))))) {
618*6777b538SAndroid Build Coastguard Worker NOTREACHED();
619*6777b538SAndroid Build Coastguard Worker }
620*6777b538SAndroid Build Coastguard Worker }
621*6777b538SAndroid Build Coastguard Worker
Read(const base::Pickle * m,base::PickleIterator * iter,param_type * r)622*6777b538SAndroid Build Coastguard Worker bool ParamTraits<base::ScopedFD>::Read(const base::Pickle* m,
623*6777b538SAndroid Build Coastguard Worker base::PickleIterator* iter,
624*6777b538SAndroid Build Coastguard Worker param_type* r) {
625*6777b538SAndroid Build Coastguard Worker r->reset();
626*6777b538SAndroid Build Coastguard Worker
627*6777b538SAndroid Build Coastguard Worker bool valid;
628*6777b538SAndroid Build Coastguard Worker if (!ReadParam(m, iter, &valid))
629*6777b538SAndroid Build Coastguard Worker return false;
630*6777b538SAndroid Build Coastguard Worker
631*6777b538SAndroid Build Coastguard Worker if (!valid)
632*6777b538SAndroid Build Coastguard Worker return true;
633*6777b538SAndroid Build Coastguard Worker
634*6777b538SAndroid Build Coastguard Worker scoped_refptr<base::Pickle::Attachment> attachment;
635*6777b538SAndroid Build Coastguard Worker if (!m->ReadAttachment(iter, &attachment))
636*6777b538SAndroid Build Coastguard Worker return false;
637*6777b538SAndroid Build Coastguard Worker
638*6777b538SAndroid Build Coastguard Worker if (static_cast<MessageAttachment*>(attachment.get())->GetType() !=
639*6777b538SAndroid Build Coastguard Worker MessageAttachment::Type::PLATFORM_FILE) {
640*6777b538SAndroid Build Coastguard Worker return false;
641*6777b538SAndroid Build Coastguard Worker }
642*6777b538SAndroid Build Coastguard Worker
643*6777b538SAndroid Build Coastguard Worker *r = base::ScopedFD(
644*6777b538SAndroid Build Coastguard Worker static_cast<internal::PlatformFileAttachment*>(attachment.get())
645*6777b538SAndroid Build Coastguard Worker ->TakePlatformFile());
646*6777b538SAndroid Build Coastguard Worker return true;
647*6777b538SAndroid Build Coastguard Worker }
648*6777b538SAndroid Build Coastguard Worker
Log(const param_type & p,std::string * l)649*6777b538SAndroid Build Coastguard Worker void ParamTraits<base::ScopedFD>::Log(const param_type& p, std::string* l) {
650*6777b538SAndroid Build Coastguard Worker l->append(base::StringPrintf("ScopedFD(%d)", p.get()));
651*6777b538SAndroid Build Coastguard Worker }
652*6777b538SAndroid Build Coastguard Worker #endif // BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA)
653*6777b538SAndroid Build Coastguard Worker
654*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN)
Write(base::Pickle * m,const param_type & p)655*6777b538SAndroid Build Coastguard Worker void ParamTraits<base::win::ScopedHandle>::Write(base::Pickle* m,
656*6777b538SAndroid Build Coastguard Worker const param_type& p) {
657*6777b538SAndroid Build Coastguard Worker const bool valid = p.IsValid();
658*6777b538SAndroid Build Coastguard Worker WriteParam(m, valid);
659*6777b538SAndroid Build Coastguard Worker if (!valid)
660*6777b538SAndroid Build Coastguard Worker return;
661*6777b538SAndroid Build Coastguard Worker
662*6777b538SAndroid Build Coastguard Worker HandleWin handle(p.Get());
663*6777b538SAndroid Build Coastguard Worker WriteParam(m, handle);
664*6777b538SAndroid Build Coastguard Worker }
665*6777b538SAndroid Build Coastguard Worker
Read(const base::Pickle * m,base::PickleIterator * iter,param_type * r)666*6777b538SAndroid Build Coastguard Worker bool ParamTraits<base::win::ScopedHandle>::Read(const base::Pickle* m,
667*6777b538SAndroid Build Coastguard Worker base::PickleIterator* iter,
668*6777b538SAndroid Build Coastguard Worker param_type* r) {
669*6777b538SAndroid Build Coastguard Worker r->Close();
670*6777b538SAndroid Build Coastguard Worker
671*6777b538SAndroid Build Coastguard Worker bool valid;
672*6777b538SAndroid Build Coastguard Worker if (!ReadParam(m, iter, &valid))
673*6777b538SAndroid Build Coastguard Worker return false;
674*6777b538SAndroid Build Coastguard Worker if (!valid)
675*6777b538SAndroid Build Coastguard Worker return true;
676*6777b538SAndroid Build Coastguard Worker
677*6777b538SAndroid Build Coastguard Worker HandleWin handle;
678*6777b538SAndroid Build Coastguard Worker if (!ReadParam(m, iter, &handle))
679*6777b538SAndroid Build Coastguard Worker return false;
680*6777b538SAndroid Build Coastguard Worker
681*6777b538SAndroid Build Coastguard Worker r->Set(handle.get_handle());
682*6777b538SAndroid Build Coastguard Worker return true;
683*6777b538SAndroid Build Coastguard Worker }
684*6777b538SAndroid Build Coastguard Worker
Log(const param_type & p,std::string * l)685*6777b538SAndroid Build Coastguard Worker void ParamTraits<base::win::ScopedHandle>::Log(const param_type& p,
686*6777b538SAndroid Build Coastguard Worker std::string* l) {
687*6777b538SAndroid Build Coastguard Worker l->append(base::StringPrintf("ScopedHandle(%p)", p.Get()));
688*6777b538SAndroid Build Coastguard Worker }
689*6777b538SAndroid Build Coastguard Worker #endif // BUILDFLAG(IS_WIN)
690*6777b538SAndroid Build Coastguard Worker
691*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_FUCHSIA)
Write(base::Pickle * m,const param_type & p)692*6777b538SAndroid Build Coastguard Worker void ParamTraits<zx::vmo>::Write(base::Pickle* m, const param_type& p) {
693*6777b538SAndroid Build Coastguard Worker // This serialization must be kept in sync with
694*6777b538SAndroid Build Coastguard Worker // nacl_message_scanner.cc:WriteHandle().
695*6777b538SAndroid Build Coastguard Worker const bool valid = p.is_valid();
696*6777b538SAndroid Build Coastguard Worker WriteParam(m, valid);
697*6777b538SAndroid Build Coastguard Worker
698*6777b538SAndroid Build Coastguard Worker if (!valid)
699*6777b538SAndroid Build Coastguard Worker return;
700*6777b538SAndroid Build Coastguard Worker
701*6777b538SAndroid Build Coastguard Worker if (!m->WriteAttachment(new internal::HandleAttachmentFuchsia(
702*6777b538SAndroid Build Coastguard Worker std::move(const_cast<param_type&>(p))))) {
703*6777b538SAndroid Build Coastguard Worker NOTREACHED();
704*6777b538SAndroid Build Coastguard Worker }
705*6777b538SAndroid Build Coastguard Worker }
706*6777b538SAndroid Build Coastguard Worker
Read(const base::Pickle * m,base::PickleIterator * iter,param_type * r)707*6777b538SAndroid Build Coastguard Worker bool ParamTraits<zx::vmo>::Read(const base::Pickle* m,
708*6777b538SAndroid Build Coastguard Worker base::PickleIterator* iter,
709*6777b538SAndroid Build Coastguard Worker param_type* r) {
710*6777b538SAndroid Build Coastguard Worker r->reset();
711*6777b538SAndroid Build Coastguard Worker
712*6777b538SAndroid Build Coastguard Worker bool valid;
713*6777b538SAndroid Build Coastguard Worker if (!ReadParam(m, iter, &valid))
714*6777b538SAndroid Build Coastguard Worker return false;
715*6777b538SAndroid Build Coastguard Worker
716*6777b538SAndroid Build Coastguard Worker if (!valid)
717*6777b538SAndroid Build Coastguard Worker return true;
718*6777b538SAndroid Build Coastguard Worker
719*6777b538SAndroid Build Coastguard Worker scoped_refptr<base::Pickle::Attachment> attachment;
720*6777b538SAndroid Build Coastguard Worker if (!m->ReadAttachment(iter, &attachment))
721*6777b538SAndroid Build Coastguard Worker return false;
722*6777b538SAndroid Build Coastguard Worker
723*6777b538SAndroid Build Coastguard Worker if (static_cast<MessageAttachment*>(attachment.get())->GetType() !=
724*6777b538SAndroid Build Coastguard Worker MessageAttachment::Type::FUCHSIA_HANDLE) {
725*6777b538SAndroid Build Coastguard Worker return false;
726*6777b538SAndroid Build Coastguard Worker }
727*6777b538SAndroid Build Coastguard Worker
728*6777b538SAndroid Build Coastguard Worker *r = zx::vmo(static_cast<internal::HandleAttachmentFuchsia*>(attachment.get())
729*6777b538SAndroid Build Coastguard Worker ->Take());
730*6777b538SAndroid Build Coastguard Worker return true;
731*6777b538SAndroid Build Coastguard Worker }
732*6777b538SAndroid Build Coastguard Worker
Log(const param_type & p,std::string * l)733*6777b538SAndroid Build Coastguard Worker void ParamTraits<zx::vmo>::Log(const param_type& p, std::string* l) {
734*6777b538SAndroid Build Coastguard Worker l->append("ZirconVMO");
735*6777b538SAndroid Build Coastguard Worker }
736*6777b538SAndroid Build Coastguard Worker
Write(base::Pickle * m,const param_type & p)737*6777b538SAndroid Build Coastguard Worker void ParamTraits<zx::channel>::Write(base::Pickle* m, const param_type& p) {
738*6777b538SAndroid Build Coastguard Worker // This serialization must be kept in sync with
739*6777b538SAndroid Build Coastguard Worker // nacl_message_scanner.cc:WriteHandle().
740*6777b538SAndroid Build Coastguard Worker const bool valid = p.is_valid();
741*6777b538SAndroid Build Coastguard Worker WriteParam(m, valid);
742*6777b538SAndroid Build Coastguard Worker
743*6777b538SAndroid Build Coastguard Worker if (!valid)
744*6777b538SAndroid Build Coastguard Worker return;
745*6777b538SAndroid Build Coastguard Worker
746*6777b538SAndroid Build Coastguard Worker if (!m->WriteAttachment(new internal::HandleAttachmentFuchsia(
747*6777b538SAndroid Build Coastguard Worker std::move(const_cast<param_type&>(p))))) {
748*6777b538SAndroid Build Coastguard Worker NOTREACHED();
749*6777b538SAndroid Build Coastguard Worker }
750*6777b538SAndroid Build Coastguard Worker }
751*6777b538SAndroid Build Coastguard Worker
Read(const base::Pickle * m,base::PickleIterator * iter,param_type * r)752*6777b538SAndroid Build Coastguard Worker bool ParamTraits<zx::channel>::Read(const base::Pickle* m,
753*6777b538SAndroid Build Coastguard Worker base::PickleIterator* iter,
754*6777b538SAndroid Build Coastguard Worker param_type* r) {
755*6777b538SAndroid Build Coastguard Worker r->reset();
756*6777b538SAndroid Build Coastguard Worker
757*6777b538SAndroid Build Coastguard Worker bool valid;
758*6777b538SAndroid Build Coastguard Worker if (!ReadParam(m, iter, &valid))
759*6777b538SAndroid Build Coastguard Worker return false;
760*6777b538SAndroid Build Coastguard Worker
761*6777b538SAndroid Build Coastguard Worker if (!valid)
762*6777b538SAndroid Build Coastguard Worker return true;
763*6777b538SAndroid Build Coastguard Worker
764*6777b538SAndroid Build Coastguard Worker scoped_refptr<base::Pickle::Attachment> attachment;
765*6777b538SAndroid Build Coastguard Worker if (!m->ReadAttachment(iter, &attachment))
766*6777b538SAndroid Build Coastguard Worker return false;
767*6777b538SAndroid Build Coastguard Worker
768*6777b538SAndroid Build Coastguard Worker if (static_cast<MessageAttachment*>(attachment.get())->GetType() !=
769*6777b538SAndroid Build Coastguard Worker MessageAttachment::Type::FUCHSIA_HANDLE) {
770*6777b538SAndroid Build Coastguard Worker return false;
771*6777b538SAndroid Build Coastguard Worker }
772*6777b538SAndroid Build Coastguard Worker
773*6777b538SAndroid Build Coastguard Worker *r = zx::channel(
774*6777b538SAndroid Build Coastguard Worker static_cast<internal::HandleAttachmentFuchsia*>(attachment.get())
775*6777b538SAndroid Build Coastguard Worker ->Take());
776*6777b538SAndroid Build Coastguard Worker return true;
777*6777b538SAndroid Build Coastguard Worker }
778*6777b538SAndroid Build Coastguard Worker
Log(const param_type & p,std::string * l)779*6777b538SAndroid Build Coastguard Worker void ParamTraits<zx::channel>::Log(const param_type& p, std::string* l) {
780*6777b538SAndroid Build Coastguard Worker l->append("ZirconChannel");
781*6777b538SAndroid Build Coastguard Worker }
782*6777b538SAndroid Build Coastguard Worker #endif // BUILDFLAG(IS_FUCHSIA)
783*6777b538SAndroid Build Coastguard Worker
784*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_ANDROID)
Write(base::Pickle * m,const param_type & p)785*6777b538SAndroid Build Coastguard Worker void ParamTraits<base::android::ScopedHardwareBufferHandle>::Write(
786*6777b538SAndroid Build Coastguard Worker base::Pickle* m,
787*6777b538SAndroid Build Coastguard Worker const param_type& p) {
788*6777b538SAndroid Build Coastguard Worker const bool is_valid = p.is_valid();
789*6777b538SAndroid Build Coastguard Worker WriteParam(m, is_valid);
790*6777b538SAndroid Build Coastguard Worker if (!is_valid)
791*6777b538SAndroid Build Coastguard Worker return;
792*6777b538SAndroid Build Coastguard Worker
793*6777b538SAndroid Build Coastguard Worker // We must keep a ref to the AHardwareBuffer alive until the receiver has
794*6777b538SAndroid Build Coastguard Worker // acquired its own reference. We do this by sending a message pipe handle
795*6777b538SAndroid Build Coastguard Worker // along with the buffer. When the receiver deserializes (or even if they
796*6777b538SAndroid Build Coastguard Worker // die without ever reading the message) their end of the pipe will be
797*6777b538SAndroid Build Coastguard Worker // closed. We will eventually detect this and release the AHB reference.
798*6777b538SAndroid Build Coastguard Worker mojo::MessagePipe tracking_pipe;
799*6777b538SAndroid Build Coastguard Worker m->WriteAttachment(new internal::MojoHandleAttachment(
800*6777b538SAndroid Build Coastguard Worker mojo::ScopedHandle::From(std::move(tracking_pipe.handle0))));
801*6777b538SAndroid Build Coastguard Worker WriteParam(m, base::FileDescriptor(p.SerializeAsFileDescriptor().release(),
802*6777b538SAndroid Build Coastguard Worker true /* auto_close */));
803*6777b538SAndroid Build Coastguard Worker
804*6777b538SAndroid Build Coastguard Worker // Pass ownership of the input handle to our tracking pipe to keep the AHB
805*6777b538SAndroid Build Coastguard Worker // alive long enough to be deserialized by the receiver.
806*6777b538SAndroid Build Coastguard Worker mojo::ScopeToMessagePipe(std::move(const_cast<param_type&>(p)),
807*6777b538SAndroid Build Coastguard Worker std::move(tracking_pipe.handle1));
808*6777b538SAndroid Build Coastguard Worker }
809*6777b538SAndroid Build Coastguard Worker
Read(const base::Pickle * m,base::PickleIterator * iter,param_type * r)810*6777b538SAndroid Build Coastguard Worker bool ParamTraits<base::android::ScopedHardwareBufferHandle>::Read(
811*6777b538SAndroid Build Coastguard Worker const base::Pickle* m,
812*6777b538SAndroid Build Coastguard Worker base::PickleIterator* iter,
813*6777b538SAndroid Build Coastguard Worker param_type* r) {
814*6777b538SAndroid Build Coastguard Worker *r = base::android::ScopedHardwareBufferHandle();
815*6777b538SAndroid Build Coastguard Worker
816*6777b538SAndroid Build Coastguard Worker bool is_valid;
817*6777b538SAndroid Build Coastguard Worker if (!ReadParam(m, iter, &is_valid))
818*6777b538SAndroid Build Coastguard Worker return false;
819*6777b538SAndroid Build Coastguard Worker if (!is_valid)
820*6777b538SAndroid Build Coastguard Worker return true;
821*6777b538SAndroid Build Coastguard Worker
822*6777b538SAndroid Build Coastguard Worker scoped_refptr<base::Pickle::Attachment> tracking_pipe_attachment;
823*6777b538SAndroid Build Coastguard Worker if (!m->ReadAttachment(iter, &tracking_pipe_attachment))
824*6777b538SAndroid Build Coastguard Worker return false;
825*6777b538SAndroid Build Coastguard Worker
826*6777b538SAndroid Build Coastguard Worker // We keep this alive until the AHB is safely deserialized below. When this
827*6777b538SAndroid Build Coastguard Worker // goes out of scope, the sender holding the other end of this pipe will treat
828*6777b538SAndroid Build Coastguard Worker // this handle closure as a signal that it's safe to release their AHB
829*6777b538SAndroid Build Coastguard Worker // keepalive ref.
830*6777b538SAndroid Build Coastguard Worker mojo::ScopedHandle tracking_pipe =
831*6777b538SAndroid Build Coastguard Worker static_cast<MessageAttachment*>(tracking_pipe_attachment.get())
832*6777b538SAndroid Build Coastguard Worker ->TakeMojoHandle();
833*6777b538SAndroid Build Coastguard Worker
834*6777b538SAndroid Build Coastguard Worker base::FileDescriptor descriptor;
835*6777b538SAndroid Build Coastguard Worker if (!ReadParam(m, iter, &descriptor))
836*6777b538SAndroid Build Coastguard Worker return false;
837*6777b538SAndroid Build Coastguard Worker
838*6777b538SAndroid Build Coastguard Worker // NOTE: It is valid to deserialize an invalid FileDescriptor, so the success
839*6777b538SAndroid Build Coastguard Worker // of |ReadParam()| above does not imply that |descriptor| is valid.
840*6777b538SAndroid Build Coastguard Worker base::ScopedFD scoped_fd(descriptor.fd);
841*6777b538SAndroid Build Coastguard Worker if (!scoped_fd.is_valid())
842*6777b538SAndroid Build Coastguard Worker return false;
843*6777b538SAndroid Build Coastguard Worker
844*6777b538SAndroid Build Coastguard Worker *r = base::android::ScopedHardwareBufferHandle::DeserializeFromFileDescriptor(
845*6777b538SAndroid Build Coastguard Worker std::move(scoped_fd));
846*6777b538SAndroid Build Coastguard Worker return true;
847*6777b538SAndroid Build Coastguard Worker }
848*6777b538SAndroid Build Coastguard Worker
Log(const param_type & p,std::string * l)849*6777b538SAndroid Build Coastguard Worker void ParamTraits<base::android::ScopedHardwareBufferHandle>::Log(
850*6777b538SAndroid Build Coastguard Worker const param_type& p,
851*6777b538SAndroid Build Coastguard Worker std::string* l) {
852*6777b538SAndroid Build Coastguard Worker l->append(base::StringPrintf("base::android::ScopedHardwareBufferHandle(%p)",
853*6777b538SAndroid Build Coastguard Worker p.get()));
854*6777b538SAndroid Build Coastguard Worker }
855*6777b538SAndroid Build Coastguard Worker #endif // BUILDFLAG(IS_ANDROID)
856*6777b538SAndroid Build Coastguard Worker
Write(base::Pickle * m,const param_type & p)857*6777b538SAndroid Build Coastguard Worker void ParamTraits<base::ReadOnlySharedMemoryRegion>::Write(base::Pickle* m,
858*6777b538SAndroid Build Coastguard Worker const param_type& p) {
859*6777b538SAndroid Build Coastguard Worker base::subtle::PlatformSharedMemoryRegion handle =
860*6777b538SAndroid Build Coastguard Worker base::ReadOnlySharedMemoryRegion::TakeHandleForSerialization(
861*6777b538SAndroid Build Coastguard Worker std::move(const_cast<param_type&>(p)));
862*6777b538SAndroid Build Coastguard Worker WriteParam(m, std::move(handle));
863*6777b538SAndroid Build Coastguard Worker }
864*6777b538SAndroid Build Coastguard Worker
Read(const base::Pickle * m,base::PickleIterator * iter,param_type * r)865*6777b538SAndroid Build Coastguard Worker bool ParamTraits<base::ReadOnlySharedMemoryRegion>::Read(
866*6777b538SAndroid Build Coastguard Worker const base::Pickle* m,
867*6777b538SAndroid Build Coastguard Worker base::PickleIterator* iter,
868*6777b538SAndroid Build Coastguard Worker param_type* r) {
869*6777b538SAndroid Build Coastguard Worker base::subtle::PlatformSharedMemoryRegion handle;
870*6777b538SAndroid Build Coastguard Worker if (!ReadParam(m, iter, &handle))
871*6777b538SAndroid Build Coastguard Worker return false;
872*6777b538SAndroid Build Coastguard Worker
873*6777b538SAndroid Build Coastguard Worker *r = base::ReadOnlySharedMemoryRegion::Deserialize(std::move(handle));
874*6777b538SAndroid Build Coastguard Worker return true;
875*6777b538SAndroid Build Coastguard Worker }
876*6777b538SAndroid Build Coastguard Worker
Log(const param_type & p,std::string * l)877*6777b538SAndroid Build Coastguard Worker void ParamTraits<base::ReadOnlySharedMemoryRegion>::Log(const param_type& p,
878*6777b538SAndroid Build Coastguard Worker std::string* l) {
879*6777b538SAndroid Build Coastguard Worker *l = "<base::ReadOnlySharedMemoryRegion>";
880*6777b538SAndroid Build Coastguard Worker // TODO(alexilin): currently there is no way to access underlying handle
881*6777b538SAndroid Build Coastguard Worker // without destructing a ReadOnlySharedMemoryRegion instance.
882*6777b538SAndroid Build Coastguard Worker }
883*6777b538SAndroid Build Coastguard Worker
Write(base::Pickle * m,const param_type & p)884*6777b538SAndroid Build Coastguard Worker void ParamTraits<base::WritableSharedMemoryRegion>::Write(base::Pickle* m,
885*6777b538SAndroid Build Coastguard Worker const param_type& p) {
886*6777b538SAndroid Build Coastguard Worker base::subtle::PlatformSharedMemoryRegion handle =
887*6777b538SAndroid Build Coastguard Worker base::WritableSharedMemoryRegion::TakeHandleForSerialization(
888*6777b538SAndroid Build Coastguard Worker std::move(const_cast<param_type&>(p)));
889*6777b538SAndroid Build Coastguard Worker WriteParam(m, std::move(handle));
890*6777b538SAndroid Build Coastguard Worker }
891*6777b538SAndroid Build Coastguard Worker
Read(const base::Pickle * m,base::PickleIterator * iter,param_type * r)892*6777b538SAndroid Build Coastguard Worker bool ParamTraits<base::WritableSharedMemoryRegion>::Read(
893*6777b538SAndroid Build Coastguard Worker const base::Pickle* m,
894*6777b538SAndroid Build Coastguard Worker base::PickleIterator* iter,
895*6777b538SAndroid Build Coastguard Worker param_type* r) {
896*6777b538SAndroid Build Coastguard Worker base::subtle::PlatformSharedMemoryRegion handle;
897*6777b538SAndroid Build Coastguard Worker if (!ReadParam(m, iter, &handle))
898*6777b538SAndroid Build Coastguard Worker return false;
899*6777b538SAndroid Build Coastguard Worker
900*6777b538SAndroid Build Coastguard Worker *r = base::WritableSharedMemoryRegion::Deserialize(std::move(handle));
901*6777b538SAndroid Build Coastguard Worker return true;
902*6777b538SAndroid Build Coastguard Worker }
903*6777b538SAndroid Build Coastguard Worker
Log(const param_type & p,std::string * l)904*6777b538SAndroid Build Coastguard Worker void ParamTraits<base::WritableSharedMemoryRegion>::Log(const param_type& p,
905*6777b538SAndroid Build Coastguard Worker std::string* l) {
906*6777b538SAndroid Build Coastguard Worker *l = "<base::WritableSharedMemoryRegion>";
907*6777b538SAndroid Build Coastguard Worker // TODO(alexilin): currently there is no way to access underlying handle
908*6777b538SAndroid Build Coastguard Worker // without destructing a ReadOnlySharedMemoryRegion instance.
909*6777b538SAndroid Build Coastguard Worker }
910*6777b538SAndroid Build Coastguard Worker
Write(base::Pickle * m,const param_type & p)911*6777b538SAndroid Build Coastguard Worker void ParamTraits<base::UnsafeSharedMemoryRegion>::Write(base::Pickle* m,
912*6777b538SAndroid Build Coastguard Worker const param_type& p) {
913*6777b538SAndroid Build Coastguard Worker base::subtle::PlatformSharedMemoryRegion handle =
914*6777b538SAndroid Build Coastguard Worker base::UnsafeSharedMemoryRegion::TakeHandleForSerialization(
915*6777b538SAndroid Build Coastguard Worker std::move(const_cast<param_type&>(p)));
916*6777b538SAndroid Build Coastguard Worker WriteParam(m, std::move(handle));
917*6777b538SAndroid Build Coastguard Worker }
918*6777b538SAndroid Build Coastguard Worker
Read(const base::Pickle * m,base::PickleIterator * iter,param_type * r)919*6777b538SAndroid Build Coastguard Worker bool ParamTraits<base::UnsafeSharedMemoryRegion>::Read(
920*6777b538SAndroid Build Coastguard Worker const base::Pickle* m,
921*6777b538SAndroid Build Coastguard Worker base::PickleIterator* iter,
922*6777b538SAndroid Build Coastguard Worker param_type* r) {
923*6777b538SAndroid Build Coastguard Worker base::subtle::PlatformSharedMemoryRegion handle;
924*6777b538SAndroid Build Coastguard Worker if (!ReadParam(m, iter, &handle))
925*6777b538SAndroid Build Coastguard Worker return false;
926*6777b538SAndroid Build Coastguard Worker
927*6777b538SAndroid Build Coastguard Worker *r = base::UnsafeSharedMemoryRegion::Deserialize(std::move(handle));
928*6777b538SAndroid Build Coastguard Worker return true;
929*6777b538SAndroid Build Coastguard Worker }
930*6777b538SAndroid Build Coastguard Worker
Log(const param_type & p,std::string * l)931*6777b538SAndroid Build Coastguard Worker void ParamTraits<base::UnsafeSharedMemoryRegion>::Log(const param_type& p,
932*6777b538SAndroid Build Coastguard Worker std::string* l) {
933*6777b538SAndroid Build Coastguard Worker *l = "<base::UnsafeSharedMemoryRegion>";
934*6777b538SAndroid Build Coastguard Worker // TODO(alexilin): currently there is no way to access underlying handle
935*6777b538SAndroid Build Coastguard Worker // without destructing a ReadOnlySharedMemoryRegion instance.
936*6777b538SAndroid Build Coastguard Worker }
937*6777b538SAndroid Build Coastguard Worker
Write(base::Pickle * m,const param_type & p)938*6777b538SAndroid Build Coastguard Worker void ParamTraits<base::subtle::PlatformSharedMemoryRegion>::Write(
939*6777b538SAndroid Build Coastguard Worker base::Pickle* m,
940*6777b538SAndroid Build Coastguard Worker const param_type& p) {
941*6777b538SAndroid Build Coastguard Worker // This serialization must be kept in sync with
942*6777b538SAndroid Build Coastguard Worker // nacl_message_scanner.cc::WriteHandle().
943*6777b538SAndroid Build Coastguard Worker const bool valid = p.IsValid();
944*6777b538SAndroid Build Coastguard Worker WriteParam(m, valid);
945*6777b538SAndroid Build Coastguard Worker
946*6777b538SAndroid Build Coastguard Worker if (!valid)
947*6777b538SAndroid Build Coastguard Worker return;
948*6777b538SAndroid Build Coastguard Worker
949*6777b538SAndroid Build Coastguard Worker WriteParam(m, p.GetMode());
950*6777b538SAndroid Build Coastguard Worker WriteParam(m, static_cast<uint64_t>(p.GetSize()));
951*6777b538SAndroid Build Coastguard Worker WriteParam(m, p.GetGUID());
952*6777b538SAndroid Build Coastguard Worker
953*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN)
954*6777b538SAndroid Build Coastguard Worker base::win::ScopedHandle h = const_cast<param_type&>(p).PassPlatformHandle();
955*6777b538SAndroid Build Coastguard Worker HandleWin handle_win(h.Get());
956*6777b538SAndroid Build Coastguard Worker WriteParam(m, handle_win);
957*6777b538SAndroid Build Coastguard Worker #elif BUILDFLAG(IS_FUCHSIA)
958*6777b538SAndroid Build Coastguard Worker zx::vmo vmo = const_cast<param_type&>(p).PassPlatformHandle();
959*6777b538SAndroid Build Coastguard Worker WriteParam(m, vmo);
960*6777b538SAndroid Build Coastguard Worker #elif BUILDFLAG(IS_APPLE)
961*6777b538SAndroid Build Coastguard Worker base::apple::ScopedMachSendRight h =
962*6777b538SAndroid Build Coastguard Worker const_cast<param_type&>(p).PassPlatformHandle();
963*6777b538SAndroid Build Coastguard Worker MachPortMac mach_port_mac(h.get());
964*6777b538SAndroid Build Coastguard Worker WriteParam(m, mach_port_mac);
965*6777b538SAndroid Build Coastguard Worker #elif BUILDFLAG(IS_ANDROID)
966*6777b538SAndroid Build Coastguard Worker m->WriteAttachment(new internal::PlatformFileAttachment(
967*6777b538SAndroid Build Coastguard Worker base::ScopedFD(const_cast<param_type&>(p).PassPlatformHandle())));
968*6777b538SAndroid Build Coastguard Worker #elif BUILDFLAG(IS_POSIX)
969*6777b538SAndroid Build Coastguard Worker base::subtle::ScopedFDPair h =
970*6777b538SAndroid Build Coastguard Worker const_cast<param_type&>(p).PassPlatformHandle();
971*6777b538SAndroid Build Coastguard Worker m->WriteAttachment(new internal::PlatformFileAttachment(std::move(h.fd)));
972*6777b538SAndroid Build Coastguard Worker if (p.GetMode() ==
973*6777b538SAndroid Build Coastguard Worker base::subtle::PlatformSharedMemoryRegion::Mode::kWritable) {
974*6777b538SAndroid Build Coastguard Worker m->WriteAttachment(
975*6777b538SAndroid Build Coastguard Worker new internal::PlatformFileAttachment(std::move(h.readonly_fd)));
976*6777b538SAndroid Build Coastguard Worker }
977*6777b538SAndroid Build Coastguard Worker #endif
978*6777b538SAndroid Build Coastguard Worker }
979*6777b538SAndroid Build Coastguard Worker
Read(const base::Pickle * m,base::PickleIterator * iter,param_type * r)980*6777b538SAndroid Build Coastguard Worker bool ParamTraits<base::subtle::PlatformSharedMemoryRegion>::Read(
981*6777b538SAndroid Build Coastguard Worker const base::Pickle* m,
982*6777b538SAndroid Build Coastguard Worker base::PickleIterator* iter,
983*6777b538SAndroid Build Coastguard Worker param_type* r) {
984*6777b538SAndroid Build Coastguard Worker bool valid;
985*6777b538SAndroid Build Coastguard Worker if (!ReadParam(m, iter, &valid))
986*6777b538SAndroid Build Coastguard Worker return false;
987*6777b538SAndroid Build Coastguard Worker if (!valid) {
988*6777b538SAndroid Build Coastguard Worker *r = base::subtle::PlatformSharedMemoryRegion();
989*6777b538SAndroid Build Coastguard Worker return true;
990*6777b538SAndroid Build Coastguard Worker }
991*6777b538SAndroid Build Coastguard Worker
992*6777b538SAndroid Build Coastguard Worker base::subtle::PlatformSharedMemoryRegion::Mode mode;
993*6777b538SAndroid Build Coastguard Worker uint64_t shm_size;
994*6777b538SAndroid Build Coastguard Worker base::UnguessableToken guid;
995*6777b538SAndroid Build Coastguard Worker if (!ReadParam(m, iter, &mode) || !ReadParam(m, iter, &shm_size) ||
996*6777b538SAndroid Build Coastguard Worker !base::IsValueInRangeForNumericType<size_t>(shm_size) ||
997*6777b538SAndroid Build Coastguard Worker !ReadParam(m, iter, &guid)) {
998*6777b538SAndroid Build Coastguard Worker return false;
999*6777b538SAndroid Build Coastguard Worker }
1000*6777b538SAndroid Build Coastguard Worker size_t size = static_cast<size_t>(shm_size);
1001*6777b538SAndroid Build Coastguard Worker
1002*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN)
1003*6777b538SAndroid Build Coastguard Worker HandleWin handle_win;
1004*6777b538SAndroid Build Coastguard Worker if (!ReadParam(m, iter, &handle_win))
1005*6777b538SAndroid Build Coastguard Worker return false;
1006*6777b538SAndroid Build Coastguard Worker *r = base::subtle::PlatformSharedMemoryRegion::Take(
1007*6777b538SAndroid Build Coastguard Worker base::win::ScopedHandle(handle_win.get_handle()), mode, size, guid);
1008*6777b538SAndroid Build Coastguard Worker #elif BUILDFLAG(IS_FUCHSIA)
1009*6777b538SAndroid Build Coastguard Worker zx::vmo vmo;
1010*6777b538SAndroid Build Coastguard Worker if (!ReadParam(m, iter, &vmo))
1011*6777b538SAndroid Build Coastguard Worker return false;
1012*6777b538SAndroid Build Coastguard Worker *r = base::subtle::PlatformSharedMemoryRegion::Take(std::move(vmo), mode,
1013*6777b538SAndroid Build Coastguard Worker size, guid);
1014*6777b538SAndroid Build Coastguard Worker #elif BUILDFLAG(IS_APPLE)
1015*6777b538SAndroid Build Coastguard Worker MachPortMac mach_port_mac;
1016*6777b538SAndroid Build Coastguard Worker if (!ReadParam(m, iter, &mach_port_mac))
1017*6777b538SAndroid Build Coastguard Worker return false;
1018*6777b538SAndroid Build Coastguard Worker *r = base::subtle::PlatformSharedMemoryRegion::Take(
1019*6777b538SAndroid Build Coastguard Worker base::apple::ScopedMachSendRight(mach_port_mac.get_mach_port()), mode,
1020*6777b538SAndroid Build Coastguard Worker size, guid);
1021*6777b538SAndroid Build Coastguard Worker #elif BUILDFLAG(IS_POSIX)
1022*6777b538SAndroid Build Coastguard Worker scoped_refptr<base::Pickle::Attachment> attachment;
1023*6777b538SAndroid Build Coastguard Worker if (!m->ReadAttachment(iter, &attachment))
1024*6777b538SAndroid Build Coastguard Worker return false;
1025*6777b538SAndroid Build Coastguard Worker if (static_cast<MessageAttachment*>(attachment.get())->GetType() !=
1026*6777b538SAndroid Build Coastguard Worker MessageAttachment::Type::PLATFORM_FILE) {
1027*6777b538SAndroid Build Coastguard Worker return false;
1028*6777b538SAndroid Build Coastguard Worker }
1029*6777b538SAndroid Build Coastguard Worker
1030*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_ANDROID)
1031*6777b538SAndroid Build Coastguard Worker *r = base::subtle::PlatformSharedMemoryRegion::Take(
1032*6777b538SAndroid Build Coastguard Worker base::ScopedFD(
1033*6777b538SAndroid Build Coastguard Worker static_cast<internal::PlatformFileAttachment*>(attachment.get())
1034*6777b538SAndroid Build Coastguard Worker ->TakePlatformFile()),
1035*6777b538SAndroid Build Coastguard Worker mode, size, guid);
1036*6777b538SAndroid Build Coastguard Worker #else
1037*6777b538SAndroid Build Coastguard Worker scoped_refptr<base::Pickle::Attachment> readonly_attachment;
1038*6777b538SAndroid Build Coastguard Worker if (mode == base::subtle::PlatformSharedMemoryRegion::Mode::kWritable) {
1039*6777b538SAndroid Build Coastguard Worker if (!m->ReadAttachment(iter, &readonly_attachment))
1040*6777b538SAndroid Build Coastguard Worker return false;
1041*6777b538SAndroid Build Coastguard Worker
1042*6777b538SAndroid Build Coastguard Worker if (static_cast<MessageAttachment*>(readonly_attachment.get())->GetType() !=
1043*6777b538SAndroid Build Coastguard Worker MessageAttachment::Type::PLATFORM_FILE) {
1044*6777b538SAndroid Build Coastguard Worker return false;
1045*6777b538SAndroid Build Coastguard Worker }
1046*6777b538SAndroid Build Coastguard Worker }
1047*6777b538SAndroid Build Coastguard Worker *r = base::subtle::PlatformSharedMemoryRegion::Take(
1048*6777b538SAndroid Build Coastguard Worker base::subtle::ScopedFDPair(
1049*6777b538SAndroid Build Coastguard Worker base::ScopedFD(
1050*6777b538SAndroid Build Coastguard Worker static_cast<internal::PlatformFileAttachment*>(attachment.get())
1051*6777b538SAndroid Build Coastguard Worker ->TakePlatformFile()),
1052*6777b538SAndroid Build Coastguard Worker readonly_attachment
1053*6777b538SAndroid Build Coastguard Worker ? base::ScopedFD(static_cast<internal::PlatformFileAttachment*>(
1054*6777b538SAndroid Build Coastguard Worker readonly_attachment.get())
1055*6777b538SAndroid Build Coastguard Worker ->TakePlatformFile())
1056*6777b538SAndroid Build Coastguard Worker : base::ScopedFD()),
1057*6777b538SAndroid Build Coastguard Worker mode, size, guid);
1058*6777b538SAndroid Build Coastguard Worker #endif // BUILDFLAG(IS_ANDROID)
1059*6777b538SAndroid Build Coastguard Worker
1060*6777b538SAndroid Build Coastguard Worker #endif
1061*6777b538SAndroid Build Coastguard Worker
1062*6777b538SAndroid Build Coastguard Worker return true;
1063*6777b538SAndroid Build Coastguard Worker }
1064*6777b538SAndroid Build Coastguard Worker
Log(const param_type & p,std::string * l)1065*6777b538SAndroid Build Coastguard Worker void ParamTraits<base::subtle::PlatformSharedMemoryRegion>::Log(
1066*6777b538SAndroid Build Coastguard Worker const param_type& p,
1067*6777b538SAndroid Build Coastguard Worker std::string* l) {
1068*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_FUCHSIA)
1069*6777b538SAndroid Build Coastguard Worker l->append("Handle: ");
1070*6777b538SAndroid Build Coastguard Worker LogParam(p.GetPlatformHandle()->get(), l);
1071*6777b538SAndroid Build Coastguard Worker #elif BUILDFLAG(IS_WIN)
1072*6777b538SAndroid Build Coastguard Worker l->append("Handle: ");
1073*6777b538SAndroid Build Coastguard Worker LogParam(p.GetPlatformHandle(), l);
1074*6777b538SAndroid Build Coastguard Worker #elif BUILDFLAG(IS_APPLE)
1075*6777b538SAndroid Build Coastguard Worker l->append("Mach port: ");
1076*6777b538SAndroid Build Coastguard Worker LogParam(p.GetPlatformHandle(), l);
1077*6777b538SAndroid Build Coastguard Worker #elif BUILDFLAG(IS_ANDROID)
1078*6777b538SAndroid Build Coastguard Worker l->append("FD: ");
1079*6777b538SAndroid Build Coastguard Worker LogParam(p.GetPlatformHandle(), l);
1080*6777b538SAndroid Build Coastguard Worker #elif BUILDFLAG(IS_POSIX)
1081*6777b538SAndroid Build Coastguard Worker base::subtle::FDPair h = p.GetPlatformHandle();
1082*6777b538SAndroid Build Coastguard Worker l->append("FD: ");
1083*6777b538SAndroid Build Coastguard Worker LogParam(h.fd, l);
1084*6777b538SAndroid Build Coastguard Worker l->append("Read-only FD: ");
1085*6777b538SAndroid Build Coastguard Worker LogParam(h.readonly_fd, l);
1086*6777b538SAndroid Build Coastguard Worker #endif
1087*6777b538SAndroid Build Coastguard Worker
1088*6777b538SAndroid Build Coastguard Worker l->append("Mode: ");
1089*6777b538SAndroid Build Coastguard Worker LogParam(p.GetMode(), l);
1090*6777b538SAndroid Build Coastguard Worker l->append("size: ");
1091*6777b538SAndroid Build Coastguard Worker LogParam(static_cast<uint64_t>(p.GetSize()), l);
1092*6777b538SAndroid Build Coastguard Worker l->append("GUID: ");
1093*6777b538SAndroid Build Coastguard Worker LogParam(p.GetGUID(), l);
1094*6777b538SAndroid Build Coastguard Worker }
1095*6777b538SAndroid Build Coastguard Worker
Write(base::Pickle * m,const param_type & value)1096*6777b538SAndroid Build Coastguard Worker void ParamTraits<base::subtle::PlatformSharedMemoryRegion::Mode>::Write(
1097*6777b538SAndroid Build Coastguard Worker base::Pickle* m,
1098*6777b538SAndroid Build Coastguard Worker const param_type& value) {
1099*6777b538SAndroid Build Coastguard Worker DCHECK(static_cast<int>(value) >= 0 &&
1100*6777b538SAndroid Build Coastguard Worker static_cast<int>(value) <= static_cast<int>(param_type::kMaxValue));
1101*6777b538SAndroid Build Coastguard Worker m->WriteInt(static_cast<int>(value));
1102*6777b538SAndroid Build Coastguard Worker }
1103*6777b538SAndroid Build Coastguard Worker
Read(const base::Pickle * m,base::PickleIterator * iter,param_type * p)1104*6777b538SAndroid Build Coastguard Worker bool ParamTraits<base::subtle::PlatformSharedMemoryRegion::Mode>::Read(
1105*6777b538SAndroid Build Coastguard Worker const base::Pickle* m,
1106*6777b538SAndroid Build Coastguard Worker base::PickleIterator* iter,
1107*6777b538SAndroid Build Coastguard Worker param_type* p) {
1108*6777b538SAndroid Build Coastguard Worker int value;
1109*6777b538SAndroid Build Coastguard Worker if (!iter->ReadInt(&value))
1110*6777b538SAndroid Build Coastguard Worker return false;
1111*6777b538SAndroid Build Coastguard Worker if (!(static_cast<int>(value) >= 0 &&
1112*6777b538SAndroid Build Coastguard Worker static_cast<int>(value) <= static_cast<int>(param_type::kMaxValue))) {
1113*6777b538SAndroid Build Coastguard Worker return false;
1114*6777b538SAndroid Build Coastguard Worker }
1115*6777b538SAndroid Build Coastguard Worker *p = static_cast<param_type>(value);
1116*6777b538SAndroid Build Coastguard Worker return true;
1117*6777b538SAndroid Build Coastguard Worker }
1118*6777b538SAndroid Build Coastguard Worker
Log(const param_type & p,std::string * l)1119*6777b538SAndroid Build Coastguard Worker void ParamTraits<base::subtle::PlatformSharedMemoryRegion::Mode>::Log(
1120*6777b538SAndroid Build Coastguard Worker const param_type& p,
1121*6777b538SAndroid Build Coastguard Worker std::string* l) {
1122*6777b538SAndroid Build Coastguard Worker LogParam(static_cast<int>(p), l);
1123*6777b538SAndroid Build Coastguard Worker }
1124*6777b538SAndroid Build Coastguard Worker
1125*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN)
Write(base::Pickle * m,const param_type & p)1126*6777b538SAndroid Build Coastguard Worker void ParamTraits<PlatformFileForTransit>::Write(base::Pickle* m,
1127*6777b538SAndroid Build Coastguard Worker const param_type& p) {
1128*6777b538SAndroid Build Coastguard Worker m->WriteBool(p.IsValid());
1129*6777b538SAndroid Build Coastguard Worker if (p.IsValid()) {
1130*6777b538SAndroid Build Coastguard Worker HandleWin handle_win(p.GetHandle());
1131*6777b538SAndroid Build Coastguard Worker ParamTraits<HandleWin>::Write(m, handle_win);
1132*6777b538SAndroid Build Coastguard Worker ::CloseHandle(p.GetHandle());
1133*6777b538SAndroid Build Coastguard Worker }
1134*6777b538SAndroid Build Coastguard Worker }
1135*6777b538SAndroid Build Coastguard Worker
Read(const base::Pickle * m,base::PickleIterator * iter,param_type * r)1136*6777b538SAndroid Build Coastguard Worker bool ParamTraits<PlatformFileForTransit>::Read(const base::Pickle* m,
1137*6777b538SAndroid Build Coastguard Worker base::PickleIterator* iter,
1138*6777b538SAndroid Build Coastguard Worker param_type* r) {
1139*6777b538SAndroid Build Coastguard Worker bool is_valid;
1140*6777b538SAndroid Build Coastguard Worker if (!iter->ReadBool(&is_valid))
1141*6777b538SAndroid Build Coastguard Worker return false;
1142*6777b538SAndroid Build Coastguard Worker if (!is_valid) {
1143*6777b538SAndroid Build Coastguard Worker *r = PlatformFileForTransit();
1144*6777b538SAndroid Build Coastguard Worker return true;
1145*6777b538SAndroid Build Coastguard Worker }
1146*6777b538SAndroid Build Coastguard Worker
1147*6777b538SAndroid Build Coastguard Worker HandleWin handle_win;
1148*6777b538SAndroid Build Coastguard Worker if (!ParamTraits<HandleWin>::Read(m, iter, &handle_win))
1149*6777b538SAndroid Build Coastguard Worker return false;
1150*6777b538SAndroid Build Coastguard Worker *r = PlatformFileForTransit(handle_win.get_handle());
1151*6777b538SAndroid Build Coastguard Worker return true;
1152*6777b538SAndroid Build Coastguard Worker }
1153*6777b538SAndroid Build Coastguard Worker
Log(const param_type & p,std::string * l)1154*6777b538SAndroid Build Coastguard Worker void ParamTraits<PlatformFileForTransit>::Log(const param_type& p,
1155*6777b538SAndroid Build Coastguard Worker std::string* l) {
1156*6777b538SAndroid Build Coastguard Worker LogParam(p.GetHandle(), l);
1157*6777b538SAndroid Build Coastguard Worker }
1158*6777b538SAndroid Build Coastguard Worker #endif // BUILDFLAG(IS_WIN)
1159*6777b538SAndroid Build Coastguard Worker
Write(base::Pickle * m,const param_type & p)1160*6777b538SAndroid Build Coastguard Worker void ParamTraits<base::FilePath>::Write(base::Pickle* m, const param_type& p) {
1161*6777b538SAndroid Build Coastguard Worker p.WriteToPickle(m);
1162*6777b538SAndroid Build Coastguard Worker }
1163*6777b538SAndroid Build Coastguard Worker
Read(const base::Pickle * m,base::PickleIterator * iter,param_type * r)1164*6777b538SAndroid Build Coastguard Worker bool ParamTraits<base::FilePath>::Read(const base::Pickle* m,
1165*6777b538SAndroid Build Coastguard Worker base::PickleIterator* iter,
1166*6777b538SAndroid Build Coastguard Worker param_type* r) {
1167*6777b538SAndroid Build Coastguard Worker return r->ReadFromPickle(iter);
1168*6777b538SAndroid Build Coastguard Worker }
1169*6777b538SAndroid Build Coastguard Worker
Log(const param_type & p,std::string * l)1170*6777b538SAndroid Build Coastguard Worker void ParamTraits<base::FilePath>::Log(const param_type& p, std::string* l) {
1171*6777b538SAndroid Build Coastguard Worker ParamTraits<base::FilePath::StringType>::Log(p.value(), l);
1172*6777b538SAndroid Build Coastguard Worker }
1173*6777b538SAndroid Build Coastguard Worker
Write(base::Pickle * m,const param_type & p)1174*6777b538SAndroid Build Coastguard Worker void ParamTraits<base::Value::List>::Write(base::Pickle* m,
1175*6777b538SAndroid Build Coastguard Worker const param_type& p) {
1176*6777b538SAndroid Build Coastguard Worker WriteListValue(p, 0, m);
1177*6777b538SAndroid Build Coastguard Worker }
1178*6777b538SAndroid Build Coastguard Worker
Read(const base::Pickle * m,base::PickleIterator * iter,param_type * r)1179*6777b538SAndroid Build Coastguard Worker bool ParamTraits<base::Value::List>::Read(const base::Pickle* m,
1180*6777b538SAndroid Build Coastguard Worker base::PickleIterator* iter,
1181*6777b538SAndroid Build Coastguard Worker param_type* r) {
1182*6777b538SAndroid Build Coastguard Worker return ReadListValue(m, iter, 0, r);
1183*6777b538SAndroid Build Coastguard Worker }
1184*6777b538SAndroid Build Coastguard Worker
Log(const param_type & p,std::string * l)1185*6777b538SAndroid Build Coastguard Worker void ParamTraits<base::Value::List>::Log(const param_type& p, std::string* l) {
1186*6777b538SAndroid Build Coastguard Worker std::string json;
1187*6777b538SAndroid Build Coastguard Worker base::JSONWriter::Write(p, &json);
1188*6777b538SAndroid Build Coastguard Worker l->append(json);
1189*6777b538SAndroid Build Coastguard Worker }
1190*6777b538SAndroid Build Coastguard Worker
Write(base::Pickle * m,const param_type & p)1191*6777b538SAndroid Build Coastguard Worker void ParamTraits<base::Value>::Write(base::Pickle* m, const param_type& p) {
1192*6777b538SAndroid Build Coastguard Worker WriteValue(p, 0, m);
1193*6777b538SAndroid Build Coastguard Worker }
1194*6777b538SAndroid Build Coastguard Worker
Read(const base::Pickle * m,base::PickleIterator * iter,param_type * r)1195*6777b538SAndroid Build Coastguard Worker bool ParamTraits<base::Value>::Read(const base::Pickle* m,
1196*6777b538SAndroid Build Coastguard Worker base::PickleIterator* iter,
1197*6777b538SAndroid Build Coastguard Worker param_type* r) {
1198*6777b538SAndroid Build Coastguard Worker return ReadValue(m, iter, 0, r);
1199*6777b538SAndroid Build Coastguard Worker }
1200*6777b538SAndroid Build Coastguard Worker
Log(const param_type & p,std::string * l)1201*6777b538SAndroid Build Coastguard Worker void ParamTraits<base::Value>::Log(const param_type& p, std::string* l) {
1202*6777b538SAndroid Build Coastguard Worker std::string json;
1203*6777b538SAndroid Build Coastguard Worker base::JSONWriter::Write(p, &json);
1204*6777b538SAndroid Build Coastguard Worker l->append(json);
1205*6777b538SAndroid Build Coastguard Worker }
1206*6777b538SAndroid Build Coastguard Worker
Write(base::Pickle * m,const param_type & p)1207*6777b538SAndroid Build Coastguard Worker void ParamTraits<base::File::Info>::Write(base::Pickle* m,
1208*6777b538SAndroid Build Coastguard Worker const param_type& p) {
1209*6777b538SAndroid Build Coastguard Worker WriteParam(m, p.size);
1210*6777b538SAndroid Build Coastguard Worker WriteParam(m, p.is_directory);
1211*6777b538SAndroid Build Coastguard Worker WriteParam(m, p.last_modified.InSecondsFSinceUnixEpoch());
1212*6777b538SAndroid Build Coastguard Worker WriteParam(m, p.last_accessed.InSecondsFSinceUnixEpoch());
1213*6777b538SAndroid Build Coastguard Worker WriteParam(m, p.creation_time.InSecondsFSinceUnixEpoch());
1214*6777b538SAndroid Build Coastguard Worker }
1215*6777b538SAndroid Build Coastguard Worker
Read(const base::Pickle * m,base::PickleIterator * iter,param_type * p)1216*6777b538SAndroid Build Coastguard Worker bool ParamTraits<base::File::Info>::Read(const base::Pickle* m,
1217*6777b538SAndroid Build Coastguard Worker base::PickleIterator* iter,
1218*6777b538SAndroid Build Coastguard Worker param_type* p) {
1219*6777b538SAndroid Build Coastguard Worker double last_modified, last_accessed, creation_time;
1220*6777b538SAndroid Build Coastguard Worker if (!ReadParam(m, iter, &p->size) ||
1221*6777b538SAndroid Build Coastguard Worker !ReadParam(m, iter, &p->is_directory) ||
1222*6777b538SAndroid Build Coastguard Worker !ReadParam(m, iter, &last_modified) ||
1223*6777b538SAndroid Build Coastguard Worker !ReadParam(m, iter, &last_accessed) ||
1224*6777b538SAndroid Build Coastguard Worker !ReadParam(m, iter, &creation_time))
1225*6777b538SAndroid Build Coastguard Worker return false;
1226*6777b538SAndroid Build Coastguard Worker p->last_modified = base::Time::FromSecondsSinceUnixEpoch(last_modified);
1227*6777b538SAndroid Build Coastguard Worker p->last_accessed = base::Time::FromSecondsSinceUnixEpoch(last_accessed);
1228*6777b538SAndroid Build Coastguard Worker p->creation_time = base::Time::FromSecondsSinceUnixEpoch(creation_time);
1229*6777b538SAndroid Build Coastguard Worker return true;
1230*6777b538SAndroid Build Coastguard Worker }
1231*6777b538SAndroid Build Coastguard Worker
Log(const param_type & p,std::string * l)1232*6777b538SAndroid Build Coastguard Worker void ParamTraits<base::File::Info>::Log(const param_type& p,
1233*6777b538SAndroid Build Coastguard Worker std::string* l) {
1234*6777b538SAndroid Build Coastguard Worker l->append("(");
1235*6777b538SAndroid Build Coastguard Worker LogParam(p.size, l);
1236*6777b538SAndroid Build Coastguard Worker l->append(",");
1237*6777b538SAndroid Build Coastguard Worker LogParam(p.is_directory, l);
1238*6777b538SAndroid Build Coastguard Worker l->append(",");
1239*6777b538SAndroid Build Coastguard Worker LogParam(p.last_modified.InSecondsFSinceUnixEpoch(), l);
1240*6777b538SAndroid Build Coastguard Worker l->append(",");
1241*6777b538SAndroid Build Coastguard Worker LogParam(p.last_accessed.InSecondsFSinceUnixEpoch(), l);
1242*6777b538SAndroid Build Coastguard Worker l->append(",");
1243*6777b538SAndroid Build Coastguard Worker LogParam(p.creation_time.InSecondsFSinceUnixEpoch(), l);
1244*6777b538SAndroid Build Coastguard Worker l->append(")");
1245*6777b538SAndroid Build Coastguard Worker }
1246*6777b538SAndroid Build Coastguard Worker
Write(base::Pickle * m,const param_type & p)1247*6777b538SAndroid Build Coastguard Worker void ParamTraits<base::Time>::Write(base::Pickle* m, const param_type& p) {
1248*6777b538SAndroid Build Coastguard Worker ParamTraits<int64_t>::Write(m, p.ToInternalValue());
1249*6777b538SAndroid Build Coastguard Worker }
1250*6777b538SAndroid Build Coastguard Worker
Read(const base::Pickle * m,base::PickleIterator * iter,param_type * r)1251*6777b538SAndroid Build Coastguard Worker bool ParamTraits<base::Time>::Read(const base::Pickle* m,
1252*6777b538SAndroid Build Coastguard Worker base::PickleIterator* iter,
1253*6777b538SAndroid Build Coastguard Worker param_type* r) {
1254*6777b538SAndroid Build Coastguard Worker int64_t value;
1255*6777b538SAndroid Build Coastguard Worker if (!ParamTraits<int64_t>::Read(m, iter, &value))
1256*6777b538SAndroid Build Coastguard Worker return false;
1257*6777b538SAndroid Build Coastguard Worker *r = base::Time::FromInternalValue(value);
1258*6777b538SAndroid Build Coastguard Worker return true;
1259*6777b538SAndroid Build Coastguard Worker }
1260*6777b538SAndroid Build Coastguard Worker
Log(const param_type & p,std::string * l)1261*6777b538SAndroid Build Coastguard Worker void ParamTraits<base::Time>::Log(const param_type& p, std::string* l) {
1262*6777b538SAndroid Build Coastguard Worker ParamTraits<int64_t>::Log(p.ToInternalValue(), l);
1263*6777b538SAndroid Build Coastguard Worker }
1264*6777b538SAndroid Build Coastguard Worker
Write(base::Pickle * m,const param_type & p)1265*6777b538SAndroid Build Coastguard Worker void ParamTraits<base::TimeDelta>::Write(base::Pickle* m, const param_type& p) {
1266*6777b538SAndroid Build Coastguard Worker ParamTraits<int64_t>::Write(m, p.ToInternalValue());
1267*6777b538SAndroid Build Coastguard Worker }
1268*6777b538SAndroid Build Coastguard Worker
Read(const base::Pickle * m,base::PickleIterator * iter,param_type * r)1269*6777b538SAndroid Build Coastguard Worker bool ParamTraits<base::TimeDelta>::Read(const base::Pickle* m,
1270*6777b538SAndroid Build Coastguard Worker base::PickleIterator* iter,
1271*6777b538SAndroid Build Coastguard Worker param_type* r) {
1272*6777b538SAndroid Build Coastguard Worker int64_t value;
1273*6777b538SAndroid Build Coastguard Worker bool ret = ParamTraits<int64_t>::Read(m, iter, &value);
1274*6777b538SAndroid Build Coastguard Worker if (ret)
1275*6777b538SAndroid Build Coastguard Worker *r = base::TimeDelta::FromInternalValue(value);
1276*6777b538SAndroid Build Coastguard Worker
1277*6777b538SAndroid Build Coastguard Worker return ret;
1278*6777b538SAndroid Build Coastguard Worker }
1279*6777b538SAndroid Build Coastguard Worker
Log(const param_type & p,std::string * l)1280*6777b538SAndroid Build Coastguard Worker void ParamTraits<base::TimeDelta>::Log(const param_type& p, std::string* l) {
1281*6777b538SAndroid Build Coastguard Worker ParamTraits<int64_t>::Log(p.ToInternalValue(), l);
1282*6777b538SAndroid Build Coastguard Worker }
1283*6777b538SAndroid Build Coastguard Worker
Write(base::Pickle * m,const param_type & p)1284*6777b538SAndroid Build Coastguard Worker void ParamTraits<base::TimeTicks>::Write(base::Pickle* m, const param_type& p) {
1285*6777b538SAndroid Build Coastguard Worker ParamTraits<int64_t>::Write(m, p.ToInternalValue());
1286*6777b538SAndroid Build Coastguard Worker }
1287*6777b538SAndroid Build Coastguard Worker
Read(const base::Pickle * m,base::PickleIterator * iter,param_type * r)1288*6777b538SAndroid Build Coastguard Worker bool ParamTraits<base::TimeTicks>::Read(const base::Pickle* m,
1289*6777b538SAndroid Build Coastguard Worker base::PickleIterator* iter,
1290*6777b538SAndroid Build Coastguard Worker param_type* r) {
1291*6777b538SAndroid Build Coastguard Worker int64_t value;
1292*6777b538SAndroid Build Coastguard Worker bool ret = ParamTraits<int64_t>::Read(m, iter, &value);
1293*6777b538SAndroid Build Coastguard Worker if (ret)
1294*6777b538SAndroid Build Coastguard Worker *r = base::TimeTicks::FromInternalValue(value);
1295*6777b538SAndroid Build Coastguard Worker
1296*6777b538SAndroid Build Coastguard Worker return ret;
1297*6777b538SAndroid Build Coastguard Worker }
1298*6777b538SAndroid Build Coastguard Worker
Log(const param_type & p,std::string * l)1299*6777b538SAndroid Build Coastguard Worker void ParamTraits<base::TimeTicks>::Log(const param_type& p, std::string* l) {
1300*6777b538SAndroid Build Coastguard Worker ParamTraits<int64_t>::Log(p.ToInternalValue(), l);
1301*6777b538SAndroid Build Coastguard Worker }
1302*6777b538SAndroid Build Coastguard Worker
1303*6777b538SAndroid Build Coastguard Worker // If base::UnguessableToken is no longer 128 bits, the IPC serialization logic
1304*6777b538SAndroid Build Coastguard Worker // below should be updated.
1305*6777b538SAndroid Build Coastguard Worker static_assert(sizeof(base::UnguessableToken) == 2 * sizeof(uint64_t),
1306*6777b538SAndroid Build Coastguard Worker "base::UnguessableToken should be of size 2 * sizeof(uint64_t).");
1307*6777b538SAndroid Build Coastguard Worker
Write(base::Pickle * m,const param_type & p)1308*6777b538SAndroid Build Coastguard Worker void ParamTraits<base::UnguessableToken>::Write(base::Pickle* m,
1309*6777b538SAndroid Build Coastguard Worker const param_type& p) {
1310*6777b538SAndroid Build Coastguard Worker DCHECK(!p.is_empty());
1311*6777b538SAndroid Build Coastguard Worker
1312*6777b538SAndroid Build Coastguard Worker ParamTraits<uint64_t>::Write(m, p.GetHighForSerialization());
1313*6777b538SAndroid Build Coastguard Worker ParamTraits<uint64_t>::Write(m, p.GetLowForSerialization());
1314*6777b538SAndroid Build Coastguard Worker }
1315*6777b538SAndroid Build Coastguard Worker
Read(const base::Pickle * m,base::PickleIterator * iter,param_type * r)1316*6777b538SAndroid Build Coastguard Worker bool ParamTraits<base::UnguessableToken>::Read(const base::Pickle* m,
1317*6777b538SAndroid Build Coastguard Worker base::PickleIterator* iter,
1318*6777b538SAndroid Build Coastguard Worker param_type* r) {
1319*6777b538SAndroid Build Coastguard Worker uint64_t high, low;
1320*6777b538SAndroid Build Coastguard Worker if (!ParamTraits<uint64_t>::Read(m, iter, &high) ||
1321*6777b538SAndroid Build Coastguard Worker !ParamTraits<uint64_t>::Read(m, iter, &low))
1322*6777b538SAndroid Build Coastguard Worker return false;
1323*6777b538SAndroid Build Coastguard Worker
1324*6777b538SAndroid Build Coastguard Worker // This is not mapped as nullable_is_same_type, so any UnguessableToken
1325*6777b538SAndroid Build Coastguard Worker // deserialized by the traits should always yield a non-empty token.
1326*6777b538SAndroid Build Coastguard Worker // If deserialization results in an empty token, the data is malformed.
1327*6777b538SAndroid Build Coastguard Worker std::optional<base::UnguessableToken> token =
1328*6777b538SAndroid Build Coastguard Worker base::UnguessableToken::Deserialize(high, low);
1329*6777b538SAndroid Build Coastguard Worker if (!token.has_value()) {
1330*6777b538SAndroid Build Coastguard Worker return false;
1331*6777b538SAndroid Build Coastguard Worker }
1332*6777b538SAndroid Build Coastguard Worker
1333*6777b538SAndroid Build Coastguard Worker *r = token.value();
1334*6777b538SAndroid Build Coastguard Worker return true;
1335*6777b538SAndroid Build Coastguard Worker }
1336*6777b538SAndroid Build Coastguard Worker
Log(const param_type & p,std::string * l)1337*6777b538SAndroid Build Coastguard Worker void ParamTraits<base::UnguessableToken>::Log(const param_type& p,
1338*6777b538SAndroid Build Coastguard Worker std::string* l) {
1339*6777b538SAndroid Build Coastguard Worker l->append(p.ToString());
1340*6777b538SAndroid Build Coastguard Worker }
1341*6777b538SAndroid Build Coastguard Worker
Write(base::Pickle * m,const param_type & p)1342*6777b538SAndroid Build Coastguard Worker void ParamTraits<IPC::ChannelHandle>::Write(base::Pickle* m,
1343*6777b538SAndroid Build Coastguard Worker const param_type& p) {
1344*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_NACL)
1345*6777b538SAndroid Build Coastguard Worker WriteParam(m, p.socket);
1346*6777b538SAndroid Build Coastguard Worker #else
1347*6777b538SAndroid Build Coastguard Worker WriteParam(m, p.mojo_handle);
1348*6777b538SAndroid Build Coastguard Worker #endif
1349*6777b538SAndroid Build Coastguard Worker }
1350*6777b538SAndroid Build Coastguard Worker
Read(const base::Pickle * m,base::PickleIterator * iter,param_type * r)1351*6777b538SAndroid Build Coastguard Worker bool ParamTraits<IPC::ChannelHandle>::Read(const base::Pickle* m,
1352*6777b538SAndroid Build Coastguard Worker base::PickleIterator* iter,
1353*6777b538SAndroid Build Coastguard Worker param_type* r) {
1354*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_NACL)
1355*6777b538SAndroid Build Coastguard Worker return ReadParam(m, iter, &r->socket);
1356*6777b538SAndroid Build Coastguard Worker #else
1357*6777b538SAndroid Build Coastguard Worker return ReadParam(m, iter, &r->mojo_handle);
1358*6777b538SAndroid Build Coastguard Worker #endif
1359*6777b538SAndroid Build Coastguard Worker }
1360*6777b538SAndroid Build Coastguard Worker
Log(const param_type & p,std::string * l)1361*6777b538SAndroid Build Coastguard Worker void ParamTraits<IPC::ChannelHandle>::Log(const param_type& p,
1362*6777b538SAndroid Build Coastguard Worker std::string* l) {
1363*6777b538SAndroid Build Coastguard Worker l->append("ChannelHandle(");
1364*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_NACL)
1365*6777b538SAndroid Build Coastguard Worker ParamTraits<base::FileDescriptor>::Log(p.socket, l);
1366*6777b538SAndroid Build Coastguard Worker #else
1367*6777b538SAndroid Build Coastguard Worker LogParam(p.mojo_handle, l);
1368*6777b538SAndroid Build Coastguard Worker #endif
1369*6777b538SAndroid Build Coastguard Worker l->append(")");
1370*6777b538SAndroid Build Coastguard Worker }
1371*6777b538SAndroid Build Coastguard Worker
Write(base::Pickle * m,const param_type & p)1372*6777b538SAndroid Build Coastguard Worker void ParamTraits<LogData>::Write(base::Pickle* m, const param_type& p) {
1373*6777b538SAndroid Build Coastguard Worker WriteParam(m, p.channel);
1374*6777b538SAndroid Build Coastguard Worker WriteParam(m, p.routing_id);
1375*6777b538SAndroid Build Coastguard Worker WriteParam(m, p.type);
1376*6777b538SAndroid Build Coastguard Worker WriteParam(m, p.flags);
1377*6777b538SAndroid Build Coastguard Worker WriteParam(m, p.sent);
1378*6777b538SAndroid Build Coastguard Worker WriteParam(m, p.receive);
1379*6777b538SAndroid Build Coastguard Worker WriteParam(m, p.dispatch);
1380*6777b538SAndroid Build Coastguard Worker WriteParam(m, p.message_name);
1381*6777b538SAndroid Build Coastguard Worker WriteParam(m, p.params);
1382*6777b538SAndroid Build Coastguard Worker }
1383*6777b538SAndroid Build Coastguard Worker
Read(const base::Pickle * m,base::PickleIterator * iter,param_type * r)1384*6777b538SAndroid Build Coastguard Worker bool ParamTraits<LogData>::Read(const base::Pickle* m,
1385*6777b538SAndroid Build Coastguard Worker base::PickleIterator* iter,
1386*6777b538SAndroid Build Coastguard Worker param_type* r) {
1387*6777b538SAndroid Build Coastguard Worker return
1388*6777b538SAndroid Build Coastguard Worker ReadParam(m, iter, &r->channel) &&
1389*6777b538SAndroid Build Coastguard Worker ReadParam(m, iter, &r->routing_id) &&
1390*6777b538SAndroid Build Coastguard Worker ReadParam(m, iter, &r->type) &&
1391*6777b538SAndroid Build Coastguard Worker ReadParam(m, iter, &r->flags) &&
1392*6777b538SAndroid Build Coastguard Worker ReadParam(m, iter, &r->sent) &&
1393*6777b538SAndroid Build Coastguard Worker ReadParam(m, iter, &r->receive) &&
1394*6777b538SAndroid Build Coastguard Worker ReadParam(m, iter, &r->dispatch) &&
1395*6777b538SAndroid Build Coastguard Worker ReadParam(m, iter, &r->message_name) &&
1396*6777b538SAndroid Build Coastguard Worker ReadParam(m, iter, &r->params);
1397*6777b538SAndroid Build Coastguard Worker }
1398*6777b538SAndroid Build Coastguard Worker
Log(const param_type & p,std::string * l)1399*6777b538SAndroid Build Coastguard Worker void ParamTraits<LogData>::Log(const param_type& p, std::string* l) {
1400*6777b538SAndroid Build Coastguard Worker // Doesn't make sense to implement this!
1401*6777b538SAndroid Build Coastguard Worker }
1402*6777b538SAndroid Build Coastguard Worker
Write(base::Pickle * m,const Message & p)1403*6777b538SAndroid Build Coastguard Worker void ParamTraits<Message>::Write(base::Pickle* m, const Message& p) {
1404*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA)
1405*6777b538SAndroid Build Coastguard Worker // We don't serialize the file descriptors in the nested message, so there
1406*6777b538SAndroid Build Coastguard Worker // better not be any.
1407*6777b538SAndroid Build Coastguard Worker DCHECK(!p.HasAttachments());
1408*6777b538SAndroid Build Coastguard Worker #endif
1409*6777b538SAndroid Build Coastguard Worker
1410*6777b538SAndroid Build Coastguard Worker // Don't just write out the message. This is used to send messages between
1411*6777b538SAndroid Build Coastguard Worker // NaCl (Posix environment) and the browser (could be on Windows). The message
1412*6777b538SAndroid Build Coastguard Worker // header formats differ between these systems (so does handle sharing, but
1413*6777b538SAndroid Build Coastguard Worker // we already asserted we don't have any handles). So just write out the
1414*6777b538SAndroid Build Coastguard Worker // parts of the header we use.
1415*6777b538SAndroid Build Coastguard Worker //
1416*6777b538SAndroid Build Coastguard Worker // Be careful also to use only explicitly-sized types. The NaCl environment
1417*6777b538SAndroid Build Coastguard Worker // could be 64-bit and the host browser could be 32-bits. The nested message
1418*6777b538SAndroid Build Coastguard Worker // may or may not be safe to send between 32-bit and 64-bit systems, but we
1419*6777b538SAndroid Build Coastguard Worker // leave that up to the code sending the message to ensure.
1420*6777b538SAndroid Build Coastguard Worker m->WriteUInt32(static_cast<uint32_t>(p.routing_id()));
1421*6777b538SAndroid Build Coastguard Worker m->WriteUInt32(p.type());
1422*6777b538SAndroid Build Coastguard Worker m->WriteUInt32(p.flags());
1423*6777b538SAndroid Build Coastguard Worker m->WriteData(p.payload_bytes());
1424*6777b538SAndroid Build Coastguard Worker }
1425*6777b538SAndroid Build Coastguard Worker
Read(const base::Pickle * m,base::PickleIterator * iter,Message * r)1426*6777b538SAndroid Build Coastguard Worker bool ParamTraits<Message>::Read(const base::Pickle* m,
1427*6777b538SAndroid Build Coastguard Worker base::PickleIterator* iter,
1428*6777b538SAndroid Build Coastguard Worker Message* r) {
1429*6777b538SAndroid Build Coastguard Worker uint32_t routing_id, type, flags;
1430*6777b538SAndroid Build Coastguard Worker if (!iter->ReadUInt32(&routing_id) ||
1431*6777b538SAndroid Build Coastguard Worker !iter->ReadUInt32(&type) ||
1432*6777b538SAndroid Build Coastguard Worker !iter->ReadUInt32(&flags))
1433*6777b538SAndroid Build Coastguard Worker return false;
1434*6777b538SAndroid Build Coastguard Worker
1435*6777b538SAndroid Build Coastguard Worker size_t payload_size;
1436*6777b538SAndroid Build Coastguard Worker const char* payload;
1437*6777b538SAndroid Build Coastguard Worker if (!iter->ReadData(&payload, &payload_size))
1438*6777b538SAndroid Build Coastguard Worker return false;
1439*6777b538SAndroid Build Coastguard Worker
1440*6777b538SAndroid Build Coastguard Worker r->SetHeaderValues(static_cast<int32_t>(routing_id), type, flags);
1441*6777b538SAndroid Build Coastguard Worker r->WriteBytes(payload, payload_size);
1442*6777b538SAndroid Build Coastguard Worker return true;
1443*6777b538SAndroid Build Coastguard Worker }
1444*6777b538SAndroid Build Coastguard Worker
Log(const Message & p,std::string * l)1445*6777b538SAndroid Build Coastguard Worker void ParamTraits<Message>::Log(const Message& p, std::string* l) {
1446*6777b538SAndroid Build Coastguard Worker l->append("<IPC::Message>");
1447*6777b538SAndroid Build Coastguard Worker }
1448*6777b538SAndroid Build Coastguard Worker
1449*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN)
1450*6777b538SAndroid Build Coastguard Worker // Note that HWNDs/HANDLE/HCURSOR/HACCEL etc are always 32 bits, even on 64
1451*6777b538SAndroid Build Coastguard Worker // bit systems. That's why we use the Windows macros to convert to 32 bits.
Write(base::Pickle * m,const param_type & p)1452*6777b538SAndroid Build Coastguard Worker void ParamTraits<HANDLE>::Write(base::Pickle* m, const param_type& p) {
1453*6777b538SAndroid Build Coastguard Worker m->WriteInt(HandleToLong(p));
1454*6777b538SAndroid Build Coastguard Worker }
1455*6777b538SAndroid Build Coastguard Worker
Read(const base::Pickle * m,base::PickleIterator * iter,param_type * r)1456*6777b538SAndroid Build Coastguard Worker bool ParamTraits<HANDLE>::Read(const base::Pickle* m,
1457*6777b538SAndroid Build Coastguard Worker base::PickleIterator* iter,
1458*6777b538SAndroid Build Coastguard Worker param_type* r) {
1459*6777b538SAndroid Build Coastguard Worker int32_t temp;
1460*6777b538SAndroid Build Coastguard Worker if (!iter->ReadInt(&temp))
1461*6777b538SAndroid Build Coastguard Worker return false;
1462*6777b538SAndroid Build Coastguard Worker *r = LongToHandle(temp);
1463*6777b538SAndroid Build Coastguard Worker return true;
1464*6777b538SAndroid Build Coastguard Worker }
1465*6777b538SAndroid Build Coastguard Worker
Log(const param_type & p,std::string * l)1466*6777b538SAndroid Build Coastguard Worker void ParamTraits<HANDLE>::Log(const param_type& p, std::string* l) {
1467*6777b538SAndroid Build Coastguard Worker l->append(base::StringPrintf("0x%p", p));
1468*6777b538SAndroid Build Coastguard Worker }
1469*6777b538SAndroid Build Coastguard Worker
Write(base::Pickle * m,const param_type & p)1470*6777b538SAndroid Build Coastguard Worker void ParamTraits<MSG>::Write(base::Pickle* m, const param_type& p) {
1471*6777b538SAndroid Build Coastguard Worker m->WriteData(reinterpret_cast<const char*>(&p), sizeof(MSG));
1472*6777b538SAndroid Build Coastguard Worker }
1473*6777b538SAndroid Build Coastguard Worker
Read(const base::Pickle * m,base::PickleIterator * iter,param_type * r)1474*6777b538SAndroid Build Coastguard Worker bool ParamTraits<MSG>::Read(const base::Pickle* m,
1475*6777b538SAndroid Build Coastguard Worker base::PickleIterator* iter,
1476*6777b538SAndroid Build Coastguard Worker param_type* r) {
1477*6777b538SAndroid Build Coastguard Worker const char *data;
1478*6777b538SAndroid Build Coastguard Worker size_t data_size = 0;
1479*6777b538SAndroid Build Coastguard Worker bool result = iter->ReadData(&data, &data_size);
1480*6777b538SAndroid Build Coastguard Worker if (result && data_size == sizeof(MSG)) {
1481*6777b538SAndroid Build Coastguard Worker memcpy(r, data, sizeof(MSG));
1482*6777b538SAndroid Build Coastguard Worker } else {
1483*6777b538SAndroid Build Coastguard Worker result = false;
1484*6777b538SAndroid Build Coastguard Worker NOTREACHED();
1485*6777b538SAndroid Build Coastguard Worker }
1486*6777b538SAndroid Build Coastguard Worker
1487*6777b538SAndroid Build Coastguard Worker return result;
1488*6777b538SAndroid Build Coastguard Worker }
1489*6777b538SAndroid Build Coastguard Worker
Log(const param_type & p,std::string * l)1490*6777b538SAndroid Build Coastguard Worker void ParamTraits<MSG>::Log(const param_type& p, std::string* l) {
1491*6777b538SAndroid Build Coastguard Worker l->append("<MSG>");
1492*6777b538SAndroid Build Coastguard Worker }
1493*6777b538SAndroid Build Coastguard Worker
1494*6777b538SAndroid Build Coastguard Worker #endif // BUILDFLAG(IS_WIN)
1495*6777b538SAndroid Build Coastguard Worker
1496*6777b538SAndroid Build Coastguard Worker } // namespace IPC
1497