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
3// found in the LICENSE file.
4
5#ifndef IPC_IPC_CHANNEL_HANDLE_H_
6#define IPC_IPC_CHANNEL_HANDLE_H_
7
8#include <string>
9
10#include "build/build_config.h"
11#include "mojo/public/cpp/system/message_pipe.h"
12
13#if defined(OS_POSIX)
14#include "base/file_descriptor_posix.h"
15#elif defined(OS_WIN)
16#include <windows.h>
17#endif  // defined (OS_WIN)
18
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.
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
25// 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//
30// 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.
33
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.
39  ChannelHandle() {}
40  // 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.
43  ChannelHandle(const std::string& n) : name(n) {}
44  ChannelHandle(const char* n) : name(n) {}
45#if defined(OS_WIN)
46  explicit ChannelHandle(HANDLE h) : pipe(h) {}
47#elif defined(OS_POSIX)
48  ChannelHandle(const std::string& n, const base::FileDescriptor& s)
49      : name(n), socket(s) {}
50#endif  // defined(OS_POSIX)
51  ChannelHandle(mojo::MessagePipeHandle h) : mojo_handle(h) {}
52
53  std::string name;
54#if defined(OS_POSIX)
55  base::FileDescriptor socket;
56#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)
65  mojo::MessagePipeHandle mojo_handle;
66};
67
68}  // namespace IPC
69
70#endif  // IPC_IPC_CHANNEL_HANDLE_H_
71