1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
|
// Copyright (c) 2010 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 WEBKIT_GLUE_PLUGINS_PEPPER_RESOURCE_H_
#define WEBKIT_GLUE_PLUGINS_PEPPER_RESOURCE_H_
#include "base/basictypes.h"
#include "base/ref_counted.h"
#include "ppapi/c/pp_resource.h"
#include "webkit/glue/plugins/pepper_resource_tracker.h"
namespace pepper {
// If you inherit from resource, make sure you add the class name here.
#define FOR_ALL_RESOURCES(F) \
F(Audio) \
F(AudioConfig) \
F(Buffer) \
F(DirectoryReader) \
F(FileChooser) \
F(FileIO) \
F(FileRef) \
F(FileSystem) \
F(Font) \
F(Graphics2D) \
F(Graphics3D) \
F(ImageData) \
F(ObjectVar) \
F(PluginModule) \
F(PrivateFontFile) \
F(Scrollbar) \
F(StringVar) \
F(Transport) \
F(URLLoader) \
F(URLRequestInfo) \
F(URLResponseInfo) \
F(Var) \
F(VarObjectClass) \
F(VideoDecoder) \
F(Widget)
// Forward declaration of Resource classes.
#define DECLARE_RESOURCE_CLASS(RESOURCE) class RESOURCE;
FOR_ALL_RESOURCES(DECLARE_RESOURCE_CLASS)
#undef DECLARE_RESOURCE_CLASS
class Resource : public base::RefCountedThreadSafe<Resource> {
public:
explicit Resource(PluginModule* module);
virtual ~Resource();
// Returns NULL if the resource is invalid or is a different type.
template<typename T>
static scoped_refptr<T> GetAs(PP_Resource res) {
scoped_refptr<Resource> resource = ResourceTracker::Get()->GetResource(res);
return resource ? resource->Cast<T>() : NULL;
}
PluginModule* module() const { return module_; }
// Cast the resource into a specified type. This will return NULL if the
// resource does not match the specified type. Specializations of this
// template call into As* functions.
template <typename T> T* Cast() { return NULL; }
// Returns an resource id of this object. If the object doesn't have a
// resource id, new one is created with plugin refcount of 1. If it does,
// the refcount is incremented. Use this when you need to return a new
// reference to the plugin.
PP_Resource GetReference();
// Returns the resource ID of this object OR NULL IF THERE IS NONE ASSIGNED.
// This will happen if the plugin doesn't have a reference to the given
// resource. The resource will not be addref'ed.
//
// This should only be used as an input parameter to the plugin for status
// updates in the proxy layer, where if the plugin has no reference, it will
// just give up since nothing needs to be updated.
//
// Generally you should use GetReference instead. This is why it has this
// obscure name rather than pp_resource().
PP_Resource GetReferenceNoAddRef() const;
// When you need to ensure that a resource has a reference, but you do not
// want to increase the refcount (for example, if you need to call a plugin
// callback function with a reference), you can use this class. For example:
//
// plugin_callback(.., ScopedResourceId(resource).id, ...);
class ScopedResourceId {
public:
explicit ScopedResourceId(Resource* resource)
: id(resource->GetReference()) {}
~ScopedResourceId() {
ResourceTracker::Get()->UnrefResource(id);
}
const PP_Resource id;
};
private:
// Type-specific getters for individual resource types. These will return
// NULL if the resource does not match the specified type. Used by the Cast()
// function.
#define DEFINE_TYPE_GETTER(RESOURCE) \
virtual RESOURCE* As##RESOURCE() { return NULL; }
FOR_ALL_RESOURCES(DEFINE_TYPE_GETTER)
#undef DEFINE_TYPE_GETTER
// If referenced by a plugin, holds the id of this resource object. Do not
// access this member directly, because it is possible that the plugin holds
// no references to the object, and therefore the resource_id_ is zero. Use
// either GetReference() to obtain a new resource_id and increase the
// refcount, or TemporaryReference when you do not want to increase the
// refcount.
PP_Resource resource_id_;
// Non-owning pointer to our module.
PluginModule* module_;
// Called by the resource tracker when the last plugin reference has been
// dropped.
friend class ResourceTracker;
void StoppedTracking();
DISALLOW_COPY_AND_ASSIGN(Resource);
};
// Cast() specializations.
#define DEFINE_RESOURCE_CAST(Type) \
template <> inline Type* Resource::Cast<Type>() { \
return As##Type(); \
}
FOR_ALL_RESOURCES(DEFINE_RESOURCE_CAST)
#undef DEFINE_RESOURCE_CAST
#undef FOR_ALL_RESOURCES
} // namespace pepper
#endif // WEBKIT_GLUE_PLUGINS_PEPPER_RESOURCE_H_
|