| Index: ppapi/native_client/src/shared/ppapi_proxy/plugin_ppb_var.cc
|
| ===================================================================
|
| --- ppapi/native_client/src/shared/ppapi_proxy/plugin_ppb_var.cc (revision 0)
|
| +++ ppapi/native_client/src/shared/ppapi_proxy/plugin_ppb_var.cc (revision 0)
|
| @@ -0,0 +1,199 @@
|
| +// Copyright (c) 2011 The Native Client Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "native_client/src/shared/ppapi_proxy/plugin_ppb_var.h"
|
| +
|
| +#include <stdio.h>
|
| +
|
| +#include <string>
|
| +#include <utility>
|
| +
|
| +#include "native_client/src/include/checked_cast.h"
|
| +#include "native_client/src/include/nacl_macros.h"
|
| +#include "native_client/src/include/portability.h"
|
| +#include "native_client/src/include/portability_io.h"
|
| +#include "native_client/src/shared/ppapi_proxy/proxy_var_cache.h"
|
| +#include "native_client/src/shared/ppapi_proxy/string_proxy_var.h"
|
| +#include "native_client/src/shared/ppapi_proxy/utility.h"
|
| +#include "ppapi/c/pp_var.h"
|
| +#include "ppapi/c/ppb_var.h"
|
| +
|
| +namespace ppapi_proxy {
|
| +
|
| +namespace {
|
| +
|
| +void AddRef(PP_Var var) {
|
| + DebugPrintf("PPB_Var::AddRef: var=PPB_Var(%s)\n",
|
| + PluginVar::DebugString(var).c_str());
|
| + ProxyVarCache::GetInstance().RetainProxyVar(var);
|
| +}
|
| +
|
| +void Release(PP_Var var) {
|
| + DebugPrintf("PPB_Var::Release: var=PPB_Var(%s)\n",
|
| + PluginVar::DebugString(var).c_str());
|
| + ProxyVarCache::GetInstance().ReleaseProxyVar(var);
|
| +}
|
| +
|
| +PP_Var VarFromUtf8(PP_Module module_id, const char* data, uint32_t len) {
|
| + DebugPrintf("PPB_Var::VarFromUtf8: data='%.*s'\n", len, data);
|
| + UNREFERENCED_PARAMETER(module_id);
|
| + if (!StringIsUtf8(data, len)) {
|
| + DebugPrintf("PPB_Var::VarFromUtf8: not UTF8\n");
|
| + return PP_MakeNull();
|
| + }
|
| + SharedProxyVar proxy_var(new StringProxyVar(data, len));
|
| + ProxyVarCache::GetInstance().RetainSharedProxyVar(proxy_var);
|
| + PP_Var var;
|
| + var.type = PP_VARTYPE_STRING;
|
| + var.value.as_id = proxy_var->id();
|
| + // Increment the reference count for the return to the caller.
|
| + AddRef(var);
|
| + DebugPrintf("PPB_Var::VarFromUtf8: as_id=%"NACL_PRId64"\n", var.value.as_id);
|
| + return var;
|
| +}
|
| +
|
| +const char* VarToUtf8(PP_Var var, uint32_t* len) {
|
| + DebugPrintf("PPB_Var::VarToUtf8: as_id=%"NACL_PRId64"\n", var.value.as_id);
|
| + SharedStringProxyVar string_var = StringProxyVar::CastFromProxyVar(
|
| + ProxyVarCache::GetInstance().SharedProxyVarForVar(var));
|
| + const char* data = NULL;
|
| + if (string_var == NULL) {
|
| + *len = 0;
|
| + } else {
|
| + *len = static_cast<uint32_t>(string_var->contents().size());
|
| + // Mimics PPAPI implementation: as long as SharedStringProxyVar is alive,
|
| + // the return value can be validly used.
|
| + data = string_var->contents().c_str();
|
| + }
|
| + DebugPrintf("PPB_Var::VarToUtf8: data='%.*s'\n", *len, data);
|
| + return data;
|
| +}
|
| +
|
| +int64_t GetVarId(PP_Var var) {
|
| + SharedProxyVar proxy_var =
|
| + ProxyVarCache::GetInstance().SharedProxyVarForVar(var);
|
| + if (proxy_var == NULL) {
|
| + return -1;
|
| + } else {
|
| + return proxy_var->id();
|
| + }
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| +const PPB_Var* PluginVar::GetInterface() {
|
| + static const PPB_Var var_interface = {
|
| + AddRef,
|
| + Release,
|
| + VarFromUtf8,
|
| + VarToUtf8
|
| + };
|
| + return &var_interface;
|
| +}
|
| +
|
| +std::string PluginVar::DebugString(const PP_Var& var) {
|
| + switch (var.type) {
|
| + case PP_VARTYPE_UNDEFINED:
|
| + return "##UNDEFINED##";
|
| + case PP_VARTYPE_NULL:
|
| + return "##NULL##";
|
| + case PP_VARTYPE_BOOL:
|
| + return (var.value.as_bool ? "true" : "false");
|
| + case PP_VARTYPE_INT32:
|
| + {
|
| + char buf[32];
|
| + const size_t kBufSize = sizeof(buf);
|
| + SNPRINTF(buf, kBufSize, "%d", static_cast<int>(var.value.as_int));
|
| + return buf;
|
| + }
|
| + case PP_VARTYPE_DOUBLE:
|
| + {
|
| + char buf[32];
|
| + const size_t kBufSize = sizeof(buf);
|
| + SNPRINTF(buf, kBufSize, "%f", var.value.as_double);
|
| + return buf;
|
| + }
|
| + case PP_VARTYPE_STRING:
|
| + {
|
| + uint32_t len;
|
| + const char* data = VarToUtf8(var, &len);
|
| + return std::string(data, len);
|
| + }
|
| + case PP_VARTYPE_OBJECT:
|
| + {
|
| + char buf[32];
|
| + const size_t kBufSize = sizeof(buf);
|
| + SNPRINTF(buf, kBufSize, "%"NACL_PRIu64"", GetVarId(var));
|
| + return std::string("##OBJECT##") + buf + "##";
|
| + }
|
| + case PP_VARTYPE_ARRAY:
|
| + case PP_VARTYPE_DICTIONARY:
|
| + NACL_NOTREACHED();
|
| + break;
|
| + }
|
| + ASSERT_MSG(0, "Unexpected type seen");
|
| + return "##ERROR##";
|
| +}
|
| +
|
| +PP_Var PluginVar::StringToPPVar(PP_Module module_id, const std::string& str) {
|
| + static const PPB_Var* ppb_var = NULL;
|
| + if (ppb_var == NULL) {
|
| + ppb_var = static_cast<const PPB_Var*>(
|
| + ppapi_proxy::PluginVar::GetInterface());
|
| + }
|
| + if (ppb_var == NULL) {
|
| + return PP_MakeUndefined();
|
| + }
|
| + return ppb_var->VarFromUtf8(
|
| + module_id, str.c_str(), nacl::assert_cast<uint32_t>(str.size()));
|
| +}
|
| +
|
| +std::string PluginVar::PPVarToString(const PP_Var& var) {
|
| + static const PPB_Var* ppb_var = NULL;
|
| + if (ppb_var == NULL) {
|
| + ppb_var = static_cast<const PPB_Var*>(
|
| + ppapi_proxy::PluginVar::GetInterface());
|
| + }
|
| + if (ppb_var == NULL || var.type != PP_VARTYPE_STRING) {
|
| + return "";
|
| + }
|
| + uint32_t len;
|
| + return ppb_var->VarToUtf8(var, &len);
|
| +}
|
| +
|
| +void PluginVar::Print(const PP_Var& var) {
|
| + switch (var.type) {
|
| + case PP_VARTYPE_UNDEFINED:
|
| + DebugPrintf("PP_Var(undefined)");
|
| + break;
|
| + case PP_VARTYPE_NULL:
|
| + DebugPrintf("PP_Var(null)");
|
| + break;
|
| + case PP_VARTYPE_BOOL:
|
| + DebugPrintf("PP_Var(bool: %s)", var.value.as_bool ? "true" : "false");
|
| + break;
|
| + case PP_VARTYPE_INT32:
|
| + DebugPrintf("PP_Var(int32: %"NACL_PRId32")", var.value.as_int);
|
| + break;
|
| + case PP_VARTYPE_DOUBLE:
|
| + DebugPrintf("PP_Var(double: %f)", var.value.as_double);
|
| + break;
|
| + case PP_VARTYPE_STRING:
|
| + {
|
| + std::string str = DebugString(var);
|
| + DebugPrintf("PP_Var(string: '%*s')",
|
| + static_cast<uint32_t>(str.size()),
|
| + str.c_str());
|
| + }
|
| + case PP_VARTYPE_OBJECT:
|
| + DebugPrintf("PP_Var(object: %"NACL_PRIu64")", GetVarId(var));
|
| + break;
|
| + case PP_VARTYPE_ARRAY:
|
| + case PP_VARTYPE_DICTIONARY:
|
| + NACL_NOTREACHED();
|
| + break;
|
| + }
|
| +}
|
| +
|
| +} // namespace ppapi_proxy
|
|
|