OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "ppapi/shared_impl/var.h" | 5 #include "ppapi/shared_impl/var.h" |
6 | 6 |
7 #include <limits> | 7 #include <limits> |
8 | 8 |
9 #include "base/logging.h" | 9 #include "base/logging.h" |
10 #include "base/string_number_conversions.h" | 10 #include "base/string_number_conversions.h" |
11 #include "base/string_util.h" | 11 #include "base/string_util.h" |
12 #include "ppapi/c/pp_var.h" | 12 #include "ppapi/c/pp_var.h" |
13 #include "ppapi/shared_impl/tracker_base.h" | 13 #include "ppapi/shared_impl/tracker_base.h" |
| 14 #include "ppapi/shared_impl/var_tracker.h" |
14 | 15 |
15 namespace ppapi { | 16 namespace ppapi { |
16 | 17 |
17 // Var ------------------------------------------------------------------------- | 18 // Var ------------------------------------------------------------------------- |
18 | 19 |
19 Var::Var(PP_Module module) : pp_module_(module), var_id_(0) { | 20 Var::Var(PP_Module module) : pp_module_(module), var_id_(0) { |
20 } | 21 } |
21 | 22 |
22 Var::~Var() { | 23 Var::~Var() { |
23 } | 24 } |
(...skipping 29 matching lines...) Expand all Loading... |
53 ReplaceSubstringsAfterOffset(&result, 0, null, "\\0"); | 54 ReplaceSubstringsAfterOffset(&result, 0, null, "\\0"); |
54 return result; | 55 return result; |
55 } | 56 } |
56 case PP_VARTYPE_OBJECT: | 57 case PP_VARTYPE_OBJECT: |
57 return "[Object]"; | 58 return "[Object]"; |
58 default: | 59 default: |
59 return "[Invalid var]"; | 60 return "[Invalid var]"; |
60 } | 61 } |
61 } | 62 } |
62 | 63 |
63 // static | |
64 void Var::PluginAddRefPPVar(PP_Var var) { | |
65 if (var.type == PP_VARTYPE_STRING || var.type == PP_VARTYPE_OBJECT) { | |
66 if (!TrackerBase::Get()->AddRefVar(static_cast<int32>(var.value.as_id))) | |
67 DLOG(WARNING) << "AddRefVar()ing a nonexistent string/object var."; | |
68 } | |
69 } | |
70 | |
71 // static | |
72 void Var::PluginReleasePPVar(PP_Var var) { | |
73 if (var.type == PP_VARTYPE_STRING || var.type == PP_VARTYPE_OBJECT) { | |
74 if (!TrackerBase::Get()->UnrefVar(static_cast<int32>(var.value.as_id))) | |
75 DLOG(WARNING) << "ReleaseVar()ing a nonexistent string/object var."; | |
76 } | |
77 } | |
78 | |
79 StringVar* Var::AsStringVar() { | 64 StringVar* Var::AsStringVar() { |
80 return NULL; | 65 return NULL; |
81 } | 66 } |
82 | 67 |
83 NPObjectVar* Var::AsNPObjectVar() { | 68 NPObjectVar* Var::AsNPObjectVar() { |
84 return NULL; | 69 return NULL; |
85 } | 70 } |
86 | 71 |
| 72 ProxyObjectVar* Var::AsProxyObjectVar() { |
| 73 return NULL; |
| 74 } |
| 75 |
87 int32 Var::GetExistingVarID() const { | 76 int32 Var::GetExistingVarID() const { |
88 return var_id_; | 77 return var_id_; |
89 } | 78 } |
90 | 79 |
91 int32 Var::GetOrCreateVarID() { | 80 int32 Var::GetOrCreateVarID() { |
92 TrackerBase* tracker = TrackerBase::Get(); | 81 VarTracker* tracker = TrackerBase::Get()->GetVarTracker(); |
93 if (var_id_) { | 82 if (var_id_) { |
94 if (!tracker->AddRefVar(var_id_)) | 83 if (!tracker->AddRefVar(var_id_)) |
95 return 0; | 84 return 0; |
96 } else { | 85 } else { |
97 var_id_ = tracker->AddVar(this); | 86 var_id_ = tracker->AddVar(this); |
98 if (!var_id_) | 87 if (!var_id_) |
99 return 0; | 88 return 0; |
100 } | 89 } |
101 return var_id_; | 90 return var_id_; |
102 } | 91 } |
103 | 92 |
| 93 void Var::AssignVarID(int32 id) { |
| 94 DCHECK(!var_id_); // Must not have already been generated. |
| 95 var_id_ = id; |
| 96 } |
| 97 |
104 // StringVar ------------------------------------------------------------------- | 98 // StringVar ------------------------------------------------------------------- |
105 | 99 |
106 StringVar::StringVar(PP_Module module, const char* str, uint32 len) | 100 StringVar::StringVar(PP_Module module, const char* str, uint32 len) |
107 : Var(module), | 101 : Var(module), |
108 value_(str, len) { | 102 value_(str, len) { |
109 } | 103 } |
110 | 104 |
111 StringVar::~StringVar() { | 105 StringVar::~StringVar() { |
112 } | 106 } |
113 | 107 |
114 StringVar* StringVar::AsStringVar() { | 108 StringVar* StringVar::AsStringVar() { |
115 return this; | 109 return this; |
116 } | 110 } |
117 | 111 |
118 PP_Var StringVar::GetPPVar() { | 112 PP_Var StringVar::GetPPVar() { |
119 int32 id = GetOrCreateVarID(); | 113 int32 id = GetOrCreateVarID(); |
120 if (!id) | 114 if (!id) |
121 return PP_MakeNull(); | 115 return PP_MakeNull(); |
122 | 116 |
123 PP_Var result; | 117 PP_Var result; |
124 result.type = PP_VARTYPE_STRING; | 118 result.type = PP_VARTYPE_STRING; |
125 result.value.as_id = id; | 119 result.value.as_id = id; |
126 return result; | 120 return result; |
127 } | 121 } |
128 | 122 |
| 123 PP_VarType StringVar::GetType() const { |
| 124 return PP_VARTYPE_STRING; |
| 125 } |
| 126 |
129 // static | 127 // static |
130 PP_Var StringVar::StringToPPVar(PP_Module module, const std::string& var) { | 128 PP_Var StringVar::StringToPPVar(PP_Module module, const std::string& var) { |
131 return StringToPPVar(module, var.c_str(), var.size()); | 129 return StringToPPVar(module, var.c_str(), var.size()); |
132 } | 130 } |
133 | 131 |
134 // static | 132 // static |
135 PP_Var StringVar::StringToPPVar(PP_Module module, | 133 PP_Var StringVar::StringToPPVar(PP_Module module, |
136 const char* data, uint32 len) { | 134 const char* data, uint32 len) { |
137 scoped_refptr<StringVar> str(new StringVar(module, data, len)); | 135 scoped_refptr<StringVar> str(new StringVar(module, data, len)); |
138 if (!str || !IsStringUTF8(str->value())) | 136 if (!str || !IsStringUTF8(str->value())) |
139 return PP_MakeNull(); | 137 return PP_MakeNull(); |
140 return str->GetPPVar(); | 138 return str->GetPPVar(); |
141 } | 139 } |
142 | 140 |
143 // static | 141 // static |
144 scoped_refptr<StringVar> StringVar::FromPPVar(PP_Var var) { | 142 scoped_refptr<StringVar> StringVar::FromPPVar(PP_Var var) { |
145 if (var.type != PP_VARTYPE_STRING) | 143 if (var.type != PP_VARTYPE_STRING) |
146 return scoped_refptr<StringVar>(); | 144 return scoped_refptr<StringVar>(); |
147 scoped_refptr<Var> var_object( | 145 scoped_refptr<Var> var_object( |
148 TrackerBase::Get()->GetVar(static_cast<int32>(var.value.as_id))); | 146 TrackerBase::Get()->GetVarTracker()->GetVar(var)); |
149 if (!var_object) | 147 if (!var_object) |
150 return scoped_refptr<StringVar>(); | 148 return scoped_refptr<StringVar>(); |
151 return scoped_refptr<StringVar>(var_object->AsStringVar()); | 149 return scoped_refptr<StringVar>(var_object->AsStringVar()); |
152 } | 150 } |
153 | 151 |
154 } // namespace ppapi | 152 } // namespace ppapi |
155 | 153 |
OLD | NEW |