| 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 190 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 201 case base::Value::TYPE_STRING: { | 201 case base::Value::TYPE_STRING: { |
| 202 std::string val; | 202 std::string val; |
| 203 if (!ReadParam(m, iter, &val)) | 203 if (!ReadParam(m, iter, &val)) |
| 204 return false; | 204 return false; |
| 205 *value = new base::StringValue(val); | 205 *value = new base::StringValue(val); |
| 206 break; | 206 break; |
| 207 } | 207 } |
| 208 case base::Value::TYPE_BINARY: { | 208 case base::Value::TYPE_BINARY: { |
| 209 const char* data; | 209 const char* data; |
| 210 int length; | 210 int length; |
| 211 if (!iter->ReadData(&data, &length)) | 211 if (!m->ReadData(iter, &data, &length)) |
| 212 return false; | 212 return false; |
| 213 *value = base::BinaryValue::CreateWithCopiedBuffer(data, length); | 213 *value = base::BinaryValue::CreateWithCopiedBuffer(data, length); |
| 214 break; | 214 break; |
| 215 } | 215 } |
| 216 case base::Value::TYPE_DICTIONARY: { | 216 case base::Value::TYPE_DICTIONARY: { |
| 217 scoped_ptr<base::DictionaryValue> val(new base::DictionaryValue()); | 217 scoped_ptr<base::DictionaryValue> val(new base::DictionaryValue()); |
| 218 if (!ReadDictionaryValue(m, iter, val.get(), recursion)) | 218 if (!ReadDictionaryValue(m, iter, val.get(), recursion)) |
| 219 return false; | 219 return false; |
| 220 *value = val.release(); | 220 *value = val.release(); |
| 221 break; | 221 break; |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 253 l->append(p ? "true" : "false"); | 253 l->append(p ? "true" : "false"); |
| 254 } | 254 } |
| 255 | 255 |
| 256 void ParamTraits<unsigned char>::Write(Message* m, const param_type& p) { | 256 void ParamTraits<unsigned char>::Write(Message* m, const param_type& p) { |
| 257 m->WriteBytes(&p, sizeof(param_type)); | 257 m->WriteBytes(&p, sizeof(param_type)); |
| 258 } | 258 } |
| 259 | 259 |
| 260 bool ParamTraits<unsigned char>::Read(const Message* m, PickleIterator* iter, | 260 bool ParamTraits<unsigned char>::Read(const Message* m, PickleIterator* iter, |
| 261 param_type* r) { | 261 param_type* r) { |
| 262 const char* data; | 262 const char* data; |
| 263 if (!iter->ReadBytes(&data, sizeof(param_type))) | 263 if (!m->ReadBytes(iter, &data, sizeof(param_type))) |
| 264 return false; | 264 return false; |
| 265 memcpy(r, data, sizeof(param_type)); | 265 memcpy(r, data, sizeof(param_type)); |
| 266 return true; | 266 return true; |
| 267 } | 267 } |
| 268 | 268 |
| 269 void ParamTraits<unsigned char>::Log(const param_type& p, std::string* l) { | 269 void ParamTraits<unsigned char>::Log(const param_type& p, std::string* l) { |
| 270 l->append(base::UintToString(p)); | 270 l->append(base::UintToString(p)); |
| 271 } | 271 } |
| 272 | 272 |
| 273 void ParamTraits<unsigned short>::Write(Message* m, const param_type& p) { | 273 void ParamTraits<unsigned short>::Write(Message* m, const param_type& p) { |
| 274 m->WriteBytes(&p, sizeof(param_type)); | 274 m->WriteBytes(&p, sizeof(param_type)); |
| 275 } | 275 } |
| 276 | 276 |
| 277 bool ParamTraits<unsigned short>::Read(const Message* m, PickleIterator* iter, | 277 bool ParamTraits<unsigned short>::Read(const Message* m, PickleIterator* iter, |
| 278 param_type* r) { | 278 param_type* r) { |
| 279 const char* data; | 279 const char* data; |
| 280 if (!iter->ReadBytes(&data, sizeof(param_type))) | 280 if (!m->ReadBytes(iter, &data, sizeof(param_type))) |
| 281 return false; | 281 return false; |
| 282 memcpy(r, data, sizeof(param_type)); | 282 memcpy(r, data, sizeof(param_type)); |
| 283 return true; | 283 return true; |
| 284 } | 284 } |
| 285 | 285 |
| 286 void ParamTraits<unsigned short>::Log(const param_type& p, std::string* l) { | 286 void ParamTraits<unsigned short>::Log(const param_type& p, std::string* l) { |
| 287 l->append(base::UintToString(p)); | 287 l->append(base::UintToString(p)); |
| 288 } | 288 } |
| 289 | 289 |
| 290 void ParamTraits<int>::Log(const param_type& p, std::string* l) { | 290 void ParamTraits<int>::Log(const param_type& p, std::string* l) { |
| (...skipping 24 matching lines...) Expand all Loading... |
| 315 l->append(base::StringPrintf("%e", p)); | 315 l->append(base::StringPrintf("%e", p)); |
| 316 } | 316 } |
| 317 | 317 |
| 318 void ParamTraits<double>::Write(Message* m, const param_type& p) { | 318 void ParamTraits<double>::Write(Message* m, const param_type& p) { |
| 319 m->WriteBytes(reinterpret_cast<const char*>(&p), sizeof(param_type)); | 319 m->WriteBytes(reinterpret_cast<const char*>(&p), sizeof(param_type)); |
| 320 } | 320 } |
| 321 | 321 |
| 322 bool ParamTraits<double>::Read(const Message* m, PickleIterator* iter, | 322 bool ParamTraits<double>::Read(const Message* m, PickleIterator* iter, |
| 323 param_type* r) { | 323 param_type* r) { |
| 324 const char *data; | 324 const char *data; |
| 325 if (!iter->ReadBytes(&data, sizeof(*r))) { | 325 if (!m->ReadBytes(iter, &data, sizeof(*r))) { |
| 326 NOTREACHED(); | 326 NOTREACHED(); |
| 327 return false; | 327 return false; |
| 328 } | 328 } |
| 329 memcpy(r, data, sizeof(param_type)); | 329 memcpy(r, data, sizeof(param_type)); |
| 330 return true; | 330 return true; |
| 331 } | 331 } |
| 332 | 332 |
| 333 void ParamTraits<double>::Log(const param_type& p, std::string* l) { | 333 void ParamTraits<double>::Log(const param_type& p, std::string* l) { |
| 334 l->append(base::StringPrintf("%e", p)); | 334 l->append(base::StringPrintf("%e", p)); |
| 335 } | 335 } |
| (...skipping 19 matching lines...) Expand all Loading... |
| 355 } else { | 355 } else { |
| 356 m->WriteData(&p.front(), static_cast<int>(p.size())); | 356 m->WriteData(&p.front(), static_cast<int>(p.size())); |
| 357 } | 357 } |
| 358 } | 358 } |
| 359 | 359 |
| 360 bool ParamTraits<std::vector<char> >::Read(const Message* m, | 360 bool ParamTraits<std::vector<char> >::Read(const Message* m, |
| 361 PickleIterator* iter, | 361 PickleIterator* iter, |
| 362 param_type* r) { | 362 param_type* r) { |
| 363 const char *data; | 363 const char *data; |
| 364 int data_size = 0; | 364 int data_size = 0; |
| 365 if (!iter->ReadData(&data, &data_size) || data_size < 0) | 365 if (!m->ReadData(iter, &data, &data_size) || data_size < 0) |
| 366 return false; | 366 return false; |
| 367 r->resize(data_size); | 367 r->resize(data_size); |
| 368 if (data_size) | 368 if (data_size) |
| 369 memcpy(&r->front(), data, data_size); | 369 memcpy(&r->front(), data, data_size); |
| 370 return true; | 370 return true; |
| 371 } | 371 } |
| 372 | 372 |
| 373 void ParamTraits<std::vector<char> >::Log(const param_type& p, std::string* l) { | 373 void ParamTraits<std::vector<char> >::Log(const param_type& p, std::string* l) { |
| 374 LogBytes(p, l); | 374 LogBytes(p, l); |
| 375 } | 375 } |
| 376 | 376 |
| 377 void ParamTraits<std::vector<unsigned char> >::Write(Message* m, | 377 void ParamTraits<std::vector<unsigned char> >::Write(Message* m, |
| 378 const param_type& p) { | 378 const param_type& p) { |
| 379 if (p.empty()) { | 379 if (p.empty()) { |
| 380 m->WriteData(NULL, 0); | 380 m->WriteData(NULL, 0); |
| 381 } else { | 381 } else { |
| 382 m->WriteData(reinterpret_cast<const char*>(&p.front()), | 382 m->WriteData(reinterpret_cast<const char*>(&p.front()), |
| 383 static_cast<int>(p.size())); | 383 static_cast<int>(p.size())); |
| 384 } | 384 } |
| 385 } | 385 } |
| 386 | 386 |
| 387 bool ParamTraits<std::vector<unsigned char> >::Read(const Message* m, | 387 bool ParamTraits<std::vector<unsigned char> >::Read(const Message* m, |
| 388 PickleIterator* iter, | 388 PickleIterator* iter, |
| 389 param_type* r) { | 389 param_type* r) { |
| 390 const char *data; | 390 const char *data; |
| 391 int data_size = 0; | 391 int data_size = 0; |
| 392 if (!iter->ReadData(&data, &data_size) || data_size < 0) | 392 if (!m->ReadData(iter, &data, &data_size) || data_size < 0) |
| 393 return false; | 393 return false; |
| 394 r->resize(data_size); | 394 r->resize(data_size); |
| 395 if (data_size) | 395 if (data_size) |
| 396 memcpy(&r->front(), data, data_size); | 396 memcpy(&r->front(), data, data_size); |
| 397 return true; | 397 return true; |
| 398 } | 398 } |
| 399 | 399 |
| 400 void ParamTraits<std::vector<unsigned char> >::Log(const param_type& p, | 400 void ParamTraits<std::vector<unsigned char> >::Log(const param_type& p, |
| 401 std::string* l) { | 401 std::string* l) { |
| 402 LogBytes(p, l); | 402 LogBytes(p, l); |
| 403 } | 403 } |
| 404 | 404 |
| 405 void ParamTraits<std::vector<bool> >::Write(Message* m, const param_type& p) { | 405 void ParamTraits<std::vector<bool> >::Write(Message* m, const param_type& p) { |
| 406 WriteParam(m, static_cast<int>(p.size())); | 406 WriteParam(m, static_cast<int>(p.size())); |
| 407 // Cast to bool below is required because libc++'s | 407 // Cast to bool below is required because libc++'s |
| 408 // vector<bool>::const_reference is different from bool, and we want to avoid | 408 // vector<bool>::const_reference is different from bool, and we want to avoid |
| 409 // writing an extra specialization of ParamTraits for it. | 409 // writing an extra specialization of ParamTraits for it. |
| 410 for (size_t i = 0; i < p.size(); i++) | 410 for (size_t i = 0; i < p.size(); i++) |
| 411 WriteParam(m, static_cast<bool>(p[i])); | 411 WriteParam(m, static_cast<bool>(p[i])); |
| 412 } | 412 } |
| 413 | 413 |
| 414 bool ParamTraits<std::vector<bool> >::Read(const Message* m, | 414 bool ParamTraits<std::vector<bool> >::Read(const Message* m, |
| 415 PickleIterator* iter, | 415 PickleIterator* iter, |
| 416 param_type* r) { | 416 param_type* r) { |
| 417 int size; | 417 int size; |
| 418 // ReadLength() checks for < 0 itself. | 418 // ReadLength() checks for < 0 itself. |
| 419 if (!iter->ReadLength(&size)) | 419 if (!m->ReadLength(iter, &size)) |
| 420 return false; | 420 return false; |
| 421 r->resize(size); | 421 r->resize(size); |
| 422 for (int i = 0; i < size; i++) { | 422 for (int i = 0; i < size; i++) { |
| 423 bool value; | 423 bool value; |
| 424 if (!ReadParam(m, iter, &value)) | 424 if (!ReadParam(m, iter, &value)) |
| 425 return false; | 425 return false; |
| 426 (*r)[i] = value; | 426 (*r)[i] = value; |
| 427 } | 427 } |
| 428 return true; | 428 return true; |
| 429 } | 429 } |
| (...skipping 312 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 742 // leave that up to the code sending the message to ensure. | 742 // leave that up to the code sending the message to ensure. |
| 743 m->WriteUInt32(static_cast<uint32>(p.routing_id())); | 743 m->WriteUInt32(static_cast<uint32>(p.routing_id())); |
| 744 m->WriteUInt32(p.type()); | 744 m->WriteUInt32(p.type()); |
| 745 m->WriteUInt32(p.flags()); | 745 m->WriteUInt32(p.flags()); |
| 746 m->WriteData(p.payload(), static_cast<uint32>(p.payload_size())); | 746 m->WriteData(p.payload(), static_cast<uint32>(p.payload_size())); |
| 747 } | 747 } |
| 748 | 748 |
| 749 bool ParamTraits<Message>::Read(const Message* m, PickleIterator* iter, | 749 bool ParamTraits<Message>::Read(const Message* m, PickleIterator* iter, |
| 750 Message* r) { | 750 Message* r) { |
| 751 uint32 routing_id, type, flags; | 751 uint32 routing_id, type, flags; |
| 752 if (!iter->ReadUInt32(&routing_id) || | 752 if (!m->ReadUInt32(iter, &routing_id) || |
| 753 !iter->ReadUInt32(&type) || | 753 !m->ReadUInt32(iter, &type) || |
| 754 !iter->ReadUInt32(&flags)) | 754 !m->ReadUInt32(iter, &flags)) |
| 755 return false; | 755 return false; |
| 756 | 756 |
| 757 int payload_size; | 757 int payload_size; |
| 758 const char* payload; | 758 const char* payload; |
| 759 if (!iter->ReadData(&payload, &payload_size)) | 759 if (!m->ReadData(iter, &payload, &payload_size)) |
| 760 return false; | 760 return false; |
| 761 | 761 |
| 762 r->SetHeaderValues(static_cast<int32>(routing_id), type, flags); | 762 r->SetHeaderValues(static_cast<int32>(routing_id), type, flags); |
| 763 return r->WriteBytes(payload, payload_size); | 763 return r->WriteBytes(payload, payload_size); |
| 764 } | 764 } |
| 765 | 765 |
| 766 void ParamTraits<Message>::Log(const Message& p, std::string* l) { | 766 void ParamTraits<Message>::Log(const Message& p, std::string* l) { |
| 767 l->append("<IPC::Message>"); | 767 l->append("<IPC::Message>"); |
| 768 } | 768 } |
| 769 | 769 |
| 770 #if defined(OS_WIN) | 770 #if defined(OS_WIN) |
| 771 // Note that HWNDs/HANDLE/HCURSOR/HACCEL etc are always 32 bits, even on 64 | 771 // Note that HWNDs/HANDLE/HCURSOR/HACCEL etc are always 32 bits, even on 64 |
| 772 // bit systems. That's why we use the Windows macros to convert to 32 bits. | 772 // bit systems. That's why we use the Windows macros to convert to 32 bits. |
| 773 void ParamTraits<HANDLE>::Write(Message* m, const param_type& p) { | 773 void ParamTraits<HANDLE>::Write(Message* m, const param_type& p) { |
| 774 m->WriteInt(HandleToLong(p)); | 774 m->WriteInt(HandleToLong(p)); |
| 775 } | 775 } |
| 776 | 776 |
| 777 bool ParamTraits<HANDLE>::Read(const Message* m, PickleIterator* iter, | 777 bool ParamTraits<HANDLE>::Read(const Message* m, PickleIterator* iter, |
| 778 param_type* r) { | 778 param_type* r) { |
| 779 int32 temp; | 779 int32 temp; |
| 780 if (!iter->ReadInt(&temp)) | 780 if (!m->ReadInt(iter, &temp)) |
| 781 return false; | 781 return false; |
| 782 *r = LongToHandle(temp); | 782 *r = LongToHandle(temp); |
| 783 return true; | 783 return true; |
| 784 } | 784 } |
| 785 | 785 |
| 786 void ParamTraits<HANDLE>::Log(const param_type& p, std::string* l) { | 786 void ParamTraits<HANDLE>::Log(const param_type& p, std::string* l) { |
| 787 l->append(base::StringPrintf("0x%X", p)); | 787 l->append(base::StringPrintf("0x%X", p)); |
| 788 } | 788 } |
| 789 | 789 |
| 790 void ParamTraits<LOGFONT>::Write(Message* m, const param_type& p) { | 790 void ParamTraits<LOGFONT>::Write(Message* m, const param_type& p) { |
| 791 m->WriteData(reinterpret_cast<const char*>(&p), sizeof(LOGFONT)); | 791 m->WriteData(reinterpret_cast<const char*>(&p), sizeof(LOGFONT)); |
| 792 } | 792 } |
| 793 | 793 |
| 794 bool ParamTraits<LOGFONT>::Read(const Message* m, PickleIterator* iter, | 794 bool ParamTraits<LOGFONT>::Read(const Message* m, PickleIterator* iter, |
| 795 param_type* r) { | 795 param_type* r) { |
| 796 const char *data; | 796 const char *data; |
| 797 int data_size = 0; | 797 int data_size = 0; |
| 798 if (iter->ReadData(&data, &data_size) && data_size == sizeof(LOGFONT)) { | 798 if (m->ReadData(iter, &data, &data_size) && data_size == sizeof(LOGFONT)) { |
| 799 const LOGFONT *font = reinterpret_cast<LOGFONT*>(const_cast<char*>(data)); | 799 const LOGFONT *font = reinterpret_cast<LOGFONT*>(const_cast<char*>(data)); |
| 800 if (_tcsnlen(font->lfFaceName, LF_FACESIZE) < LF_FACESIZE) { | 800 if (_tcsnlen(font->lfFaceName, LF_FACESIZE) < LF_FACESIZE) { |
| 801 memcpy(r, data, sizeof(LOGFONT)); | 801 memcpy(r, data, sizeof(LOGFONT)); |
| 802 return true; | 802 return true; |
| 803 } | 803 } |
| 804 } | 804 } |
| 805 | 805 |
| 806 NOTREACHED(); | 806 NOTREACHED(); |
| 807 return false; | 807 return false; |
| 808 } | 808 } |
| 809 | 809 |
| 810 void ParamTraits<LOGFONT>::Log(const param_type& p, std::string* l) { | 810 void ParamTraits<LOGFONT>::Log(const param_type& p, std::string* l) { |
| 811 l->append(base::StringPrintf("<LOGFONT>")); | 811 l->append(base::StringPrintf("<LOGFONT>")); |
| 812 } | 812 } |
| 813 | 813 |
| 814 void ParamTraits<MSG>::Write(Message* m, const param_type& p) { | 814 void ParamTraits<MSG>::Write(Message* m, const param_type& p) { |
| 815 m->WriteData(reinterpret_cast<const char*>(&p), sizeof(MSG)); | 815 m->WriteData(reinterpret_cast<const char*>(&p), sizeof(MSG)); |
| 816 } | 816 } |
| 817 | 817 |
| 818 bool ParamTraits<MSG>::Read(const Message* m, PickleIterator* iter, | 818 bool ParamTraits<MSG>::Read(const Message* m, PickleIterator* iter, |
| 819 param_type* r) { | 819 param_type* r) { |
| 820 const char *data; | 820 const char *data; |
| 821 int data_size = 0; | 821 int data_size = 0; |
| 822 bool result = iter->ReadData(&data, &data_size); | 822 bool result = m->ReadData(iter, &data, &data_size); |
| 823 if (result && data_size == sizeof(MSG)) { | 823 if (result && data_size == sizeof(MSG)) { |
| 824 memcpy(r, data, sizeof(MSG)); | 824 memcpy(r, data, sizeof(MSG)); |
| 825 } else { | 825 } else { |
| 826 result = false; | 826 result = false; |
| 827 NOTREACHED(); | 827 NOTREACHED(); |
| 828 } | 828 } |
| 829 | 829 |
| 830 return result; | 830 return result; |
| 831 } | 831 } |
| 832 | 832 |
| 833 void ParamTraits<MSG>::Log(const param_type& p, std::string* l) { | 833 void ParamTraits<MSG>::Log(const param_type& p, std::string* l) { |
| 834 l->append("<MSG>"); | 834 l->append("<MSG>"); |
| 835 } | 835 } |
| 836 | 836 |
| 837 #endif // OS_WIN | 837 #endif // OS_WIN |
| 838 | 838 |
| 839 } // namespace IPC | 839 } // namespace IPC |
| OLD | NEW |