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)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef PPAPI_SHARED_IMPL_SCOPED_RESOURCE_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PPAPI_SHARED_IMPL_SCOPED_RESOURCE_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/pp_resource.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/shared_impl/ppapi_shared_export.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ppapi {
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Resource;
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This is a version of scoped_refptr but for PP_Resources.
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PPAPI_SHARED_EXPORT ScopedPPResource {
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct PassRef {};
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedPPResource();
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Takes one reference to the given resource.
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit ScopedPPResource(PP_Resource resource);
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Assumes responsibility for one ref that the resource already has.
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit ScopedPPResource(const PassRef&, PP_Resource resource);
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Helper to get the PP_Resource out of the given object and take a reference
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // to it.
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit ScopedPPResource(Resource* resource);
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Implicit copy constructor allowed.
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedPPResource(const ScopedPPResource& other);
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~ScopedPPResource();
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedPPResource& operator=(PP_Resource resource);
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedPPResource& operator=(const ScopedPPResource& resource);
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the PP_Resource without affecting the refcounting.
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PP_Resource get() const { return id_; }
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  operator PP_Resource() const { return id_; }
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the PP_Resource, passing the reference to the caller. This class
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // will no longer hold the resource.
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PP_Resource Release();
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Helpers to addref or release the id_ if it's non-NULL. The id_ value will
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // be unchanged.
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CallAddRef();
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CallRelease();
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PP_Resource id_;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace ppapi
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // PPAPI_SHARED_IMPL_SCOPED_RESOURCE_H_
60