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
3// found in the LICENSE file.
4
5#ifndef PPAPI_PROXY_PPB_BUFFER_PROXY_H_
6#define PPAPI_PROXY_PPB_BUFFER_PROXY_H_
7
8#include "base/memory/shared_memory.h"
9#include "ppapi/c/pp_instance.h"
10#include "ppapi/proxy/interface_proxy.h"
11#include "ppapi/shared_impl/resource.h"
12#include "ppapi/thunk/ppb_buffer_api.h"
13
14namespace ppapi {
15
16class HostResource;
17
18namespace proxy {
19
20class SerializedHandle;
21
22class Buffer : public thunk::PPB_Buffer_API, public Resource {
23 public:
24  Buffer(const HostResource& resource,
25         const base::SharedMemoryHandle& shm_handle,
26         uint32_t size);
27  virtual ~Buffer();
28
29  // Resource overrides.
30  virtual thunk::PPB_Buffer_API* AsPPB_Buffer_API() OVERRIDE;
31
32  // PPB_Buffer_API implementation.
33  virtual PP_Bool Describe(uint32_t* size_in_bytes) OVERRIDE;
34  virtual PP_Bool IsMapped() OVERRIDE;
35  virtual void* Map() OVERRIDE;
36  virtual void Unmap() OVERRIDE;
37
38  // Trusted
39  virtual int32_t GetSharedMemory(int* handle) OVERRIDE;
40
41 private:
42  base::SharedMemory shm_;
43  uint32_t size_;
44  int map_count_;
45
46  DISALLOW_COPY_AND_ASSIGN(Buffer);
47};
48
49class PPB_Buffer_Proxy : public InterfaceProxy {
50 public:
51  explicit PPB_Buffer_Proxy(Dispatcher* dispatcher);
52  virtual ~PPB_Buffer_Proxy();
53
54  static PP_Resource CreateProxyResource(PP_Instance instance,
55                                         uint32_t size);
56  static PP_Resource AddProxyResource(const HostResource& resource,
57                                      base::SharedMemoryHandle shm_handle,
58                                      uint32_t size);
59
60  // InterfaceProxy implementation.
61  virtual bool OnMessageReceived(const IPC::Message& msg);
62
63  static const ApiID kApiID = API_ID_PPB_BUFFER;
64
65 private:
66  // Message handlers.
67  void OnMsgCreate(PP_Instance instance,
68                   uint32_t size,
69                   HostResource* result_resource,
70                   ppapi::proxy::SerializedHandle* result_shm_handle);
71};
72
73}  // namespace proxy
74}  // namespace ppapi
75
76#endif  // PPAPI_PROXY_PPB_BUFFER_PROXY_H_
77