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