1eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Copyright 2013 The Chromium Authors. All rights reserved.
2eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// found in the LICENSE file.
4eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
5eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ppapi/cpp/var_array.h"
6eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
7eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ppapi/c/ppb_var_array.h"
8eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ppapi/cpp/logging.h"
9eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ppapi/cpp/module_impl.h"
10eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnamespace pp {
12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
13eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnamespace {
14eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochtemplate <> const char* interface_name<PPB_VarArray_1_0>() {
16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return PPB_VAR_ARRAY_INTERFACE_1_0;
17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
18eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
19eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}  // namespace
20eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
21eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochVarArray::VarArray() : Var(Null()) {
22eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (has_interface<PPB_VarArray_1_0>())
23eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    var_ = get_interface<PPB_VarArray_1_0>()->Create();
24eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  else
25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    PP_NOTREACHED();
26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
27eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
28eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochVarArray::VarArray(const Var& var) : Var(var) {
29eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (!var.is_array()) {
30eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    PP_NOTREACHED();
31eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
32eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // This takes care of releasing the reference that this object holds.
33eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    Var::operator=(Var(Null()));
34eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
35eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
36eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochVarArray::VarArray(const PP_Var& var) : Var(var) {
38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (var.type != PP_VARTYPE_ARRAY) {
39eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    PP_NOTREACHED();
40eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
41eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // This takes care of releasing the reference that this object holds.
42eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    Var::operator=(Var(Null()));
43eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
44eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
45eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
46eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochVarArray::VarArray(const VarArray& other) : Var(other) {
47eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
48eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
49eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochVarArray::~VarArray() {
50eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
51eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
52eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochVarArray& VarArray::operator=(const VarArray& other) {
53eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  Var::operator=(other);
54eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return *this;
55eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
56eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
57eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochVar& VarArray::operator=(const Var& other) {
58eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (other.is_array()) {
59eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    Var::operator=(other);
60eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  } else {
61eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    PP_NOTREACHED();
62eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    Var::operator=(Var(Null()));
63eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
64eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return *this;
65eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
66eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
67eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochVar VarArray::Get(uint32_t index) const {
68eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (!has_interface<PPB_VarArray_1_0>())
69eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return Var();
70eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
71eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return Var(PASS_REF, get_interface<PPB_VarArray_1_0>()->Get(var_, index));
72eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
73eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
74eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool VarArray::Set(uint32_t index, const Var& value) {
75eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (!has_interface<PPB_VarArray_1_0>())
76eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return false;
77eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
78eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return PP_ToBool(get_interface<PPB_VarArray_1_0>()->Set(var_, index,
79eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                                          value.pp_var()));
80eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
81eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
82eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochuint32_t VarArray::GetLength() const {
83eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (!has_interface<PPB_VarArray_1_0>())
84eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return 0;
85eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
86eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return get_interface<PPB_VarArray_1_0>()->GetLength(var_);
87eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
88eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
89eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool VarArray::SetLength(uint32_t length) {
90eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (!has_interface<PPB_VarArray_1_0>())
91eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return false;
92eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
93eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return PP_ToBool(get_interface<PPB_VarArray_1_0>()->SetLength(var_, length));
94eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
95eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
96eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}  // namespace pp
97