| 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 #include "ppapi/proxy/raw_var_data.h" | 5 #include "ppapi/proxy/raw_var_data.h" |
| 6 | 6 |
| 7 #include <stack> | 7 #include <stack> |
| 8 | 8 |
| 9 #include "base/containers/hash_tables.h" | 9 #include "base/containers/hash_tables.h" |
| 10 #include "base/stl_util.h" | 10 #include "base/stl_util.h" |
| (...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 166 graph.push_back(data_[i]->CreatePPVar(instance)); | 166 graph.push_back(data_[i]->CreatePPVar(instance)); |
| 167 for (size_t i = 0; i < data_.size(); ++i) | 167 for (size_t i = 0; i < data_.size(); ++i) |
| 168 data_[i]->PopulatePPVar(graph[i], graph); | 168 data_[i]->PopulatePPVar(graph[i], graph); |
| 169 // Everything except the root will have one extra ref. Remove that ref. | 169 // Everything except the root will have one extra ref. Remove that ref. |
| 170 for (size_t i = 1; i < data_.size(); ++i) | 170 for (size_t i = 1; i < data_.size(); ++i) |
| 171 ScopedPPVar(ScopedPPVar::PassRef(), graph[i]); | 171 ScopedPPVar(ScopedPPVar::PassRef(), graph[i]); |
| 172 // The first element is the root. | 172 // The first element is the root. |
| 173 return graph[0]; | 173 return graph[0]; |
| 174 } | 174 } |
| 175 | 175 |
| 176 void RawVarDataGraph::Write(IPC::Message* m, | 176 void RawVarDataGraph::Write(base::Pickle* m, |
| 177 const HandleWriter& handle_writer) { | 177 const HandleWriter& handle_writer) { |
| 178 // Write the size, followed by each node in the graph. | 178 // Write the size, followed by each node in the graph. |
| 179 m->WriteUInt32(static_cast<uint32_t>(data_.size())); | 179 m->WriteUInt32(static_cast<uint32_t>(data_.size())); |
| 180 for (size_t i = 0; i < data_.size(); ++i) { | 180 for (size_t i = 0; i < data_.size(); ++i) { |
| 181 m->WriteInt(data_[i]->Type()); | 181 m->WriteInt(data_[i]->Type()); |
| 182 data_[i]->Write(m, handle_writer); | 182 data_[i]->Write(m, handle_writer); |
| 183 } | 183 } |
| 184 } | 184 } |
| 185 | 185 |
| 186 // static | 186 // static |
| 187 scoped_ptr<RawVarDataGraph> RawVarDataGraph::Read(const IPC::Message* m, | 187 scoped_ptr<RawVarDataGraph> RawVarDataGraph::Read(const base::Pickle* m, |
| 188 base::PickleIterator* iter) { | 188 base::PickleIterator* iter) { |
| 189 scoped_ptr<RawVarDataGraph> result(new RawVarDataGraph); | 189 scoped_ptr<RawVarDataGraph> result(new RawVarDataGraph); |
| 190 uint32_t size = 0; | 190 uint32_t size = 0; |
| 191 if (!iter->ReadUInt32(&size)) | 191 if (!iter->ReadUInt32(&size)) |
| 192 return scoped_ptr<RawVarDataGraph>(); | 192 return scoped_ptr<RawVarDataGraph>(); |
| 193 for (uint32_t i = 0; i < size; ++i) { | 193 for (uint32_t i = 0; i < size; ++i) { |
| 194 int32_t type; | 194 int32_t type; |
| 195 if (!iter->ReadInt(&type)) | 195 if (!iter->ReadInt(&type)) |
| 196 return scoped_ptr<RawVarDataGraph>(); | 196 return scoped_ptr<RawVarDataGraph>(); |
| 197 PP_VarType var_type = static_cast<PP_VarType>(type); | 197 PP_VarType var_type = static_cast<PP_VarType>(type); |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 276 } | 276 } |
| 277 | 277 |
| 278 PP_Var BasicRawVarData::CreatePPVar(PP_Instance instance) { | 278 PP_Var BasicRawVarData::CreatePPVar(PP_Instance instance) { |
| 279 return var_; | 279 return var_; |
| 280 } | 280 } |
| 281 | 281 |
| 282 void BasicRawVarData::PopulatePPVar(const PP_Var& var, | 282 void BasicRawVarData::PopulatePPVar(const PP_Var& var, |
| 283 const std::vector<PP_Var>& graph) { | 283 const std::vector<PP_Var>& graph) { |
| 284 } | 284 } |
| 285 | 285 |
| 286 void BasicRawVarData::Write( | 286 void BasicRawVarData::Write(base::Pickle* m, |
| 287 IPC::Message* m, | 287 const HandleWriter& handle_writer) { |
| 288 const HandleWriter& handle_writer) { | |
| 289 switch (var_.type) { | 288 switch (var_.type) { |
| 290 case PP_VARTYPE_UNDEFINED: | 289 case PP_VARTYPE_UNDEFINED: |
| 291 case PP_VARTYPE_NULL: | 290 case PP_VARTYPE_NULL: |
| 292 // These don't need any data associated with them other than the type we | 291 // These don't need any data associated with them other than the type we |
| 293 // just serialized. | 292 // just serialized. |
| 294 break; | 293 break; |
| 295 case PP_VARTYPE_BOOL: | 294 case PP_VARTYPE_BOOL: |
| 296 m->WriteBool(PP_ToBool(var_.value.as_bool)); | 295 m->WriteBool(PP_ToBool(var_.value.as_bool)); |
| 297 break; | 296 break; |
| 298 case PP_VARTYPE_INT32: | 297 case PP_VARTYPE_INT32: |
| 299 m->WriteInt(var_.value.as_int); | 298 m->WriteInt(var_.value.as_int); |
| 300 break; | 299 break; |
| 301 case PP_VARTYPE_DOUBLE: | 300 case PP_VARTYPE_DOUBLE: |
| 302 IPC::WriteParam(m, var_.value.as_double); | 301 IPC::WriteParam(m, var_.value.as_double); |
| 303 break; | 302 break; |
| 304 case PP_VARTYPE_OBJECT: | 303 case PP_VARTYPE_OBJECT: |
| 305 m->WriteInt64(var_.value.as_id); | 304 m->WriteInt64(var_.value.as_id); |
| 306 break; | 305 break; |
| 307 default: | 306 default: |
| 308 NOTREACHED(); | 307 NOTREACHED(); |
| 309 break; | 308 break; |
| 310 } | 309 } |
| 311 } | 310 } |
| 312 | 311 |
| 313 bool BasicRawVarData::Read(PP_VarType type, | 312 bool BasicRawVarData::Read(PP_VarType type, |
| 314 const IPC::Message* m, | 313 const base::Pickle* m, |
| 315 base::PickleIterator* iter) { | 314 base::PickleIterator* iter) { |
| 316 PP_Var result; | 315 PP_Var result; |
| 317 result.type = type; | 316 result.type = type; |
| 318 switch (type) { | 317 switch (type) { |
| 319 case PP_VARTYPE_UNDEFINED: | 318 case PP_VARTYPE_UNDEFINED: |
| 320 case PP_VARTYPE_NULL: | 319 case PP_VARTYPE_NULL: |
| 321 // These don't have any data associated with them other than the type we | 320 // These don't have any data associated with them other than the type we |
| 322 // just deserialized. | 321 // just deserialized. |
| 323 break; | 322 break; |
| 324 case PP_VARTYPE_BOOL: { | 323 case PP_VARTYPE_BOOL: { |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 370 } | 369 } |
| 371 | 370 |
| 372 PP_Var StringRawVarData::CreatePPVar(PP_Instance instance) { | 371 PP_Var StringRawVarData::CreatePPVar(PP_Instance instance) { |
| 373 return StringVar::SwapValidatedUTF8StringIntoPPVar(&data_); | 372 return StringVar::SwapValidatedUTF8StringIntoPPVar(&data_); |
| 374 } | 373 } |
| 375 | 374 |
| 376 void StringRawVarData::PopulatePPVar(const PP_Var& var, | 375 void StringRawVarData::PopulatePPVar(const PP_Var& var, |
| 377 const std::vector<PP_Var>& graph) { | 376 const std::vector<PP_Var>& graph) { |
| 378 } | 377 } |
| 379 | 378 |
| 380 void StringRawVarData::Write(IPC::Message* m, | 379 void StringRawVarData::Write(base::Pickle* m, |
| 381 const HandleWriter& handle_writer) { | 380 const HandleWriter& handle_writer) { |
| 382 m->WriteString(data_); | 381 m->WriteString(data_); |
| 383 } | 382 } |
| 384 | 383 |
| 385 bool StringRawVarData::Read(PP_VarType type, | 384 bool StringRawVarData::Read(PP_VarType type, |
| 386 const IPC::Message* m, | 385 const base::Pickle* m, |
| 387 base::PickleIterator* iter) { | 386 base::PickleIterator* iter) { |
| 388 if (!iter->ReadString(&data_)) | 387 if (!iter->ReadString(&data_)) |
| 389 return false; | 388 return false; |
| 390 return true; | 389 return true; |
| 391 } | 390 } |
| 392 | 391 |
| 393 // ArrayBufferRawVarData ------------------------------------------------------- | 392 // ArrayBufferRawVarData ------------------------------------------------------- |
| 394 ArrayBufferRawVarData::ArrayBufferRawVarData() { | 393 ArrayBufferRawVarData::ArrayBufferRawVarData() { |
| 395 } | 394 } |
| 396 | 395 |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 475 return PP_MakeUndefined(); | 474 return PP_MakeUndefined(); |
| 476 } | 475 } |
| 477 DCHECK(result.type == PP_VARTYPE_ARRAY_BUFFER); | 476 DCHECK(result.type == PP_VARTYPE_ARRAY_BUFFER); |
| 478 return result; | 477 return result; |
| 479 } | 478 } |
| 480 | 479 |
| 481 void ArrayBufferRawVarData::PopulatePPVar(const PP_Var& var, | 480 void ArrayBufferRawVarData::PopulatePPVar(const PP_Var& var, |
| 482 const std::vector<PP_Var>& graph) { | 481 const std::vector<PP_Var>& graph) { |
| 483 } | 482 } |
| 484 | 483 |
| 485 void ArrayBufferRawVarData::Write( | 484 void ArrayBufferRawVarData::Write(base::Pickle* m, |
| 486 IPC::Message* m, | 485 const HandleWriter& handle_writer) { |
| 487 const HandleWriter& handle_writer) { | |
| 488 m->WriteInt(type_); | 486 m->WriteInt(type_); |
| 489 switch (type_) { | 487 switch (type_) { |
| 490 case ARRAY_BUFFER_SHMEM_HOST: | 488 case ARRAY_BUFFER_SHMEM_HOST: |
| 491 m->WriteInt(host_shm_handle_id_); | 489 m->WriteInt(host_shm_handle_id_); |
| 492 break; | 490 break; |
| 493 case ARRAY_BUFFER_SHMEM_PLUGIN: | 491 case ARRAY_BUFFER_SHMEM_PLUGIN: |
| 494 handle_writer.Run(m, plugin_shm_handle_); | 492 handle_writer.Run(m, plugin_shm_handle_); |
| 495 break; | 493 break; |
| 496 case ARRAY_BUFFER_NO_SHMEM: | 494 case ARRAY_BUFFER_NO_SHMEM: |
| 497 m->WriteString(data_); | 495 m->WriteString(data_); |
| 498 break; | 496 break; |
| 499 } | 497 } |
| 500 } | 498 } |
| 501 | 499 |
| 502 bool ArrayBufferRawVarData::Read(PP_VarType type, | 500 bool ArrayBufferRawVarData::Read(PP_VarType type, |
| 503 const IPC::Message* m, | 501 const base::Pickle* m, |
| 504 base::PickleIterator* iter) { | 502 base::PickleIterator* iter) { |
| 505 int shmem_type; | 503 int shmem_type; |
| 506 if (!iter->ReadInt(&shmem_type)) | 504 if (!iter->ReadInt(&shmem_type)) |
| 507 return false; | 505 return false; |
| 508 type_ = static_cast<ShmemType>(shmem_type); | 506 type_ = static_cast<ShmemType>(shmem_type); |
| 509 switch (type_) { | 507 switch (type_) { |
| 510 case ARRAY_BUFFER_SHMEM_HOST: | 508 case ARRAY_BUFFER_SHMEM_HOST: |
| 511 if (!iter->ReadInt(&host_shm_handle_id_)) | 509 if (!iter->ReadInt(&host_shm_handle_id_)) |
| 512 return false; | 510 return false; |
| 513 break; | 511 break; |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 565 if (var.type != PP_VARTYPE_ARRAY) { | 563 if (var.type != PP_VARTYPE_ARRAY) { |
| 566 NOTREACHED(); | 564 NOTREACHED(); |
| 567 return; | 565 return; |
| 568 } | 566 } |
| 569 ArrayVar* array_var = ArrayVar::FromPPVar(var); | 567 ArrayVar* array_var = ArrayVar::FromPPVar(var); |
| 570 DCHECK(array_var->elements().empty()); | 568 DCHECK(array_var->elements().empty()); |
| 571 for (size_t i = 0; i < children_.size(); ++i) | 569 for (size_t i = 0; i < children_.size(); ++i) |
| 572 array_var->elements().push_back(ScopedPPVar(graph[children_[i]])); | 570 array_var->elements().push_back(ScopedPPVar(graph[children_[i]])); |
| 573 } | 571 } |
| 574 | 572 |
| 575 void ArrayRawVarData::Write(IPC::Message* m, | 573 void ArrayRawVarData::Write(base::Pickle* m, |
| 576 const HandleWriter& handle_writer) { | 574 const HandleWriter& handle_writer) { |
| 577 m->WriteUInt32(static_cast<uint32_t>(children_.size())); | 575 m->WriteUInt32(static_cast<uint32_t>(children_.size())); |
| 578 for (size_t i = 0; i < children_.size(); ++i) | 576 for (size_t i = 0; i < children_.size(); ++i) |
| 579 m->WriteUInt32(static_cast<uint32_t>(children_[i])); | 577 m->WriteUInt32(static_cast<uint32_t>(children_[i])); |
| 580 } | 578 } |
| 581 | 579 |
| 582 bool ArrayRawVarData::Read(PP_VarType type, | 580 bool ArrayRawVarData::Read(PP_VarType type, |
| 583 const IPC::Message* m, | 581 const base::Pickle* m, |
| 584 base::PickleIterator* iter) { | 582 base::PickleIterator* iter) { |
| 585 uint32_t size; | 583 uint32_t size; |
| 586 if (!iter->ReadUInt32(&size)) | 584 if (!iter->ReadUInt32(&size)) |
| 587 return false; | 585 return false; |
| 588 for (uint32_t i = 0; i < size; ++i) { | 586 for (uint32_t i = 0; i < size; ++i) { |
| 589 uint32_t index; | 587 uint32_t index; |
| 590 if (!iter->ReadUInt32(&index)) | 588 if (!iter->ReadUInt32(&index)) |
| 591 return false; | 589 return false; |
| 592 children_.push_back(index); | 590 children_.push_back(index); |
| 593 } | 591 } |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 628 } | 626 } |
| 629 DictionaryVar* dictionary_var = DictionaryVar::FromPPVar(var); | 627 DictionaryVar* dictionary_var = DictionaryVar::FromPPVar(var); |
| 630 DCHECK(dictionary_var->key_value_map().empty()); | 628 DCHECK(dictionary_var->key_value_map().empty()); |
| 631 for (size_t i = 0; i < children_.size(); ++i) { | 629 for (size_t i = 0; i < children_.size(); ++i) { |
| 632 bool success = dictionary_var->SetWithStringKey(children_[i].first, | 630 bool success = dictionary_var->SetWithStringKey(children_[i].first, |
| 633 graph[children_[i].second]); | 631 graph[children_[i].second]); |
| 634 DCHECK(success); | 632 DCHECK(success); |
| 635 } | 633 } |
| 636 } | 634 } |
| 637 | 635 |
| 638 void DictionaryRawVarData::Write( | 636 void DictionaryRawVarData::Write(base::Pickle* m, |
| 639 IPC::Message* m, | 637 const HandleWriter& handle_writer) { |
| 640 const HandleWriter& handle_writer) { | |
| 641 m->WriteUInt32(static_cast<uint32_t>(children_.size())); | 638 m->WriteUInt32(static_cast<uint32_t>(children_.size())); |
| 642 for (size_t i = 0; i < children_.size(); ++i) { | 639 for (size_t i = 0; i < children_.size(); ++i) { |
| 643 m->WriteString(children_[i].first); | 640 m->WriteString(children_[i].first); |
| 644 m->WriteUInt32(static_cast<uint32_t>(children_[i].second)); | 641 m->WriteUInt32(static_cast<uint32_t>(children_[i].second)); |
| 645 } | 642 } |
| 646 } | 643 } |
| 647 | 644 |
| 648 bool DictionaryRawVarData::Read(PP_VarType type, | 645 bool DictionaryRawVarData::Read(PP_VarType type, |
| 649 const IPC::Message* m, | 646 const base::Pickle* m, |
| 650 base::PickleIterator* iter) { | 647 base::PickleIterator* iter) { |
| 651 uint32_t size; | 648 uint32_t size; |
| 652 if (!iter->ReadUInt32(&size)) | 649 if (!iter->ReadUInt32(&size)) |
| 653 return false; | 650 return false; |
| 654 for (uint32_t i = 0; i < size; ++i) { | 651 for (uint32_t i = 0; i < size; ++i) { |
| 655 std::string key; | 652 std::string key; |
| 656 uint32_t value; | 653 uint32_t value; |
| 657 if (!iter->ReadString(&key)) | 654 if (!iter->ReadString(&key)) |
| 658 return false; | 655 return false; |
| 659 if (!iter->ReadUInt32(&value)) | 656 if (!iter->ReadUInt32(&value)) |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 705 instance, | 702 instance, |
| 706 *creation_message_, | 703 *creation_message_, |
| 707 pending_renderer_host_id_, | 704 pending_renderer_host_id_, |
| 708 pending_browser_host_id_); | 705 pending_browser_host_id_); |
| 709 } | 706 } |
| 710 | 707 |
| 711 void ResourceRawVarData::PopulatePPVar(const PP_Var& var, | 708 void ResourceRawVarData::PopulatePPVar(const PP_Var& var, |
| 712 const std::vector<PP_Var>& graph) { | 709 const std::vector<PP_Var>& graph) { |
| 713 } | 710 } |
| 714 | 711 |
| 715 void ResourceRawVarData::Write(IPC::Message* m, | 712 void ResourceRawVarData::Write(base::Pickle* m, |
| 716 const HandleWriter& handle_writer) { | 713 const HandleWriter& handle_writer) { |
| 717 m->WriteInt(static_cast<int>(pp_resource_)); | 714 m->WriteInt(static_cast<int>(pp_resource_)); |
| 718 m->WriteInt(pending_renderer_host_id_); | 715 m->WriteInt(pending_renderer_host_id_); |
| 719 m->WriteInt(pending_browser_host_id_); | 716 m->WriteInt(pending_browser_host_id_); |
| 720 m->WriteBool(creation_message_); | 717 m->WriteBool(creation_message_); |
| 721 if (creation_message_) | 718 if (creation_message_) |
| 722 IPC::WriteParam(m, *creation_message_); | 719 IPC::WriteParam(m, *creation_message_); |
| 723 } | 720 } |
| 724 | 721 |
| 725 bool ResourceRawVarData::Read(PP_VarType type, | 722 bool ResourceRawVarData::Read(PP_VarType type, |
| 726 const IPC::Message* m, | 723 const base::Pickle* m, |
| 727 base::PickleIterator* iter) { | 724 base::PickleIterator* iter) { |
| 728 int value; | 725 int value; |
| 729 if (!iter->ReadInt(&value)) | 726 if (!iter->ReadInt(&value)) |
| 730 return false; | 727 return false; |
| 731 pp_resource_ = static_cast<PP_Resource>(value); | 728 pp_resource_ = static_cast<PP_Resource>(value); |
| 732 if (!iter->ReadInt(&pending_renderer_host_id_)) | 729 if (!iter->ReadInt(&pending_renderer_host_id_)) |
| 733 return false; | 730 return false; |
| 734 if (!iter->ReadInt(&pending_browser_host_id_)) | 731 if (!iter->ReadInt(&pending_browser_host_id_)) |
| 735 return false; | 732 return false; |
| 736 bool has_creation_message; | 733 bool has_creation_message; |
| 737 if (!iter->ReadBool(&has_creation_message)) | 734 if (!iter->ReadBool(&has_creation_message)) |
| 738 return false; | 735 return false; |
| 739 if (has_creation_message) { | 736 if (has_creation_message) { |
| 740 creation_message_.reset(new IPC::Message()); | 737 creation_message_.reset(new IPC::Message()); |
| 741 if (!IPC::ReadParam(m, iter, creation_message_.get())) | 738 if (!IPC::ReadParam(m, iter, creation_message_.get())) |
| 742 return false; | 739 return false; |
| 743 } else { | 740 } else { |
| 744 creation_message_.reset(); | 741 creation_message_.reset(); |
| 745 } | 742 } |
| 746 return true; | 743 return true; |
| 747 } | 744 } |
| 748 | 745 |
| 749 } // namespace proxy | 746 } // namespace proxy |
| 750 } // namespace ppapi | 747 } // namespace ppapi |
| OLD | NEW |