- add sources.
[platform/framework/web/crosswalk.git] / src / ppapi / shared_impl / scoped_pp_resource.cc
1 // Copyright (c) 2011 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 #include "ppapi/shared_impl/scoped_pp_resource.h"
6
7 #include "ppapi/shared_impl/ppapi_globals.h"
8 #include "ppapi/shared_impl/resource.h"
9 #include "ppapi/shared_impl/resource_tracker.h"
10
11 namespace ppapi {
12
13 ScopedPPResource::ScopedPPResource() : id_(0) {
14 }
15
16 ScopedPPResource::ScopedPPResource(PP_Resource resource) : id_(resource) {
17   CallAddRef();
18 }
19
20 ScopedPPResource::ScopedPPResource(const PassRef&, PP_Resource resource)
21     : id_(resource) {
22 }
23
24 ScopedPPResource::ScopedPPResource(Resource* resource)
25     : id_(resource ? resource->GetReference() : 0) {
26   // GetReference AddRef's for us.
27 }
28
29 ScopedPPResource::ScopedPPResource(const ScopedPPResource& other)
30     : id_(other.id_) {
31   CallAddRef();
32 }
33
34 ScopedPPResource::~ScopedPPResource() {
35   CallRelease();
36 }
37
38 ScopedPPResource& ScopedPPResource::operator=(PP_Resource resource) {
39   if (id_ == resource)
40     return *this;  // Be careful about self-assignment.
41   CallRelease();
42   id_ = resource;
43   CallAddRef();
44   return *this;
45 }
46
47 ScopedPPResource& ScopedPPResource::operator=(
48     const ScopedPPResource& resource) {
49   if (id_ == resource.id_)
50     return *this;  // Be careful about self-assignment.
51   CallRelease();
52   id_ = resource.id_;
53   CallAddRef();
54   return *this;
55 }
56
57 PP_Resource ScopedPPResource::Release() {
58   // We do NOT call CallRelease, because we want to pass our reference to the
59   // caller.
60
61   PP_Resource ret = id_;
62   id_ = 0;
63   return ret;
64 }
65
66 void ScopedPPResource::CallAddRef() {
67   if (id_)
68     PpapiGlobals::Get()->GetResourceTracker()->AddRefResource(id_);
69 }
70
71 void ScopedPPResource::CallRelease() {
72   if (id_)
73     PpapiGlobals::Get()->GetResourceTracker()->ReleaseResource(id_);
74 }
75
76 }  // namespace ppapi