12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/shared_impl/dictionary_var.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/ref_counted.h"
87d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/strings/string_util.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/shared_impl/array_var.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/shared_impl/ppapi_globals.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/shared_impl/var_tracker.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace ppapi {
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DictionaryVar::DictionaryVar() {
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DictionaryVar::~DictionaryVar() {
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DictionaryVar* DictionaryVar::FromPPVar(const PP_Var& var) {
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (var.type != PP_VARTYPE_DICTIONARY)
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return NULL;
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<Var> var_object(
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      PpapiGlobals::Get()->GetVarTracker()->GetVar(var));
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!var_object.get())
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return NULL;
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return var_object->AsDictionaryVar();
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DictionaryVar* DictionaryVar::AsDictionaryVar() {
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return this;
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)PP_VarType DictionaryVar::GetType() const {
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return PP_VARTYPE_DICTIONARY;
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)PP_Var DictionaryVar::Get(const PP_Var& key) const {
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  StringVar* string_var = StringVar::FromPPVar(key);
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!string_var)
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return PP_MakeUndefined();
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  KeyValueMap::const_iterator iter = key_value_map_.find(string_var->value());
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (iter != key_value_map_.end()) {
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (PpapiGlobals::Get()->GetVarTracker()->AddRefVar(iter->second.get()))
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return iter->second.get();
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    else
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return PP_MakeUndefined();
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return PP_MakeUndefined();
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)PP_Bool DictionaryVar::Set(const PP_Var& key, const PP_Var& value) {
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  StringVar* string_var = StringVar::FromPPVar(key);
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!string_var)
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return PP_FALSE;
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  key_value_map_[string_var->value()] = value;
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return PP_TRUE;
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DictionaryVar::Delete(const PP_Var& key) {
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  StringVar* string_var = StringVar::FromPPVar(key);
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!string_var)
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  key_value_map_.erase(string_var->value());
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)PP_Bool DictionaryVar::HasKey(const PP_Var& key) const {
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  StringVar* string_var = StringVar::FromPPVar(key);
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!string_var)
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return PP_FALSE;
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool result =
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      key_value_map_.find(string_var->value()) != key_value_map_.end();
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return PP_FromBool(result);
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)PP_Var DictionaryVar::GetKeys() const {
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<ArrayVar> array_var(new ArrayVar());
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  array_var->elements().reserve(key_value_map_.size());
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (KeyValueMap::const_iterator iter = key_value_map_.begin();
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       iter != key_value_map_.end(); ++iter) {
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    array_var->elements().push_back(
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ScopedPPVar(ScopedPPVar::PassRef(),
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    StringVar::StringToPPVar(iter->first)));
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return array_var->GetPPVar();
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool DictionaryVar::SetWithStringKey(const std::string& utf8_key,
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                     const PP_Var& value) {
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!IsStringUTF8(utf8_key))
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  key_value_map_[utf8_key] = value;
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DictionaryVar::DeleteWithStringKey(const std::string& utf8_key) {
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  key_value_map_.erase(utf8_key);
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace ppapi
111