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