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 672 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
683 #if defined(OS_MACOSX) && !defined(OS_IOS) | 683 #if defined(OS_MACOSX) && !defined(OS_IOS) |
684 void ParamTraits<base::SharedMemoryHandle>::GetSize(base::PickleSizer* sizer, | 684 void ParamTraits<base::SharedMemoryHandle>::GetSize(base::PickleSizer* sizer, |
685 const param_type& p) { | 685 const param_type& p) { |
686 GetParamSize(sizer, p.GetMemoryObject()); | 686 GetParamSize(sizer, p.GetMemoryObject()); |
687 uint32_t dummy = 0; | 687 uint32_t dummy = 0; |
688 GetParamSize(sizer, dummy); | 688 GetParamSize(sizer, dummy); |
689 } | 689 } |
690 | 690 |
691 void ParamTraits<base::SharedMemoryHandle>::Write(base::Pickle* m, | 691 void ParamTraits<base::SharedMemoryHandle>::Write(base::Pickle* m, |
692 const param_type& p) { | 692 const param_type& p) { |
693 MachPortMac mach_port_mac(p.GetMemoryObject()); | 693 m->WriteInt(p.GetType()); |
694 ParamTraits<MachPortMac>::Write(m, mach_port_mac); | 694 switch (p.GetType()) { |
695 size_t size = 0; | 695 case base::SharedMemoryHandle::POSIX: |
696 bool result = p.GetSize(&size); | 696 ParamTraits<base::FileDescriptor>::Write(m, p.GetFileDescriptor()); |
697 DCHECK(result); | 697 break; |
698 ParamTraits<uint32_t>::Write(m, static_cast<uint32_t>(size)); | 698 case base::SharedMemoryHandle::MACH: |
| 699 MachPortMac mach_port_mac(p.GetMemoryObject()); |
| 700 ParamTraits<MachPortMac>::Write(m, mach_port_mac); |
| 701 size_t size = 0; |
| 702 bool result = p.GetSize(&size); |
| 703 DCHECK(result); |
| 704 ParamTraits<uint32_t>::Write(m, static_cast<uint32_t>(size)); |
699 | 705 |
700 // If the caller intended to pass ownership to the IPC stack, release a | 706 // If the caller intended to pass ownership to the IPC stack, release a |
701 // reference. | 707 // reference. |
702 if (p.OwnershipPassesToIPC()) | 708 if (p.OwnershipPassesToIPC()) |
703 p.Close(); | 709 p.Close(); |
| 710 break; |
| 711 } |
704 } | 712 } |
705 | 713 |
706 bool ParamTraits<base::SharedMemoryHandle>::Read(const base::Pickle* m, | 714 bool ParamTraits<base::SharedMemoryHandle>::Read(const base::Pickle* m, |
707 base::PickleIterator* iter, | 715 base::PickleIterator* iter, |
708 param_type* r) { | 716 param_type* r) { |
709 MachPortMac mach_port_mac; | 717 base::SharedMemoryHandle::TypeWireFormat type; |
710 if (!ParamTraits<MachPortMac>::Read(m, iter, &mach_port_mac)) | 718 if (!iter->ReadInt(&type)) |
711 return false; | 719 return false; |
712 | 720 |
713 uint32_t size; | 721 base::SharedMemoryHandle::Type shm_type = base::SharedMemoryHandle::POSIX; |
714 if (!ParamTraits<uint32_t>::Read(m, iter, &size)) | 722 switch (type) { |
715 return false; | 723 case base::SharedMemoryHandle::POSIX: |
| 724 case base::SharedMemoryHandle::MACH: { |
| 725 shm_type = static_cast<base::SharedMemoryHandle::Type>(type); |
| 726 break; |
| 727 } |
| 728 default: { |
| 729 return false; |
| 730 } |
| 731 } |
716 | 732 |
717 *r = base::SharedMemoryHandle(mach_port_mac.get_mach_port(), | 733 switch(shm_type) { |
718 static_cast<size_t>(size), | 734 case base::SharedMemoryHandle::POSIX: { |
719 base::GetCurrentProcId()); | 735 base::FileDescriptor file_descriptor; |
720 return true; | 736 |
| 737 bool success = |
| 738 ParamTraits<base::FileDescriptor>::Read(m, iter, &file_descriptor); |
| 739 if (!success) |
| 740 return false; |
| 741 |
| 742 *r = base::SharedMemoryHandle(file_descriptor.fd, |
| 743 file_descriptor.auto_close); |
| 744 return true; |
| 745 } |
| 746 case base::SharedMemoryHandle::MACH: { |
| 747 MachPortMac mach_port_mac; |
| 748 if (!ParamTraits<MachPortMac>::Read(m, iter, &mach_port_mac)) |
| 749 return false; |
| 750 |
| 751 uint32_t size; |
| 752 if (!ParamTraits<uint32_t>::Read(m, iter, &size)) |
| 753 return false; |
| 754 |
| 755 *r = base::SharedMemoryHandle(mach_port_mac.get_mach_port(), |
| 756 static_cast<size_t>(size), |
| 757 base::GetCurrentProcId()); |
| 758 return true; |
| 759 } |
| 760 } |
721 } | 761 } |
722 | 762 |
723 void ParamTraits<base::SharedMemoryHandle>::Log(const param_type& p, | 763 void ParamTraits<base::SharedMemoryHandle>::Log(const param_type& p, |
724 std::string* l) { | 764 std::string* l) { |
725 l->append("Mach port: "); | 765 switch (p.GetType()) { |
726 LogParam(p.GetMemoryObject(), l); | 766 case base::SharedMemoryHandle::POSIX: |
| 767 l->append("POSIX Fd: "); |
| 768 ParamTraits<base::FileDescriptor>::Log(p.GetFileDescriptor(), l); |
| 769 break; |
| 770 case base::SharedMemoryHandle::MACH: |
| 771 l->append("Mach port: "); |
| 772 LogParam(p.GetMemoryObject(), l); |
| 773 break; |
| 774 } |
727 } | 775 } |
728 | 776 |
729 #elif defined(OS_WIN) | 777 #elif defined(OS_WIN) |
730 void ParamTraits<base::SharedMemoryHandle>::GetSize(base::PickleSizer* s, | 778 void ParamTraits<base::SharedMemoryHandle>::GetSize(base::PickleSizer* s, |
731 const param_type& p) { | 779 const param_type& p) { |
732 GetParamSize(s, p.NeedsBrokering()); | 780 GetParamSize(s, p.NeedsBrokering()); |
733 if (p.NeedsBrokering()) { | 781 if (p.NeedsBrokering()) { |
734 GetParamSize(s, p.GetHandle()); | 782 GetParamSize(s, p.GetHandle()); |
735 } else { | 783 } else { |
736 GetParamSize(s, HandleToLong(p.GetHandle())); | 784 GetParamSize(s, HandleToLong(p.GetHandle())); |
(...skipping 494 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1231 return result; | 1279 return result; |
1232 } | 1280 } |
1233 | 1281 |
1234 void ParamTraits<MSG>::Log(const param_type& p, std::string* l) { | 1282 void ParamTraits<MSG>::Log(const param_type& p, std::string* l) { |
1235 l->append("<MSG>"); | 1283 l->append("<MSG>"); |
1236 } | 1284 } |
1237 | 1285 |
1238 #endif // OS_WIN | 1286 #endif // OS_WIN |
1239 | 1287 |
1240 } // namespace IPC | 1288 } // namespace IPC |
OLD | NEW |