// 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/c/ppb_var_dictionary.h"
#include "ppapi/c/pp_bool.h"
#include "ppapi/c/pp_var.h"
#include "ppapi/shared_impl/dictionary_var.h"
#include "ppapi/shared_impl/proxy_lock.h"
#include "ppapi/thunk/thunk.h"

namespace ppapi {
namespace thunk {

namespace {

PP_Var Create() {
  ProxyAutoLock lock;

  // Var tracker will hold a reference to this object.
  DictionaryVar* var = new DictionaryVar();
  return var->GetPPVar();
}

PP_Var Get(PP_Var dict, PP_Var key) {
  ProxyAutoLock lock;

  DictionaryVar* dict_var = DictionaryVar::FromPPVar(dict);
  if (!dict_var)
    return PP_MakeUndefined();
  return dict_var->Get(key);
}

PP_Bool Set(PP_Var dict, PP_Var key, PP_Var value) {
  ProxyAutoLock lock;

  DictionaryVar* dict_var = DictionaryVar::FromPPVar(dict);
  if (!dict_var)
    return PP_FALSE;

  return dict_var->Set(key, value);
}

void Delete(PP_Var dict, PP_Var key) {
  ProxyAutoLock lock;

  DictionaryVar* dict_var = DictionaryVar::FromPPVar(dict);
  if (dict_var)
    dict_var->Delete(key);
}

PP_Bool HasKey(PP_Var dict, PP_Var key) {
  ProxyAutoLock lock;

  DictionaryVar* dict_var = DictionaryVar::FromPPVar(dict);
  if (!dict_var)
    return PP_FALSE;
  return dict_var->HasKey(key);
}

PP_Var GetKeys(PP_Var dict) {
  ProxyAutoLock lock;

  DictionaryVar* dict_var = DictionaryVar::FromPPVar(dict);
  if (!dict_var)
    return PP_MakeNull();
  return dict_var->GetKeys();
}

const PPB_VarDictionary_1_0 g_ppb_vardictionary_1_0_thunk = {
  &Create,
  &Get,
  &Set,
  &Delete,
  &HasKey,
  &GetKeys
};

}  // namespace

const PPB_VarDictionary_1_0* GetPPB_VarDictionary_1_0_Thunk() {
  return &g_ppb_vardictionary_1_0_thunk;
}

}  // namespace thunk
}  // namespace ppapi
