| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 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_STRUCTS_H_ | 5 #ifndef PPAPI_PROXY_SERIALIZED_STRUCTS_H_ |
| 6 #define PPAPI_PROXY_SERIALIZED_STRUCTS_H_ | 6 #define PPAPI_PROXY_SERIALIZED_STRUCTS_H_ |
| 7 | 7 |
| 8 #include <string> | 8 #include <string> |
| 9 #include <vector> | 9 #include <vector> |
| 10 | 10 |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 100 struct PPPVideoCapture_Buffer { | 100 struct PPPVideoCapture_Buffer { |
| 101 ppapi::HostResource resource; | 101 ppapi::HostResource resource; |
| 102 uint32_t size; | 102 uint32_t size; |
| 103 base::SharedMemoryHandle handle; | 103 base::SharedMemoryHandle handle; |
| 104 }; | 104 }; |
| 105 | 105 |
| 106 // We put all our handles in a unified structure to make it easy to translate | 106 // We put all our handles in a unified structure to make it easy to translate |
| 107 // them in NaClIPCAdapter for use in NaCl. | 107 // them in NaClIPCAdapter for use in NaCl. |
| 108 class PPAPI_PROXY_EXPORT SerializedHandle { | 108 class PPAPI_PROXY_EXPORT SerializedHandle { |
| 109 public: | 109 public: |
| 110 enum Type { INVALID, SHARED_MEMORY, SOCKET }; | 110 enum Type { INVALID, SHARED_MEMORY, SOCKET, CHANNEL_HANDLE }; |
| 111 struct Header { | 111 struct Header { |
| 112 Header() : type(INVALID), size(0) {} | 112 Header() : type(INVALID), size(0) {} |
| 113 Header(Type type_arg, uint32_t size_arg) | 113 Header(Type type_arg, uint32_t size_arg) |
| 114 : type(type_arg), size(size_arg) { | 114 : type(type_arg), size(size_arg) { |
| 115 } | 115 } |
| 116 Type type; | 116 Type type; |
| 117 uint32_t size; | 117 uint32_t size; |
| 118 }; | 118 }; |
| 119 | 119 |
| 120 SerializedHandle(); | 120 SerializedHandle(); |
| 121 // Create an invalid handle of the given type. | 121 // Create an invalid handle of the given type. |
| 122 explicit SerializedHandle(Type type); | 122 explicit SerializedHandle(Type type); |
| 123 | 123 |
| 124 // Create a shared memory handle. | 124 // Create a shared memory handle. |
| 125 SerializedHandle(const base::SharedMemoryHandle& handle, uint32_t size); | 125 SerializedHandle(const base::SharedMemoryHandle& handle, uint32_t size); |
| 126 | 126 |
| 127 // Create a socket handle. | 127 // Create a socket or channel handle. |
| 128 // TODO(dmichael): If we have other ways to use FDs later, this would be | 128 SerializedHandle(const Type type, |
| 129 // ambiguous. | 129 const IPC::PlatformFileForTransit& descriptor); |
| 130 explicit SerializedHandle( | |
| 131 const IPC::PlatformFileForTransit& socket_descriptor); | |
| 132 | 130 |
| 133 Type type() const { return type_; } | 131 Type type() const { return type_; } |
| 134 bool is_shmem() const { return type_ == SHARED_MEMORY; } | 132 bool is_shmem() const { return type_ == SHARED_MEMORY; } |
| 135 bool is_socket() const { return type_ == SOCKET; } | 133 bool is_socket() const { return type_ == SOCKET; } |
| 134 bool is_channel_handle() const { return type_ == CHANNEL_HANDLE; } |
| 136 const base::SharedMemoryHandle& shmem() const { | 135 const base::SharedMemoryHandle& shmem() const { |
| 137 DCHECK(is_shmem()); | 136 DCHECK(is_shmem()); |
| 138 return shm_handle_; | 137 return shm_handle_; |
| 139 } | 138 } |
| 140 uint32_t size() const { | 139 uint32_t size() const { |
| 141 DCHECK(is_shmem()); | 140 DCHECK(is_shmem()); |
| 142 return size_; | 141 return size_; |
| 143 } | 142 } |
| 144 const IPC::PlatformFileForTransit& descriptor() const { | 143 const IPC::PlatformFileForTransit& descriptor() const { |
| 145 DCHECK(is_socket()); | 144 DCHECK(is_socket() || is_channel_handle()); |
| 146 return descriptor_; | 145 return descriptor_; |
| 147 } | 146 } |
| 148 void set_shmem(const base::SharedMemoryHandle& handle, uint32_t size) { | 147 void set_shmem(const base::SharedMemoryHandle& handle, uint32_t size) { |
| 149 type_ = SHARED_MEMORY; | 148 type_ = SHARED_MEMORY; |
| 150 shm_handle_ = handle; | 149 shm_handle_ = handle; |
| 151 size_ = size; | 150 size_ = size; |
| 152 | 151 |
| 153 descriptor_ = IPC::InvalidPlatformFileForTransit(); | 152 descriptor_ = IPC::InvalidPlatformFileForTransit(); |
| 154 } | 153 } |
| 155 void set_socket(const IPC::PlatformFileForTransit& socket) { | 154 void set_socket(const IPC::PlatformFileForTransit& socket) { |
| 156 type_ = SOCKET; | 155 type_ = SOCKET; |
| 157 descriptor_ = socket; | 156 descriptor_ = socket; |
| 158 | 157 |
| 159 shm_handle_ = base::SharedMemory::NULLHandle(); | 158 shm_handle_ = base::SharedMemory::NULLHandle(); |
| 160 size_ = 0; | 159 size_ = 0; |
| 161 } | 160 } |
| 161 void set_channel_handle(const IPC::PlatformFileForTransit& descriptor) { |
| 162 type_ = CHANNEL_HANDLE; |
| 163 |
| 164 descriptor_ = descriptor; |
| 165 shm_handle_ = base::SharedMemory::NULLHandle(); |
| 166 size_ = 0; |
| 167 } |
| 162 void set_null_shmem() { | 168 void set_null_shmem() { |
| 163 set_shmem(base::SharedMemory::NULLHandle(), 0); | 169 set_shmem(base::SharedMemory::NULLHandle(), 0); |
| 164 } | 170 } |
| 165 void set_null_socket() { | 171 void set_null_socket() { |
| 166 set_socket(IPC::InvalidPlatformFileForTransit()); | 172 set_socket(IPC::InvalidPlatformFileForTransit()); |
| 167 } | 173 } |
| 174 void set_null_channel_handle() { |
| 175 set_channel_handle(IPC::InvalidPlatformFileForTransit()); |
| 176 } |
| 168 bool IsHandleValid() const; | 177 bool IsHandleValid() const; |
| 169 | 178 |
| 170 Header header() const { | 179 Header header() const { |
| 171 return Header(type_, size_); | 180 return Header(type_, size_); |
| 172 } | 181 } |
| 173 | 182 |
| 174 // Write/Read a Header, which contains all the data except the handle. This | 183 // Write/Read a Header, which contains all the data except the handle. This |
| 175 // allows us to write the handle in a platform-specific way, as is necessary | 184 // allows us to write the handle in a platform-specific way, as is necessary |
| 176 // in NaClIPCAdapter to share handles with NaCl from Windows. | 185 // in NaClIPCAdapter to share handles with NaCl from Windows. |
| 177 static bool WriteHeader(const Header& hdr, Pickle* pickle); | 186 static bool WriteHeader(const Header& hdr, Pickle* pickle); |
| 178 static bool ReadHeader(PickleIterator* iter, Header* hdr); | 187 static bool ReadHeader(PickleIterator* iter, Header* hdr); |
| 179 | 188 |
| 180 private: | 189 private: |
| 181 // The kind of handle we're holding. | 190 // The kind of handle we're holding. |
| 182 Type type_; | 191 Type type_; |
| 183 | 192 |
| 184 // We hold more members than we really need; we can't easily use a union, | 193 // We hold more members than we really need; we can't easily use a union, |
| 185 // because we hold non-POD types. But these types are pretty light-weight. If | 194 // because we hold non-POD types. But these types are pretty light-weight. If |
| 186 // we add more complex things later, we should come up with a more memory- | 195 // we add more complex things later, we should come up with a more memory- |
| 187 // efficient strategy. | 196 // efficient strategy. |
| 188 // These are valid if type == SHARED_MEMORY. | 197 // These are valid if type == SHARED_MEMORY. |
| 189 base::SharedMemoryHandle shm_handle_; | 198 base::SharedMemoryHandle shm_handle_; |
| 190 uint32_t size_; | 199 uint32_t size_; |
| 191 | 200 |
| 192 // This is valid if type == SOCKET. | 201 // This is valid if type == SOCKET || type == CHANNEL_HANDLE. |
| 193 IPC::PlatformFileForTransit descriptor_; | 202 IPC::PlatformFileForTransit descriptor_; |
| 194 }; | 203 }; |
| 195 | 204 |
| 196 // TODO(tomfinegan): This is identical to PPPVideoCapture_Buffer, maybe replace | 205 // TODO(tomfinegan): This is identical to PPPVideoCapture_Buffer, maybe replace |
| 197 // both with a single type? | 206 // both with a single type? |
| 198 struct PPPDecryptor_Buffer { | 207 struct PPPDecryptor_Buffer { |
| 199 ppapi::HostResource resource; | 208 ppapi::HostResource resource; |
| 200 uint32_t size; | 209 uint32_t size; |
| 201 base::SharedMemoryHandle handle; | 210 base::SharedMemoryHandle handle; |
| 202 }; | 211 }; |
| 203 | 212 |
| 204 #if defined(OS_WIN) | 213 #if defined(OS_WIN) |
| 205 typedef HANDLE ImageHandle; | 214 typedef HANDLE ImageHandle; |
| 206 #elif defined(OS_MACOSX) || defined(OS_ANDROID) | 215 #elif defined(OS_MACOSX) || defined(OS_ANDROID) |
| 207 typedef base::SharedMemoryHandle ImageHandle; | 216 typedef base::SharedMemoryHandle ImageHandle; |
| 208 #else | 217 #else |
| 209 // On X Windows this is a SysV shared memory key. | 218 // On X Windows this is a SysV shared memory key. |
| 210 typedef int ImageHandle; | 219 typedef int ImageHandle; |
| 211 #endif | 220 #endif |
| 212 | 221 |
| 213 } // namespace proxy | 222 } // namespace proxy |
| 214 } // namespace ppapi | 223 } // namespace ppapi |
| 215 | 224 |
| 216 #endif // PPAPI_PROXY_SERIALIZED_STRUCTS_H_ | 225 #endif // PPAPI_PROXY_SERIALIZED_STRUCTS_H_ |
| OLD | NEW |