blob: 60d439bd6b3f0099830a6a33b5e5c3c40030ac2d [file] [log] [blame]
[email protected]ce701cd2011-08-01 21:47:041// Copyright (c) 2011 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/var.h"
6
7#include <limits>
8
9#include "base/logging.h"
10#include "base/string_number_conversions.h"
11#include "base/string_util.h"
12#include "ppapi/c/pp_var.h"
[email protected]794d83cd2011-10-20 19:09:2013#include "ppapi/shared_impl/ppapi_globals.h"
[email protected]2bbd2c672011-08-09 23:14:1314#include "ppapi/shared_impl/var_tracker.h"
[email protected]ce701cd2011-08-01 21:47:0415
16namespace ppapi {
17
18// Var -------------------------------------------------------------------------
19
[email protected]872caf562011-12-07 22:50:4320Var::Var() : var_id_(0) {
[email protected]ce701cd2011-08-01 21:47:0421}
22
23Var::~Var() {
24}
25
26// static
27std::string Var::PPVarToLogString(PP_Var var) {
28 switch (var.type) {
29 case PP_VARTYPE_UNDEFINED:
30 return "[Undefined]";
31 case PP_VARTYPE_NULL:
32 return "[Null]";
33 case PP_VARTYPE_BOOL:
34 return var.value.as_bool ? "[True]" : "[False]";
35 case PP_VARTYPE_INT32:
36 return base::IntToString(var.value.as_int);
37 case PP_VARTYPE_DOUBLE:
38 return base::DoubleToString(var.value.as_double);
39 case PP_VARTYPE_STRING: {
[email protected]28cfaed02011-08-22 22:15:5840 StringVar* string(StringVar::FromPPVar(var));
[email protected]ce701cd2011-08-01 21:47:0441 if (!string)
42 return "[Invalid string]";
43
44 // Since this is for logging, escape NULLs, truncate length.
45 std::string result;
46 const size_t kTruncateAboveLength = 128;
47 if (string->value().size() > kTruncateAboveLength)
48 result = string->value().substr(0, kTruncateAboveLength) + "...";
49 else
50 result = string->value();
51
52 std::string null;
53 null.push_back(0);
54 ReplaceSubstringsAfterOffset(&result, 0, null, "\\0");
55 return result;
56 }
57 case PP_VARTYPE_OBJECT:
58 return "[Object]";
59 default:
60 return "[Invalid var]";
61 }
62}
63
[email protected]ce701cd2011-08-01 21:47:0464StringVar* Var::AsStringVar() {
65 return NULL;
66}
67
[email protected]8cc26a42011-12-15 21:22:3168ArrayBufferVar* Var::AsArrayBufferVar() {
69 return NULL;
70}
71
[email protected]ce701cd2011-08-01 21:47:0472NPObjectVar* Var::AsNPObjectVar() {
73 return NULL;
74}
75
[email protected]2bbd2c672011-08-09 23:14:1376ProxyObjectVar* Var::AsProxyObjectVar() {
77 return NULL;
78}
79
[email protected]8cc26a42011-12-15 21:22:3180PP_Var Var::GetPPVar() {
81 int32 id = GetOrCreateVarID();
82 if (!id)
83 return PP_MakeNull();
84
85 PP_Var result;
86 result.type = GetType();
87 result.padding = 0;
88 result.value.as_id = id;
89 return result;
90}
91
[email protected]ce701cd2011-08-01 21:47:0492int32 Var::GetExistingVarID() const {
93 return var_id_;
94}
95
96int32 Var::GetOrCreateVarID() {
[email protected]794d83cd2011-10-20 19:09:2097 VarTracker* tracker = PpapiGlobals::Get()->GetVarTracker();
[email protected]ce701cd2011-08-01 21:47:0498 if (var_id_) {
99 if (!tracker->AddRefVar(var_id_))
100 return 0;
101 } else {
102 var_id_ = tracker->AddVar(this);
103 if (!var_id_)
104 return 0;
105 }
106 return var_id_;
107}
108
[email protected]2bbd2c672011-08-09 23:14:13109void Var::AssignVarID(int32 id) {
110 DCHECK(!var_id_); // Must not have already been generated.
111 var_id_ = id;
112}
113
[email protected]ce701cd2011-08-01 21:47:04114// StringVar -------------------------------------------------------------------
115
[email protected]872caf562011-12-07 22:50:43116StringVar::StringVar(const std::string& str)
117 : value_(str) {
[email protected]6f75c952011-08-26 04:51:07118}
119
[email protected]872caf562011-12-07 22:50:43120StringVar::StringVar(const char* str, uint32 len)
121 : value_(str, len) {
[email protected]ce701cd2011-08-01 21:47:04122}
123
124StringVar::~StringVar() {
125}
126
127StringVar* StringVar::AsStringVar() {
128 return this;
129}
130
[email protected]2bbd2c672011-08-09 23:14:13131PP_VarType StringVar::GetType() const {
132 return PP_VARTYPE_STRING;
133}
134
[email protected]ce701cd2011-08-01 21:47:04135// static
[email protected]872caf562011-12-07 22:50:43136PP_Var StringVar::StringToPPVar(const std::string& var) {
137 return StringToPPVar(var.c_str(), var.size());
[email protected]ce701cd2011-08-01 21:47:04138}
139
140// static
[email protected]872caf562011-12-07 22:50:43141PP_Var StringVar::StringToPPVar(const char* data, uint32 len) {
142 scoped_refptr<StringVar> str(new StringVar(data, len));
[email protected]ce701cd2011-08-01 21:47:04143 if (!str || !IsStringUTF8(str->value()))
144 return PP_MakeNull();
145 return str->GetPPVar();
146}
147
148// static
[email protected]28cfaed02011-08-22 22:15:58149StringVar* StringVar::FromPPVar(PP_Var var) {
[email protected]ce701cd2011-08-01 21:47:04150 if (var.type != PP_VARTYPE_STRING)
[email protected]28cfaed02011-08-22 22:15:58151 return NULL;
[email protected]ce701cd2011-08-01 21:47:04152 scoped_refptr<Var> var_object(
[email protected]794d83cd2011-10-20 19:09:20153 PpapiGlobals::Get()->GetVarTracker()->GetVar(var));
[email protected]ce701cd2011-08-01 21:47:04154 if (!var_object)
[email protected]28cfaed02011-08-22 22:15:58155 return NULL;
156 return var_object->AsStringVar();
[email protected]ce701cd2011-08-01 21:47:04157}
158
[email protected]8cc26a42011-12-15 21:22:31159// ArrayBufferVar --------------------------------------------------------------
160
161ArrayBufferVar::ArrayBufferVar() {
162}
163
164ArrayBufferVar::~ArrayBufferVar() {
165}
166
167ArrayBufferVar* ArrayBufferVar::AsArrayBufferVar() {
168 return this;
169}
170
171PP_VarType ArrayBufferVar::GetType() const {
172 return PP_VARTYPE_ARRAY_BUFFER;
173}
174
175// static
176ArrayBufferVar* ArrayBufferVar::FromPPVar(PP_Var var) {
177 if (var.type != PP_VARTYPE_ARRAY_BUFFER)
178 return NULL;
179 scoped_refptr<Var> var_object(
180 PpapiGlobals::Get()->GetVarTracker()->GetVar(var));
181 if (!var_object)
182 return NULL;
183 return var_object->AsArrayBufferVar();
184}
185
[email protected]ce701cd2011-08-01 21:47:04186} // namespace ppapi
187