| // Copyright (c) 2013 The Chromium 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 "ppapi/shared_impl/dictionary_var.h" |
| |
| #include "base/memory/ref_counted.h" |
| #include "base/strings/string_util.h" |
| #include "ppapi/shared_impl/array_var.h" |
| #include "ppapi/shared_impl/ppapi_globals.h" |
| #include "ppapi/shared_impl/var_tracker.h" |
| |
| namespace ppapi { |
| |
| DictionaryVar::DictionaryVar() {} |
| |
| DictionaryVar::~DictionaryVar() {} |
| |
| // static |
| DictionaryVar* DictionaryVar::FromPPVar(const PP_Var& var) { |
| if (var.type != PP_VARTYPE_DICTIONARY) |
| return NULL; |
| |
| scoped_refptr<Var> var_object( |
| PpapiGlobals::Get()->GetVarTracker()->GetVar(var)); |
| if (!var_object.get()) |
| return NULL; |
| return var_object->AsDictionaryVar(); |
| } |
| |
| DictionaryVar* DictionaryVar::AsDictionaryVar() { return this; } |
| |
| PP_VarType DictionaryVar::GetType() const { return PP_VARTYPE_DICTIONARY; } |
| |
| PP_Var DictionaryVar::Get(const PP_Var& key) const { |
| StringVar* string_var = StringVar::FromPPVar(key); |
| if (!string_var) |
| return PP_MakeUndefined(); |
| |
| KeyValueMap::const_iterator iter = key_value_map_.find(string_var->value()); |
| if (iter != key_value_map_.end()) { |
| if (PpapiGlobals::Get()->GetVarTracker()->AddRefVar(iter->second.get())) |
| return iter->second.get(); |
| else |
| return PP_MakeUndefined(); |
| } else { |
| return PP_MakeUndefined(); |
| } |
| } |
| |
| PP_Bool DictionaryVar::Set(const PP_Var& key, const PP_Var& value) { |
| StringVar* string_var = StringVar::FromPPVar(key); |
| if (!string_var) |
| return PP_FALSE; |
| |
| key_value_map_[string_var->value()] = value; |
| return PP_TRUE; |
| } |
| |
| void DictionaryVar::Delete(const PP_Var& key) { |
| StringVar* string_var = StringVar::FromPPVar(key); |
| if (!string_var) |
| return; |
| |
| key_value_map_.erase(string_var->value()); |
| } |
| |
| PP_Bool DictionaryVar::HasKey(const PP_Var& key) const { |
| StringVar* string_var = StringVar::FromPPVar(key); |
| if (!string_var) |
| return PP_FALSE; |
| |
| bool result = |
| key_value_map_.find(string_var->value()) != key_value_map_.end(); |
| return PP_FromBool(result); |
| } |
| |
| PP_Var DictionaryVar::GetKeys() const { |
| scoped_refptr<ArrayVar> array_var(new ArrayVar()); |
| array_var->elements().reserve(key_value_map_.size()); |
| |
| for (KeyValueMap::const_iterator iter = key_value_map_.begin(); |
| iter != key_value_map_.end(); |
| ++iter) { |
| array_var->elements().push_back(ScopedPPVar( |
| ScopedPPVar::PassRef(), StringVar::StringToPPVar(iter->first))); |
| } |
| return array_var->GetPPVar(); |
| } |
| |
| bool DictionaryVar::SetWithStringKey(const std::string& utf8_key, |
| const PP_Var& value) { |
| if (!base::IsStringUTF8(utf8_key)) |
| return false; |
| |
| key_value_map_[utf8_key] = value; |
| return true; |
| } |
| |
| void DictionaryVar::DeleteWithStringKey(const std::string& utf8_key) { |
| key_value_map_.erase(utf8_key); |
| } |
| |
| } // namespace ppapi |