1ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// Use of this source code is governed by a BSD-style license that can be
3ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// found in the LICENSE file.
4ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
5ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "ppapi/shared_impl/ppb_var_shared.h"
6ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
7ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include <limits>
8ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
9ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "ppapi/c/ppb_var.h"
10ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "ppapi/c/ppb_var_array_buffer.h"
11ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "ppapi/c/pp_var.h"
12ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "ppapi/shared_impl/ppapi_globals.h"
13ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "ppapi/shared_impl/proxy_lock.h"
14ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "ppapi/shared_impl/resource_tracker.h"
15ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "ppapi/shared_impl/resource_var.h"
16ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "ppapi/shared_impl/var.h"
17ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "ppapi/shared_impl/var_tracker.h"
18ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
19ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovusing ppapi::PpapiGlobals;
20ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovusing ppapi::StringVar;
21ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
22ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovnamespace ppapi {
23ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovnamespace {
24ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
25ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// PPB_Var methods -------------------------------------------------------------
26ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
27ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid AddRefVar(PP_Var var) {
28ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  ProxyAutoLock lock;
29ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  PpapiGlobals::Get()->GetVarTracker()->AddRefVar(var);
30ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
31ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
32ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid ReleaseVar(PP_Var var) {
33ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  ProxyAutoLock lock;
34ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  PpapiGlobals::Get()->GetVarTracker()->ReleaseVar(var);
35ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
36ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
37ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovPP_Var VarFromUtf8(const char* data, uint32_t len) {
38ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  ProxyAutoLock lock;
39ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  return StringVar::StringToPPVar(data, len);
40ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
41ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
42ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovPP_Var VarFromUtf8_1_0(PP_Module /*module*/, const char* data, uint32_t len) {
43ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  return VarFromUtf8(data, len);
44ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
45ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
46ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovconst char* VarToUtf8(PP_Var var, uint32_t* len) {
47ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  ProxyAutoLock lock;
48ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  StringVar* str = StringVar::FromPPVar(var);
49ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  if (str) {
50ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    *len = static_cast<uint32_t>(str->value().size());
51ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return str->value().c_str();
52ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  }
53ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  *len = 0;
54ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  return NULL;
55ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
56ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
57ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovPP_Resource VarToResource(PP_Var var) {
58ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  ProxyAutoLock lock;
59ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  ResourceVar* resource = ResourceVar::FromPPVar(var);
60ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  if (!resource)
61ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return 0;
62ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  PP_Resource pp_resource = resource->GetPPResource();
63ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  PpapiGlobals::Get()->GetResourceTracker()->AddRefResource(pp_resource);
64ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  return pp_resource;
65ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
66ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
67ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovPP_Var VarFromResource(PP_Resource resource) {
68ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  ProxyAutoLock lock;
69ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  return PpapiGlobals::Get()->GetVarTracker()->MakeResourcePPVar(resource);
70ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
71ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
72ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovconst PPB_Var var_interface = {&AddRefVar, &ReleaseVar,    &VarFromUtf8,
73ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                               &VarToUtf8, &VarToResource, &VarFromResource};
74ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
75ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovconst PPB_Var_1_1 var_interface1_1 = {&AddRefVar,   &ReleaseVar,
76ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                      &VarFromUtf8, &VarToUtf8};
77ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
78ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovconst PPB_Var_1_0 var_interface1_0 = {&AddRefVar,       &ReleaseVar,
79ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                      &VarFromUtf8_1_0, &VarToUtf8};
80ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
81ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// PPB_VarArrayBuffer methods --------------------------------------------------
82ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
83ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovPP_Var CreateArrayBufferVar(uint32_t size_in_bytes) {
84ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  ProxyAutoLock lock;
85ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  return PpapiGlobals::Get()->GetVarTracker()->MakeArrayBufferPPVar(
86ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      size_in_bytes);
87ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
88ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
89ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovPP_Bool ByteLength(PP_Var array, uint32_t* byte_length) {
90ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  ProxyAutoLock lock;
91ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  ArrayBufferVar* buffer = ArrayBufferVar::FromPPVar(array);
92ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  if (!buffer)
93ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return PP_FALSE;
94ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  *byte_length = buffer->ByteLength();
95ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  return PP_TRUE;
96ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
97ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
98ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid* Map(PP_Var array) {
99ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  ProxyAutoLock lock;
100ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  ArrayBufferVar* buffer = ArrayBufferVar::FromPPVar(array);
101ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  if (!buffer)
102ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return NULL;
103ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  return buffer->Map();
104ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
105ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
106ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid Unmap(PP_Var array) {
107ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  ProxyAutoLock lock;
108ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  ArrayBufferVar* buffer = ArrayBufferVar::FromPPVar(array);
109ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  if (buffer)
110ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    buffer->Unmap();
111ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
112ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
113ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovconst PPB_VarArrayBuffer_1_0 var_arraybuffer_interface = {
114ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    &CreateArrayBufferVar, &ByteLength, &Map, &Unmap};
115ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
116ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}  // namespace
117ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
118ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// static
119ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovconst PPB_Var_1_2* PPB_Var_Shared::GetVarInterface1_2() {
120ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  return &var_interface;
121ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
122ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
123ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// static
124ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovconst PPB_Var_1_1* PPB_Var_Shared::GetVarInterface1_1() {
125ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  return &var_interface1_1;
126ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
127ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
128ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// static
129ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovconst PPB_Var_1_0* PPB_Var_Shared::GetVarInterface1_0() {
130ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  return &var_interface1_0;
131ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
132ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
133ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// static
134ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovconst PPB_VarArrayBuffer_1_0* PPB_Var_Shared::GetVarArrayBufferInterface1_0() {
135ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  return &var_arraybuffer_interface;
136ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
137ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
138ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}  // namespace ppapi
139ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov