OLD | NEW |
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef PPAPI_PROXY_RAW_VAR_DATA_H_ | 5 #ifndef PPAPI_PROXY_RAW_VAR_DATA_H_ |
6 #define PPAPI_PROXY_RAW_VAR_DATA_H_ | 6 #define PPAPI_PROXY_RAW_VAR_DATA_H_ |
7 | 7 |
8 #include <stddef.h> | 8 #include <stddef.h> |
9 #include <stdint.h> | 9 #include <stdint.h> |
10 | 10 |
(...skipping 15 matching lines...) Expand all Loading... |
26 | 26 |
27 namespace IPC { | 27 namespace IPC { |
28 class Message; | 28 class Message; |
29 } | 29 } |
30 | 30 |
31 namespace ppapi { | 31 namespace ppapi { |
32 namespace proxy { | 32 namespace proxy { |
33 | 33 |
34 class RawVarData; | 34 class RawVarData; |
35 | 35 |
36 typedef base::Callback<void(IPC::Message*, const SerializedHandle&)> | 36 typedef base::Callback<void(base::Pickle*, const SerializedHandle&)> |
37 HandleWriter; | 37 HandleWriter; |
38 | 38 |
39 // Contains the data associated with a graph of connected PP_Vars. Useful for | 39 // Contains the data associated with a graph of connected PP_Vars. Useful for |
40 // serializing/deserializing a graph of PP_Vars. First we compute the transitive | 40 // serializing/deserializing a graph of PP_Vars. First we compute the transitive |
41 // closure of the given PP_Var to find all PP_Vars which are referenced by that | 41 // closure of the given PP_Var to find all PP_Vars which are referenced by that |
42 // var. A RawVarData object is created for each of these vars. We then write | 42 // var. A RawVarData object is created for each of these vars. We then write |
43 // data contained in each RawVarData to the message. The format looks like this: | 43 // data contained in each RawVarData to the message. The format looks like this: |
44 // idx | size | (number of vars in the graph) | 44 // idx | size | (number of vars in the graph) |
45 // 0 | var type | | 45 // 0 | var type | |
46 // | var data | | 46 // | var data | |
(...skipping 16 matching lines...) Expand all Loading... |
63 RawVarDataGraph(); | 63 RawVarDataGraph(); |
64 ~RawVarDataGraph(); | 64 ~RawVarDataGraph(); |
65 | 65 |
66 // Construct a new PP_Var from the graph. All of the PP_Vars referenced by | 66 // Construct a new PP_Var from the graph. All of the PP_Vars referenced by |
67 // the returned PP_Var are also constructed. Each PP_Var created has a | 67 // the returned PP_Var are also constructed. Each PP_Var created has a |
68 // ref-count equal to the number of references it has in the graph of vars. | 68 // ref-count equal to the number of references it has in the graph of vars. |
69 // The returned var (the "root") has one additional reference. | 69 // The returned var (the "root") has one additional reference. |
70 PP_Var CreatePPVar(PP_Instance instance); | 70 PP_Var CreatePPVar(PP_Instance instance); |
71 | 71 |
72 // Write the graph to a message using the given HandleWriter. | 72 // Write the graph to a message using the given HandleWriter. |
73 void Write(IPC::Message* m, const HandleWriter& handle_writer); | 73 void Write(base::Pickle* m, const HandleWriter& handle_writer); |
74 | 74 |
75 // Create a RawVarDataGraph from the given message. | 75 // Create a RawVarDataGraph from the given message. |
76 static scoped_ptr<RawVarDataGraph> Read(const IPC::Message* m, | 76 static scoped_ptr<RawVarDataGraph> Read(const base::Pickle* m, |
77 base::PickleIterator* iter); | 77 base::PickleIterator* iter); |
78 | 78 |
79 // Returns a vector of SerializedHandles associated with this RawVarDataGraph. | 79 // Returns a vector of SerializedHandles associated with this RawVarDataGraph. |
80 // Ownership of the pointers remains with the elements of the RawVarDataGraph. | 80 // Ownership of the pointers remains with the elements of the RawVarDataGraph. |
81 std::vector<SerializedHandle*> GetHandles(); | 81 std::vector<SerializedHandle*> GetHandles(); |
82 | 82 |
83 // Sets the threshold size at which point we switch from transmitting | 83 // Sets the threshold size at which point we switch from transmitting |
84 // array buffers in IPC messages to using shared memory. This is only used | 84 // array buffers in IPC messages to using shared memory. This is only used |
85 // for testing purposes where we need to transmit small buffers using shmem | 85 // for testing purposes where we need to transmit small buffers using shmem |
86 // (in order to have fast tests). | 86 // (in order to have fast tests). |
(...skipping 23 matching lines...) Expand all Loading... |
110 // Create a PP_Var from the raw data contained in this object. | 110 // Create a PP_Var from the raw data contained in this object. |
111 virtual PP_Var CreatePPVar(PP_Instance instance) = 0; | 111 virtual PP_Var CreatePPVar(PP_Instance instance) = 0; |
112 // Some PP_Vars may require 2-step initialization. For example, they may | 112 // Some PP_Vars may require 2-step initialization. For example, they may |
113 // reference other PP_Vars which had not yet been created when |CreatePPVar| | 113 // reference other PP_Vars which had not yet been created when |CreatePPVar| |
114 // was called. The original var created with |CreatePPVar| is passed back in, | 114 // was called. The original var created with |CreatePPVar| is passed back in, |
115 // along with the graph it is a part of to be initialized. | 115 // along with the graph it is a part of to be initialized. |
116 virtual void PopulatePPVar(const PP_Var& var, | 116 virtual void PopulatePPVar(const PP_Var& var, |
117 const std::vector<PP_Var>& graph) = 0; | 117 const std::vector<PP_Var>& graph) = 0; |
118 | 118 |
119 // Writes the RawVarData to a message. | 119 // Writes the RawVarData to a message. |
120 virtual void Write(IPC::Message* m, | 120 virtual void Write(base::Pickle* m, const HandleWriter& handle_writer) = 0; |
121 const HandleWriter& handle_writer) = 0; | |
122 // Reads the RawVarData from a message. Returns true on success. | 121 // Reads the RawVarData from a message. Returns true on success. |
123 virtual bool Read(PP_VarType type, | 122 virtual bool Read(PP_VarType type, |
124 const IPC::Message* m, | 123 const base::Pickle* m, |
125 base::PickleIterator* iter) = 0; | 124 base::PickleIterator* iter) = 0; |
126 | 125 |
127 // Returns a SerializedHandle associated with this RawVarData or NULL if none | 126 // Returns a SerializedHandle associated with this RawVarData or NULL if none |
128 // exists. Ownership of the pointer remains with the RawVarData. | 127 // exists. Ownership of the pointer remains with the RawVarData. |
129 virtual SerializedHandle* GetHandle(); | 128 virtual SerializedHandle* GetHandle(); |
130 | 129 |
131 bool initialized() { return initialized_; } | 130 bool initialized() { return initialized_; } |
132 | 131 |
133 protected: | 132 protected: |
134 bool initialized_; | 133 bool initialized_; |
135 }; | 134 }; |
136 | 135 |
137 // A RawVarData class for PP_Vars which are value types. | 136 // A RawVarData class for PP_Vars which are value types. |
138 class BasicRawVarData : public RawVarData { | 137 class BasicRawVarData : public RawVarData { |
139 public: | 138 public: |
140 BasicRawVarData(); | 139 BasicRawVarData(); |
141 ~BasicRawVarData() override; | 140 ~BasicRawVarData() override; |
142 | 141 |
143 // RawVarData implementation. | 142 // RawVarData implementation. |
144 PP_VarType Type() override; | 143 PP_VarType Type() override; |
145 bool Init(const PP_Var& var, PP_Instance instance) override; | 144 bool Init(const PP_Var& var, PP_Instance instance) override; |
146 PP_Var CreatePPVar(PP_Instance instance) override; | 145 PP_Var CreatePPVar(PP_Instance instance) override; |
147 void PopulatePPVar(const PP_Var& var, | 146 void PopulatePPVar(const PP_Var& var, |
148 const std::vector<PP_Var>& graph) override; | 147 const std::vector<PP_Var>& graph) override; |
149 void Write(IPC::Message* m, const HandleWriter& handle_writer) override; | 148 void Write(base::Pickle* m, const HandleWriter& handle_writer) override; |
150 bool Read(PP_VarType type, | 149 bool Read(PP_VarType type, |
151 const IPC::Message* m, | 150 const base::Pickle* m, |
152 base::PickleIterator* iter) override; | 151 base::PickleIterator* iter) override; |
153 | 152 |
154 private: | 153 private: |
155 PP_Var var_; | 154 PP_Var var_; |
156 }; | 155 }; |
157 | 156 |
158 // A RawVarData class for string PP_Vars. | 157 // A RawVarData class for string PP_Vars. |
159 class StringRawVarData : public RawVarData { | 158 class StringRawVarData : public RawVarData { |
160 public: | 159 public: |
161 StringRawVarData(); | 160 StringRawVarData(); |
162 ~StringRawVarData() override; | 161 ~StringRawVarData() override; |
163 | 162 |
164 // RawVarData implementation. | 163 // RawVarData implementation. |
165 PP_VarType Type() override; | 164 PP_VarType Type() override; |
166 bool Init(const PP_Var& var, PP_Instance instance) override; | 165 bool Init(const PP_Var& var, PP_Instance instance) override; |
167 PP_Var CreatePPVar(PP_Instance instance) override; | 166 PP_Var CreatePPVar(PP_Instance instance) override; |
168 void PopulatePPVar(const PP_Var& var, | 167 void PopulatePPVar(const PP_Var& var, |
169 const std::vector<PP_Var>& graph) override; | 168 const std::vector<PP_Var>& graph) override; |
170 void Write(IPC::Message* m, const HandleWriter& handle_writer) override; | 169 void Write(base::Pickle* m, const HandleWriter& handle_writer) override; |
171 bool Read(PP_VarType type, | 170 bool Read(PP_VarType type, |
172 const IPC::Message* m, | 171 const base::Pickle* m, |
173 base::PickleIterator* iter) override; | 172 base::PickleIterator* iter) override; |
174 | 173 |
175 private: | 174 private: |
176 // The data in the string. | 175 // The data in the string. |
177 std::string data_; | 176 std::string data_; |
178 }; | 177 }; |
179 | 178 |
180 // A RawVarData class for array buffer PP_Vars. | 179 // A RawVarData class for array buffer PP_Vars. |
181 class ArrayBufferRawVarData : public RawVarData { | 180 class ArrayBufferRawVarData : public RawVarData { |
182 public: | 181 public: |
183 // Enum for array buffer message types. | 182 // Enum for array buffer message types. |
184 enum ShmemType { | 183 enum ShmemType { |
185 ARRAY_BUFFER_NO_SHMEM, | 184 ARRAY_BUFFER_NO_SHMEM, |
186 ARRAY_BUFFER_SHMEM_HOST, | 185 ARRAY_BUFFER_SHMEM_HOST, |
187 ARRAY_BUFFER_SHMEM_PLUGIN, | 186 ARRAY_BUFFER_SHMEM_PLUGIN, |
188 }; | 187 }; |
189 | 188 |
190 ArrayBufferRawVarData(); | 189 ArrayBufferRawVarData(); |
191 ~ArrayBufferRawVarData() override; | 190 ~ArrayBufferRawVarData() override; |
192 | 191 |
193 // RawVarData implementation. | 192 // RawVarData implementation. |
194 PP_VarType Type() override; | 193 PP_VarType Type() override; |
195 bool Init(const PP_Var& var, PP_Instance instance) override; | 194 bool Init(const PP_Var& var, PP_Instance instance) override; |
196 PP_Var CreatePPVar(PP_Instance instance) override; | 195 PP_Var CreatePPVar(PP_Instance instance) override; |
197 void PopulatePPVar(const PP_Var& var, | 196 void PopulatePPVar(const PP_Var& var, |
198 const std::vector<PP_Var>& graph) override; | 197 const std::vector<PP_Var>& graph) override; |
199 void Write(IPC::Message* m, const HandleWriter& handle_writer) override; | 198 void Write(base::Pickle* m, const HandleWriter& handle_writer) override; |
200 bool Read(PP_VarType type, | 199 bool Read(PP_VarType type, |
201 const IPC::Message* m, | 200 const base::Pickle* m, |
202 base::PickleIterator* iter) override; | 201 base::PickleIterator* iter) override; |
203 SerializedHandle* GetHandle() override; | 202 SerializedHandle* GetHandle() override; |
204 | 203 |
205 private: | 204 private: |
206 // The type of the storage underlying the array buffer. | 205 // The type of the storage underlying the array buffer. |
207 ShmemType type_; | 206 ShmemType type_; |
208 // The data in the buffer. Valid for |type_| == ARRAY_BUFFER_NO_SHMEM. | 207 // The data in the buffer. Valid for |type_| == ARRAY_BUFFER_NO_SHMEM. |
209 std::string data_; | 208 std::string data_; |
210 // Host shmem handle. Valid for |type_| == ARRAY_BUFFER_SHMEM_HOST. | 209 // Host shmem handle. Valid for |type_| == ARRAY_BUFFER_SHMEM_HOST. |
211 int host_shm_handle_id_; | 210 int host_shm_handle_id_; |
212 // Plugin shmem handle. Valid for |type_| == ARRAY_BUFFER_SHMEM_PLUGIN. | 211 // Plugin shmem handle. Valid for |type_| == ARRAY_BUFFER_SHMEM_PLUGIN. |
213 SerializedHandle plugin_shm_handle_; | 212 SerializedHandle plugin_shm_handle_; |
214 }; | 213 }; |
215 | 214 |
216 // A RawVarData class for array PP_Vars. | 215 // A RawVarData class for array PP_Vars. |
217 class ArrayRawVarData : public RawVarData { | 216 class ArrayRawVarData : public RawVarData { |
218 public: | 217 public: |
219 ArrayRawVarData(); | 218 ArrayRawVarData(); |
220 ~ArrayRawVarData() override; | 219 ~ArrayRawVarData() override; |
221 | 220 |
222 void AddChild(size_t element); | 221 void AddChild(size_t element); |
223 | 222 |
224 // RawVarData implementation. | 223 // RawVarData implementation. |
225 PP_VarType Type() override; | 224 PP_VarType Type() override; |
226 bool Init(const PP_Var& var, PP_Instance instance) override; | 225 bool Init(const PP_Var& var, PP_Instance instance) override; |
227 PP_Var CreatePPVar(PP_Instance instance) override; | 226 PP_Var CreatePPVar(PP_Instance instance) override; |
228 void PopulatePPVar(const PP_Var& var, | 227 void PopulatePPVar(const PP_Var& var, |
229 const std::vector<PP_Var>& graph) override; | 228 const std::vector<PP_Var>& graph) override; |
230 void Write(IPC::Message* m, const HandleWriter& handle_writer) override; | 229 void Write(base::Pickle* m, const HandleWriter& handle_writer) override; |
231 bool Read(PP_VarType type, | 230 bool Read(PP_VarType type, |
232 const IPC::Message* m, | 231 const base::Pickle* m, |
233 base::PickleIterator* iter) override; | 232 base::PickleIterator* iter) override; |
234 | 233 |
235 private: | 234 private: |
236 std::vector<size_t> children_; | 235 std::vector<size_t> children_; |
237 }; | 236 }; |
238 | 237 |
239 // A RawVarData class for dictionary PP_Vars. | 238 // A RawVarData class for dictionary PP_Vars. |
240 class DictionaryRawVarData : public RawVarData { | 239 class DictionaryRawVarData : public RawVarData { |
241 public: | 240 public: |
242 DictionaryRawVarData(); | 241 DictionaryRawVarData(); |
243 ~DictionaryRawVarData() override; | 242 ~DictionaryRawVarData() override; |
244 | 243 |
245 void AddChild(const std::string& key, size_t value); | 244 void AddChild(const std::string& key, size_t value); |
246 | 245 |
247 // RawVarData implementation. | 246 // RawVarData implementation. |
248 PP_VarType Type() override; | 247 PP_VarType Type() override; |
249 bool Init(const PP_Var& var, PP_Instance instance) override; | 248 bool Init(const PP_Var& var, PP_Instance instance) override; |
250 PP_Var CreatePPVar(PP_Instance instance) override; | 249 PP_Var CreatePPVar(PP_Instance instance) override; |
251 void PopulatePPVar(const PP_Var& var, | 250 void PopulatePPVar(const PP_Var& var, |
252 const std::vector<PP_Var>& graph) override; | 251 const std::vector<PP_Var>& graph) override; |
253 void Write(IPC::Message* m, const HandleWriter& handle_writer) override; | 252 void Write(base::Pickle* m, const HandleWriter& handle_writer) override; |
254 bool Read(PP_VarType type, | 253 bool Read(PP_VarType type, |
255 const IPC::Message* m, | 254 const base::Pickle* m, |
256 base::PickleIterator* iter) override; | 255 base::PickleIterator* iter) override; |
257 | 256 |
258 private: | 257 private: |
259 std::vector<std::pair<std::string, size_t> > children_; | 258 std::vector<std::pair<std::string, size_t> > children_; |
260 }; | 259 }; |
261 | 260 |
262 // A RawVarData class for resource PP_Vars. | 261 // A RawVarData class for resource PP_Vars. |
263 // This class does not hold a reference on the PP_Resource that is being | 262 // This class does not hold a reference on the PP_Resource that is being |
264 // serialized. If sending a resource from the plugin to the host, the plugin | 263 // serialized. If sending a resource from the plugin to the host, the plugin |
265 // should not release the ResourceVar before sending the serialized message to | 264 // should not release the ResourceVar before sending the serialized message to |
266 // the host, and the host should immediately consume the ResourceVar before | 265 // the host, and the host should immediately consume the ResourceVar before |
267 // processing further messages. | 266 // processing further messages. |
268 class ResourceRawVarData : public RawVarData { | 267 class ResourceRawVarData : public RawVarData { |
269 public: | 268 public: |
270 ResourceRawVarData(); | 269 ResourceRawVarData(); |
271 ~ResourceRawVarData() override; | 270 ~ResourceRawVarData() override; |
272 | 271 |
273 // RawVarData implementation. | 272 // RawVarData implementation. |
274 PP_VarType Type() override; | 273 PP_VarType Type() override; |
275 bool Init(const PP_Var& var, PP_Instance instance) override; | 274 bool Init(const PP_Var& var, PP_Instance instance) override; |
276 PP_Var CreatePPVar(PP_Instance instance) override; | 275 PP_Var CreatePPVar(PP_Instance instance) override; |
277 void PopulatePPVar(const PP_Var& var, | 276 void PopulatePPVar(const PP_Var& var, |
278 const std::vector<PP_Var>& graph) override; | 277 const std::vector<PP_Var>& graph) override; |
279 void Write(IPC::Message* m, const HandleWriter& handle_writer) override; | 278 void Write(base::Pickle* m, const HandleWriter& handle_writer) override; |
280 bool Read(PP_VarType type, | 279 bool Read(PP_VarType type, |
281 const IPC::Message* m, | 280 const base::Pickle* m, |
282 base::PickleIterator* iter) override; | 281 base::PickleIterator* iter) override; |
283 | 282 |
284 private: | 283 private: |
285 // Resource ID in the plugin. If one has not yet been created, this is 0. | 284 // Resource ID in the plugin. If one has not yet been created, this is 0. |
286 // This is a borrowed reference; the resource's refcount is not incremented. | 285 // This is a borrowed reference; the resource's refcount is not incremented. |
287 PP_Resource pp_resource_; | 286 PP_Resource pp_resource_; |
288 | 287 |
289 // Pending resource host ID in the renderer. | 288 // Pending resource host ID in the renderer. |
290 int pending_renderer_host_id_; | 289 int pending_renderer_host_id_; |
291 | 290 |
292 // Pending resource host ID in the browser. | 291 // Pending resource host ID in the browser. |
293 int pending_browser_host_id_; | 292 int pending_browser_host_id_; |
294 | 293 |
295 // A message containing information about how to create a plugin-side | 294 // A message containing information about how to create a plugin-side |
296 // resource. The message type will vary based on the resource type, and will | 295 // resource. The message type will vary based on the resource type, and will |
297 // usually contain a pending resource host ID, and other required information. | 296 // usually contain a pending resource host ID, and other required information. |
298 // If the resource was created directly, this is NULL. | 297 // If the resource was created directly, this is NULL. |
299 scoped_ptr<IPC::Message> creation_message_; | 298 scoped_ptr<IPC::Message> creation_message_; |
300 }; | 299 }; |
301 | 300 |
302 } // namespace proxy | 301 } // namespace proxy |
303 } // namespace ppapi | 302 } // namespace ppapi |
304 | 303 |
305 #endif // PPAPI_PROXY_RAW_VAR_DATA_H_ | 304 #endif // PPAPI_PROXY_RAW_VAR_DATA_H_ |
OLD | NEW |