1// Copyright (c) 2013 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#ifndef PPAPI_CPP_EXTENSIONS_DICT_FIELD_H_ 6#define PPAPI_CPP_EXTENSIONS_DICT_FIELD_H_ 7 8#include <string> 9 10#include "ppapi/c/pp_bool.h" 11#include "ppapi/cpp/extensions/from_var_converter.h" 12#include "ppapi/cpp/extensions/optional.h" 13#include "ppapi/cpp/extensions/to_var_converter.h" 14#include "ppapi/cpp/var.h" 15#include "ppapi/cpp/var_dictionary.h" 16 17namespace pp { 18namespace ext { 19 20template <class T> 21class DictField { 22 public: 23 explicit DictField(const std::string& key) : key_(key), value_() { 24 } 25 26 ~DictField() { 27 } 28 29 const std::string& key() const { return key_; } 30 31 // Returns the value. 32 T& operator()() { return value_; } 33 const T& operator()() const { return value_; } 34 35 // Adds this field to the dictionary var. 36 bool AddTo(VarDictionary* dict) const { 37 if (!dict) 38 return false; 39 40 internal::ToVarConverter<T> converter(value_); 41 return dict->Set(Var(key_), converter.var()); 42 } 43 44 bool Populate(const VarDictionary& dict) { 45 Var value_var = dict.Get(Var(key_)); 46 if (value_var.is_undefined()) 47 return false; 48 49 internal::FromVarConverter<T> converter(value_var.pp_var()); 50 value_ = converter.value(); 51 return true; 52 } 53 54 private: 55 std::string key_; 56 T value_; 57}; 58 59template <class T> 60class OptionalDictField { 61 public: 62 explicit OptionalDictField(const std::string& key) : key_(key) { 63 } 64 65 ~OptionalDictField() { 66 } 67 68 const std::string& key() const { return key_; } 69 70 // Returns the value. 71 Optional<T>& operator()() { return value_; } 72 const Optional<T>& operator()() const { return value_; } 73 74 // Adds this field to the dictionary var, if |value| has been set. 75 bool MayAddTo(VarDictionary* dict) const { 76 if (!dict) 77 return false; 78 if (!value_.IsSet()) 79 return true; 80 81 internal::ToVarConverter<T> converter(*value_); 82 return dict->Set(Var(key_), converter.var()); 83 } 84 85 bool Populate(const VarDictionary& dict) { 86 Var value_var = dict.Get(Var(key_)); 87 internal::FromVarConverter<Optional<T> > converter(value_var.pp_var()); 88 value_.Swap(&converter.value()); 89 return true; 90 } 91 92 private: 93 std::string key_; 94 Optional<T> value_; 95}; 96 97} // namespace ext 98} // namespace pp 99 100#endif // PPAPI_CPP_EXTENSIONS_DICT_FIELD_H_ 101