12 #include "ppapi/c/pp_var.h"
13 #include "ppapi/c/ppb_var.h"
21 # define snprintf sprintf_s
28 template <>
const char* interface_name<PPB_Var_1_2>() {
29 return PPB_VAR_INTERFACE_1_2;
31 template <>
const char* interface_name<PPB_Var_1_1>() {
32 return PPB_VAR_INTERFACE_1_1;
34 template <>
const char* interface_name<PPB_Var_1_0>() {
35 return PPB_VAR_INTERFACE_1_0;
41 inline bool NeedsRefcounting(
const PP_Var& var) {
42 return var.type > PP_VARTYPE_DOUBLE;
47 PP_Var VarFromUtf8Helper(
const char* utf8_str, uint32_t len) {
48 if (has_interface<PPB_Var_1_2>()) {
49 return get_interface<PPB_Var_1_2>()->VarFromUtf8(utf8_str, len);
50 }
else if (has_interface<PPB_Var_1_1>()) {
51 return get_interface<PPB_Var_1_1>()->VarFromUtf8(utf8_str, len);
52 }
else if (has_interface<PPB_Var_1_0>()) {
62 bool AddRefHelper(
const PP_Var& var) {
63 if (has_interface<PPB_Var_1_2>()) {
64 get_interface<PPB_Var_1_2>()->AddRef(var);
66 }
else if (has_interface<PPB_Var_1_1>()) {
67 get_interface<PPB_Var_1_1>()->AddRef(var);
69 }
else if (has_interface<PPB_Var_1_0>()) {
70 get_interface<PPB_Var_1_0>()->AddRef(var);
78 bool ReleaseHelper(
const PP_Var& var) {
79 if (has_interface<PPB_Var_1_2>()) {
80 get_interface<PPB_Var_1_2>()->Release(var);
82 }
else if (has_interface<PPB_Var_1_1>()) {
83 get_interface<PPB_Var_1_1>()->Release(var);
85 }
else if (has_interface<PPB_Var_1_0>()) {
86 get_interface<PPB_Var_1_0>()->Release(var);
96 var_.type = PP_VARTYPE_UNDEFINED;
102 var_.type = PP_VARTYPE_NULL;
107 var_.type = PP_VARTYPE_BOOL;
109 var_.value.as_bool = PP_FromBool(b);
114 var_.type = PP_VARTYPE_INT32;
116 var_.value.as_int = i;
121 var_.type = PP_VARTYPE_DOUBLE;
123 var_.value.as_double = d;
128 uint32_t len = utf8_str ?
static_cast<uint32_t
>(strlen(utf8_str)) : 0;
129 var_ = VarFromUtf8Helper(utf8_str, len);
134 var_ = VarFromUtf8Helper(utf8_str.c_str(),
135 static_cast<uint32_t
>(utf8_str.size()));
140 if (has_interface<PPB_Var_1_2>()) {
141 var_ = get_interface<PPB_Var_1_2>()->VarFromResource(
156 if (NeedsRefcounting(
var_)) {
157 if (!AddRefHelper(
var_))
158 var_.type = PP_VARTYPE_NULL;
165 if (NeedsRefcounting(
var_)) {
166 if (!AddRefHelper(
var_))
167 var_.type = PP_VARTYPE_NULL;
187 if (NeedsRefcounting(other.
var_)) {
188 AddRefHelper(other.
var_);
190 if (NeedsRefcounting(
var_) && old_is_managed)
201 case PP_VARTYPE_UNDEFINED:
202 case PP_VARTYPE_NULL:
204 case PP_VARTYPE_BOOL:
206 case PP_VARTYPE_INT32:
208 case PP_VARTYPE_DOUBLE:
210 case PP_VARTYPE_STRING:
211 if (
var_.value.as_id == other.
var_.value.as_id)
214 case PP_VARTYPE_OBJECT:
215 case PP_VARTYPE_ARRAY:
216 case PP_VARTYPE_ARRAY_BUFFER:
217 case PP_VARTYPE_DICTIONARY:
218 case PP_VARTYPE_RESOURCE:
220 return var_.value.as_id == other.
var_.value.as_id;
229 return PP_ToBool(
var_.value.as_bool);
234 return var_.value.as_int;
236 return static_cast<int>(
var_.value.as_double);
243 return var_.value.as_double;
245 return static_cast<double>(
var_.value.as_int);
253 return std::string();
258 if (has_interface<PPB_Var_1_2>())
259 str = get_interface<PPB_Var_1_2>()->VarToUtf8(
var_, &len);
260 else if (has_interface<PPB_Var_1_1>())
261 str = get_interface<PPB_Var_1_1>()->VarToUtf8(
var_, &len);
262 else if (has_interface<PPB_Var_1_0>())
263 str = get_interface<PPB_Var_1_0>()->VarToUtf8(
var_, &len);
265 return std::string();
266 return std::string(str, len);
275 if (has_interface<PPB_Var_1_2>()) {
277 get_interface<PPB_Var_1_2>()->VarToResource(
var_));
286 snprintf(buf,
sizeof(buf),
"Var(UNDEFINED)");
288 snprintf(buf,
sizeof(buf),
"Var(NULL)");
290 snprintf(buf,
sizeof(buf),
AsBool() ?
"Var(true)" :
"Var(false)");
292 snprintf(buf,
sizeof(buf),
"Var(%d)", static_cast<int>(
AsInt()));
294 snprintf(buf,
sizeof(buf),
"Var(%f)",
AsDouble());
296 char format[] =
"Var<'%s'>";
297 size_t decoration =
sizeof(format) - 2;
298 size_t available =
sizeof(buf) - decoration;
300 if (str.length() > available) {
301 str.resize(available - 3);
304 snprintf(buf,
sizeof(buf), format, str.c_str());
306 snprintf(buf,
sizeof(buf),
"Var(OBJECT)");
308 snprintf(buf,
sizeof(buf),
"Var(ARRAY)");
310 snprintf(buf,
sizeof(buf),
"Var(DICTIONARY)");
312 snprintf(buf,
sizeof(buf),
"Var(ARRAY_BUFFER)");
314 snprintf(buf,
sizeof(buf),
"Var(RESOURCE)");
virtual Var & operator=(const Var &other)
bool is_array_buffer() const
This function determines if this Var is an ArrayBuffer.
std::string DebugString() const
bool is_dictionary() const
virtual ~Var()
Destructor.
std::string AsString() const
Special value passed to constructor to make NULL.
bool is_undefined() const
bool operator==(const Var &other) const
PP_Resource pp_resource() const
A generic type used for passing data types between the module and the page.
pp::Resource AsResource() const
A reference counted module resource.
PP_Module pp_module() const