OLD | NEW |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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 #include "ppapi/proxy/serialized_var.h" | 5 #include "ppapi/proxy/serialized_var.h" |
6 | 6 |
7 #include "base/logging.h" | 7 #include "base/logging.h" |
8 #include "ipc/ipc_message_utils.h" | 8 #include "ipc/ipc_message_utils.h" |
9 #include "ppapi/proxy/dispatcher.h" | 9 #include "ppapi/proxy/dispatcher.h" |
10 #include "ppapi/proxy/interface_proxy.h" | 10 #include "ppapi/proxy/interface_proxy.h" |
(...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
218 : inner_(new Inner(serialization_rules, var)) { | 218 : inner_(new Inner(serialization_rules, var)) { |
219 } | 219 } |
220 | 220 |
221 SerializedVar::~SerializedVar() { | 221 SerializedVar::~SerializedVar() { |
222 } | 222 } |
223 | 223 |
224 // SerializedVarSendInput ------------------------------------------------------ | 224 // SerializedVarSendInput ------------------------------------------------------ |
225 | 225 |
226 SerializedVarSendInput::SerializedVarSendInput(Dispatcher* dispatcher, | 226 SerializedVarSendInput::SerializedVarSendInput(Dispatcher* dispatcher, |
227 const PP_Var& var) | 227 const PP_Var& var) |
228 : SerializedVar(dispatcher->serialization_rules(), var) { | 228 : SerializedVar(dispatcher->serialization_rules()) { |
229 dispatcher->serialization_rules()->SendCallerOwned(var, | 229 inner_->SetVar(dispatcher->serialization_rules()->SendCallerOwned( |
230 inner_->GetStringPtr()); | 230 var, inner_->GetStringPtr())); |
231 } | 231 } |
232 | 232 |
233 // static | 233 // static |
234 void SerializedVarSendInput::ConvertVector(Dispatcher* dispatcher, | 234 void SerializedVarSendInput::ConvertVector(Dispatcher* dispatcher, |
235 const PP_Var* input, | 235 const PP_Var* input, |
236 size_t input_count, | 236 size_t input_count, |
237 std::vector<SerializedVar>* output) { | 237 std::vector<SerializedVar>* output) { |
238 output->resize(input_count); | 238 output->resize(input_count); |
239 for (size_t i = 0; i < input_count; i++) { | 239 for (size_t i = 0; i < input_count; i++) { |
240 (*output)[i] = SerializedVar(dispatcher->serialization_rules(), input[i]); | 240 SerializedVar& cur = (*output)[i]; |
241 dispatcher->serialization_rules()->SendCallerOwned( | 241 cur = SerializedVar(dispatcher->serialization_rules()); |
242 input[i], (*output)[i].inner_->GetStringPtr()); | 242 cur.inner_->SetVar(dispatcher->serialization_rules()->SendCallerOwned( |
| 243 input[i], cur.inner_->GetStringPtr())); |
243 } | 244 } |
244 } | 245 } |
245 | 246 |
246 // ReceiveSerializedVarReturnValue --------------------------------------------- | 247 // ReceiveSerializedVarReturnValue --------------------------------------------- |
247 | 248 |
248 ReceiveSerializedVarReturnValue::ReceiveSerializedVarReturnValue() { | 249 ReceiveSerializedVarReturnValue::ReceiveSerializedVarReturnValue() { |
249 } | 250 } |
250 | 251 |
251 PP_Var ReceiveSerializedVarReturnValue::Return(Dispatcher* dispatcher) { | 252 PP_Var ReceiveSerializedVarReturnValue::Return(Dispatcher* dispatcher) { |
252 inner_->set_serialization_rules(dispatcher->serialization_rules()); | 253 inner_->set_serialization_rules(dispatcher->serialization_rules()); |
253 inner_->SetVar(inner_->serialization_rules()->ReceivePassRef( | 254 inner_->SetVar(inner_->serialization_rules()->ReceivePassRef( |
254 inner_->GetIncompleteVar(), inner_->GetString())); | 255 inner_->GetIncompleteVar(), inner_->GetString(), dispatcher)); |
255 return inner_->GetVar(); | 256 return inner_->GetVar(); |
256 } | 257 } |
257 | 258 |
258 // ReceiveSerializedException -------------------------------------------------- | 259 // ReceiveSerializedException -------------------------------------------------- |
259 | 260 |
260 ReceiveSerializedException::ReceiveSerializedException(Dispatcher* dispatcher, | 261 ReceiveSerializedException::ReceiveSerializedException(Dispatcher* dispatcher, |
261 PP_Var* exception) | 262 PP_Var* exception) |
262 : SerializedVar(dispatcher->serialization_rules()), | 263 : SerializedVar(dispatcher->serialization_rules()), |
| 264 dispatcher_(dispatcher), |
263 exception_(exception) { | 265 exception_(exception) { |
264 } | 266 } |
265 | 267 |
266 ReceiveSerializedException::~ReceiveSerializedException() { | 268 ReceiveSerializedException::~ReceiveSerializedException() { |
267 if (exception_) { | 269 if (exception_) { |
268 // When an output exception is specified, it will take ownership of the | 270 // When an output exception is specified, it will take ownership of the |
269 // reference. | 271 // reference. |
270 inner_->SetVar(inner_->serialization_rules()->ReceivePassRef( | 272 inner_->SetVar(inner_->serialization_rules()->ReceivePassRef( |
271 inner_->GetIncompleteVar(), inner_->GetString())); | 273 inner_->GetIncompleteVar(), inner_->GetString(), dispatcher_)); |
272 *exception_ = inner_->GetVar(); | 274 *exception_ = inner_->GetVar(); |
273 } else { | 275 } else { |
274 // When no output exception is specified, the browser thinks we have a ref | 276 // When no output exception is specified, the browser thinks we have a ref |
275 // to an object that we don't want (this will happen only in the plugin | 277 // to an object that we don't want (this will happen only in the plugin |
276 // since the browser will always specify an out exception for the plugin to | 278 // since the browser will always specify an out exception for the plugin to |
277 // write into). | 279 // write into). |
278 // | 280 // |
279 // Strings don't need this handling since we can just avoid creating a | 281 // Strings don't need this handling since we can just avoid creating a |
280 // Var from the std::string in the first place. | 282 // Var from the std::string in the first place. |
281 if (inner_->GetVar().type == PP_VARTYPE_OBJECT) | 283 if (inner_->GetVar().type == PP_VARTYPE_OBJECT) |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
335 serialized_.inner_->set_serialization_rules( | 337 serialized_.inner_->set_serialization_rules( |
336 dispatcher->serialization_rules()); | 338 dispatcher->serialization_rules()); |
337 | 339 |
338 // Ensure that when the serialized var goes out of scope it cleans up the | 340 // Ensure that when the serialized var goes out of scope it cleans up the |
339 // stuff we're making in BeginReceiveCallerOwned. | 341 // stuff we're making in BeginReceiveCallerOwned. |
340 serialized_.inner_->set_cleanup_mode(SerializedVar::END_RECEIVE_CALLER_OWNED); | 342 serialized_.inner_->set_cleanup_mode(SerializedVar::END_RECEIVE_CALLER_OWNED); |
341 | 343 |
342 serialized_.inner_->SetVar( | 344 serialized_.inner_->SetVar( |
343 serialized_.inner_->serialization_rules()->BeginReceiveCallerOwned( | 345 serialized_.inner_->serialization_rules()->BeginReceiveCallerOwned( |
344 serialized_.inner_->GetIncompleteVar(), | 346 serialized_.inner_->GetIncompleteVar(), |
345 serialized_.inner_->GetStringPtr())); | 347 serialized_.inner_->GetStringPtr(), |
| 348 dispatcher)); |
346 return serialized_.inner_->GetVar(); | 349 return serialized_.inner_->GetVar(); |
347 } | 350 } |
348 | 351 |
349 // SerializedVarVectorReceiveInput --------------------------------------------- | 352 // SerializedVarVectorReceiveInput --------------------------------------------- |
350 | 353 |
351 SerializedVarVectorReceiveInput::SerializedVarVectorReceiveInput( | 354 SerializedVarVectorReceiveInput::SerializedVarVectorReceiveInput( |
352 const std::vector<SerializedVar>& serialized) | 355 const std::vector<SerializedVar>& serialized) |
353 : serialized_(serialized) { | 356 : serialized_(serialized) { |
354 } | 357 } |
355 | 358 |
356 SerializedVarVectorReceiveInput::~SerializedVarVectorReceiveInput() { | 359 SerializedVarVectorReceiveInput::~SerializedVarVectorReceiveInput() { |
357 for (size_t i = 0; i < deserialized_.size(); i++) { | 360 for (size_t i = 0; i < deserialized_.size(); i++) { |
358 serialized_[i].inner_->serialization_rules()->EndReceiveCallerOwned( | 361 serialized_[i].inner_->serialization_rules()->EndReceiveCallerOwned( |
359 deserialized_[i]); | 362 deserialized_[i]); |
360 } | 363 } |
361 } | 364 } |
362 | 365 |
363 PP_Var* SerializedVarVectorReceiveInput::Get(Dispatcher* dispatcher, | 366 PP_Var* SerializedVarVectorReceiveInput::Get(Dispatcher* dispatcher, |
364 uint32_t* array_size) { | 367 uint32_t* array_size) { |
365 deserialized_.resize(serialized_.size()); | 368 deserialized_.resize(serialized_.size()); |
366 for (size_t i = 0; i < serialized_.size(); i++) { | 369 for (size_t i = 0; i < serialized_.size(); i++) { |
367 // The vector must be able to clean themselves up after this call is | 370 // The vector must be able to clean themselves up after this call is |
368 // torn down. | 371 // torn down. |
369 serialized_[i].inner_->set_serialization_rules( | 372 serialized_[i].inner_->set_serialization_rules( |
370 dispatcher->serialization_rules()); | 373 dispatcher->serialization_rules()); |
371 | 374 |
372 serialized_[i].inner_->SetVar( | 375 serialized_[i].inner_->SetVar( |
373 serialized_[i].inner_->serialization_rules()->BeginReceiveCallerOwned( | 376 serialized_[i].inner_->serialization_rules()->BeginReceiveCallerOwned( |
374 serialized_[i].inner_->GetIncompleteVar(), | 377 serialized_[i].inner_->GetIncompleteVar(), |
375 serialized_[i].inner_->GetStringPtr())); | 378 serialized_[i].inner_->GetStringPtr(), |
| 379 dispatcher)); |
376 deserialized_[i] = serialized_[i].inner_->GetVar(); | 380 deserialized_[i] = serialized_[i].inner_->GetVar(); |
377 } | 381 } |
378 | 382 |
379 *array_size = static_cast<uint32_t>(serialized_.size()); | 383 *array_size = static_cast<uint32_t>(serialized_.size()); |
380 return deserialized_.size() > 0 ? &deserialized_[0] : NULL; | 384 return deserialized_.size() > 0 ? &deserialized_[0] : NULL; |
381 } | 385 } |
382 | 386 |
383 // SerializedVarReturnValue ---------------------------------------------------- | 387 // SerializedVarReturnValue ---------------------------------------------------- |
384 | 388 |
385 SerializedVarReturnValue::SerializedVarReturnValue(SerializedVar* serialized) | 389 SerializedVarReturnValue::SerializedVarReturnValue(SerializedVar* serialized) |
386 : serialized_(serialized) { | 390 : serialized_(serialized) { |
387 } | 391 } |
388 | 392 |
389 void SerializedVarReturnValue::Return(Dispatcher* dispatcher, | 393 void SerializedVarReturnValue::Return(Dispatcher* dispatcher, |
390 const PP_Var& var) { | 394 const PP_Var& var) { |
391 serialized_->inner_->set_serialization_rules( | 395 serialized_->inner_->set_serialization_rules( |
392 dispatcher->serialization_rules()); | 396 dispatcher->serialization_rules()); |
393 serialized_->inner_->SetVar(var); | |
394 | 397 |
395 // Var must clean up after our BeginSendPassRef call. | 398 // Var must clean up after our BeginSendPassRef call. |
396 serialized_->inner_->set_cleanup_mode(SerializedVar::END_SEND_PASS_REF); | 399 serialized_->inner_->set_cleanup_mode(SerializedVar::END_SEND_PASS_REF); |
397 | 400 |
398 dispatcher->serialization_rules()->BeginSendPassRef( | 401 serialized_->inner_->SetVar( |
399 serialized_->inner_->GetIncompleteVar(), | 402 dispatcher->serialization_rules()->BeginSendPassRef( |
400 serialized_->inner_->GetStringPtr()); | 403 var, |
| 404 serialized_->inner_->GetStringPtr())); |
401 } | 405 } |
402 | 406 |
403 // SerializedVarOutParam ------------------------------------------------------- | 407 // SerializedVarOutParam ------------------------------------------------------- |
404 | 408 |
405 SerializedVarOutParam::SerializedVarOutParam(SerializedVar* serialized) | 409 SerializedVarOutParam::SerializedVarOutParam(SerializedVar* serialized) |
406 : serialized_(serialized), | 410 : serialized_(serialized), |
407 writable_var_(PP_MakeUndefined()) { | 411 writable_var_(PP_MakeUndefined()) { |
408 } | 412 } |
409 | 413 |
410 SerializedVarOutParam::~SerializedVarOutParam() { | 414 SerializedVarOutParam::~SerializedVarOutParam() { |
411 if (serialized_->inner_->serialization_rules()) { | 415 if (serialized_->inner_->serialization_rules()) { |
412 // When unset, OutParam wasn't called. We'll just leave the var untouched | 416 // When unset, OutParam wasn't called. We'll just leave the var untouched |
413 // in that case. | 417 // in that case. |
414 serialized_->inner_->SetVar(writable_var_); | 418 serialized_->inner_->SetVar( |
415 serialized_->inner_->serialization_rules()->BeginSendPassRef( | 419 serialized_->inner_->serialization_rules()->BeginSendPassRef( |
416 writable_var_, serialized_->inner_->GetStringPtr()); | 420 writable_var_, serialized_->inner_->GetStringPtr())); |
417 | 421 |
418 // Normally the current object will be created on the stack to wrap a | 422 // Normally the current object will be created on the stack to wrap a |
419 // SerializedVar and won't have a scope around the actual IPC send. So we | 423 // SerializedVar and won't have a scope around the actual IPC send. So we |
420 // need to tell the SerializedVar to do the begin/end send pass ref calls. | 424 // need to tell the SerializedVar to do the begin/end send pass ref calls. |
421 serialized_->inner_->set_cleanup_mode(SerializedVar::END_SEND_PASS_REF); | 425 serialized_->inner_->set_cleanup_mode(SerializedVar::END_SEND_PASS_REF); |
422 } | 426 } |
423 } | 427 } |
424 | 428 |
425 PP_Var* SerializedVarOutParam::OutParam(Dispatcher* dispatcher) { | 429 PP_Var* SerializedVarOutParam::OutParam(Dispatcher* dispatcher) { |
426 serialized_->inner_->set_serialization_rules( | 430 serialized_->inner_->set_serialization_rules( |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
460 | 464 |
461 PP_Var** SerializedVarVectorOutParam::ArrayOutParam(Dispatcher* dispatcher) { | 465 PP_Var** SerializedVarVectorOutParam::ArrayOutParam(Dispatcher* dispatcher) { |
462 DCHECK(!dispatcher_); // Should only be called once. | 466 DCHECK(!dispatcher_); // Should only be called once. |
463 dispatcher_ = dispatcher; | 467 dispatcher_ = dispatcher; |
464 return &array_; | 468 return &array_; |
465 } | 469 } |
466 | 470 |
467 } // namespace proxy | 471 } // namespace proxy |
468 } // namespace pp | 472 } // namespace pp |
469 | 473 |
OLD | NEW |