| 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 <stddef.h> | 7 #include <stddef.h> |
| 8 #include <stdint.h> | 8 #include <stdint.h> |
| 9 | 9 |
| 10 #include "base/files/file_path.h" | 10 #include "base/files/file_path.h" |
| (...skipping 665 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 676 l->append(base::StringPrintf("FD(%d auto-close)", p.fd)); | 676 l->append(base::StringPrintf("FD(%d auto-close)", p.fd)); |
| 677 } else { | 677 } else { |
| 678 l->append(base::StringPrintf("FD(%d)", p.fd)); | 678 l->append(base::StringPrintf("FD(%d)", p.fd)); |
| 679 } | 679 } |
| 680 } | 680 } |
| 681 #endif // defined(OS_POSIX) | 681 #endif // defined(OS_POSIX) |
| 682 | 682 |
| 683 #if defined(OS_MACOSX) && !defined(OS_IOS) | 683 #if defined(OS_MACOSX) && !defined(OS_IOS) |
| 684 void ParamTraits<base::SharedMemoryHandle>::Write(base::Pickle* m, | 684 void ParamTraits<base::SharedMemoryHandle>::Write(base::Pickle* m, |
| 685 const param_type& p) { | 685 const param_type& p) { |
| 686 MachPortMac mach_port_mac(p.GetMemoryObject()); | 686 m->WriteInt(p.GetType()); |
| 687 ParamTraits<MachPortMac>::Write(m, mach_port_mac); | |
| 688 size_t size = 0; | |
| 689 bool result = p.GetSize(&size); | |
| 690 DCHECK(result); | |
| 691 ParamTraits<uint32_t>::Write(m, static_cast<uint32_t>(size)); | |
| 692 | 687 |
| 693 // If the caller intended to pass ownership to the IPC stack, release a | 688 switch (p.GetType()) { |
| 694 // reference. | 689 case base::SharedMemoryHandle::POSIX: |
| 695 if (p.OwnershipPassesToIPC()) | 690 ParamTraits<base::FileDescriptor>::Write(m, p.GetFileDescriptor()); |
| 696 p.Close(); | 691 break; |
| 692 case base::SharedMemoryHandle::MACH: |
| 693 MachPortMac mach_port_mac(p.GetMemoryObject()); |
| 694 ParamTraits<MachPortMac>::Write(m, mach_port_mac); |
| 695 size_t size = 0; |
| 696 bool result = p.GetSize(&size); |
| 697 DCHECK(result); |
| 698 ParamTraits<uint32_t>::Write(m, static_cast<uint32_t>(size)); |
| 699 |
| 700 // If the caller intended to pass ownership to the IPC stack, release a |
| 701 // reference. |
| 702 if (p.OwnershipPassesToIPC()) |
| 703 p.Close(); |
| 704 |
| 705 break; |
| 706 } |
| 697 } | 707 } |
| 698 | 708 |
| 699 bool ParamTraits<base::SharedMemoryHandle>::Read(const base::Pickle* m, | 709 bool ParamTraits<base::SharedMemoryHandle>::Read(const base::Pickle* m, |
| 700 base::PickleIterator* iter, | 710 base::PickleIterator* iter, |
| 701 param_type* r) { | 711 param_type* r) { |
| 702 MachPortMac mach_port_mac; | 712 base::SharedMemoryHandle::TypeWireFormat type; |
| 703 if (!ParamTraits<MachPortMac>::Read(m, iter, &mach_port_mac)) | 713 if (!iter->ReadInt(&type)) |
| 704 return false; | 714 return false; |
| 705 | 715 |
| 706 uint32_t size; | 716 base::SharedMemoryHandle::Type shm_type = base::SharedMemoryHandle::POSIX; |
| 707 if (!ParamTraits<uint32_t>::Read(m, iter, &size)) | 717 switch (type) { |
| 708 return false; | 718 case base::SharedMemoryHandle::POSIX: |
| 719 case base::SharedMemoryHandle::MACH: { |
| 720 shm_type = static_cast<base::SharedMemoryHandle::Type>(type); |
| 721 break; |
| 722 } |
| 723 default: { |
| 724 return false; |
| 725 } |
| 726 } |
| 709 | 727 |
| 710 *r = base::SharedMemoryHandle(mach_port_mac.get_mach_port(), | 728 switch (shm_type) { |
| 711 static_cast<size_t>(size), | 729 case base::SharedMemoryHandle::POSIX: { |
| 712 base::GetCurrentProcId()); | 730 base::FileDescriptor file_descriptor; |
| 713 return true; | 731 |
| 732 bool success = |
| 733 ParamTraits<base::FileDescriptor>::Read(m, iter, &file_descriptor); |
| 734 if (!success) |
| 735 return false; |
| 736 |
| 737 *r = base::SharedMemoryHandle(file_descriptor.fd, |
| 738 file_descriptor.auto_close); |
| 739 return true; |
| 740 } |
| 741 case base::SharedMemoryHandle::MACH: { |
| 742 MachPortMac mach_port_mac; |
| 743 if (!ParamTraits<MachPortMac>::Read(m, iter, &mach_port_mac)) |
| 744 return false; |
| 745 |
| 746 uint32_t size; |
| 747 if (!ParamTraits<uint32_t>::Read(m, iter, &size)) |
| 748 return false; |
| 749 |
| 750 *r = base::SharedMemoryHandle(mach_port_mac.get_mach_port(), |
| 751 static_cast<size_t>(size), |
| 752 base::GetCurrentProcId()); |
| 753 return true; |
| 754 } |
| 755 } |
| 714 } | 756 } |
| 715 | 757 |
| 716 void ParamTraits<base::SharedMemoryHandle>::Log(const param_type& p, | 758 void ParamTraits<base::SharedMemoryHandle>::Log(const param_type& p, |
| 717 std::string* l) { | 759 std::string* l) { |
| 718 l->append("Mach port: "); | 760 switch (p.GetType()) { |
| 719 LogParam(p.GetMemoryObject(), l); | 761 case base::SharedMemoryHandle::POSIX: |
| 762 l->append("POSIX Fd: "); |
| 763 ParamTraits<base::FileDescriptor>::Log(p.GetFileDescriptor(), l); |
| 764 break; |
| 765 case base::SharedMemoryHandle::MACH: |
| 766 l->append("Mach port: "); |
| 767 LogParam(p.GetMemoryObject(), l); |
| 768 break; |
| 769 } |
| 720 } | 770 } |
| 721 | 771 |
| 722 #elif defined(OS_WIN) | 772 #elif defined(OS_WIN) |
| 723 void ParamTraits<base::SharedMemoryHandle>::Write(base::Pickle* m, | 773 void ParamTraits<base::SharedMemoryHandle>::Write(base::Pickle* m, |
| 724 const param_type& p) { | 774 const param_type& p) { |
| 725 m->WriteBool(p.NeedsBrokering()); | 775 m->WriteBool(p.NeedsBrokering()); |
| 726 | 776 |
| 727 if (p.NeedsBrokering()) { | 777 if (p.NeedsBrokering()) { |
| 728 HandleWin handle_win(p.GetHandle(), HandleWin::DUPLICATE); | 778 HandleWin handle_win(p.GetHandle(), HandleWin::DUPLICATE); |
| 729 ParamTraits<HandleWin>::Write(m, handle_win); | 779 ParamTraits<HandleWin>::Write(m, handle_win); |
| (...skipping 438 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1168 return result; | 1218 return result; |
| 1169 } | 1219 } |
| 1170 | 1220 |
| 1171 void ParamTraits<MSG>::Log(const param_type& p, std::string* l) { | 1221 void ParamTraits<MSG>::Log(const param_type& p, std::string* l) { |
| 1172 l->append("<MSG>"); | 1222 l->append("<MSG>"); |
| 1173 } | 1223 } |
| 1174 | 1224 |
| 1175 #endif // OS_WIN | 1225 #endif // OS_WIN |
| 1176 | 1226 |
| 1177 } // namespace IPC | 1227 } // namespace IPC |
| OLD | NEW |