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/private/var_private.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/dev/ppb_memory_dev.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/dev/ppb_var_deprecated.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/instance_handle.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/private/instance_private.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/logging.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/module_impl.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/dev/scriptable_object_deprecated.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace pp { 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <> const char* interface_name<PPB_Var_Deprecated>() { 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PPB_VAR_DEPRECATED_INTERFACE; 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using namespace deprecated; 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)VarPrivate::VarPrivate(const InstanceHandle& instance, 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScriptableObject* object) { 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (has_interface<PPB_Var_Deprecated>()) { 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var_ = get_interface<PPB_Var_Deprecated>()->CreateObject( 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instance.pp_instance(), object->GetClass(), object); 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var_.type = PP_VARTYPE_NULL; 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var_.padding = 0; 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_managed_ = true; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ScriptableObject* VarPrivate::AsScriptableObject() const { 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!is_object()) { 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_NOTREACHED(); 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (has_interface<PPB_Var_Deprecated>()) { 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void* object = NULL; 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (get_interface<PPB_Var_Deprecated>()->IsInstanceOf( 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var_, ScriptableObject::GetClass(), &object)) { 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return reinterpret_cast<ScriptableObject*>(object); 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool VarPrivate::HasProperty(const Var& name, Var* exception) const { 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!has_interface<PPB_Var_Deprecated>()) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return get_interface<PPB_Var_Deprecated>()->HasProperty( 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var_, name.pp_var(), OutException(exception).get()); 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool VarPrivate::HasMethod(const Var& name, Var* exception) const { 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!has_interface<PPB_Var_Deprecated>()) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return get_interface<PPB_Var_Deprecated>()->HasMethod( 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var_, name.pp_var(), OutException(exception).get()); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)VarPrivate VarPrivate::GetProperty(const Var& name, Var* exception) const { 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!has_interface<PPB_Var_Deprecated>()) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return Var(); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return Var(PassRef(), get_interface<PPB_Var_Deprecated>()->GetProperty( 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var_, name.pp_var(), OutException(exception).get())); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void VarPrivate::GetAllPropertyNames(std::vector<Var>* properties, 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Var* exception) const { 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!has_interface<PPB_Var_Deprecated>()) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Var* props = NULL; 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32_t prop_count = 0; 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) get_interface<PPB_Var_Deprecated>()->GetAllPropertyNames( 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var_, &prop_count, &props, OutException(exception).get()); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!prop_count) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) properties->resize(prop_count); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (uint32_t i = 0; i < prop_count; ++i) { 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Var temp(PassRef(), props[i]); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*properties)[i] = temp; 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const PPB_Memory_Dev* memory_if = static_cast<const PPB_Memory_Dev*>( 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp::Module::Get()->GetBrowserInterface(PPB_MEMORY_DEV_INTERFACE)); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memory_if->MemFree(props); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void VarPrivate::SetProperty(const Var& name, const Var& value, 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Var* exception) { 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!has_interface<PPB_Var_Deprecated>()) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) get_interface<PPB_Var_Deprecated>()->SetProperty( 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var_, name.pp_var(), value.pp_var(), OutException(exception).get()); 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void VarPrivate::RemoveProperty(const Var& name, Var* exception) { 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!has_interface<PPB_Var_Deprecated>()) 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) get_interface<PPB_Var_Deprecated>()->RemoveProperty( 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var_, name.pp_var(), OutException(exception).get()); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)VarPrivate VarPrivate::Call(const Var& method_name, uint32_t argc, Var* argv, 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Var* exception) { 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!has_interface<PPB_Var_Deprecated>()) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return Var(); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (argc > 0) { 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<PP_Var> args; 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) args.reserve(argc); 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < argc; i++) 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) args.push_back(argv[i].pp_var()); 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return Var(PassRef(), get_interface<PPB_Var_Deprecated>()->Call( 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var_, method_name.pp_var(), argc, &args[0], 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OutException(exception).get())); 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Don't try to get the address of a vector if it's empty. 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return Var(PassRef(), get_interface<PPB_Var_Deprecated>()->Call( 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var_, method_name.pp_var(), 0, NULL, 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OutException(exception).get())); 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)VarPrivate VarPrivate::Construct(uint32_t argc, Var* argv, 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Var* exception) const { 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!has_interface<PPB_Var_Deprecated>()) 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return Var(); 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (argc > 0) { 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<PP_Var> args; 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) args.reserve(argc); 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < argc; i++) 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) args.push_back(argv[i].pp_var()); 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return Var(PassRef(), get_interface<PPB_Var_Deprecated>()->Construct( 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var_, argc, &args[0], OutException(exception).get())); 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Don't try to get the address of a vector if it's empty. 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return Var(PassRef(), get_interface<PPB_Var_Deprecated>()->Construct( 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var_, 0, NULL, OutException(exception).get())); 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)VarPrivate VarPrivate::Call(const Var& method_name, Var* exception) { 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!has_interface<PPB_Var_Deprecated>()) 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return Var(); 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return Var(PassRef(), get_interface<PPB_Var_Deprecated>()->Call( 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var_, method_name.pp_var(), 0, NULL, OutException(exception).get())); 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)VarPrivate VarPrivate::Call(const Var& method_name, const Var& arg1, 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Var* exception) { 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!has_interface<PPB_Var_Deprecated>()) 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return Var(); 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Var args[1] = {arg1.pp_var()}; 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return Var(PassRef(), get_interface<PPB_Var_Deprecated>()->Call( 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var_, method_name.pp_var(), 1, args, OutException(exception).get())); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)VarPrivate VarPrivate::Call(const Var& method_name, const Var& arg1, 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Var& arg2, Var* exception) { 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!has_interface<PPB_Var_Deprecated>()) 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return Var(); 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Var args[2] = {arg1.pp_var(), arg2.pp_var()}; 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return Var(PassRef(), get_interface<PPB_Var_Deprecated>()->Call( 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var_, method_name.pp_var(), 2, args, OutException(exception).get())); 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)VarPrivate VarPrivate::Call(const Var& method_name, const Var& arg1, 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Var& arg2, const Var& arg3, Var* exception) { 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!has_interface<PPB_Var_Deprecated>()) 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return Var(); 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Var args[3] = {arg1.pp_var(), arg2.pp_var(), arg3.pp_var()}; 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return Var(PassRef(), get_interface<PPB_Var_Deprecated>()->Call( 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var_, method_name.pp_var(), 3, args, OutException(exception).get())); 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)VarPrivate VarPrivate::Call(const Var& method_name, const Var& arg1, 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Var& arg2, const Var& arg3, const Var& arg4, 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Var* exception) { 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!has_interface<PPB_Var_Deprecated>()) 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return Var(); 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Var args[4] = {arg1.pp_var(), arg2.pp_var(), arg3.pp_var(), arg4.pp_var()}; 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return Var(PassRef(), get_interface<PPB_Var_Deprecated>()->Call( 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var_, method_name.pp_var(), 4, args, OutException(exception).get())); 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace pp 191