| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "ipc/ipc_message_utils.h" | 5 #include "ipc/ipc_message_utils.h" |
| 6 | 6 |
| 7 #include "base/files/file_path.h" | 7 #include "base/files/file_path.h" |
| 8 #include "base/json/json_writer.h" | 8 #include "base/json/json_writer.h" |
| 9 #include "base/memory/scoped_ptr.h" | 9 #include "base/memory/scoped_ptr.h" |
| 10 #include "base/strings/nullable_string16.h" | 10 #include "base/strings/nullable_string16.h" |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 47 base::StringPrintf("[%02X]", static_cast<unsigned char>(data[i]))); | 47 base::StringPrintf("[%02X]", static_cast<unsigned char>(data[i]))); |
| 48 } | 48 } |
| 49 if (data.size() > kMaxBytesToLog) { | 49 if (data.size() > kMaxBytesToLog) { |
| 50 out->append(base::StringPrintf( | 50 out->append(base::StringPrintf( |
| 51 " and %u more bytes", | 51 " and %u more bytes", |
| 52 static_cast<unsigned>(data.size() - kMaxBytesToLog))); | 52 static_cast<unsigned>(data.size() - kMaxBytesToLog))); |
| 53 } | 53 } |
| 54 #endif | 54 #endif |
| 55 } | 55 } |
| 56 | 56 |
| 57 bool ReadValue(const Message* m, PickleIterator* iter, base::Value** value, | 57 bool ReadValue(const Message* m, |
| 58 base::PickleIterator* iter, |
| 59 base::Value** value, |
| 58 int recursion); | 60 int recursion); |
| 59 | 61 |
| 60 void WriteValue(Message* m, const base::Value* value, int recursion) { | 62 void WriteValue(Message* m, const base::Value* value, int recursion) { |
| 61 bool result; | 63 bool result; |
| 62 if (recursion > kMaxRecursionDepth) { | 64 if (recursion > kMaxRecursionDepth) { |
| 63 LOG(WARNING) << "Max recursion depth hit in WriteValue."; | 65 LOG(WARNING) << "Max recursion depth hit in WriteValue."; |
| 64 return; | 66 return; |
| 65 } | 67 } |
| 66 | 68 |
| 67 m->WriteInt(value->GetType()); | 69 m->WriteInt(value->GetType()); |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 123 it != list->end(); ++it) { | 125 it != list->end(); ++it) { |
| 124 WriteValue(m, *it, recursion + 1); | 126 WriteValue(m, *it, recursion + 1); |
| 125 } | 127 } |
| 126 break; | 128 break; |
| 127 } | 129 } |
| 128 } | 130 } |
| 129 } | 131 } |
| 130 | 132 |
| 131 // Helper for ReadValue that reads a DictionaryValue into a pre-allocated | 133 // Helper for ReadValue that reads a DictionaryValue into a pre-allocated |
| 132 // object. | 134 // object. |
| 133 bool ReadDictionaryValue(const Message* m, PickleIterator* iter, | 135 bool ReadDictionaryValue(const Message* m, |
| 134 base::DictionaryValue* value, int recursion) { | 136 base::PickleIterator* iter, |
| 137 base::DictionaryValue* value, |
| 138 int recursion) { |
| 135 int size; | 139 int size; |
| 136 if (!ReadParam(m, iter, &size)) | 140 if (!ReadParam(m, iter, &size)) |
| 137 return false; | 141 return false; |
| 138 | 142 |
| 139 for (int i = 0; i < size; ++i) { | 143 for (int i = 0; i < size; ++i) { |
| 140 std::string key; | 144 std::string key; |
| 141 base::Value* subval; | 145 base::Value* subval; |
| 142 if (!ReadParam(m, iter, &key) || | 146 if (!ReadParam(m, iter, &key) || |
| 143 !ReadValue(m, iter, &subval, recursion + 1)) | 147 !ReadValue(m, iter, &subval, recursion + 1)) |
| 144 return false; | 148 return false; |
| 145 value->SetWithoutPathExpansion(key, subval); | 149 value->SetWithoutPathExpansion(key, subval); |
| 146 } | 150 } |
| 147 | 151 |
| 148 return true; | 152 return true; |
| 149 } | 153 } |
| 150 | 154 |
| 151 // Helper for ReadValue that reads a ReadListValue into a pre-allocated | 155 // Helper for ReadValue that reads a ReadListValue into a pre-allocated |
| 152 // object. | 156 // object. |
| 153 bool ReadListValue(const Message* m, PickleIterator* iter, | 157 bool ReadListValue(const Message* m, |
| 154 base::ListValue* value, int recursion) { | 158 base::PickleIterator* iter, |
| 159 base::ListValue* value, |
| 160 int recursion) { |
| 155 int size; | 161 int size; |
| 156 if (!ReadParam(m, iter, &size)) | 162 if (!ReadParam(m, iter, &size)) |
| 157 return false; | 163 return false; |
| 158 | 164 |
| 159 for (int i = 0; i < size; ++i) { | 165 for (int i = 0; i < size; ++i) { |
| 160 base::Value* subval; | 166 base::Value* subval; |
| 161 if (!ReadValue(m, iter, &subval, recursion + 1)) | 167 if (!ReadValue(m, iter, &subval, recursion + 1)) |
| 162 return false; | 168 return false; |
| 163 value->Set(i, subval); | 169 value->Set(i, subval); |
| 164 } | 170 } |
| 165 | 171 |
| 166 return true; | 172 return true; |
| 167 } | 173 } |
| 168 | 174 |
| 169 bool ReadValue(const Message* m, PickleIterator* iter, base::Value** value, | 175 bool ReadValue(const Message* m, |
| 176 base::PickleIterator* iter, |
| 177 base::Value** value, |
| 170 int recursion) { | 178 int recursion) { |
| 171 if (recursion > kMaxRecursionDepth) { | 179 if (recursion > kMaxRecursionDepth) { |
| 172 LOG(WARNING) << "Max recursion depth hit in ReadValue."; | 180 LOG(WARNING) << "Max recursion depth hit in ReadValue."; |
| 173 return false; | 181 return false; |
| 174 } | 182 } |
| 175 | 183 |
| 176 int type; | 184 int type; |
| 177 if (!ReadParam(m, iter, &type)) | 185 if (!ReadParam(m, iter, &type)) |
| 178 return false; | 186 return false; |
| 179 | 187 |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 254 } | 262 } |
| 255 | 263 |
| 256 void ParamTraits<bool>::Log(const param_type& p, std::string* l) { | 264 void ParamTraits<bool>::Log(const param_type& p, std::string* l) { |
| 257 l->append(p ? "true" : "false"); | 265 l->append(p ? "true" : "false"); |
| 258 } | 266 } |
| 259 | 267 |
| 260 void ParamTraits<unsigned char>::Write(Message* m, const param_type& p) { | 268 void ParamTraits<unsigned char>::Write(Message* m, const param_type& p) { |
| 261 m->WriteBytes(&p, sizeof(param_type)); | 269 m->WriteBytes(&p, sizeof(param_type)); |
| 262 } | 270 } |
| 263 | 271 |
| 264 bool ParamTraits<unsigned char>::Read(const Message* m, PickleIterator* iter, | 272 bool ParamTraits<unsigned char>::Read(const Message* m, |
| 265 param_type* r) { | 273 base::PickleIterator* iter, |
| 274 param_type* r) { |
| 266 const char* data; | 275 const char* data; |
| 267 if (!iter->ReadBytes(&data, sizeof(param_type))) | 276 if (!iter->ReadBytes(&data, sizeof(param_type))) |
| 268 return false; | 277 return false; |
| 269 memcpy(r, data, sizeof(param_type)); | 278 memcpy(r, data, sizeof(param_type)); |
| 270 return true; | 279 return true; |
| 271 } | 280 } |
| 272 | 281 |
| 273 void ParamTraits<unsigned char>::Log(const param_type& p, std::string* l) { | 282 void ParamTraits<unsigned char>::Log(const param_type& p, std::string* l) { |
| 274 l->append(base::UintToString(p)); | 283 l->append(base::UintToString(p)); |
| 275 } | 284 } |
| 276 | 285 |
| 277 void ParamTraits<unsigned short>::Write(Message* m, const param_type& p) { | 286 void ParamTraits<unsigned short>::Write(Message* m, const param_type& p) { |
| 278 m->WriteBytes(&p, sizeof(param_type)); | 287 m->WriteBytes(&p, sizeof(param_type)); |
| 279 } | 288 } |
| 280 | 289 |
| 281 bool ParamTraits<unsigned short>::Read(const Message* m, PickleIterator* iter, | 290 bool ParamTraits<unsigned short>::Read(const Message* m, |
| 291 base::PickleIterator* iter, |
| 282 param_type* r) { | 292 param_type* r) { |
| 283 const char* data; | 293 const char* data; |
| 284 if (!iter->ReadBytes(&data, sizeof(param_type))) | 294 if (!iter->ReadBytes(&data, sizeof(param_type))) |
| 285 return false; | 295 return false; |
| 286 memcpy(r, data, sizeof(param_type)); | 296 memcpy(r, data, sizeof(param_type)); |
| 287 return true; | 297 return true; |
| 288 } | 298 } |
| 289 | 299 |
| 290 void ParamTraits<unsigned short>::Log(const param_type& p, std::string* l) { | 300 void ParamTraits<unsigned short>::Log(const param_type& p, std::string* l) { |
| 291 l->append(base::UintToString(p)); | 301 l->append(base::UintToString(p)); |
| (...skipping 24 matching lines...) Expand all Loading... |
| 316 } | 326 } |
| 317 | 327 |
| 318 void ParamTraits<float>::Log(const param_type& p, std::string* l) { | 328 void ParamTraits<float>::Log(const param_type& p, std::string* l) { |
| 319 l->append(base::StringPrintf("%e", p)); | 329 l->append(base::StringPrintf("%e", p)); |
| 320 } | 330 } |
| 321 | 331 |
| 322 void ParamTraits<double>::Write(Message* m, const param_type& p) { | 332 void ParamTraits<double>::Write(Message* m, const param_type& p) { |
| 323 m->WriteBytes(reinterpret_cast<const char*>(&p), sizeof(param_type)); | 333 m->WriteBytes(reinterpret_cast<const char*>(&p), sizeof(param_type)); |
| 324 } | 334 } |
| 325 | 335 |
| 326 bool ParamTraits<double>::Read(const Message* m, PickleIterator* iter, | 336 bool ParamTraits<double>::Read(const Message* m, |
| 337 base::PickleIterator* iter, |
| 327 param_type* r) { | 338 param_type* r) { |
| 328 const char *data; | 339 const char *data; |
| 329 if (!iter->ReadBytes(&data, sizeof(*r))) { | 340 if (!iter->ReadBytes(&data, sizeof(*r))) { |
| 330 NOTREACHED(); | 341 NOTREACHED(); |
| 331 return false; | 342 return false; |
| 332 } | 343 } |
| 333 memcpy(r, data, sizeof(param_type)); | 344 memcpy(r, data, sizeof(param_type)); |
| 334 return true; | 345 return true; |
| 335 } | 346 } |
| 336 | 347 |
| (...skipping 11 matching lines...) Expand all Loading... |
| 348 } | 359 } |
| 349 | 360 |
| 350 void ParamTraits<std::vector<char> >::Write(Message* m, const param_type& p) { | 361 void ParamTraits<std::vector<char> >::Write(Message* m, const param_type& p) { |
| 351 if (p.empty()) { | 362 if (p.empty()) { |
| 352 m->WriteData(NULL, 0); | 363 m->WriteData(NULL, 0); |
| 353 } else { | 364 } else { |
| 354 m->WriteData(&p.front(), static_cast<int>(p.size())); | 365 m->WriteData(&p.front(), static_cast<int>(p.size())); |
| 355 } | 366 } |
| 356 } | 367 } |
| 357 | 368 |
| 358 bool ParamTraits<std::vector<char> >::Read(const Message* m, | 369 bool ParamTraits<std::vector<char>>::Read(const Message* m, |
| 359 PickleIterator* iter, | 370 base::PickleIterator* iter, |
| 360 param_type* r) { | 371 param_type* r) { |
| 361 const char *data; | 372 const char *data; |
| 362 int data_size = 0; | 373 int data_size = 0; |
| 363 if (!iter->ReadData(&data, &data_size) || data_size < 0) | 374 if (!iter->ReadData(&data, &data_size) || data_size < 0) |
| 364 return false; | 375 return false; |
| 365 r->resize(data_size); | 376 r->resize(data_size); |
| 366 if (data_size) | 377 if (data_size) |
| 367 memcpy(&r->front(), data, data_size); | 378 memcpy(&r->front(), data, data_size); |
| 368 return true; | 379 return true; |
| 369 } | 380 } |
| 370 | 381 |
| 371 void ParamTraits<std::vector<char> >::Log(const param_type& p, std::string* l) { | 382 void ParamTraits<std::vector<char> >::Log(const param_type& p, std::string* l) { |
| 372 LogBytes(p, l); | 383 LogBytes(p, l); |
| 373 } | 384 } |
| 374 | 385 |
| 375 void ParamTraits<std::vector<unsigned char> >::Write(Message* m, | 386 void ParamTraits<std::vector<unsigned char> >::Write(Message* m, |
| 376 const param_type& p) { | 387 const param_type& p) { |
| 377 if (p.empty()) { | 388 if (p.empty()) { |
| 378 m->WriteData(NULL, 0); | 389 m->WriteData(NULL, 0); |
| 379 } else { | 390 } else { |
| 380 m->WriteData(reinterpret_cast<const char*>(&p.front()), | 391 m->WriteData(reinterpret_cast<const char*>(&p.front()), |
| 381 static_cast<int>(p.size())); | 392 static_cast<int>(p.size())); |
| 382 } | 393 } |
| 383 } | 394 } |
| 384 | 395 |
| 385 bool ParamTraits<std::vector<unsigned char> >::Read(const Message* m, | 396 bool ParamTraits<std::vector<unsigned char>>::Read(const Message* m, |
| 386 PickleIterator* iter, | 397 base::PickleIterator* iter, |
| 387 param_type* r) { | 398 param_type* r) { |
| 388 const char *data; | 399 const char *data; |
| 389 int data_size = 0; | 400 int data_size = 0; |
| 390 if (!iter->ReadData(&data, &data_size) || data_size < 0) | 401 if (!iter->ReadData(&data, &data_size) || data_size < 0) |
| 391 return false; | 402 return false; |
| 392 r->resize(data_size); | 403 r->resize(data_size); |
| 393 if (data_size) | 404 if (data_size) |
| 394 memcpy(&r->front(), data, data_size); | 405 memcpy(&r->front(), data, data_size); |
| 395 return true; | 406 return true; |
| 396 } | 407 } |
| 397 | 408 |
| 398 void ParamTraits<std::vector<unsigned char> >::Log(const param_type& p, | 409 void ParamTraits<std::vector<unsigned char> >::Log(const param_type& p, |
| 399 std::string* l) { | 410 std::string* l) { |
| 400 LogBytes(p, l); | 411 LogBytes(p, l); |
| 401 } | 412 } |
| 402 | 413 |
| 403 void ParamTraits<std::vector<bool> >::Write(Message* m, const param_type& p) { | 414 void ParamTraits<std::vector<bool> >::Write(Message* m, const param_type& p) { |
| 404 WriteParam(m, static_cast<int>(p.size())); | 415 WriteParam(m, static_cast<int>(p.size())); |
| 405 // Cast to bool below is required because libc++'s | 416 // Cast to bool below is required because libc++'s |
| 406 // vector<bool>::const_reference is different from bool, and we want to avoid | 417 // vector<bool>::const_reference is different from bool, and we want to avoid |
| 407 // writing an extra specialization of ParamTraits for it. | 418 // writing an extra specialization of ParamTraits for it. |
| 408 for (size_t i = 0; i < p.size(); i++) | 419 for (size_t i = 0; i < p.size(); i++) |
| 409 WriteParam(m, static_cast<bool>(p[i])); | 420 WriteParam(m, static_cast<bool>(p[i])); |
| 410 } | 421 } |
| 411 | 422 |
| 412 bool ParamTraits<std::vector<bool> >::Read(const Message* m, | 423 bool ParamTraits<std::vector<bool>>::Read(const Message* m, |
| 413 PickleIterator* iter, | 424 base::PickleIterator* iter, |
| 414 param_type* r) { | 425 param_type* r) { |
| 415 int size; | 426 int size; |
| 416 // ReadLength() checks for < 0 itself. | 427 // ReadLength() checks for < 0 itself. |
| 417 if (!iter->ReadLength(&size)) | 428 if (!iter->ReadLength(&size)) |
| 418 return false; | 429 return false; |
| 419 r->resize(size); | 430 r->resize(size); |
| 420 for (int i = 0; i < size; i++) { | 431 for (int i = 0; i < size; i++) { |
| 421 bool value; | 432 bool value; |
| 422 if (!ReadParam(m, iter, &value)) | 433 if (!ReadParam(m, iter, &value)) |
| 423 return false; | 434 return false; |
| 424 (*r)[i] = value; | 435 (*r)[i] = value; |
| 425 } | 436 } |
| 426 return true; | 437 return true; |
| 427 } | 438 } |
| 428 | 439 |
| 429 void ParamTraits<std::vector<bool> >::Log(const param_type& p, std::string* l) { | 440 void ParamTraits<std::vector<bool> >::Log(const param_type& p, std::string* l) { |
| 430 for (size_t i = 0; i < p.size(); ++i) { | 441 for (size_t i = 0; i < p.size(); ++i) { |
| 431 if (i != 0) | 442 if (i != 0) |
| 432 l->push_back(' '); | 443 l->push_back(' '); |
| 433 LogParam(static_cast<bool>(p[i]), l); | 444 LogParam(static_cast<bool>(p[i]), l); |
| 434 } | 445 } |
| 435 } | 446 } |
| 436 | 447 |
| 437 void ParamTraits<base::DictionaryValue>::Write(Message* m, | 448 void ParamTraits<base::DictionaryValue>::Write(Message* m, |
| 438 const param_type& p) { | 449 const param_type& p) { |
| 439 WriteValue(m, &p, 0); | 450 WriteValue(m, &p, 0); |
| 440 } | 451 } |
| 441 | 452 |
| 442 bool ParamTraits<base::DictionaryValue>::Read( | 453 bool ParamTraits<base::DictionaryValue>::Read(const Message* m, |
| 443 const Message* m, PickleIterator* iter, param_type* r) { | 454 base::PickleIterator* iter, |
| 455 param_type* r) { |
| 444 int type; | 456 int type; |
| 445 if (!ReadParam(m, iter, &type) || type != base::Value::TYPE_DICTIONARY) | 457 if (!ReadParam(m, iter, &type) || type != base::Value::TYPE_DICTIONARY) |
| 446 return false; | 458 return false; |
| 447 | 459 |
| 448 return ReadDictionaryValue(m, iter, r, 0); | 460 return ReadDictionaryValue(m, iter, r, 0); |
| 449 } | 461 } |
| 450 | 462 |
| 451 void ParamTraits<base::DictionaryValue>::Log(const param_type& p, | 463 void ParamTraits<base::DictionaryValue>::Log(const param_type& p, |
| 452 std::string* l) { | 464 std::string* l) { |
| 453 std::string json; | 465 std::string json; |
| (...skipping 13 matching lines...) Expand all Loading... |
| 467 if (!m->WriteAttachment( | 479 if (!m->WriteAttachment( |
| 468 new internal::PlatformFileAttachment(base::ScopedFD(p.fd)))) | 480 new internal::PlatformFileAttachment(base::ScopedFD(p.fd)))) |
| 469 NOTREACHED(); | 481 NOTREACHED(); |
| 470 } else { | 482 } else { |
| 471 if (!m->WriteAttachment(new internal::PlatformFileAttachment(p.fd))) | 483 if (!m->WriteAttachment(new internal::PlatformFileAttachment(p.fd))) |
| 472 NOTREACHED(); | 484 NOTREACHED(); |
| 473 } | 485 } |
| 474 } | 486 } |
| 475 | 487 |
| 476 bool ParamTraits<base::FileDescriptor>::Read(const Message* m, | 488 bool ParamTraits<base::FileDescriptor>::Read(const Message* m, |
| 477 PickleIterator* iter, | 489 base::PickleIterator* iter, |
| 478 param_type* r) { | 490 param_type* r) { |
| 479 *r = base::FileDescriptor(); | 491 *r = base::FileDescriptor(); |
| 480 | 492 |
| 481 bool valid; | 493 bool valid; |
| 482 if (!ReadParam(m, iter, &valid)) | 494 if (!ReadParam(m, iter, &valid)) |
| 483 return false; | 495 return false; |
| 484 | 496 |
| 485 // TODO(morrita): Seems like this should return false. | 497 // TODO(morrita): Seems like this should return false. |
| 486 if (!valid) | 498 if (!valid) |
| 487 return true; | 499 return true; |
| (...skipping 14 matching lines...) Expand all Loading... |
| 502 l->append(base::StringPrintf("FD(%d)", p.fd)); | 514 l->append(base::StringPrintf("FD(%d)", p.fd)); |
| 503 } | 515 } |
| 504 } | 516 } |
| 505 #endif // defined(OS_POSIX) | 517 #endif // defined(OS_POSIX) |
| 506 | 518 |
| 507 void ParamTraits<base::FilePath>::Write(Message* m, const param_type& p) { | 519 void ParamTraits<base::FilePath>::Write(Message* m, const param_type& p) { |
| 508 p.WriteToPickle(m); | 520 p.WriteToPickle(m); |
| 509 } | 521 } |
| 510 | 522 |
| 511 bool ParamTraits<base::FilePath>::Read(const Message* m, | 523 bool ParamTraits<base::FilePath>::Read(const Message* m, |
| 512 PickleIterator* iter, | 524 base::PickleIterator* iter, |
| 513 param_type* r) { | 525 param_type* r) { |
| 514 return r->ReadFromPickle(iter); | 526 return r->ReadFromPickle(iter); |
| 515 } | 527 } |
| 516 | 528 |
| 517 void ParamTraits<base::FilePath>::Log(const param_type& p, std::string* l) { | 529 void ParamTraits<base::FilePath>::Log(const param_type& p, std::string* l) { |
| 518 ParamTraits<base::FilePath::StringType>::Log(p.value(), l); | 530 ParamTraits<base::FilePath::StringType>::Log(p.value(), l); |
| 519 } | 531 } |
| 520 | 532 |
| 521 void ParamTraits<base::ListValue>::Write(Message* m, const param_type& p) { | 533 void ParamTraits<base::ListValue>::Write(Message* m, const param_type& p) { |
| 522 WriteValue(m, &p, 0); | 534 WriteValue(m, &p, 0); |
| 523 } | 535 } |
| 524 | 536 |
| 525 bool ParamTraits<base::ListValue>::Read( | 537 bool ParamTraits<base::ListValue>::Read(const Message* m, |
| 526 const Message* m, PickleIterator* iter, param_type* r) { | 538 base::PickleIterator* iter, |
| 539 param_type* r) { |
| 527 int type; | 540 int type; |
| 528 if (!ReadParam(m, iter, &type) || type != base::Value::TYPE_LIST) | 541 if (!ReadParam(m, iter, &type) || type != base::Value::TYPE_LIST) |
| 529 return false; | 542 return false; |
| 530 | 543 |
| 531 return ReadListValue(m, iter, r, 0); | 544 return ReadListValue(m, iter, r, 0); |
| 532 } | 545 } |
| 533 | 546 |
| 534 void ParamTraits<base::ListValue>::Log(const param_type& p, std::string* l) { | 547 void ParamTraits<base::ListValue>::Log(const param_type& p, std::string* l) { |
| 535 std::string json; | 548 std::string json; |
| 536 base::JSONWriter::Write(p, &json); | 549 base::JSONWriter::Write(p, &json); |
| 537 l->append(json); | 550 l->append(json); |
| 538 } | 551 } |
| 539 | 552 |
| 540 void ParamTraits<base::NullableString16>::Write(Message* m, | 553 void ParamTraits<base::NullableString16>::Write(Message* m, |
| 541 const param_type& p) { | 554 const param_type& p) { |
| 542 WriteParam(m, p.string()); | 555 WriteParam(m, p.string()); |
| 543 WriteParam(m, p.is_null()); | 556 WriteParam(m, p.is_null()); |
| 544 } | 557 } |
| 545 | 558 |
| 546 bool ParamTraits<base::NullableString16>::Read(const Message* m, | 559 bool ParamTraits<base::NullableString16>::Read(const Message* m, |
| 547 PickleIterator* iter, | 560 base::PickleIterator* iter, |
| 548 param_type* r) { | 561 param_type* r) { |
| 549 base::string16 string; | 562 base::string16 string; |
| 550 if (!ReadParam(m, iter, &string)) | 563 if (!ReadParam(m, iter, &string)) |
| 551 return false; | 564 return false; |
| 552 bool is_null; | 565 bool is_null; |
| 553 if (!ReadParam(m, iter, &is_null)) | 566 if (!ReadParam(m, iter, &is_null)) |
| 554 return false; | 567 return false; |
| 555 *r = base::NullableString16(string, is_null); | 568 *r = base::NullableString16(string, is_null); |
| 556 return true; | 569 return true; |
| 557 } | 570 } |
| (...skipping 10 matching lines...) Expand all Loading... |
| 568 void ParamTraits<base::File::Info>::Write(Message* m, | 581 void ParamTraits<base::File::Info>::Write(Message* m, |
| 569 const param_type& p) { | 582 const param_type& p) { |
| 570 WriteParam(m, p.size); | 583 WriteParam(m, p.size); |
| 571 WriteParam(m, p.is_directory); | 584 WriteParam(m, p.is_directory); |
| 572 WriteParam(m, p.last_modified.ToDoubleT()); | 585 WriteParam(m, p.last_modified.ToDoubleT()); |
| 573 WriteParam(m, p.last_accessed.ToDoubleT()); | 586 WriteParam(m, p.last_accessed.ToDoubleT()); |
| 574 WriteParam(m, p.creation_time.ToDoubleT()); | 587 WriteParam(m, p.creation_time.ToDoubleT()); |
| 575 } | 588 } |
| 576 | 589 |
| 577 bool ParamTraits<base::File::Info>::Read(const Message* m, | 590 bool ParamTraits<base::File::Info>::Read(const Message* m, |
| 578 PickleIterator* iter, | 591 base::PickleIterator* iter, |
| 579 param_type* p) { | 592 param_type* p) { |
| 580 double last_modified, last_accessed, creation_time; | 593 double last_modified, last_accessed, creation_time; |
| 581 if (!ReadParam(m, iter, &p->size) || | 594 if (!ReadParam(m, iter, &p->size) || |
| 582 !ReadParam(m, iter, &p->is_directory) || | 595 !ReadParam(m, iter, &p->is_directory) || |
| 583 !ReadParam(m, iter, &last_modified) || | 596 !ReadParam(m, iter, &last_modified) || |
| 584 !ReadParam(m, iter, &last_accessed) || | 597 !ReadParam(m, iter, &last_accessed) || |
| 585 !ReadParam(m, iter, &creation_time)) | 598 !ReadParam(m, iter, &creation_time)) |
| 586 return false; | 599 return false; |
| 587 p->last_modified = base::Time::FromDoubleT(last_modified); | 600 p->last_modified = base::Time::FromDoubleT(last_modified); |
| 588 p->last_accessed = base::Time::FromDoubleT(last_accessed); | 601 p->last_accessed = base::Time::FromDoubleT(last_accessed); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 602 LogParam(p.last_accessed.ToDoubleT(), l); | 615 LogParam(p.last_accessed.ToDoubleT(), l); |
| 603 l->append(","); | 616 l->append(","); |
| 604 LogParam(p.creation_time.ToDoubleT(), l); | 617 LogParam(p.creation_time.ToDoubleT(), l); |
| 605 l->append(")"); | 618 l->append(")"); |
| 606 } | 619 } |
| 607 | 620 |
| 608 void ParamTraits<base::Time>::Write(Message* m, const param_type& p) { | 621 void ParamTraits<base::Time>::Write(Message* m, const param_type& p) { |
| 609 ParamTraits<int64>::Write(m, p.ToInternalValue()); | 622 ParamTraits<int64>::Write(m, p.ToInternalValue()); |
| 610 } | 623 } |
| 611 | 624 |
| 612 bool ParamTraits<base::Time>::Read(const Message* m, PickleIterator* iter, | 625 bool ParamTraits<base::Time>::Read(const Message* m, |
| 626 base::PickleIterator* iter, |
| 613 param_type* r) { | 627 param_type* r) { |
| 614 int64 value; | 628 int64 value; |
| 615 if (!ParamTraits<int64>::Read(m, iter, &value)) | 629 if (!ParamTraits<int64>::Read(m, iter, &value)) |
| 616 return false; | 630 return false; |
| 617 *r = base::Time::FromInternalValue(value); | 631 *r = base::Time::FromInternalValue(value); |
| 618 return true; | 632 return true; |
| 619 } | 633 } |
| 620 | 634 |
| 621 void ParamTraits<base::Time>::Log(const param_type& p, std::string* l) { | 635 void ParamTraits<base::Time>::Log(const param_type& p, std::string* l) { |
| 622 ParamTraits<int64>::Log(p.ToInternalValue(), l); | 636 ParamTraits<int64>::Log(p.ToInternalValue(), l); |
| 623 } | 637 } |
| 624 | 638 |
| 625 void ParamTraits<base::TimeDelta>::Write(Message* m, const param_type& p) { | 639 void ParamTraits<base::TimeDelta>::Write(Message* m, const param_type& p) { |
| 626 ParamTraits<int64>::Write(m, p.ToInternalValue()); | 640 ParamTraits<int64>::Write(m, p.ToInternalValue()); |
| 627 } | 641 } |
| 628 | 642 |
| 629 bool ParamTraits<base::TimeDelta>::Read(const Message* m, | 643 bool ParamTraits<base::TimeDelta>::Read(const Message* m, |
| 630 PickleIterator* iter, | 644 base::PickleIterator* iter, |
| 631 param_type* r) { | 645 param_type* r) { |
| 632 int64 value; | 646 int64 value; |
| 633 bool ret = ParamTraits<int64>::Read(m, iter, &value); | 647 bool ret = ParamTraits<int64>::Read(m, iter, &value); |
| 634 if (ret) | 648 if (ret) |
| 635 *r = base::TimeDelta::FromInternalValue(value); | 649 *r = base::TimeDelta::FromInternalValue(value); |
| 636 | 650 |
| 637 return ret; | 651 return ret; |
| 638 } | 652 } |
| 639 | 653 |
| 640 void ParamTraits<base::TimeDelta>::Log(const param_type& p, std::string* l) { | 654 void ParamTraits<base::TimeDelta>::Log(const param_type& p, std::string* l) { |
| 641 ParamTraits<int64>::Log(p.ToInternalValue(), l); | 655 ParamTraits<int64>::Log(p.ToInternalValue(), l); |
| 642 } | 656 } |
| 643 | 657 |
| 644 void ParamTraits<base::TimeTicks>::Write(Message* m, const param_type& p) { | 658 void ParamTraits<base::TimeTicks>::Write(Message* m, const param_type& p) { |
| 645 ParamTraits<int64>::Write(m, p.ToInternalValue()); | 659 ParamTraits<int64>::Write(m, p.ToInternalValue()); |
| 646 } | 660 } |
| 647 | 661 |
| 648 bool ParamTraits<base::TimeTicks>::Read(const Message* m, | 662 bool ParamTraits<base::TimeTicks>::Read(const Message* m, |
| 649 PickleIterator* iter, | 663 base::PickleIterator* iter, |
| 650 param_type* r) { | 664 param_type* r) { |
| 651 int64 value; | 665 int64 value; |
| 652 bool ret = ParamTraits<int64>::Read(m, iter, &value); | 666 bool ret = ParamTraits<int64>::Read(m, iter, &value); |
| 653 if (ret) | 667 if (ret) |
| 654 *r = base::TimeTicks::FromInternalValue(value); | 668 *r = base::TimeTicks::FromInternalValue(value); |
| 655 | 669 |
| 656 return ret; | 670 return ret; |
| 657 } | 671 } |
| 658 | 672 |
| 659 void ParamTraits<base::TimeTicks>::Log(const param_type& p, std::string* l) { | 673 void ParamTraits<base::TimeTicks>::Log(const param_type& p, std::string* l) { |
| 660 ParamTraits<int64>::Log(p.ToInternalValue(), l); | 674 ParamTraits<int64>::Log(p.ToInternalValue(), l); |
| 661 } | 675 } |
| 662 | 676 |
| 663 void ParamTraits<base::TraceTicks>::Write(Message* m, const param_type& p) { | 677 void ParamTraits<base::TraceTicks>::Write(Message* m, const param_type& p) { |
| 664 ParamTraits<int64>::Write(m, p.ToInternalValue()); | 678 ParamTraits<int64>::Write(m, p.ToInternalValue()); |
| 665 } | 679 } |
| 666 | 680 |
| 667 bool ParamTraits<base::TraceTicks>::Read(const Message* m, | 681 bool ParamTraits<base::TraceTicks>::Read(const Message* m, |
| 668 PickleIterator* iter, | 682 base::PickleIterator* iter, |
| 669 param_type* r) { | 683 param_type* r) { |
| 670 int64 value; | 684 int64 value; |
| 671 bool ret = ParamTraits<int64>::Read(m, iter, &value); | 685 bool ret = ParamTraits<int64>::Read(m, iter, &value); |
| 672 if (ret) | 686 if (ret) |
| 673 *r = base::TraceTicks::FromInternalValue(value); | 687 *r = base::TraceTicks::FromInternalValue(value); |
| 674 | 688 |
| 675 return ret; | 689 return ret; |
| 676 } | 690 } |
| 677 | 691 |
| 678 void ParamTraits<base::TraceTicks>::Log(const param_type& p, std::string* l) { | 692 void ParamTraits<base::TraceTicks>::Log(const param_type& p, std::string* l) { |
| 679 ParamTraits<int64>::Log(p.ToInternalValue(), l); | 693 ParamTraits<int64>::Log(p.ToInternalValue(), l); |
| 680 } | 694 } |
| 681 | 695 |
| 682 void ParamTraits<IPC::ChannelHandle>::Write(Message* m, const param_type& p) { | 696 void ParamTraits<IPC::ChannelHandle>::Write(Message* m, const param_type& p) { |
| 683 #if defined(OS_WIN) | 697 #if defined(OS_WIN) |
| 684 // On Windows marshalling pipe handle is not supported. | 698 // On Windows marshalling pipe handle is not supported. |
| 685 DCHECK(p.pipe.handle == NULL); | 699 DCHECK(p.pipe.handle == NULL); |
| 686 #endif // defined (OS_WIN) | 700 #endif // defined (OS_WIN) |
| 687 WriteParam(m, p.name); | 701 WriteParam(m, p.name); |
| 688 #if defined(OS_POSIX) | 702 #if defined(OS_POSIX) |
| 689 WriteParam(m, p.socket); | 703 WriteParam(m, p.socket); |
| 690 #endif | 704 #endif |
| 691 } | 705 } |
| 692 | 706 |
| 693 bool ParamTraits<IPC::ChannelHandle>::Read(const Message* m, | 707 bool ParamTraits<IPC::ChannelHandle>::Read(const Message* m, |
| 694 PickleIterator* iter, | 708 base::PickleIterator* iter, |
| 695 param_type* r) { | 709 param_type* r) { |
| 696 return ReadParam(m, iter, &r->name) | 710 return ReadParam(m, iter, &r->name) |
| 697 #if defined(OS_POSIX) | 711 #if defined(OS_POSIX) |
| 698 && ReadParam(m, iter, &r->socket) | 712 && ReadParam(m, iter, &r->socket) |
| 699 #endif | 713 #endif |
| 700 ; | 714 ; |
| 701 } | 715 } |
| 702 | 716 |
| 703 void ParamTraits<IPC::ChannelHandle>::Log(const param_type& p, | 717 void ParamTraits<IPC::ChannelHandle>::Log(const param_type& p, |
| 704 std::string* l) { | 718 std::string* l) { |
| (...skipping 11 matching lines...) Expand all Loading... |
| 716 WriteParam(m, p.type); | 730 WriteParam(m, p.type); |
| 717 WriteParam(m, p.flags); | 731 WriteParam(m, p.flags); |
| 718 WriteParam(m, p.sent); | 732 WriteParam(m, p.sent); |
| 719 WriteParam(m, p.receive); | 733 WriteParam(m, p.receive); |
| 720 WriteParam(m, p.dispatch); | 734 WriteParam(m, p.dispatch); |
| 721 WriteParam(m, p.message_name); | 735 WriteParam(m, p.message_name); |
| 722 WriteParam(m, p.params); | 736 WriteParam(m, p.params); |
| 723 } | 737 } |
| 724 | 738 |
| 725 bool ParamTraits<LogData>::Read(const Message* m, | 739 bool ParamTraits<LogData>::Read(const Message* m, |
| 726 PickleIterator* iter, | 740 base::PickleIterator* iter, |
| 727 param_type* r) { | 741 param_type* r) { |
| 728 return | 742 return |
| 729 ReadParam(m, iter, &r->channel) && | 743 ReadParam(m, iter, &r->channel) && |
| 730 ReadParam(m, iter, &r->routing_id) && | 744 ReadParam(m, iter, &r->routing_id) && |
| 731 ReadParam(m, iter, &r->type) && | 745 ReadParam(m, iter, &r->type) && |
| 732 ReadParam(m, iter, &r->flags) && | 746 ReadParam(m, iter, &r->flags) && |
| 733 ReadParam(m, iter, &r->sent) && | 747 ReadParam(m, iter, &r->sent) && |
| 734 ReadParam(m, iter, &r->receive) && | 748 ReadParam(m, iter, &r->receive) && |
| 735 ReadParam(m, iter, &r->dispatch) && | 749 ReadParam(m, iter, &r->dispatch) && |
| 736 ReadParam(m, iter, &r->message_name) && | 750 ReadParam(m, iter, &r->message_name) && |
| (...skipping 20 matching lines...) Expand all Loading... |
| 757 // Be careful also to use only explicitly-sized types. The NaCl environment | 771 // Be careful also to use only explicitly-sized types. The NaCl environment |
| 758 // could be 64-bit and the host browser could be 32-bits. The nested message | 772 // could be 64-bit and the host browser could be 32-bits. The nested message |
| 759 // may or may not be safe to send between 32-bit and 64-bit systems, but we | 773 // may or may not be safe to send between 32-bit and 64-bit systems, but we |
| 760 // leave that up to the code sending the message to ensure. | 774 // leave that up to the code sending the message to ensure. |
| 761 m->WriteUInt32(static_cast<uint32>(p.routing_id())); | 775 m->WriteUInt32(static_cast<uint32>(p.routing_id())); |
| 762 m->WriteUInt32(p.type()); | 776 m->WriteUInt32(p.type()); |
| 763 m->WriteUInt32(p.flags()); | 777 m->WriteUInt32(p.flags()); |
| 764 m->WriteData(p.payload(), static_cast<uint32>(p.payload_size())); | 778 m->WriteData(p.payload(), static_cast<uint32>(p.payload_size())); |
| 765 } | 779 } |
| 766 | 780 |
| 767 bool ParamTraits<Message>::Read(const Message* m, PickleIterator* iter, | 781 bool ParamTraits<Message>::Read(const Message* m, |
| 782 base::PickleIterator* iter, |
| 768 Message* r) { | 783 Message* r) { |
| 769 uint32 routing_id, type, flags; | 784 uint32 routing_id, type, flags; |
| 770 if (!iter->ReadUInt32(&routing_id) || | 785 if (!iter->ReadUInt32(&routing_id) || |
| 771 !iter->ReadUInt32(&type) || | 786 !iter->ReadUInt32(&type) || |
| 772 !iter->ReadUInt32(&flags)) | 787 !iter->ReadUInt32(&flags)) |
| 773 return false; | 788 return false; |
| 774 | 789 |
| 775 int payload_size; | 790 int payload_size; |
| 776 const char* payload; | 791 const char* payload; |
| 777 if (!iter->ReadData(&payload, &payload_size)) | 792 if (!iter->ReadData(&payload, &payload_size)) |
| 778 return false; | 793 return false; |
| 779 | 794 |
| 780 r->SetHeaderValues(static_cast<int32>(routing_id), type, flags); | 795 r->SetHeaderValues(static_cast<int32>(routing_id), type, flags); |
| 781 return r->WriteBytes(payload, payload_size); | 796 return r->WriteBytes(payload, payload_size); |
| 782 } | 797 } |
| 783 | 798 |
| 784 void ParamTraits<Message>::Log(const Message& p, std::string* l) { | 799 void ParamTraits<Message>::Log(const Message& p, std::string* l) { |
| 785 l->append("<IPC::Message>"); | 800 l->append("<IPC::Message>"); |
| 786 } | 801 } |
| 787 | 802 |
| 788 #if defined(OS_WIN) | 803 #if defined(OS_WIN) |
| 789 // Note that HWNDs/HANDLE/HCURSOR/HACCEL etc are always 32 bits, even on 64 | 804 // Note that HWNDs/HANDLE/HCURSOR/HACCEL etc are always 32 bits, even on 64 |
| 790 // bit systems. That's why we use the Windows macros to convert to 32 bits. | 805 // bit systems. That's why we use the Windows macros to convert to 32 bits. |
| 791 void ParamTraits<HANDLE>::Write(Message* m, const param_type& p) { | 806 void ParamTraits<HANDLE>::Write(Message* m, const param_type& p) { |
| 792 m->WriteInt(HandleToLong(p)); | 807 m->WriteInt(HandleToLong(p)); |
| 793 } | 808 } |
| 794 | 809 |
| 795 bool ParamTraits<HANDLE>::Read(const Message* m, PickleIterator* iter, | 810 bool ParamTraits<HANDLE>::Read(const Message* m, |
| 811 base::PickleIterator* iter, |
| 796 param_type* r) { | 812 param_type* r) { |
| 797 int32 temp; | 813 int32 temp; |
| 798 if (!iter->ReadInt(&temp)) | 814 if (!iter->ReadInt(&temp)) |
| 799 return false; | 815 return false; |
| 800 *r = LongToHandle(temp); | 816 *r = LongToHandle(temp); |
| 801 return true; | 817 return true; |
| 802 } | 818 } |
| 803 | 819 |
| 804 void ParamTraits<HANDLE>::Log(const param_type& p, std::string* l) { | 820 void ParamTraits<HANDLE>::Log(const param_type& p, std::string* l) { |
| 805 l->append(base::StringPrintf("0x%X", p)); | 821 l->append(base::StringPrintf("0x%X", p)); |
| 806 } | 822 } |
| 807 | 823 |
| 808 void ParamTraits<LOGFONT>::Write(Message* m, const param_type& p) { | 824 void ParamTraits<LOGFONT>::Write(Message* m, const param_type& p) { |
| 809 m->WriteData(reinterpret_cast<const char*>(&p), sizeof(LOGFONT)); | 825 m->WriteData(reinterpret_cast<const char*>(&p), sizeof(LOGFONT)); |
| 810 } | 826 } |
| 811 | 827 |
| 812 bool ParamTraits<LOGFONT>::Read(const Message* m, PickleIterator* iter, | 828 bool ParamTraits<LOGFONT>::Read(const Message* m, |
| 829 base::PickleIterator* iter, |
| 813 param_type* r) { | 830 param_type* r) { |
| 814 const char *data; | 831 const char *data; |
| 815 int data_size = 0; | 832 int data_size = 0; |
| 816 if (iter->ReadData(&data, &data_size) && data_size == sizeof(LOGFONT)) { | 833 if (iter->ReadData(&data, &data_size) && data_size == sizeof(LOGFONT)) { |
| 817 const LOGFONT *font = reinterpret_cast<LOGFONT*>(const_cast<char*>(data)); | 834 const LOGFONT *font = reinterpret_cast<LOGFONT*>(const_cast<char*>(data)); |
| 818 if (_tcsnlen(font->lfFaceName, LF_FACESIZE) < LF_FACESIZE) { | 835 if (_tcsnlen(font->lfFaceName, LF_FACESIZE) < LF_FACESIZE) { |
| 819 memcpy(r, data, sizeof(LOGFONT)); | 836 memcpy(r, data, sizeof(LOGFONT)); |
| 820 return true; | 837 return true; |
| 821 } | 838 } |
| 822 } | 839 } |
| 823 | 840 |
| 824 NOTREACHED(); | 841 NOTREACHED(); |
| 825 return false; | 842 return false; |
| 826 } | 843 } |
| 827 | 844 |
| 828 void ParamTraits<LOGFONT>::Log(const param_type& p, std::string* l) { | 845 void ParamTraits<LOGFONT>::Log(const param_type& p, std::string* l) { |
| 829 l->append(base::StringPrintf("<LOGFONT>")); | 846 l->append(base::StringPrintf("<LOGFONT>")); |
| 830 } | 847 } |
| 831 | 848 |
| 832 void ParamTraits<MSG>::Write(Message* m, const param_type& p) { | 849 void ParamTraits<MSG>::Write(Message* m, const param_type& p) { |
| 833 m->WriteData(reinterpret_cast<const char*>(&p), sizeof(MSG)); | 850 m->WriteData(reinterpret_cast<const char*>(&p), sizeof(MSG)); |
| 834 } | 851 } |
| 835 | 852 |
| 836 bool ParamTraits<MSG>::Read(const Message* m, PickleIterator* iter, | 853 bool ParamTraits<MSG>::Read(const Message* m, |
| 854 base::PickleIterator* iter, |
| 837 param_type* r) { | 855 param_type* r) { |
| 838 const char *data; | 856 const char *data; |
| 839 int data_size = 0; | 857 int data_size = 0; |
| 840 bool result = iter->ReadData(&data, &data_size); | 858 bool result = iter->ReadData(&data, &data_size); |
| 841 if (result && data_size == sizeof(MSG)) { | 859 if (result && data_size == sizeof(MSG)) { |
| 842 memcpy(r, data, sizeof(MSG)); | 860 memcpy(r, data, sizeof(MSG)); |
| 843 } else { | 861 } else { |
| 844 result = false; | 862 result = false; |
| 845 NOTREACHED(); | 863 NOTREACHED(); |
| 846 } | 864 } |
| 847 | 865 |
| 848 return result; | 866 return result; |
| 849 } | 867 } |
| 850 | 868 |
| 851 void ParamTraits<MSG>::Log(const param_type& p, std::string* l) { | 869 void ParamTraits<MSG>::Log(const param_type& p, std::string* l) { |
| 852 l->append("<MSG>"); | 870 l->append("<MSG>"); |
| 853 } | 871 } |
| 854 | 872 |
| 855 #endif // OS_WIN | 873 #endif // OS_WIN |
| 856 | 874 |
| 857 } // namespace IPC | 875 } // namespace IPC |
| OLD | NEW |