15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/dev/scriptable_object_deprecated.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/dev/ppb_memory_dev.h" 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/dev/ppp_class_deprecated.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/module.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/var.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace pp { 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace deprecated { 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Allows converting an output param of a Var to an output param of a PP_Var 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// for exceptions. The object is only copied if it is not void, which we 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// take to mean an exception occurred. 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ExceptionConverter { 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExceptionConverter(PP_Var* out) : out_(out) { 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~ExceptionConverter() { 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!exception_.is_undefined()) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out_ = exception_.Detach(); 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Var* Get() { return &exception_; } 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Var* out_; 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Var exception_; 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Used internally to convert a C-style array of PP_Var to a vector of Var. 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ArgListToVector(uint32_t argc, PP_Var* argv, std::vector<Var>* output) { 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) output->reserve(argc); 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < argc; i++) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) output->push_back(Var(Var::DontManage(), argv[i])); 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool HasProperty(void* object, PP_Var name, PP_Var* exception) { 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExceptionConverter e(exception); 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return static_cast<ScriptableObject*>(object)->HasProperty( 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Var(Var::DontManage(), name), e.Get()); 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool HasMethod(void* object, PP_Var name, PP_Var* exception) { 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExceptionConverter e(exception); 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return static_cast<ScriptableObject*>(object)->HasMethod( 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Var(Var::DontManage(), name), e.Get()); 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_Var GetProperty(void* object, 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Var name, 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Var* exception) { 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExceptionConverter e(exception); 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return static_cast<ScriptableObject*>(object)->GetProperty( 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Var(Var::DontManage(), name), e.Get()).Detach(); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GetAllPropertyNames(void* object, 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32_t* property_count, 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Var** properties, 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Var* exception) { 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExceptionConverter e(exception); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<Var> props; 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<ScriptableObject*>(object)->GetAllPropertyNames(&props, e.Get()); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (props.empty()) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *property_count = static_cast<uint32_t>(props.size()); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const PPB_Memory_Dev* memory_if = static_cast<const PPB_Memory_Dev*>( 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp::Module::Get()->GetBrowserInterface(PPB_MEMORY_DEV_INTERFACE)); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *properties = static_cast<PP_Var*>( 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memory_if->MemAlloc(sizeof(PP_Var) * props.size())); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < props.size(); ++i) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*properties)[i] = props[i].Detach(); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SetProperty(void* object, 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Var name, 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Var value, 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Var* exception) { 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExceptionConverter e(exception); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<ScriptableObject*>(object)->SetProperty( 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Var(Var::DontManage(), name), Var(Var::DontManage(), value), e.Get()); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RemoveProperty(void* object, 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Var name, 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Var* exception) { 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExceptionConverter e(exception); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<ScriptableObject*>(object)->RemoveProperty( 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Var(Var::DontManage(), name), e.Get()); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_Var Call(void* object, 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Var method_name, 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32_t argc, 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Var* argv, 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Var* exception) { 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExceptionConverter e(exception); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<Var> args; 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ArgListToVector(argc, argv, &args); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return static_cast<ScriptableObject*>(object)->Call( 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Var(Var::DontManage(), method_name), args, e.Get()).Detach(); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_Var Construct(void* object, 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32_t argc, 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Var* argv, 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Var* exception) { 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExceptionConverter e(exception); 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<Var> args; 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ArgListToVector(argc, argv, &args); 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return static_cast<ScriptableObject*>(object)->Construct( 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) args, e.Get()).Detach(); 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Deallocate(void* object) { 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete static_cast<ScriptableObject*>(object); 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PPP_Class_Deprecated plugin_class = { 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &HasProperty, 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &HasMethod, 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &GetProperty, 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &GetAllPropertyNames, 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &SetProperty, 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &RemoveProperty, 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &Call, 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &Construct, 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &Deallocate 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ScriptableObject::HasProperty(const Var& /*name*/, Var* /*exception*/) { 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ScriptableObject::HasMethod(const Var& /*name*/, Var* /*exception*/) { 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Var ScriptableObject::GetProperty(const Var& /*name*/, Var* exception) { 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *exception = Var("Property does not exist on ScriptableObject"); 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return Var(); 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ScriptableObject::GetAllPropertyNames(std::vector<Var>* /*properties*/, 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Var* /*exception*/) { 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ScriptableObject::SetProperty(const Var& /*name*/, 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Var& /*value*/, 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Var* exception) { 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *exception = Var("Property can not be set on ScriptableObject"); 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ScriptableObject::RemoveProperty(const Var& /*name*/, 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Var* exception) { 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *exception = Var( 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Property does does not exist to be removed in ScriptableObject"); 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Var ScriptableObject::Call(const Var& /*method_name*/, 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<Var>& /*args*/, 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Var* exception) { 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *exception = Var("Method does not exist to call in ScriptableObject"); 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return Var(); 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Var ScriptableObject::Construct(const std::vector<Var>& /*args*/, 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Var* exception) { 181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) *exception = Var("Construct method does not exist in ScriptableObject"); 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return Var(); 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PPP_Class_Deprecated* ScriptableObject::GetClass() { 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return &plugin_class; 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace deprecated 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace pp 193