// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef PPAPI_CPP_RESOURCE_H_
#define PPAPI_CPP_RESOURCE_H_

#include "ppapi/c/pp_resource.h"
#include "ppapi/cpp/instance_handle.h"
#include "ppapi/cpp/pass_ref.h"

/// @file
/// This file defines a <code>Resource</code> type representing data associated
/// with the module.
namespace pp {

class Var;

/// A reference counted module resource.
class Resource {
 public:
  /// The default constructor.
  Resource();

  /// A constructor for copying a resource.
  ///
  /// @param[in] other A <code>Resource</code>.
  Resource(const Resource& other);

  /// Destructor.
  virtual ~Resource();

  /// This function assigns one <code>Resource</code> to another
  /// <code>Resource</code>.
  ///
  /// @param[in] other A Resource.
  ///
  /// @return A Resource containing the assigned Resource.
  Resource& operator=(const Resource& other);

  /// This functions determines if this resource is invalid or
  /// uninitialized.
  ///
  /// @return true if this resource is invalid or uninitialized.
  bool is_null() const { return !pp_resource_; }

  PP_Resource pp_resource() const { return pp_resource_; }

  /// This function releases ownership of this resource and returns it to the
  /// caller.
  ///
  /// Note that the reference count on the resource is unchanged and the caller
  /// needs to release the resource.
  ///
  /// @return The detached <code>PP_Resource</code>.
  PP_Resource detach();

 protected:
  /// A constructor used when a <code>PP_Resource</code> is provided as a
  /// return value whose reference count we need to increment.
  ///
  /// @param[in] resource A <code>PP_Resource</code> corresponding to a
  /// resource.
  explicit Resource(PP_Resource resource);

  /// Constructor used when a <code>PP_Resource</code> already has a ref count
  /// assigned. Add additional refcount is not taken.
  Resource(PassRef, PP_Resource resource);

  /// PassRefFromConstructor is called by derived class' constructors to
  /// initialize this <code>Resource</code> with a <code>PP_Resource</code>
  /// that has already had its reference count incremented by
  /// <code>Core::AddRefResource</code>. It also assumes this object has no
  /// current resource.
  ///
  /// The intended usage of this function that the derived class constructor
  /// will call the default <code>Resource</code> constructor, then make a call
  /// to create a resource. It then wants to assign the new resource (which,
  /// since it was returned by the browser, already had its reference count
  /// increased).
  ///
  /// @param[in] resource A <code>PP_Resource</code> corresponding to a
  /// resource.
  void PassRefFromConstructor(PP_Resource resource);

  /// Sets this resource to null. This releases ownership of the resource.
  void Clear();

 private:
  friend class Var;

  PP_Resource pp_resource_;
};

}  // namespace pp

inline bool operator==(const pp::Resource& lhs, const pp::Resource& rhs) {
  return lhs.pp_resource() == rhs.pp_resource();
}

inline bool operator!=(const pp::Resource& lhs, const pp::Resource& rhs) {
  return !(lhs == rhs);
}

#endif // PPAPI_CPP_RESOURCE_H_
