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