1645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// Use of this source code is governed by a BSD-style license that can be
3645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// found in the LICENSE file.
4645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
5645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#ifndef IPC_IPC_CHANNEL_HANDLE_H_
6645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#define IPC_IPC_CHANNEL_HANDLE_H_
7645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
8645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include <string>
9645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
10645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include "build/build_config.h"
11645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include "mojo/public/cpp/system/message_pipe.h"
12645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
13645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#if defined(OS_POSIX)
14645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include "base/file_descriptor_posix.h"
15645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#elif defined(OS_WIN)
16645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include <windows.h>
17645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#endif  // defined (OS_WIN)
18645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
19645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// On Windows, any process can create an IPC channel and others can fetch
20645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// it by name.  We pass around the channel names over IPC.
21645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// On Windows the initialization of ChannelHandle with an existing pipe
22645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// handle is provided for convenience.
23645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// NOTE: A ChannelHandle with a pipe handle Will NOT be marshalled over IPC.
24645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
25645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// On POSIX, we instead pass around handles to channel endpoints via IPC.
26645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// When it's time to IPC a new channel endpoint around, we send both the
27645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// channel name as well as a base::FileDescriptor, which is itself a special
28645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// type that knows how to copy a socket endpoint over IPC.
29645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez//
30645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// In sum, this data structure can be used to pass channel information by name
31645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// in both Windows and Posix. When passing a handle to a channel over IPC,
32645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// use this data structure only for POSIX.
33645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
34645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chaveznamespace IPC {
35645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
36645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezstruct ChannelHandle {
37645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  // Note that serialization for this object is defined in the ParamTraits
38645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  // template specialization in ipc_message_utils.h.
39645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  ChannelHandle() {}
40645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  // The name that is passed in should be an absolute path for Posix.
41645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  // Otherwise there may be a problem in IPC communication between
42645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  // processes with different working directories.
43645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  ChannelHandle(const std::string& n) : name(n) {}
44645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  ChannelHandle(const char* n) : name(n) {}
45645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#if defined(OS_WIN)
46645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  explicit ChannelHandle(HANDLE h) : pipe(h) {}
47645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#elif defined(OS_POSIX)
48645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  ChannelHandle(const std::string& n, const base::FileDescriptor& s)
49645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez      : name(n), socket(s) {}
50645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#endif  // defined(OS_POSIX)
51645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  ChannelHandle(mojo::MessagePipeHandle h) : mojo_handle(h) {}
52645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
53645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  std::string name;
54645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#if defined(OS_POSIX)
55645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  base::FileDescriptor socket;
56645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#elif defined(OS_WIN)
57645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  // A simple container to automatically initialize pipe handle
58645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  struct PipeHandle {
59645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    PipeHandle() : handle(NULL) {}
60645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    PipeHandle(HANDLE h) : handle(h) {}
61645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    HANDLE handle;
62645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  };
63645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  PipeHandle pipe;
64645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#endif  // defined (OS_WIN)
65645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  mojo::MessagePipeHandle mojo_handle;
66645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez};
67645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
68645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez}  // namespace IPC
69645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
70645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#endif  // IPC_IPC_CHANNEL_HANDLE_H_
71