summaryrefslogtreecommitdiffstats
path: root/ppapi/thunk/enter.h
diff options
context:
space:
mode:
Diffstat (limited to 'ppapi/thunk/enter.h')
-rw-r--r--ppapi/thunk/enter.h83
1 files changed, 73 insertions, 10 deletions
diff --git a/ppapi/thunk/enter.h b/ppapi/thunk/enter.h
index e2c6938..86d6022 100644
--- a/ppapi/thunk/enter.h
+++ b/ppapi/thunk/enter.h
@@ -66,16 +66,67 @@ struct LockOnEntry<true> {
}
};
+// Keep non-templatized since we need non-inline functions here.
+class PPAPI_THUNK_EXPORT EnterBase {
+ public:
+ EnterBase();
+ explicit EnterBase(const PP_CompletionCallback& callback);
+ virtual ~EnterBase();
+
+ // Sets the result.
+ //
+ // Returns the "retval()". This is to support the typical usage of
+ // return enter.SetResult(...);
+ // without having to write a separate "return enter.retval();" line.
+ int32_t SetResult(int32_t result);
+
+ // Use this value as the return value for the function.
+ int32_t retval() const { return retval_; }
+
+ protected:
+ // Helper function to return a function group from a PP_Instance. Having this
+ // code be in the non-templatized base keeps us from having to instantiate
+ // it in every template.
+ FunctionGroupBase* GetFunctions(PP_Instance instance, ApiID id) const;
+
+ // Helper function to return a Resource from a PP_Resource. Having this
+ // code be in the non-templatized base keeps us from having to instantiate
+ // it in every template.
+ Resource* GetResource(PP_Resource resource) const;
+
+ // Does error handling associated with entering a resource. The resource_base
+ // is the result of looking up the given pp_resource. The object is the
+ // result of converting the base to the desired object (converted back to a
+ // Resource* so this function doesn't have to be templatized). The reason for
+ // passing both resource_base and object is that we can differentiate "bad
+ // resource ID" from "valid resource ID not of the currect type."
+ //
+ // This will set retval_ = PP_ERROR_BADRESOURCE if the object is invalid, and
+ // if report_error is set, log a message to the programmer.
+ void SetStateForResourceError(PP_Resource pp_resource,
+ Resource* resource_base,
+ void* object,
+ bool report_error);
+
+ private:
+ // Holds the callback. The function will only be non-NULL when the
+ // callback is requried. Optional callbacks don't require any special
+ // handling from us at this layer.
+ PP_CompletionCallback callback_;
+
+ int32_t retval_;
+};
+
} // namespace subtle
template<typename FunctionsT, bool lock_on_entry = true>
-class EnterFunction : subtle::LockOnEntry<lock_on_entry> {
+class EnterFunction : public subtle::EnterBase,
+ public subtle::LockOnEntry<lock_on_entry> {
public:
EnterFunction(PP_Instance instance, bool report_error)
: functions_(NULL) {
- FunctionGroupBase* base = PpapiGlobals::Get()->GetFunctionAPI(
- instance, FunctionsT::kApiID);
+ FunctionGroupBase* base = GetFunctions(instance, FunctionsT::kApiID);
if (base)
functions_ = base->GetAs<FunctionsT>();
// TODO(brettw) check error and if report_error is set, do something.
@@ -124,15 +175,18 @@ class EnterFunctionGivenResource : public EnterFunction<FunctionsT> {
// EnterResource ---------------------------------------------------------------
template<typename ResourceT, bool lock_on_entry = true>
-class EnterResource : subtle::LockOnEntry<lock_on_entry> {
+class EnterResource : public subtle::EnterBase,
+ public subtle::LockOnEntry<lock_on_entry> {
public:
EnterResource(PP_Resource resource, bool report_error)
- : object_(NULL) {
- resource_ =
- PpapiGlobals::Get()->GetResourceTracker()->GetResource(resource);
- if (resource_)
- object_ = resource_->GetAs<ResourceT>();
- // TODO(brettw) check error and if report_error is set, do something.
+ : EnterBase() {
+ Init(resource, report_error);
+ }
+ EnterResource(PP_Resource resource,
+ const PP_CompletionCallback& callback,
+ bool report_error)
+ : EnterBase(callback) {
+ Init(resource, report_error);
}
~EnterResource() {}
@@ -143,6 +197,15 @@ class EnterResource : subtle::LockOnEntry<lock_on_entry> {
Resource* resource() { return resource_; }
private:
+ void Init(PP_Resource resource, bool report_error) {
+ resource_ = GetResource(resource);
+ if (resource_)
+ object_ = resource_->GetAs<ResourceT>();
+ else
+ object_ = NULL;
+ SetStateForResourceError(resource, resource_, object_, report_error);
+ }
+
Resource* resource_;
ResourceT* object_;