15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#ifndef CONTENT_RENDERER_PEPPER_PPB_BUFFER_IMPL_H_
6bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#define CONTENT_RENDERER_PEPPER_PPB_BUFFER_IMPL_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/ref_counted.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
119ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/memory/shared_memory.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/shared_impl/resource.h"
139ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "ppapi/thunk/ppb_buffer_api.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochnamespace content {
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochclass PPB_Buffer_Impl : public ppapi::Resource,
18ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                        public ppapi::thunk::PPB_Buffer_API {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static PP_Resource Create(PP_Instance instance, uint32_t size);
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static scoped_refptr<PPB_Buffer_Impl> CreateResource(PP_Instance instance,
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                       uint32_t size);
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual PPB_Buffer_Impl* AsPPB_Buffer_Impl();
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::SharedMemory* shared_memory() const { return shared_memory_.get(); }
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32_t size() const { return size_; }
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Resource overrides.
30ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  virtual ppapi::thunk::PPB_Buffer_API* AsPPB_Buffer_API() OVERRIDE;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // PPB_Buffer_API implementation.
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual PP_Bool Describe(uint32_t* size_in_bytes) OVERRIDE;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual PP_Bool IsMapped() OVERRIDE;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void* Map() OVERRIDE;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Unmap() OVERRIDE;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Trusted.
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int32_t GetSharedMemory(int* handle) OVERRIDE;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
42bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  virtual ~PPB_Buffer_Impl();
43bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit PPB_Buffer_Impl(PP_Instance instance);
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool Init(uint32_t size);
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<base::SharedMemory> shared_memory_;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32_t size_;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int map_count_;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(PPB_Buffer_Impl);
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Ensures that the given buffer is mapped, and returns it to its previous
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// mapped state in the destructor.
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BufferAutoMapper {
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
58ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  explicit BufferAutoMapper(ppapi::thunk::PPB_Buffer_API* api);
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~BufferAutoMapper();
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Will be NULL on failure to map.
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void* data() { return data_; }
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32_t size() { return size_; }
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
66ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ppapi::thunk::PPB_Buffer_API* api_;
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool needs_unmap_;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void* data_;
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32_t size_;
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(BufferAutoMapper);
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch}  // namespace content
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
78bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#endif  // CONTENT_RENDERER_PEPPER_PPB_BUFFER_IMPL_H_
79