values.cc revision 5821806d5e7f356e8fa4b058a389a808ea183019
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <algorithm> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <ostream> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/float_util.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/json/json_writer.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/string_util.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/utf_string_conversions.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Make a deep copy of |node|, but don't include empty lists or dictionaries 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// in the copy. It's possible for this function to return NULL and it 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// expects |node| to always be non-NULL. 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value* CopyWithoutEmptyChildren(Value* node) { 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(node); 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (node->GetType()) { 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case Value::TYPE_LIST: { 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ListValue* list = static_cast<ListValue*>(node); 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ListValue* copy = new ListValue; 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (ListValue::const_iterator it = list->begin(); it != list->end(); 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++it) { 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Value* child_copy = CopyWithoutEmptyChildren(*it); 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (child_copy) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) copy->Append(child_copy); 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!copy->empty()) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return copy; 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete copy; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case Value::TYPE_DICTIONARY: { 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DictionaryValue* dict = static_cast<DictionaryValue*>(node); 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DictionaryValue* copy = new DictionaryValue; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (DictionaryValue::key_iterator it = dict->begin_keys(); 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it != dict->end_keys(); ++it) { 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Value* child = NULL; 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool rv = dict->GetWithoutPathExpansion(*it, &child); 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(rv); 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Value* child_copy = CopyWithoutEmptyChildren(child); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (child_copy) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) copy->SetWithoutPathExpansion(*it, child_copy); 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!copy->empty()) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return copy; 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete copy; 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For everything else, just make a copy. 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return node->DeepCopy(); 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A small functor for comparing Values for std::find_if and similar. 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ValueEquals { 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Pass the value against which all consecutive calls of the () operator will 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // compare their argument to. This Value object must not be destroyed while 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the ValueEquals is in use. 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ValueEquals(const Value* first) : first_(first) { } 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool operator ()(const Value* second) const { 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return first_->Equals(second); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Value* first_; 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base { 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)///////////////////// Value //////////////////// 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::~Value() { 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value* Value::CreateNullValue() { 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new Value(TYPE_NULL); 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FundamentalValue* Value::CreateBooleanValue(bool in_value) { 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new FundamentalValue(in_value); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FundamentalValue* Value::CreateIntegerValue(int in_value) { 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new FundamentalValue(in_value); 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FundamentalValue* Value::CreateDoubleValue(double in_value) { 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new FundamentalValue(in_value); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)StringValue* Value::CreateStringValue(const std::string& in_value) { 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new StringValue(in_value); 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)StringValue* Value::CreateStringValue(const string16& in_value) { 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new StringValue(in_value); 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Value::GetAsBoolean(bool* out_value) const { 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Value::GetAsInteger(int* out_value) const { 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Value::GetAsDouble(double* out_value) const { 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Value::GetAsString(std::string* out_value) const { 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Value::GetAsString(string16* out_value) const { 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Value::GetAsList(ListValue** out_value) { 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Value::GetAsList(const ListValue** out_value) const { 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Value::GetAsDictionary(DictionaryValue** out_value) { 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Value::GetAsDictionary(const DictionaryValue** out_value) const { 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value* Value::DeepCopy() const { 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This method should only be getting called for null Values--all subclasses 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // need to provide their own implementation;. 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(IsType(TYPE_NULL)); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return CreateNullValue(); 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Value::Equals(const Value* other) const { 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This method should only be getting called for null Values--all subclasses 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // need to provide their own implementation;. 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(IsType(TYPE_NULL)); 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return other->IsType(TYPE_NULL); 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Value::Equals(const Value* a, const Value* b) { 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((a == NULL) && (b == NULL)) return true; 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((a == NULL) ^ (b == NULL)) return false; 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return a->Equals(b); 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::Value(Type type) : type_(type) { 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)///////////////////// FundamentalValue //////////////////// 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FundamentalValue::FundamentalValue(bool in_value) 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : Value(TYPE_BOOLEAN), boolean_value_(in_value) { 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FundamentalValue::FundamentalValue(int in_value) 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : Value(TYPE_INTEGER), integer_value_(in_value) { 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FundamentalValue::FundamentalValue(double in_value) 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : Value(TYPE_DOUBLE), double_value_(in_value) { 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!IsFinite(double_value_)) { 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED() << "Non-finite (i.e. NaN or positive/negative infinity) " 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << "values cannot be represented in JSON"; 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double_value_ = 0.0; 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FundamentalValue::~FundamentalValue() { 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool FundamentalValue::GetAsBoolean(bool* out_value) const { 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (out_value && IsType(TYPE_BOOLEAN)) 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out_value = boolean_value_; 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (IsType(TYPE_BOOLEAN)); 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool FundamentalValue::GetAsInteger(int* out_value) const { 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (out_value && IsType(TYPE_INTEGER)) 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out_value = integer_value_; 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (IsType(TYPE_INTEGER)); 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool FundamentalValue::GetAsDouble(double* out_value) const { 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (out_value && IsType(TYPE_DOUBLE)) 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out_value = double_value_; 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (out_value && IsType(TYPE_INTEGER)) 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out_value = integer_value_; 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (IsType(TYPE_DOUBLE) || IsType(TYPE_INTEGER)); 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FundamentalValue* FundamentalValue::DeepCopy() const { 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (GetType()) { 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TYPE_BOOLEAN: 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return CreateBooleanValue(boolean_value_); 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TYPE_INTEGER: 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return CreateIntegerValue(integer_value_); 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TYPE_DOUBLE: 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return CreateDoubleValue(double_value_); 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool FundamentalValue::Equals(const Value* other) const { 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (other->GetType() != GetType()) 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (GetType()) { 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TYPE_BOOLEAN: { 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool lhs, rhs; 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetAsBoolean(&lhs) && other->GetAsBoolean(&rhs) && lhs == rhs; 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TYPE_INTEGER: { 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int lhs, rhs; 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetAsInteger(&lhs) && other->GetAsInteger(&rhs) && lhs == rhs; 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TYPE_DOUBLE: { 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double lhs, rhs; 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetAsDouble(&lhs) && other->GetAsDouble(&rhs) && lhs == rhs; 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)///////////////////// StringValue //////////////////// 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)StringValue::StringValue(const std::string& in_value) 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : Value(TYPE_STRING), 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value_(in_value) { 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(IsStringUTF8(in_value)); 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)StringValue::StringValue(const string16& in_value) 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : Value(TYPE_STRING), 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value_(UTF16ToUTF8(in_value)) { 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)StringValue::~StringValue() { 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool StringValue::GetAsString(std::string* out_value) const { 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (out_value) 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out_value = value_; 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool StringValue::GetAsString(string16* out_value) const { 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (out_value) 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out_value = UTF8ToUTF16(value_); 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)StringValue* StringValue::DeepCopy() const { 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return CreateStringValue(value_); 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool StringValue::Equals(const Value* other) const { 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (other->GetType() != GetType()) 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string lhs, rhs; 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetAsString(&lhs) && other->GetAsString(&rhs) && lhs == rhs; 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)///////////////////// BinaryValue //////////////////// 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BinaryValue::~BinaryValue() { 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(buffer_); 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (buffer_) 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete[] buffer_; 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BinaryValue* BinaryValue::Create(char* buffer, size_t size) { 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!buffer) 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new BinaryValue(buffer, size); 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BinaryValue* BinaryValue::CreateWithCopiedBuffer(const char* buffer, 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t size) { 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!buffer) 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char* buffer_copy = new char[size]; 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memcpy(buffer_copy, buffer, size); 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new BinaryValue(buffer_copy, size); 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BinaryValue* BinaryValue::DeepCopy() const { 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return CreateWithCopiedBuffer(buffer_, size_); 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool BinaryValue::Equals(const Value* other) const { 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (other->GetType() != GetType()) 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const BinaryValue* other_binary = static_cast<const BinaryValue*>(other); 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (other_binary->size_ != size_) 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return !memcmp(buffer_, other_binary->buffer_, size_); 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BinaryValue::BinaryValue(char* buffer, size_t size) 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : Value(TYPE_BINARY), 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buffer_(buffer), 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_(size) { 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(buffer_); 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)///////////////////// DictionaryValue //////////////////// 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DictionaryValue::DictionaryValue() 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : Value(TYPE_DICTIONARY) { 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DictionaryValue::~DictionaryValue() { 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Clear(); 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DictionaryValue::GetAsDictionary(DictionaryValue** out_value) { 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (out_value) 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out_value = this; 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DictionaryValue::GetAsDictionary(const DictionaryValue** out_value) const { 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (out_value) 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out_value = this; 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DictionaryValue::HasKey(const std::string& key) const { 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(IsStringUTF8(key)); 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ValueMap::const_iterator current_entry = dictionary_.find(key); 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK((current_entry == dictionary_.end()) || current_entry->second); 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return current_entry != dictionary_.end(); 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DictionaryValue::Clear() { 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ValueMap::iterator dict_iterator = dictionary_.begin(); 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (dict_iterator != dictionary_.end()) { 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete dict_iterator->second; 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++dict_iterator; 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dictionary_.clear(); 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DictionaryValue::Set(const std::string& path, Value* in_value) { 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(IsStringUTF8(path)); 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(in_value); 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string current_path(path); 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DictionaryValue* current_dictionary = this; 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t delimiter_position = current_path.find('.'); 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delimiter_position != std::string::npos; 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delimiter_position = current_path.find('.')) { 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Assume that we're indexing into a dictionary. 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string key(current_path, 0, delimiter_position); 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DictionaryValue* child_dictionary = NULL; 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!current_dictionary->GetDictionary(key, &child_dictionary)) { 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child_dictionary = new DictionaryValue; 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_dictionary->SetWithoutPathExpansion(key, child_dictionary); 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_dictionary = child_dictionary; 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_path.erase(0, delimiter_position + 1); 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_dictionary->SetWithoutPathExpansion(current_path, in_value); 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DictionaryValue::SetBoolean(const std::string& path, bool in_value) { 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Set(path, CreateBooleanValue(in_value)); 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DictionaryValue::SetInteger(const std::string& path, int in_value) { 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Set(path, CreateIntegerValue(in_value)); 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DictionaryValue::SetDouble(const std::string& path, double in_value) { 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Set(path, CreateDoubleValue(in_value)); 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DictionaryValue::SetString(const std::string& path, 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& in_value) { 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Set(path, CreateStringValue(in_value)); 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DictionaryValue::SetString(const std::string& path, 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& in_value) { 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Set(path, CreateStringValue(in_value)); 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DictionaryValue::SetWithoutPathExpansion(const std::string& key, 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Value* in_value) { 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If there's an existing value here, we need to delete it, because 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // we own all our children. 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::pair<ValueMap::iterator, bool> ins_res = 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dictionary_.insert(std::make_pair(key, in_value)); 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!ins_res.second) { 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_NE(ins_res.first->second, in_value); // This would be bogus 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete ins_res.first->second; 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ins_res.first->second = in_value; 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DictionaryValue::SetBooleanWithoutPathExpansion( 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& path, bool in_value) { 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetWithoutPathExpansion(path, CreateBooleanValue(in_value)); 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DictionaryValue::SetIntegerWithoutPathExpansion( 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& path, int in_value) { 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetWithoutPathExpansion(path, CreateIntegerValue(in_value)); 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DictionaryValue::SetDoubleWithoutPathExpansion( 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& path, double in_value) { 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetWithoutPathExpansion(path, CreateDoubleValue(in_value)); 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DictionaryValue::SetStringWithoutPathExpansion( 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& path, const std::string& in_value) { 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetWithoutPathExpansion(path, CreateStringValue(in_value)); 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DictionaryValue::SetStringWithoutPathExpansion( 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& path, const string16& in_value) { 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetWithoutPathExpansion(path, CreateStringValue(in_value)); 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DictionaryValue::Get( 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& path, const Value** out_value) const { 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(IsStringUTF8(path)); 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string current_path(path); 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const DictionaryValue* current_dictionary = this; 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t delimiter_position = current_path.find('.'); 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delimiter_position != std::string::npos; 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delimiter_position = current_path.find('.')) { 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const DictionaryValue* child_dictionary = NULL; 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!current_dictionary->GetDictionary( 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_path.substr(0, delimiter_position), &child_dictionary)) 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_dictionary = child_dictionary; 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_path.erase(0, delimiter_position + 1); 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return current_dictionary->GetWithoutPathExpansion(current_path, out_value); 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DictionaryValue::Get(const std::string& path, Value** out_value) { 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return static_cast<const DictionaryValue&>(*this).Get( 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) path, 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const_cast<const Value**>(out_value)); 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DictionaryValue::GetBoolean(const std::string& path, 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool* bool_value) const { 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Value* value; 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!Get(path, &value)) 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return value->GetAsBoolean(bool_value); 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DictionaryValue::GetInteger(const std::string& path, 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int* out_value) const { 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Value* value; 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!Get(path, &value)) 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return value->GetAsInteger(out_value); 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DictionaryValue::GetDouble(const std::string& path, 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double* out_value) const { 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Value* value; 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!Get(path, &value)) 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return value->GetAsDouble(out_value); 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DictionaryValue::GetString(const std::string& path, 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string* out_value) const { 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Value* value; 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!Get(path, &value)) 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return value->GetAsString(out_value); 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DictionaryValue::GetString(const std::string& path, 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16* out_value) const { 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Value* value; 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!Get(path, &value)) 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return value->GetAsString(out_value); 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DictionaryValue::GetStringASCII(const std::string& path, 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string* out_value) const { 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string out; 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!GetString(path, &out)) 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!IsStringASCII(out)) { 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) out_value->assign(out); 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DictionaryValue::GetBinary(const std::string& path, 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const BinaryValue** out_value) const { 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Value* value; 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool result = Get(path, &value); 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!result || !value->IsType(TYPE_BINARY)) 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (out_value) 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out_value = static_cast<const BinaryValue*>(value); 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DictionaryValue::GetBinary(const std::string& path, 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BinaryValue** out_value) { 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return static_cast<const DictionaryValue&>(*this).GetBinary( 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) path, 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const_cast<const BinaryValue**>(out_value)); 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DictionaryValue::GetDictionary(const std::string& path, 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const DictionaryValue** out_value) const { 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Value* value; 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool result = Get(path, &value); 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!result || !value->IsType(TYPE_DICTIONARY)) 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (out_value) 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out_value = static_cast<const DictionaryValue*>(value); 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DictionaryValue::GetDictionary(const std::string& path, 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DictionaryValue** out_value) { 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return static_cast<const DictionaryValue&>(*this).GetDictionary( 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) path, 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const_cast<const DictionaryValue**>(out_value)); 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DictionaryValue::GetList(const std::string& path, 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ListValue** out_value) const { 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Value* value; 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool result = Get(path, &value); 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!result || !value->IsType(TYPE_LIST)) 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (out_value) 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out_value = static_cast<const ListValue*>(value); 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DictionaryValue::GetList(const std::string& path, ListValue** out_value) { 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return static_cast<const DictionaryValue&>(*this).GetList( 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) path, 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const_cast<const ListValue**>(out_value)); 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DictionaryValue::GetWithoutPathExpansion(const std::string& key, 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Value** out_value) const { 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(IsStringUTF8(key)); 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ValueMap::const_iterator entry_iterator = dictionary_.find(key); 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (entry_iterator == dictionary_.end()) 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Value* entry = entry_iterator->second; 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (out_value) 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out_value = entry; 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DictionaryValue::GetWithoutPathExpansion(const std::string& key, 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Value** out_value) { 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return static_cast<const DictionaryValue&>(*this).GetWithoutPathExpansion( 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key, 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const_cast<const Value**>(out_value)); 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DictionaryValue::GetBooleanWithoutPathExpansion(const std::string& key, 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool* out_value) const { 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Value* value; 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!GetWithoutPathExpansion(key, &value)) 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return value->GetAsBoolean(out_value); 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DictionaryValue::GetIntegerWithoutPathExpansion(const std::string& key, 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int* out_value) const { 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Value* value; 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!GetWithoutPathExpansion(key, &value)) 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return value->GetAsInteger(out_value); 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DictionaryValue::GetDoubleWithoutPathExpansion(const std::string& key, 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double* out_value) const { 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Value* value; 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!GetWithoutPathExpansion(key, &value)) 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return value->GetAsDouble(out_value); 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DictionaryValue::GetStringWithoutPathExpansion( 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& key, 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string* out_value) const { 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Value* value; 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!GetWithoutPathExpansion(key, &value)) 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return value->GetAsString(out_value); 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DictionaryValue::GetStringWithoutPathExpansion(const std::string& key, 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16* out_value) const { 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Value* value; 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!GetWithoutPathExpansion(key, &value)) 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return value->GetAsString(out_value); 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DictionaryValue::GetDictionaryWithoutPathExpansion( 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& key, 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const DictionaryValue** out_value) const { 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Value* value; 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool result = GetWithoutPathExpansion(key, &value); 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!result || !value->IsType(TYPE_DICTIONARY)) 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (out_value) 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out_value = static_cast<const DictionaryValue*>(value); 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DictionaryValue::GetDictionaryWithoutPathExpansion( 6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& key, 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DictionaryValue** out_value) { 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const DictionaryValue& const_this = 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<const DictionaryValue&>(*this); 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return const_this.GetDictionaryWithoutPathExpansion( 7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key, 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const_cast<const DictionaryValue**>(out_value)); 7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DictionaryValue::GetListWithoutPathExpansion( 7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& key, 7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ListValue** out_value) const { 7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Value* value; 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool result = GetWithoutPathExpansion(key, &value); 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!result || !value->IsType(TYPE_LIST)) 7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (out_value) 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out_value = static_cast<const ListValue*>(value); 7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DictionaryValue::GetListWithoutPathExpansion(const std::string& key, 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ListValue** out_value) { 7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<const DictionaryValue&>(*this).GetListWithoutPathExpansion( 7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key, 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const_cast<const ListValue**>(out_value)); 7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DictionaryValue::Remove(const std::string& path, Value** out_value) { 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(IsStringUTF8(path)); 7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string current_path(path); 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DictionaryValue* current_dictionary = this; 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t delimiter_position = current_path.rfind('.'); 7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delimiter_position != std::string::npos) { 7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!GetDictionary(current_path.substr(0, delimiter_position), 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ¤t_dictionary)) 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_path.erase(0, delimiter_position + 1); 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return current_dictionary->RemoveWithoutPathExpansion(current_path, 7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) out_value); 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DictionaryValue::RemoveWithoutPathExpansion(const std::string& key, 7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Value** out_value) { 7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(IsStringUTF8(key)); 7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ValueMap::iterator entry_iterator = dictionary_.find(key); 7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (entry_iterator == dictionary_.end()) 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Value* entry = entry_iterator->second; 7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (out_value) 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out_value = entry; 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete entry; 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dictionary_.erase(entry_iterator); 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DictionaryValue* DictionaryValue::DeepCopyWithoutEmptyChildren() { 7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Value* copy = CopyWithoutEmptyChildren(this); 7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return copy ? static_cast<DictionaryValue*>(copy) : new DictionaryValue; 7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DictionaryValue::MergeDictionary(const DictionaryValue* dictionary) { 7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (DictionaryValue::key_iterator key(dictionary->begin_keys()); 7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key != dictionary->end_keys(); ++key) { 7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Value* merge_value; 7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (dictionary->GetWithoutPathExpansion(*key, &merge_value)) { 7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check whether we have to merge dictionaries. 7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (merge_value->IsType(Value::TYPE_DICTIONARY)) { 7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DictionaryValue* sub_dict; 7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetDictionaryWithoutPathExpansion(*key, &sub_dict)) { 7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sub_dict->MergeDictionary( 7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<const DictionaryValue*>(merge_value)); 7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; 7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // All other cases: Make a copy and hook it up. 7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetWithoutPathExpansion(*key, merge_value->DeepCopy()); 7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DictionaryValue::Swap(DictionaryValue* other) { 7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dictionary_.swap(other->dictionary_); 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DictionaryValue::key_iterator::key_iterator(ValueMap::const_iterator itr) { 7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) itr_ = itr; 7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DictionaryValue::key_iterator::key_iterator(const key_iterator& rhs) { 7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) itr_ = rhs.itr_; 7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DictionaryValue::Iterator::Iterator(const DictionaryValue& target) 7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : target_(target), 7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it_(target.dictionary_.begin()) {} 8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DictionaryValue* DictionaryValue::DeepCopy() const { 8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DictionaryValue* result = new DictionaryValue; 8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (ValueMap::const_iterator current_entry(dictionary_.begin()); 8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_entry != dictionary_.end(); ++current_entry) { 8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result->SetWithoutPathExpansion(current_entry->first, 8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_entry->second->DeepCopy()); 8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return result; 8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DictionaryValue::Equals(const Value* other) const { 8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (other->GetType() != GetType()) 8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const DictionaryValue* other_dict = 8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<const DictionaryValue*>(other); 8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key_iterator lhs_it(begin_keys()); 8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key_iterator rhs_it(other_dict->begin_keys()); 8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (lhs_it != end_keys() && rhs_it != other_dict->end_keys()) { 8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Value* lhs; 8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Value* rhs; 8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (*lhs_it != *rhs_it || 8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !GetWithoutPathExpansion(*lhs_it, &lhs) || 8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !other_dict->GetWithoutPathExpansion(*rhs_it, &rhs) || 8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !lhs->Equals(rhs)) { 8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++lhs_it; 8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++rhs_it; 8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (lhs_it != end_keys() || rhs_it != other_dict->end_keys()) 8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)///////////////////// ListValue //////////////////// 8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ListValue::ListValue() : Value(TYPE_LIST) { 8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ListValue::~ListValue() { 8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Clear(); 8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ListValue::Clear() { 8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (ValueVector::iterator i(list_.begin()); i != list_.end(); ++i) 8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete *i; 8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list_.clear(); 8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ListValue::Set(size_t index, Value* in_value) { 8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!in_value) 8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (index >= list_.size()) { 8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Pad out any intermediate indexes with null settings 8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (index > list_.size()) 8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Append(CreateNullValue()); 8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Append(in_value); 8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(list_[index] != in_value); 8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete list_[index]; 8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list_[index] = in_value; 8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ListValue::Get(size_t index, const Value** out_value) const { 8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (index >= list_.size()) 8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (out_value) 8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out_value = list_[index]; 8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ListValue::Get(size_t index, Value** out_value) { 8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return static_cast<const ListValue&>(*this).Get( 8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) index, 8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const_cast<const Value**>(out_value)); 8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ListValue::GetBoolean(size_t index, bool* bool_value) const { 8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Value* value; 8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!Get(index, &value)) 8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return value->GetAsBoolean(bool_value); 8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ListValue::GetInteger(size_t index, int* out_value) const { 8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Value* value; 8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!Get(index, &value)) 8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return value->GetAsInteger(out_value); 9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ListValue::GetDouble(size_t index, double* out_value) const { 9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Value* value; 9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!Get(index, &value)) 9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return value->GetAsDouble(out_value); 9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ListValue::GetString(size_t index, std::string* out_value) const { 9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Value* value; 9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!Get(index, &value)) 9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return value->GetAsString(out_value); 9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ListValue::GetString(size_t index, string16* out_value) const { 9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Value* value; 9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!Get(index, &value)) 9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return value->GetAsString(out_value); 9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ListValue::GetBinary(size_t index, const BinaryValue** out_value) const { 9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Value* value; 9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool result = Get(index, &value); 9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!result || !value->IsType(TYPE_BINARY)) 9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (out_value) 9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out_value = static_cast<const BinaryValue*>(value); 9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ListValue::GetBinary(size_t index, BinaryValue** out_value) { 9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return static_cast<const ListValue&>(*this).GetBinary( 9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) index, 9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const_cast<const BinaryValue**>(out_value)); 9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ListValue::GetDictionary(size_t index, 9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const DictionaryValue** out_value) const { 9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Value* value; 9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool result = Get(index, &value); 9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!result || !value->IsType(TYPE_DICTIONARY)) 9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (out_value) 9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out_value = static_cast<const DictionaryValue*>(value); 9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ListValue::GetDictionary(size_t index, DictionaryValue** out_value) { 9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return static_cast<const ListValue&>(*this).GetDictionary( 9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) index, 9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const_cast<const DictionaryValue**>(out_value)); 9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ListValue::GetList(size_t index, const ListValue** out_value) const { 9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Value* value; 9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool result = Get(index, &value); 9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!result || !value->IsType(TYPE_LIST)) 9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (out_value) 9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out_value = static_cast<const ListValue*>(value); 9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ListValue::GetList(size_t index, ListValue** out_value) { 9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return static_cast<const ListValue&>(*this).GetList( 9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) index, 9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const_cast<const ListValue**>(out_value)); 9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ListValue::Remove(size_t index, Value** out_value) { 9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (index >= list_.size()) 9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (out_value) 9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out_value = list_[index]; 9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete list_[index]; 9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list_.erase(list_.begin() + index); 9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ListValue::Remove(const Value& value, size_t* index) { 9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (ValueVector::iterator i(list_.begin()); i != list_.end(); ++i) { 9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((*i)->Equals(&value)) { 9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t previous_index = i - list_.begin(); 9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete *i; 10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list_.erase(i); 10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (index) 10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *index = previous_index; 10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ListValue::Erase(iterator iter, Value** out_value) { 10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (out_value) 10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out_value = *iter; 10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete *iter; 10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list_.erase(iter); 10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ListValue::Append(Value* in_value) { 10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(in_value); 10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list_.push_back(in_value); 10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ListValue::AppendBoolean(bool in_value) { 10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Append(CreateBooleanValue(in_value)); 10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ListValue::AppendInteger(int in_value) { 10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Append(CreateIntegerValue(in_value)); 10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ListValue::AppendDouble(double in_value) { 10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Append(CreateDoubleValue(in_value)); 10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ListValue::AppendString(const std::string& in_value) { 10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Append(CreateStringValue(in_value)); 10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ListValue::AppendString(const string16& in_value) { 10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Append(CreateStringValue(in_value)); 10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ListValue::AppendStrings(const std::vector<std::string>& in_values) { 10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (std::vector<std::string>::const_iterator it = in_values.begin(); 10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it != in_values.end(); ++it) { 10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AppendString(*it); 10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ListValue::AppendStrings(const std::vector<string16>& in_values) { 10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (std::vector<string16>::const_iterator it = in_values.begin(); 10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it != in_values.end(); ++it) { 10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AppendString(*it); 10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ListValue::AppendIfNotPresent(Value* in_value) { 10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(in_value); 10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (ValueVector::const_iterator i(list_.begin()); i != list_.end(); ++i) { 10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((*i)->Equals(in_value)) { 10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete in_value; 10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list_.push_back(in_value); 10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ListValue::Insert(size_t index, Value* in_value) { 10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(in_value); 10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (index > list_.size()) 10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list_.insert(list_.begin() + index, in_value); 10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ListValue::const_iterator ListValue::Find(const Value& value) const { 10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return std::find_if(list_.begin(), list_.end(), ValueEquals(&value)); 10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ListValue::Swap(ListValue* other) { 10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list_.swap(other->list_); 10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ListValue::GetAsList(ListValue** out_value) { 10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (out_value) 10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out_value = this; 10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ListValue::GetAsList(const ListValue** out_value) const { 10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (out_value) 10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out_value = this; 10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ListValue* ListValue::DeepCopy() const { 11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ListValue* result = new ListValue; 11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (ValueVector::const_iterator i(list_.begin()); i != list_.end(); ++i) 11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result->Append((*i)->DeepCopy()); 11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return result; 11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ListValue::Equals(const Value* other) const { 11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (other->GetType() != GetType()) 11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ListValue* other_list = 11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<const ListValue*>(other); 11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const_iterator lhs_it, rhs_it; 11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (lhs_it = begin(), rhs_it = other_list->begin(); 11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lhs_it != end() && rhs_it != other_list->end(); 11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++lhs_it, ++rhs_it) { 11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!(*lhs_it)->Equals(*rhs_it)) 11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (lhs_it != end() || rhs_it != other_list->end()) 11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ValueSerializer::~ValueSerializer() { 11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::ostream& operator<<(std::ostream& out, const Value& value) { 11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string json; 11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) JSONWriter::WriteWithOptions(&value, 11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) JSONWriter::OPTIONS_PRETTY_PRINT, 11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &json); 11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return out << json; 11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace base 1139