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 #ifndef PPAPI_CPP_RESOURCE_H_ 6 #define PPAPI_CPP_RESOURCE_H_ 7 8 #include "ppapi/c/pp_resource.h" 9 #include "ppapi/cpp/instance_handle.h" 10 #include "ppapi/cpp/pass_ref.h" 11 12 /// @file 13 /// This file defines a <code>Resource</code> type representing data associated 14 /// with the module. 15 namespace pp { 16 17 class VarResource_Dev; 18 19 /// A reference counted module resource. 20 class Resource { 21 public: 22 /// The default constructor. 23 Resource(); 24 25 /// A constructor for copying a resource. 26 /// 27 /// @param[in] other A <code>Resource</code>. 28 Resource(const Resource& other); 29 30 /// Destructor. 31 virtual ~Resource(); 32 33 /// This function assigns one <code>Resource</code> to another 34 /// <code>Resource</code>. 35 /// 36 /// @param[in] other A Resource. 37 /// 38 /// @return A Resource containing the assigned Resource. 39 Resource& operator=(const Resource& other); 40 41 /// This functions determines if this resource is invalid or 42 /// uninitialized. 43 /// 44 /// @return true if this resource is invalid or uninitialized. 45 bool is_null() const { return !pp_resource_; } 46 47 PP_Resource pp_resource() const { return pp_resource_; } 48 49 /// This function releases ownership of this resource and returns it to the 50 /// caller. 51 /// 52 /// Note that the reference count on the resource is unchanged and the caller 53 /// needs to release the resource. 54 /// 55 /// @return The detached <code>PP_Resource</code>. 56 PP_Resource detach(); 57 58 protected: 59 /// A constructor used when a <code>PP_Resource</code> is provided as a 60 /// return value whose reference count we need to increment. 61 /// 62 /// @param[in] resource A <code>PP_Resource</code> corresponding to a 63 /// resource. 64 explicit Resource(PP_Resource resource); 65 66 /// Constructor used when a <code>PP_Resource</code> already has a ref count 67 /// assigned. Add additional refcount is not taken. 68 Resource(PassRef, PP_Resource resource); 69 70 /// PassRefFromConstructor is called by derived class' constructors to 71 /// initialize this <code>Resource</code> with a <code>PP_Resource</code> 72 /// that has already had its reference count incremented by 73 /// <code>Core::AddRefResource</code>. It also assumes this object has no 74 /// current resource. 75 /// 76 /// The intended usage of this function that the derived class constructor 77 /// will call the default <code>Resource</code> constructor, then make a call 78 /// to create a resource. It then wants to assign the new resource (which, 79 /// since it was returned by the browser, already had its reference count 80 /// increased). 81 /// 82 /// @param[in] resource A <code>PP_Resource</code> corresponding to a 83 /// resource. 84 void PassRefFromConstructor(PP_Resource resource); 85 86 /// Sets this resource to null. This releases ownership of the resource. 87 void Clear(); 88 89 private: 90 friend class VarResource_Dev; 91 92 PP_Resource pp_resource_; 93 }; 94 95 } // namespace pp 96 97 inline bool operator==(const pp::Resource& lhs, const pp::Resource& rhs) { 98 return lhs.pp_resource() == rhs.pp_resource(); 99 } 100 101 inline bool operator!=(const pp::Resource& lhs, const pp::Resource& rhs) { 102 return !(lhs == rhs); 103 } 104 105 #endif // PPAPI_CPP_RESOURCE_H_ 106