| Index: ppapi/proxy/serialized_structs.h | 
| diff --git a/ppapi/proxy/serialized_structs.h b/ppapi/proxy/serialized_structs.h | 
| index 31744495baab07ea84ffcd584ecf7f9190b0ab3f..7ad8456d8dc9a404945a38c5871095e196505c1a 100644 | 
| --- a/ppapi/proxy/serialized_structs.h | 
| +++ b/ppapi/proxy/serialized_structs.h | 
| @@ -8,6 +8,7 @@ | 
| #include <string> | 
| #include <vector> | 
|  | 
| +#include "base/logging.h" | 
| #include "base/shared_memory.h" | 
| #include "build/build_config.h" | 
| #include "ipc/ipc_platform_file.h" | 
| @@ -18,6 +19,7 @@ | 
| #include "ppapi/proxy/serialized_var.h" | 
| #include "ppapi/shared_impl/host_resource.h" | 
|  | 
| +class Pickle; | 
| struct PP_FontDescription_Dev; | 
|  | 
| namespace ppapi { | 
| @@ -101,6 +103,96 @@ struct PPPVideoCapture_Buffer { | 
| base::SharedMemoryHandle handle; | 
| }; | 
|  | 
| +// We put all our handles in a unified structure to make it easy to translate | 
| +// them in NaClIPCAdapter for use in NaCl. | 
| +class PPAPI_PROXY_EXPORT SerializedHandle { | 
| + public: | 
| +  enum Type { INVALID, SHARED_MEMORY, SOCKET }; | 
| +  struct Header { | 
| +    Header() : type(INVALID), size(0) {} | 
| +    Header(Type type_arg, uint32_t size_arg) | 
| +        : type(type_arg), size(size_arg) { | 
| +    } | 
| +    Type type; | 
| +    uint32_t size; | 
| +  }; | 
| + | 
| +  SerializedHandle(); | 
| +  // Create an invalid handle of the given type. | 
| +  explicit SerializedHandle(Type type); | 
| + | 
| +  // Create a shared memory handle. | 
| +  SerializedHandle(const base::SharedMemoryHandle& handle, uint32_t size); | 
| + | 
| +  // Create a socket handle. | 
| +  // TODO(dmichael): If we have other ways to use FDs later, this would be | 
| +  //                 ambiguous. | 
| +  explicit SerializedHandle( | 
| +      const IPC::PlatformFileForTransit& socket_descriptor); | 
| + | 
| +  Type type() const { return type_; } | 
| +  bool is_shmem() const { return type_ == SHARED_MEMORY; } | 
| +  bool is_socket() const { return type_ == SOCKET; } | 
| +  const base::SharedMemoryHandle& shmem() const { | 
| +    DCHECK(is_shmem()); | 
| +    return shm_handle_; | 
| +  } | 
| +  uint32_t size() const { | 
| +    DCHECK(is_shmem()); | 
| +    return size_; | 
| +  } | 
| +  const IPC::PlatformFileForTransit& descriptor() const { | 
| +    DCHECK(is_socket()); | 
| +    return descriptor_; | 
| +  } | 
| +  void set_shmem(const base::SharedMemoryHandle& handle, uint32_t size) { | 
| +    type_ = SHARED_MEMORY; | 
| +    shm_handle_ = handle; | 
| +    size_ = size; | 
| + | 
| +    descriptor_ = IPC::InvalidPlatformFileForTransit(); | 
| +  } | 
| +  void set_socket(const IPC::PlatformFileForTransit& socket) { | 
| +    type_ = SOCKET; | 
| +    descriptor_ = socket; | 
| + | 
| +    shm_handle_ = base::SharedMemory::NULLHandle(); | 
| +    size_ = 0; | 
| +  } | 
| +  void set_null_shmem() { | 
| +    set_shmem(base::SharedMemory::NULLHandle(), 0); | 
| +  } | 
| +  void set_null_socket() { | 
| +    set_socket(IPC::InvalidPlatformFileForTransit()); | 
| +  } | 
| +  bool IsHandleValid() const; | 
| + | 
| +  Header header() const { | 
| +    return Header(type_, size_); | 
| +  } | 
| + | 
| +  // Write/Read a Header, which contains all the data except the handle. This | 
| +  // allows us to write the handle in a platform-specific way, as is necessary | 
| +  // in NaClIPCAdapter to share handles with NaCl from Windows. | 
| +  static bool WriteHeader(const Header& hdr, Pickle* pickle); | 
| +  static bool ReadHeader(PickleIterator* iter, Header* hdr); | 
| + | 
| + private: | 
| +  // The kind of handle we're holding. | 
| +  Type type_; | 
| + | 
| +  // We hold more members than we really need; we can't easily use a union, | 
| +  // because we hold non-POD types. But these types are pretty light-weight. If | 
| +  // we add more complex things later, we should come up with a more memory- | 
| +  // efficient strategy. | 
| +  // These are valid if type == SHARED_MEMORY. | 
| +  base::SharedMemoryHandle shm_handle_; | 
| +  uint32_t size_; | 
| + | 
| +  // This is valid if type == SOCKET. | 
| +  IPC::PlatformFileForTransit descriptor_; | 
| +}; | 
| + | 
| // TODO(tomfinegan): This is identical to PPPVideoCapture_Buffer, maybe replace | 
| // both with a single type? | 
| struct PPPDecryptor_Buffer { | 
|  |