blob: 1b6fd8ca2059030d11d07391c3c6ead37e162ede [file] [log] [blame]
[email protected]a7c03d4f32012-01-24 02:36:051// Copyright (c) 2012 The Chromium Authors. All rights reserved.
[email protected]d2e884d2009-06-22 20:37:522// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
[email protected]946d1b22009-07-22 23:57:215#ifndef IPC_IPC_CHANNEL_HANDLE_H_
6#define IPC_IPC_CHANNEL_HANDLE_H_
[email protected]d2e884d2009-06-22 20:37:527
[email protected]246a70452010-03-05 21:53:508#include <string>
9
[email protected]d2e884d2009-06-22 20:37:5210#include "build/build_config.h"
11
12#if defined(OS_POSIX)
13#include "base/file_descriptor_posix.h"
[email protected]a7c03d4f32012-01-24 02:36:0514#elif defined(OS_WIN)
15#include <windows.h>
16#endif // defined (OS_WIN)
[email protected]d2e884d2009-06-22 20:37:5217
18// On Windows, any process can create an IPC channel and others can fetch
19// it by name. We pass around the channel names over IPC.
[email protected]a7c03d4f32012-01-24 02:36:0520// On Windows the initialization of ChannelHandle with an existing pipe
21// handle is provided for convenience.
22// NOTE: A ChannelHandle with a pipe handle Will NOT be marshalled over IPC.
23
[email protected]d2e884d2009-06-22 20:37:5224// On POSIX, we instead pass around handles to channel endpoints via IPC.
25// When it's time to IPC a new channel endpoint around, we send both the
26// channel name as well as a base::FileDescriptor, which is itself a special
27// type that knows how to copy a socket endpoint over IPC.
28//
[email protected]a7c03d4f32012-01-24 02:36:0529// In sum, this data structure can be used to pass channel information by name
30// in both Windows and Posix. When passing a handle to a channel over IPC,
31// use this data structure only for POSIX.
[email protected]d2e884d2009-06-22 20:37:5232
33namespace IPC {
34
35struct ChannelHandle {
36 // Note that serialization for this object is defined in the ParamTraits
37 // template specialization in ipc_message_utils.h.
[email protected]d2e884d2009-06-22 20:37:5238 ChannelHandle() {}
[email protected]84818e92011-06-24 18:57:2439 // The name that is passed in should be an absolute path for Posix.
40 // Otherwise there may be a problem in IPC communication between
41 // processes with different working directories.
[email protected]42ce94e2010-12-08 19:28:0942 ChannelHandle(const std::string& n) : name(n) {}
43 ChannelHandle(const char* n) : name(n) {}
[email protected]a7c03d4f32012-01-24 02:36:0544#if defined(OS_WIN)
45 explicit ChannelHandle(HANDLE h) : pipe(h) {}
46#elif defined(OS_POSIX)
[email protected]d2e884d2009-06-22 20:37:5247 ChannelHandle(const std::string& n, const base::FileDescriptor& s)
48 : name(n), socket(s) {}
[email protected]42ce94e2010-12-08 19:28:0949#endif // defined(OS_POSIX)
50
51 std::string name;
52#if defined(OS_POSIX)
53 base::FileDescriptor socket;
[email protected]a7c03d4f32012-01-24 02:36:0554#elif defined(OS_WIN)
55 // A simple container to automatically initialize pipe handle
56 struct PipeHandle {
57 PipeHandle() : handle(NULL) {}
58 PipeHandle(HANDLE h) : handle(h) {}
59 HANDLE handle;
60 };
61 PipeHandle pipe;
62#endif // defined (OS_WIN)
[email protected]d2e884d2009-06-22 20:37:5263};
64
65} // namespace IPC
66
[email protected]946d1b22009-07-22 23:57:2167#endif // IPC_IPC_CHANNEL_HANDLE_H_