| Index: ipc/ipc_message_utils.cc
|
| diff --git a/ipc/ipc_message_utils.cc b/ipc/ipc_message_utils.cc
|
| index 5e615c33f9b7ed4212df39b85833cf502d6245a7..5c0c49344988b9b19b76abdd61e6c040b6dad493 100644
|
| --- a/ipc/ipc_message_utils.cc
|
| +++ b/ipc/ipc_message_utils.cc
|
| @@ -20,12 +20,13 @@
|
| #include "ipc/ipc_platform_file_attachment_posix.h"
|
| #endif
|
|
|
| -#if defined(OS_MACOSX) && !defined(OS_IOS)
|
| +#if (defined(OS_MACOSX) && !defined(OS_IOS)) || defined(OS_WIN)
|
| #include "base/memory/shared_memory_handle.h"
|
| -#endif // defined(OS_MACOSX) && !defined(OS_IOS)
|
| +#endif // (defined(OS_MACOSX) && !defined(OS_IOS)) || defined(OS_WIN)
|
|
|
| #if defined(OS_WIN)
|
| #include <tchar.h>
|
| +#include "ipc/handle_win.h"
|
| #endif
|
|
|
| namespace IPC {
|
| @@ -592,6 +593,58 @@ void ParamTraits<base::SharedMemoryHandle>::Log(const param_type& p,
|
| ParamTraits<base::FileDescriptor>::Log(p.GetFileDescriptor(), l);
|
| }
|
| }
|
| +#elif defined(OS_WIN)
|
| +void ParamTraits<base::SharedMemoryHandle>::Write(Message* m,
|
| + const param_type& p) {
|
| + // Longs on windows are 32 bits.
|
| + uint32_t pid = p.GetPID();
|
| + m->WriteUInt32(pid);
|
| + m->WriteBool(p.NeedsBrokering());
|
| +
|
| + if (p.NeedsBrokering()) {
|
| + HandleWin handle_win(p.GetHandle(), HandleWin::DUPLICATE);
|
| + ParamTraits<HandleWin>::Write(m, handle_win);
|
| + } else {
|
| + m->WriteInt(HandleToLong(p.GetHandle()));
|
| + }
|
| +}
|
| +
|
| +bool ParamTraits<base::SharedMemoryHandle>::Read(const Message* m,
|
| + base::PickleIterator* iter,
|
| + param_type* r) {
|
| + uint32_t pid_int;
|
| + if (!iter->ReadUInt32(&pid_int))
|
| + return false;
|
| + base::ProcessId pid = pid_int;
|
| +
|
| + bool needs_brokering;
|
| + if (!iter->ReadBool(&needs_brokering))
|
| + return false;
|
| +
|
| + if (needs_brokering) {
|
| + HandleWin handle_win;
|
| + if (!ParamTraits<HandleWin>::Read(m, iter, &handle_win))
|
| + return false;
|
| + *r = base::SharedMemoryHandle(handle_win.get_handle(), pid);
|
| + return true;
|
| + }
|
| +
|
| + int handle_int;
|
| + if (!iter->ReadInt(&handle_int))
|
| + return false;
|
| + HANDLE handle = LongToHandle(handle_int);
|
| + *r = base::SharedMemoryHandle(handle, pid);
|
| + return true;
|
| +}
|
| +
|
| +void ParamTraits<base::SharedMemoryHandle>::Log(const param_type& p,
|
| + std::string* l) {
|
| + LogParam(p.GetPID(), l);
|
| + l->append(" ");
|
| + LogParam(p.GetHandle(), l);
|
| + l->append(" needs brokering: ");
|
| + LogParam(p.NeedsBrokering(), l);
|
| +}
|
| #endif // defined(OS_MACOSX) && !defined(OS_IOS)
|
|
|
| void ParamTraits<base::FilePath>::Write(Message* m, const param_type& p) {
|
|
|