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