blob: 2e9dc3e57f37f424934ac1a7f832763d1f2a80f1 [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"
amistry36182522016-06-27 06:34:4211#include "mojo/public/cpp/system/message_pipe.h"
[email protected]d2e884d2009-06-22 20:37:5212
13#if defined(OS_POSIX)
14#include "base/file_descriptor_posix.h"
[email protected]a7c03d4f32012-01-24 02:36:0515#elif defined(OS_WIN)
16#include <windows.h>
17#endif // defined (OS_WIN)
[email protected]d2e884d2009-06-22 20:37:5218
19// On Windows, any process can create an IPC channel and others can fetch
20// it by name. We pass around the channel names over IPC.
[email protected]a7c03d4f32012-01-24 02:36:0521// 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
[email protected]d2e884d2009-06-22 20:37:5225// On POSIX, we instead pass around handles to channel endpoints via IPC.
26// When it's time to IPC a new channel endpoint around, we send both the
27// channel name as well as a base::FileDescriptor, which is itself a special
28// type that knows how to copy a socket endpoint over IPC.
29//
[email protected]a7c03d4f32012-01-24 02:36:0530// In sum, this data structure can be used to pass channel information by name
31// in both Windows and Posix. When passing a handle to a channel over IPC,
32// use this data structure only for POSIX.
[email protected]d2e884d2009-06-22 20:37:5233
34namespace IPC {
35
36struct ChannelHandle {
37 // Note that serialization for this object is defined in the ParamTraits
38 // template specialization in ipc_message_utils.h.
[email protected]d2e884d2009-06-22 20:37:5239 ChannelHandle() {}
[email protected]84818e92011-06-24 18:57:2440 // The name that is passed in should be an absolute path for Posix.
41 // Otherwise there may be a problem in IPC communication between
42 // processes with different working directories.
[email protected]42ce94e2010-12-08 19:28:0943 ChannelHandle(const std::string& n) : name(n) {}
44 ChannelHandle(const char* n) : name(n) {}
[email protected]a7c03d4f32012-01-24 02:36:0545#if defined(OS_WIN)
46 explicit ChannelHandle(HANDLE h) : pipe(h) {}
47#elif defined(OS_POSIX)
[email protected]d2e884d2009-06-22 20:37:5248 ChannelHandle(const std::string& n, const base::FileDescriptor& s)
49 : name(n), socket(s) {}
[email protected]42ce94e2010-12-08 19:28:0950#endif // defined(OS_POSIX)
amistry36182522016-06-27 06:34:4251 ChannelHandle(mojo::MessagePipeHandle h) : mojo_handle(h) {}
[email protected]42ce94e2010-12-08 19:28:0952
53 std::string name;
54#if defined(OS_POSIX)
55 base::FileDescriptor socket;
[email protected]a7c03d4f32012-01-24 02:36:0556#elif defined(OS_WIN)
57 // A simple container to automatically initialize pipe handle
58 struct PipeHandle {
59 PipeHandle() : handle(NULL) {}
60 PipeHandle(HANDLE h) : handle(h) {}
61 HANDLE handle;
62 };
63 PipeHandle pipe;
64#endif // defined (OS_WIN)
amistry36182522016-06-27 06:34:4265 mojo::MessagePipeHandle mojo_handle;
[email protected]d2e884d2009-06-22 20:37:5266};
67
68} // namespace IPC
69
[email protected]946d1b22009-07-22 23:57:2170#endif // IPC_IPC_CHANNEL_HANDLE_H_