OLD | NEW |
1 // Copyright (c) 2011 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 #ifndef IPC_IPC_CHANNEL_HANDLE_H_ | 5 #ifndef IPC_IPC_CHANNEL_HANDLE_H_ |
6 #define IPC_IPC_CHANNEL_HANDLE_H_ | 6 #define IPC_IPC_CHANNEL_HANDLE_H_ |
7 #pragma once | 7 #pragma once |
8 | 8 |
9 #include <string> | 9 #include <string> |
10 | 10 |
11 #include "build/build_config.h" | 11 #include "build/build_config.h" |
12 | 12 |
13 #if defined(OS_POSIX) | 13 #if defined(OS_POSIX) |
14 #include "base/file_descriptor_posix.h" | 14 #include "base/file_descriptor_posix.h" |
15 #endif | 15 #elif defined(OS_WIN) |
| 16 #include <windows.h> |
| 17 #endif // defined (OS_WIN) |
16 | 18 |
17 // On Windows, any process can create an IPC channel and others can fetch | 19 // On Windows, any process can create an IPC channel and others can fetch |
18 // it by name. We pass around the channel names over IPC. | 20 // it by name. We pass around the channel names over IPC. |
| 21 // On Windows the initialization of ChannelHandle with an existing pipe |
| 22 // handle is provided for convenience. |
| 23 // NOTE: A ChannelHandle with a pipe handle Will NOT be marshalled over IPC. |
| 24 |
19 // On POSIX, we instead pass around handles to channel endpoints via IPC. | 25 // On POSIX, we instead pass around handles to channel endpoints via IPC. |
20 // When it's time to IPC a new channel endpoint around, we send both the | 26 // When it's time to IPC a new channel endpoint around, we send both the |
21 // channel name as well as a base::FileDescriptor, which is itself a special | 27 // channel name as well as a base::FileDescriptor, which is itself a special |
22 // type that knows how to copy a socket endpoint over IPC. | 28 // type that knows how to copy a socket endpoint over IPC. |
23 // | 29 // |
24 // In sum, when passing a handle to a channel over IPC, use this data structure | 30 // In sum, this data structure can be used to pass channel information by name |
25 // to work on both Windows and POSIX. | 31 // in both Windows and Posix. When passing a handle to a channel over IPC, |
| 32 // use this data structure only for POSIX. |
26 | 33 |
27 namespace IPC { | 34 namespace IPC { |
28 | 35 |
29 struct ChannelHandle { | 36 struct ChannelHandle { |
30 // Note that serialization for this object is defined in the ParamTraits | 37 // Note that serialization for this object is defined in the ParamTraits |
31 // template specialization in ipc_message_utils.h. | 38 // template specialization in ipc_message_utils.h. |
32 ChannelHandle() {} | 39 ChannelHandle() {} |
33 // The name that is passed in should be an absolute path for Posix. | 40 // The name that is passed in should be an absolute path for Posix. |
34 // Otherwise there may be a problem in IPC communication between | 41 // Otherwise there may be a problem in IPC communication between |
35 // processes with different working directories. | 42 // processes with different working directories. |
36 ChannelHandle(const std::string& n) : name(n) {} | 43 ChannelHandle(const std::string& n) : name(n) {} |
37 ChannelHandle(const char* n) : name(n) {} | 44 ChannelHandle(const char* n) : name(n) {} |
38 #if defined(OS_POSIX) | 45 #if defined(OS_WIN) |
| 46 explicit ChannelHandle(HANDLE h) : pipe(h) {} |
| 47 #elif defined(OS_POSIX) |
39 ChannelHandle(const std::string& n, const base::FileDescriptor& s) | 48 ChannelHandle(const std::string& n, const base::FileDescriptor& s) |
40 : name(n), socket(s) {} | 49 : name(n), socket(s) {} |
41 #endif // defined(OS_POSIX) | 50 #endif // defined(OS_POSIX) |
42 | 51 |
43 std::string name; | 52 std::string name; |
44 #if defined(OS_POSIX) | 53 #if defined(OS_POSIX) |
45 base::FileDescriptor socket; | 54 base::FileDescriptor socket; |
46 #endif // defined(OS_POSIX) | 55 #elif defined(OS_WIN) |
47 | 56 // A simple container to automatically initialize pipe handle |
| 57 struct PipeHandle { |
| 58 PipeHandle() : handle(NULL) {} |
| 59 PipeHandle(HANDLE h) : handle(h) {} |
| 60 HANDLE handle; |
| 61 }; |
| 62 PipeHandle pipe; |
| 63 #endif // defined (OS_WIN) |
48 }; | 64 }; |
49 | 65 |
50 } // namespace IPC | 66 } // namespace IPC |
51 | 67 |
52 #endif // IPC_IPC_CHANNEL_HANDLE_H_ | 68 #endif // IPC_IPC_CHANNEL_HANDLE_H_ |
OLD | NEW |