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