| // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 
 | // Use of this source code is governed by a BSD-style license that can be | 
 | // found in the LICENSE file. | 
 |  | 
 | #ifndef IPC_IPC_PLATFORM_FILE_H_ | 
 | #define IPC_IPC_PLATFORM_FILE_H_ | 
 |  | 
 | #include "base/files/file.h" | 
 | #include "base/process/process.h" | 
 | #include "build/build_config.h" | 
 | #include "ipc/ipc_message_support_export.h" | 
 |  | 
 | #if defined(OS_POSIX) || defined(OS_FUCHSIA) | 
 | #include "base/file_descriptor_posix.h" | 
 | #endif | 
 |  | 
 | namespace IPC { | 
 |  | 
 | #if defined(OS_WIN) | 
 | class IPC_MESSAGE_SUPPORT_EXPORT PlatformFileForTransit { | 
 |  public: | 
 |   // Creates an invalid platform file. | 
 |   PlatformFileForTransit(); | 
 |  | 
 |   // Creates a platform file that takes unofficial ownership of |handle|. Note | 
 |   // that ownership is not handled by a Scoped* class due to usage patterns of | 
 |   // this class and its POSIX counterpart [base::FileDescriptor]. When this | 
 |   // class is used as an input to an IPC message, the IPC subsystem will close | 
 |   // |handle|. When this class is used as the output from an IPC message, the | 
 |   // receiver is expected to take ownership of |handle|. | 
 |   explicit PlatformFileForTransit(HANDLE handle); | 
 |  | 
 |   // Comparison operators. | 
 |   bool operator==(const PlatformFileForTransit& platform_file) const; | 
 |   bool operator!=(const PlatformFileForTransit& platform_file) const; | 
 |  | 
 |   HANDLE GetHandle() const; | 
 |   bool IsValid() const; | 
 |  | 
 |  private: | 
 |   HANDLE handle_; | 
 | }; | 
 | #elif defined(OS_POSIX) || defined(OS_FUCHSIA) | 
 | typedef base::FileDescriptor PlatformFileForTransit; | 
 | #endif | 
 |  | 
 | inline PlatformFileForTransit InvalidPlatformFileForTransit() { | 
 | #if defined(OS_WIN) | 
 |   return PlatformFileForTransit(); | 
 | #elif defined(OS_POSIX) || defined(OS_FUCHSIA) | 
 |   return base::FileDescriptor(); | 
 | #endif | 
 | } | 
 |  | 
 | inline base::PlatformFile PlatformFileForTransitToPlatformFile( | 
 |     const PlatformFileForTransit& transit) { | 
 | #if defined(OS_WIN) | 
 |   return transit.GetHandle(); | 
 | #elif defined(OS_POSIX) || defined(OS_FUCHSIA) | 
 |   return transit.fd; | 
 | #endif | 
 | } | 
 |  | 
 | inline base::File PlatformFileForTransitToFile( | 
 |     const PlatformFileForTransit& transit) { | 
 | #if defined(OS_WIN) | 
 |   return base::File(transit.GetHandle()); | 
 | #elif defined(OS_POSIX) || defined(OS_FUCHSIA) | 
 |   return base::File(transit.fd); | 
 | #endif | 
 | } | 
 |  | 
 | // Creates a new handle that can be passed through IPC. The result must be | 
 | // passed to the IPC layer as part of a message, or else it will leak. | 
 | IPC_MESSAGE_SUPPORT_EXPORT PlatformFileForTransit | 
 | GetPlatformFileForTransit(base::PlatformFile file, bool close_source_handle); | 
 |  | 
 | // Creates a new handle that can be passed through IPC. The result must be | 
 | // passed to the IPC layer as part of a message, or else it will leak. | 
 | // Note that this function takes ownership of |file|. | 
 | IPC_MESSAGE_SUPPORT_EXPORT PlatformFileForTransit | 
 | TakePlatformFileForTransit(base::File file); | 
 |  | 
 | }  // namespace IPC | 
 |  | 
 | #endif  // IPC_IPC_PLATFORM_FILE_H_ |