| OLD | NEW |
| 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef PPAPI_PROXY_SERIALIZED_HANDLES_H_ | 5 #ifndef PPAPI_PROXY_SERIALIZED_HANDLES_H_ |
| 6 #define PPAPI_PROXY_SERIALIZED_HANDLES_H_ | 6 #define PPAPI_PROXY_SERIALIZED_HANDLES_H_ |
| 7 | 7 |
| 8 #include <stdint.h> |
| 9 |
| 8 #include <string> | 10 #include <string> |
| 9 #include <vector> | 11 #include <vector> |
| 10 | 12 |
| 11 #include "base/atomicops.h" | 13 #include "base/atomicops.h" |
| 12 #include "base/basictypes.h" | |
| 13 #include "base/logging.h" | 14 #include "base/logging.h" |
| 14 #include "base/memory/ref_counted.h" | 15 #include "base/memory/ref_counted.h" |
| 15 #include "base/memory/shared_memory.h" | 16 #include "base/memory/shared_memory.h" |
| 16 #include "build/build_config.h" | 17 #include "build/build_config.h" |
| 17 #include "ipc/ipc_platform_file.h" | 18 #include "ipc/ipc_platform_file.h" |
| 18 #include "ppapi/c/pp_resource.h" | 19 #include "ppapi/c/pp_resource.h" |
| 19 #include "ppapi/proxy/ppapi_proxy_export.h" | 20 #include "ppapi/proxy/ppapi_proxy_export.h" |
| 20 | 21 |
| 21 namespace base { | 22 namespace base { |
| 22 class Pickle; | 23 class Pickle; |
| 23 } | 24 } |
| 24 | 25 |
| 25 namespace ppapi { | 26 namespace ppapi { |
| 26 namespace proxy { | 27 namespace proxy { |
| 27 | 28 |
| 28 // SerializedHandle is a unified structure for holding a handle (e.g., a shared | 29 // SerializedHandle is a unified structure for holding a handle (e.g., a shared |
| 29 // memory handle, socket descriptor, etc). This is useful for passing handles in | 30 // memory handle, socket descriptor, etc). This is useful for passing handles in |
| 30 // resource messages and also makes it easier to translate handles in | 31 // resource messages and also makes it easier to translate handles in |
| 31 // NaClIPCAdapter for use in NaCl. | 32 // NaClIPCAdapter for use in NaCl. |
| 32 class PPAPI_PROXY_EXPORT SerializedHandle { | 33 class PPAPI_PROXY_EXPORT SerializedHandle { |
| 33 public: | 34 public: |
| 34 enum Type { INVALID, SHARED_MEMORY, SOCKET, FILE }; | 35 enum Type { INVALID, SHARED_MEMORY, SOCKET, FILE }; |
| 35 // Header contains the fields that we send in IPC messages, apart from the | 36 // Header contains the fields that we send in IPC messages, apart from the |
| 36 // actual handle. See comments on the SerializedHandle fields below. | 37 // actual handle. See comments on the SerializedHandle fields below. |
| 37 struct Header { | 38 struct Header { |
| 38 Header() : type(INVALID), size(0), open_flags(0) {} | 39 Header() : type(INVALID), size(0), open_flags(0) {} |
| 39 Header(Type type_arg, | 40 Header(Type type_arg, |
| 40 uint32 size_arg, | 41 uint32_t size_arg, |
| 41 int32 open_flags_arg, | 42 int32_t open_flags_arg, |
| 42 PP_Resource file_io_arg) | 43 PP_Resource file_io_arg) |
| 43 : type(type_arg), | 44 : type(type_arg), |
| 44 size(size_arg), | 45 size(size_arg), |
| 45 open_flags(open_flags_arg), | 46 open_flags(open_flags_arg), |
| 46 file_io(file_io_arg) { | 47 file_io(file_io_arg) {} |
| 47 } | |
| 48 | 48 |
| 49 Type type; | 49 Type type; |
| 50 uint32 size; | 50 uint32_t size; |
| 51 int32 open_flags; | 51 int32_t open_flags; |
| 52 PP_Resource file_io; | 52 PP_Resource file_io; |
| 53 }; | 53 }; |
| 54 | 54 |
| 55 SerializedHandle(); | 55 SerializedHandle(); |
| 56 // Create an invalid handle of the given type. | 56 // Create an invalid handle of the given type. |
| 57 explicit SerializedHandle(Type type); | 57 explicit SerializedHandle(Type type); |
| 58 | 58 |
| 59 // Create a shared memory handle. | 59 // Create a shared memory handle. |
| 60 SerializedHandle(const base::SharedMemoryHandle& handle, uint32 size); | 60 SerializedHandle(const base::SharedMemoryHandle& handle, uint32_t size); |
| 61 | 61 |
| 62 // Create a socket or file handle. | 62 // Create a socket or file handle. |
| 63 SerializedHandle(const Type type, | 63 SerializedHandle(const Type type, |
| 64 const IPC::PlatformFileForTransit& descriptor); | 64 const IPC::PlatformFileForTransit& descriptor); |
| 65 | 65 |
| 66 Type type() const { return type_; } | 66 Type type() const { return type_; } |
| 67 bool is_shmem() const { return type_ == SHARED_MEMORY; } | 67 bool is_shmem() const { return type_ == SHARED_MEMORY; } |
| 68 bool is_socket() const { return type_ == SOCKET; } | 68 bool is_socket() const { return type_ == SOCKET; } |
| 69 bool is_file() const { return type_ == FILE; } | 69 bool is_file() const { return type_ == FILE; } |
| 70 const base::SharedMemoryHandle& shmem() const { | 70 const base::SharedMemoryHandle& shmem() const { |
| 71 DCHECK(is_shmem()); | 71 DCHECK(is_shmem()); |
| 72 return shm_handle_; | 72 return shm_handle_; |
| 73 } | 73 } |
| 74 uint32 size() const { | 74 uint32_t size() const { |
| 75 DCHECK(is_shmem()); | 75 DCHECK(is_shmem()); |
| 76 return size_; | 76 return size_; |
| 77 } | 77 } |
| 78 const IPC::PlatformFileForTransit& descriptor() const { | 78 const IPC::PlatformFileForTransit& descriptor() const { |
| 79 DCHECK(is_socket() || is_file()); | 79 DCHECK(is_socket() || is_file()); |
| 80 return descriptor_; | 80 return descriptor_; |
| 81 } | 81 } |
| 82 int32 open_flags() const { | 82 int32_t open_flags() const { return open_flags_; } |
| 83 return open_flags_; | |
| 84 } | |
| 85 PP_Resource file_io() const { | 83 PP_Resource file_io() const { |
| 86 return file_io_; | 84 return file_io_; |
| 87 } | 85 } |
| 88 void set_shmem(const base::SharedMemoryHandle& handle, uint32 size) { | 86 void set_shmem(const base::SharedMemoryHandle& handle, uint32_t size) { |
| 89 type_ = SHARED_MEMORY; | 87 type_ = SHARED_MEMORY; |
| 90 shm_handle_ = handle; | 88 shm_handle_ = handle; |
| 91 size_ = size; | 89 size_ = size; |
| 92 | 90 |
| 93 descriptor_ = IPC::InvalidPlatformFileForTransit(); | 91 descriptor_ = IPC::InvalidPlatformFileForTransit(); |
| 94 } | 92 } |
| 95 void set_socket(const IPC::PlatformFileForTransit& socket) { | 93 void set_socket(const IPC::PlatformFileForTransit& socket) { |
| 96 type_ = SOCKET; | 94 type_ = SOCKET; |
| 97 descriptor_ = socket; | 95 descriptor_ = socket; |
| 98 | 96 |
| 99 shm_handle_ = base::SharedMemory::NULLHandle(); | 97 shm_handle_ = base::SharedMemory::NULLHandle(); |
| 100 size_ = 0; | 98 size_ = 0; |
| 101 } | 99 } |
| 102 void set_file_handle(const IPC::PlatformFileForTransit& descriptor, | 100 void set_file_handle(const IPC::PlatformFileForTransit& descriptor, |
| 103 int32 open_flags, | 101 int32_t open_flags, |
| 104 PP_Resource file_io) { | 102 PP_Resource file_io) { |
| 105 type_ = FILE; | 103 type_ = FILE; |
| 106 | 104 |
| 107 descriptor_ = descriptor; | 105 descriptor_ = descriptor; |
| 108 shm_handle_ = base::SharedMemory::NULLHandle(); | 106 shm_handle_ = base::SharedMemory::NULLHandle(); |
| 109 size_ = 0; | 107 size_ = 0; |
| 110 open_flags_ = open_flags; | 108 open_flags_ = open_flags; |
| 111 file_io_ = file_io; | 109 file_io_ = file_io; |
| 112 } | 110 } |
| 113 void set_null_shmem() { | 111 void set_null_shmem() { |
| (...skipping 23 matching lines...) Expand all Loading... |
| 137 private: | 135 private: |
| 138 // The kind of handle we're holding. | 136 // The kind of handle we're holding. |
| 139 Type type_; | 137 Type type_; |
| 140 | 138 |
| 141 // We hold more members than we really need; we can't easily use a union, | 139 // We hold more members than we really need; we can't easily use a union, |
| 142 // because we hold non-POD types. But these types are pretty light-weight. If | 140 // because we hold non-POD types. But these types are pretty light-weight. If |
| 143 // we add more complex things later, we should come up with a more memory- | 141 // we add more complex things later, we should come up with a more memory- |
| 144 // efficient strategy. | 142 // efficient strategy. |
| 145 // These are valid if type == SHARED_MEMORY. | 143 // These are valid if type == SHARED_MEMORY. |
| 146 base::SharedMemoryHandle shm_handle_; | 144 base::SharedMemoryHandle shm_handle_; |
| 147 uint32 size_; | 145 uint32_t size_; |
| 148 | 146 |
| 149 // This is valid if type == SOCKET || type == FILE. | 147 // This is valid if type == SOCKET || type == FILE. |
| 150 IPC::PlatformFileForTransit descriptor_; | 148 IPC::PlatformFileForTransit descriptor_; |
| 151 | 149 |
| 152 // The following fields are valid if type == FILE. | 150 // The following fields are valid if type == FILE. |
| 153 int32 open_flags_; | 151 int32_t open_flags_; |
| 154 // This is non-zero if file writes require quota checking. | 152 // This is non-zero if file writes require quota checking. |
| 155 PP_Resource file_io_; | 153 PP_Resource file_io_; |
| 156 }; | 154 }; |
| 157 | 155 |
| 158 } // namespace proxy | 156 } // namespace proxy |
| 159 } // namespace ppapi | 157 } // namespace ppapi |
| 160 | 158 |
| 161 #endif // PPAPI_PROXY_SERIALIZED_HANDLES_H_ | 159 #endif // PPAPI_PROXY_SERIALIZED_HANDLES_H_ |
| OLD | NEW |