values.cc revision 7d4cd473f85ac64c3747c96c277f9e506a0d2246
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" 13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h" 14868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)namespace base { 177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Make a deep copy of |node|, but don't include empty lists or dictionaries 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// in the copy. It's possible for this function to return NULL and it 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// expects |node| to always be non-NULL. 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)Value* CopyWithoutEmptyChildren(const Value* node) { 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(node); 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (node->GetType()) { 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case Value::TYPE_LIST: { 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ListValue* list = static_cast<const ListValue*>(node); 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ListValue* copy = new ListValue; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (ListValue::const_iterator it = list->begin(); it != list->end(); 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++it) { 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Value* child_copy = CopyWithoutEmptyChildren(*it); 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (child_copy) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) copy->Append(child_copy); 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!copy->empty()) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return copy; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete copy; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case Value::TYPE_DICTIONARY: { 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const DictionaryValue* dict = static_cast<const DictionaryValue*>(node); 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DictionaryValue* copy = new DictionaryValue; 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (DictionaryValue::Iterator it(*dict); !it.IsAtEnd(); it.Advance()) { 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Value* child_copy = CopyWithoutEmptyChildren(&it.value()); 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (child_copy) 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) copy->SetWithoutPathExpansion(it.key(), child_copy); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!copy->empty()) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return copy; 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete copy; 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For everything else, just make a copy. 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return node->DeepCopy(); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A small functor for comparing Values for std::find_if and similar. 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ValueEquals { 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Pass the value against which all consecutive calls of the () operator will 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // compare their argument to. This Value object must not be destroyed while 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the ValueEquals is in use. 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) explicit ValueEquals(const Value* first) : first_(first) { } 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool operator ()(const Value* second) const { 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return first_->Equals(second); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Value* first_; 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::~Value() { 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value* Value::CreateNullValue() { 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new Value(TYPE_NULL); 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FundamentalValue* Value::CreateBooleanValue(bool in_value) { 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new FundamentalValue(in_value); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FundamentalValue* Value::CreateIntegerValue(int in_value) { 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new FundamentalValue(in_value); 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FundamentalValue* Value::CreateDoubleValue(double in_value) { 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new FundamentalValue(in_value); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)StringValue* Value::CreateStringValue(const std::string& in_value) { 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new StringValue(in_value); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)StringValue* Value::CreateStringValue(const string16& in_value) { 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new StringValue(in_value); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Value::GetAsBoolean(bool* out_value) const { 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Value::GetAsInteger(int* out_value) const { 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Value::GetAsDouble(double* out_value) const { 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Value::GetAsString(std::string* out_value) const { 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Value::GetAsString(string16* out_value) const { 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Value::GetAsList(ListValue** out_value) { 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Value::GetAsList(const ListValue** out_value) const { 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Value::GetAsDictionary(DictionaryValue** out_value) { 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Value::GetAsDictionary(const DictionaryValue** out_value) const { 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value* Value::DeepCopy() const { 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This method should only be getting called for null Values--all subclasses 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // need to provide their own implementation;. 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(IsType(TYPE_NULL)); 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return CreateNullValue(); 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Value::Equals(const Value* other) const { 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This method should only be getting called for null Values--all subclasses 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // need to provide their own implementation;. 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(IsType(TYPE_NULL)); 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return other->IsType(TYPE_NULL); 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Value::Equals(const Value* a, const Value* b) { 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((a == NULL) && (b == NULL)) return true; 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((a == NULL) ^ (b == NULL)) return false; 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return a->Equals(b); 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)Value::Value(Type type) : type_(type) {} 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)Value::Value(const Value& that) : type_(that.type_) {} 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)Value& Value::operator=(const Value& that) { 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) type_ = that.type_; 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return *this; 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) 3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)BinaryValue::BinaryValue() 3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : Value(TYPE_BINARY), 3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_(0) { 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)BinaryValue::BinaryValue(scoped_ptr<char[]> buffer, size_t size) 3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : Value(TYPE_BINARY), 3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) buffer_(buffer.Pass()), 3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_(size) { 3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)BinaryValue::~BinaryValue() { 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) char* buffer_copy = new char[size]; 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memcpy(buffer_copy, buffer, size); 3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<char[]> scoped_buffer_copy(buffer_copy); 3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return new BinaryValue(scoped_buffer_copy.Pass(), size); 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BinaryValue* BinaryValue::DeepCopy() const { 3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return CreateWithCopiedBuffer(buffer_.get(), size_); 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool BinaryValue::Equals(const Value* other) const { 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (other->GetType() != GetType()) 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const BinaryValue* other_binary = static_cast<const BinaryValue*>(other); 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (other_binary->size_ != size_) 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return !memcmp(GetBuffer(), other_binary->GetBuffer(), size_); 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)///////////////////// DictionaryValue //////////////////// 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DictionaryValue::DictionaryValue() 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : Value(TYPE_DICTIONARY) { 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DictionaryValue::~DictionaryValue() { 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Clear(); 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DictionaryValue::GetAsDictionary(DictionaryValue** out_value) { 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (out_value) 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out_value = this; 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DictionaryValue::GetAsDictionary(const DictionaryValue** out_value) const { 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (out_value) 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out_value = this; 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DictionaryValue::HasKey(const std::string& key) const { 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(IsStringUTF8(key)); 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ValueMap::const_iterator current_entry = dictionary_.find(key); 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK((current_entry == dictionary_.end()) || current_entry->second); 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return current_entry != dictionary_.end(); 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DictionaryValue::Clear() { 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ValueMap::iterator dict_iterator = dictionary_.begin(); 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (dict_iterator != dictionary_.end()) { 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete dict_iterator->second; 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++dict_iterator; 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dictionary_.clear(); 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DictionaryValue::Set(const std::string& path, Value* in_value) { 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(IsStringUTF8(path)); 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(in_value); 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string current_path(path); 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DictionaryValue* current_dictionary = this; 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t delimiter_position = current_path.find('.'); 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delimiter_position != std::string::npos; 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delimiter_position = current_path.find('.')) { 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Assume that we're indexing into a dictionary. 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string key(current_path, 0, delimiter_position); 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DictionaryValue* child_dictionary = NULL; 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!current_dictionary->GetDictionary(key, &child_dictionary)) { 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child_dictionary = new DictionaryValue; 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_dictionary->SetWithoutPathExpansion(key, child_dictionary); 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_dictionary = child_dictionary; 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_path.erase(0, delimiter_position + 1); 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_dictionary->SetWithoutPathExpansion(current_path, in_value); 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DictionaryValue::SetBoolean(const std::string& path, bool in_value) { 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Set(path, CreateBooleanValue(in_value)); 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DictionaryValue::SetInteger(const std::string& path, int in_value) { 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Set(path, CreateIntegerValue(in_value)); 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DictionaryValue::SetDouble(const std::string& path, double in_value) { 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Set(path, CreateDoubleValue(in_value)); 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DictionaryValue::SetString(const std::string& path, 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& in_value) { 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Set(path, CreateStringValue(in_value)); 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DictionaryValue::SetString(const std::string& path, 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& in_value) { 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Set(path, CreateStringValue(in_value)); 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DictionaryValue::SetWithoutPathExpansion(const std::string& key, 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Value* in_value) { 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If there's an existing value here, we need to delete it, because 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // we own all our children. 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::pair<ValueMap::iterator, bool> ins_res = 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dictionary_.insert(std::make_pair(key, in_value)); 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!ins_res.second) { 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_NE(ins_res.first->second, in_value); // This would be bogus 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete ins_res.first->second; 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ins_res.first->second = in_value; 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DictionaryValue::SetBooleanWithoutPathExpansion( 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& path, bool in_value) { 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetWithoutPathExpansion(path, CreateBooleanValue(in_value)); 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DictionaryValue::SetIntegerWithoutPathExpansion( 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& path, int in_value) { 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetWithoutPathExpansion(path, CreateIntegerValue(in_value)); 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DictionaryValue::SetDoubleWithoutPathExpansion( 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& path, double in_value) { 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetWithoutPathExpansion(path, CreateDoubleValue(in_value)); 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DictionaryValue::SetStringWithoutPathExpansion( 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& path, const std::string& in_value) { 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetWithoutPathExpansion(path, CreateStringValue(in_value)); 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DictionaryValue::SetStringWithoutPathExpansion( 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& path, const string16& in_value) { 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetWithoutPathExpansion(path, CreateStringValue(in_value)); 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DictionaryValue::Get( 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& path, const Value** out_value) const { 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(IsStringUTF8(path)); 465b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)// LOG(WARNING) << "\n1\n"; 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string current_path(path); 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const DictionaryValue* current_dictionary = this; 468b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)// LOG(WARNING) << "\n2\n"; 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t delimiter_position = current_path.find('.'); 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delimiter_position != std::string::npos; 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delimiter_position = current_path.find('.')) { 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const DictionaryValue* child_dictionary = NULL; 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!current_dictionary->GetDictionary( 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_path.substr(0, delimiter_position), &child_dictionary)) 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_dictionary = child_dictionary; 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_path.erase(0, delimiter_position + 1); 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 480b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)// LOG(WARNING) << "\n3\n"; 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return current_dictionary->GetWithoutPathExpansion(current_path, out_value); 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DictionaryValue::Get(const std::string& path, Value** out_value) { 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return static_cast<const DictionaryValue&>(*this).Get( 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) path, 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const_cast<const Value**>(out_value)); 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DictionaryValue::GetBoolean(const std::string& path, 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool* bool_value) const { 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Value* value; 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!Get(path, &value)) 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return value->GetAsBoolean(bool_value); 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DictionaryValue::GetInteger(const std::string& path, 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int* out_value) const { 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Value* value; 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!Get(path, &value)) 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return value->GetAsInteger(out_value); 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DictionaryValue::GetDouble(const std::string& path, 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double* out_value) const { 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Value* value; 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!Get(path, &value)) 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return value->GetAsDouble(out_value); 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DictionaryValue::GetString(const std::string& path, 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string* out_value) const { 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Value* value; 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!Get(path, &value)) 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return value->GetAsString(out_value); 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DictionaryValue::GetString(const std::string& path, 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16* out_value) const { 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Value* value; 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!Get(path, &value)) 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return value->GetAsString(out_value); 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DictionaryValue::GetStringASCII(const std::string& path, 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string* out_value) const { 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string out; 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!GetString(path, &out)) 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!IsStringASCII(out)) { 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) out_value->assign(out); 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DictionaryValue::GetBinary(const std::string& path, 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const BinaryValue** out_value) const { 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Value* value; 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool result = Get(path, &value); 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!result || !value->IsType(TYPE_BINARY)) 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (out_value) 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out_value = static_cast<const BinaryValue*>(value); 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DictionaryValue::GetBinary(const std::string& path, 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BinaryValue** out_value) { 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return static_cast<const DictionaryValue&>(*this).GetBinary( 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) path, 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const_cast<const BinaryValue**>(out_value)); 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DictionaryValue::GetDictionary(const std::string& path, 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const DictionaryValue** out_value) const { 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Value* value; 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool result = Get(path, &value); 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!result || !value->IsType(TYPE_DICTIONARY)) 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (out_value) 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out_value = static_cast<const DictionaryValue*>(value); 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DictionaryValue::GetDictionary(const std::string& path, 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DictionaryValue** out_value) { 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return static_cast<const DictionaryValue&>(*this).GetDictionary( 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) path, 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const_cast<const DictionaryValue**>(out_value)); 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DictionaryValue::GetList(const std::string& path, 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ListValue** out_value) const { 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Value* value; 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool result = Get(path, &value); 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!result || !value->IsType(TYPE_LIST)) 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (out_value) 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out_value = static_cast<const ListValue*>(value); 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DictionaryValue::GetList(const std::string& path, ListValue** out_value) { 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return static_cast<const DictionaryValue&>(*this).GetList( 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) path, 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const_cast<const ListValue**>(out_value)); 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DictionaryValue::GetWithoutPathExpansion(const std::string& key, 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Value** out_value) const { 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(IsStringUTF8(key)); 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ValueMap::const_iterator entry_iterator = dictionary_.find(key); 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (entry_iterator == dictionary_.end()) 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Value* entry = entry_iterator->second; 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (out_value) 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out_value = entry; 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DictionaryValue::GetWithoutPathExpansion(const std::string& key, 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Value** out_value) { 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return static_cast<const DictionaryValue&>(*this).GetWithoutPathExpansion( 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key, 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const_cast<const Value**>(out_value)); 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DictionaryValue::GetBooleanWithoutPathExpansion(const std::string& key, 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool* out_value) const { 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Value* value; 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!GetWithoutPathExpansion(key, &value)) 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return value->GetAsBoolean(out_value); 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DictionaryValue::GetIntegerWithoutPathExpansion(const std::string& key, 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int* out_value) const { 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Value* value; 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!GetWithoutPathExpansion(key, &value)) 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return value->GetAsInteger(out_value); 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DictionaryValue::GetDoubleWithoutPathExpansion(const std::string& key, 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double* out_value) const { 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Value* value; 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!GetWithoutPathExpansion(key, &value)) 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return value->GetAsDouble(out_value); 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DictionaryValue::GetStringWithoutPathExpansion( 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& key, 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string* out_value) const { 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Value* value; 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!GetWithoutPathExpansion(key, &value)) 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return value->GetAsString(out_value); 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DictionaryValue::GetStringWithoutPathExpansion(const std::string& key, 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16* out_value) const { 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Value* value; 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!GetWithoutPathExpansion(key, &value)) 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return value->GetAsString(out_value); 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DictionaryValue::GetDictionaryWithoutPathExpansion( 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& key, 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const DictionaryValue** out_value) const { 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Value* value; 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool result = GetWithoutPathExpansion(key, &value); 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!result || !value->IsType(TYPE_DICTIONARY)) 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (out_value) 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out_value = static_cast<const DictionaryValue*>(value); 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DictionaryValue::GetDictionaryWithoutPathExpansion( 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& key, 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DictionaryValue** out_value) { 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const DictionaryValue& const_this = 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<const DictionaryValue&>(*this); 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return const_this.GetDictionaryWithoutPathExpansion( 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key, 6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const_cast<const DictionaryValue**>(out_value)); 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DictionaryValue::GetListWithoutPathExpansion( 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& key, 7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ListValue** out_value) const { 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Value* value; 7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool result = GetWithoutPathExpansion(key, &value); 7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!result || !value->IsType(TYPE_LIST)) 7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (out_value) 7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out_value = static_cast<const ListValue*>(value); 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DictionaryValue::GetListWithoutPathExpansion(const std::string& key, 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ListValue** out_value) { 7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<const DictionaryValue&>(*this).GetListWithoutPathExpansion( 7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key, 7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const_cast<const ListValue**>(out_value)); 7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DictionaryValue::Remove(const std::string& path, Value** out_value) { 7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(IsStringUTF8(path)); 7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string current_path(path); 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DictionaryValue* current_dictionary = this; 7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t delimiter_position = current_path.rfind('.'); 7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delimiter_position != std::string::npos) { 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!GetDictionary(current_path.substr(0, delimiter_position), 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ¤t_dictionary)) 7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_path.erase(0, delimiter_position + 1); 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return current_dictionary->RemoveWithoutPathExpansion(current_path, 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) out_value); 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DictionaryValue::RemoveWithoutPathExpansion(const std::string& key, 7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Value** out_value) { 7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(IsStringUTF8(key)); 7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ValueMap::iterator entry_iterator = dictionary_.find(key); 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (entry_iterator == dictionary_.end()) 7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Value* entry = entry_iterator->second; 7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (out_value) 7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out_value = entry; 7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete entry; 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dictionary_.erase(entry_iterator); 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DictionaryValue* DictionaryValue::DeepCopyWithoutEmptyChildren() { 7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Value* copy = CopyWithoutEmptyChildren(this); 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return copy ? static_cast<DictionaryValue*>(copy) : new DictionaryValue; 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DictionaryValue::MergeDictionary(const DictionaryValue* dictionary) { 7602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (DictionaryValue::Iterator it(*dictionary); !it.IsAtEnd(); it.Advance()) { 7612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const Value* merge_value = &it.value(); 7622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Check whether we have to merge dictionaries. 7632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (merge_value->IsType(Value::TYPE_DICTIONARY)) { 7642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DictionaryValue* sub_dict; 7652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (GetDictionaryWithoutPathExpansion(it.key(), &sub_dict)) { 7662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sub_dict->MergeDictionary( 7672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static_cast<const DictionaryValue*>(merge_value)); 7682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) continue; 7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // All other cases: Make a copy and hook it up. 7722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetWithoutPathExpansion(it.key(), merge_value->DeepCopy()); 7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DictionaryValue::Swap(DictionaryValue* other) { 7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dictionary_.swap(other->dictionary_); 7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DictionaryValue::Iterator::Iterator(const DictionaryValue& target) 7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : target_(target), 7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it_(target.dictionary_.begin()) {} 7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DictionaryValue* DictionaryValue::DeepCopy() const { 7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DictionaryValue* result = new DictionaryValue; 7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (ValueMap::const_iterator current_entry(dictionary_.begin()); 7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_entry != dictionary_.end(); ++current_entry) { 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result->SetWithoutPathExpansion(current_entry->first, 7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_entry->second->DeepCopy()); 7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return result; 7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DictionaryValue::Equals(const Value* other) const { 7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (other->GetType() != GetType()) 7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const DictionaryValue* other_dict = 8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<const DictionaryValue*>(other); 8022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Iterator lhs_it(*this); 8032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Iterator rhs_it(*other_dict); 8042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) while (!lhs_it.IsAtEnd() && !rhs_it.IsAtEnd()) { 8052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (lhs_it.key() != rhs_it.key() || 8062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !lhs_it.value().Equals(&rhs_it.value())) { 8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) lhs_it.Advance(); 8102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rhs_it.Advance(); 8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!lhs_it.IsAtEnd() || !rhs_it.IsAtEnd()) 8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)///////////////////// ListValue //////////////////// 8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ListValue::ListValue() : Value(TYPE_LIST) { 8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ListValue::~ListValue() { 8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Clear(); 8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ListValue::Clear() { 8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (ValueVector::iterator i(list_.begin()); i != list_.end(); ++i) 8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete *i; 8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list_.clear(); 8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ListValue::Set(size_t index, Value* in_value) { 8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!in_value) 8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (index >= list_.size()) { 8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Pad out any intermediate indexes with null settings 8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (index > list_.size()) 8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Append(CreateNullValue()); 8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Append(in_value); 8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(list_[index] != in_value); 8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete list_[index]; 8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list_[index] = in_value; 8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ListValue::Get(size_t index, const Value** out_value) const { 8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (index >= list_.size()) 8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (out_value) 8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out_value = list_[index]; 8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ListValue::Get(size_t index, Value** out_value) { 8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return static_cast<const ListValue&>(*this).Get( 8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) index, 8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const_cast<const Value**>(out_value)); 8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ListValue::GetBoolean(size_t index, bool* bool_value) const { 8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Value* value; 8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!Get(index, &value)) 8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return value->GetAsBoolean(bool_value); 8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ListValue::GetInteger(size_t index, int* out_value) const { 8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Value* value; 8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!Get(index, &value)) 8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return value->GetAsInteger(out_value); 8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ListValue::GetDouble(size_t index, double* out_value) const { 8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Value* value; 8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!Get(index, &value)) 8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return value->GetAsDouble(out_value); 8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ListValue::GetString(size_t index, std::string* out_value) const { 8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Value* value; 8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!Get(index, &value)) 8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return value->GetAsString(out_value); 8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ListValue::GetString(size_t index, string16* out_value) const { 8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Value* value; 9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!Get(index, &value)) 9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return value->GetAsString(out_value); 9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ListValue::GetBinary(size_t index, const BinaryValue** out_value) const { 9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Value* value; 9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool result = Get(index, &value); 9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!result || !value->IsType(TYPE_BINARY)) 9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (out_value) 9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out_value = static_cast<const BinaryValue*>(value); 9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ListValue::GetBinary(size_t index, BinaryValue** out_value) { 9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return static_cast<const ListValue&>(*this).GetBinary( 9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) index, 9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const_cast<const BinaryValue**>(out_value)); 9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ListValue::GetDictionary(size_t index, 9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const DictionaryValue** out_value) const { 9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Value* value; 9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool result = Get(index, &value); 9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!result || !value->IsType(TYPE_DICTIONARY)) 9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (out_value) 9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out_value = static_cast<const DictionaryValue*>(value); 9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ListValue::GetDictionary(size_t index, DictionaryValue** out_value) { 9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return static_cast<const ListValue&>(*this).GetDictionary( 9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) index, 9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const_cast<const DictionaryValue**>(out_value)); 9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ListValue::GetList(size_t index, const ListValue** out_value) const { 9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Value* value; 9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool result = Get(index, &value); 9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!result || !value->IsType(TYPE_LIST)) 9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (out_value) 9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out_value = static_cast<const ListValue*>(value); 9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ListValue::GetList(size_t index, ListValue** out_value) { 9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return static_cast<const ListValue&>(*this).GetList( 9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) index, 9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const_cast<const ListValue**>(out_value)); 9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ListValue::Remove(size_t index, Value** out_value) { 9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (index >= list_.size()) 9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (out_value) 9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out_value = list_[index]; 9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete list_[index]; 9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list_.erase(list_.begin() + index); 9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ListValue::Remove(const Value& value, size_t* index) { 9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (ValueVector::iterator i(list_.begin()); i != list_.end(); ++i) { 9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((*i)->Equals(&value)) { 9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t previous_index = i - list_.begin(); 9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete *i; 9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list_.erase(i); 9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (index) 9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *index = previous_index; 9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ListValue::iterator ListValue::Erase(iterator iter, Value** out_value) { 9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (out_value) 9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out_value = *iter; 9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete *iter; 9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return list_.erase(iter); 9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ListValue::Append(Value* in_value) { 9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(in_value); 10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list_.push_back(in_value); 10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ListValue::AppendBoolean(bool in_value) { 10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Append(CreateBooleanValue(in_value)); 10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ListValue::AppendInteger(int in_value) { 10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Append(CreateIntegerValue(in_value)); 10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ListValue::AppendDouble(double in_value) { 10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Append(CreateDoubleValue(in_value)); 10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ListValue::AppendString(const std::string& in_value) { 10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Append(CreateStringValue(in_value)); 10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ListValue::AppendString(const string16& in_value) { 10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Append(CreateStringValue(in_value)); 10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ListValue::AppendStrings(const std::vector<std::string>& in_values) { 10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (std::vector<std::string>::const_iterator it = in_values.begin(); 10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it != in_values.end(); ++it) { 10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AppendString(*it); 10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ListValue::AppendStrings(const std::vector<string16>& in_values) { 10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (std::vector<string16>::const_iterator it = in_values.begin(); 10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it != in_values.end(); ++it) { 10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AppendString(*it); 10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ListValue::AppendIfNotPresent(Value* in_value) { 10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(in_value); 10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (ValueVector::const_iterator i(list_.begin()); i != list_.end(); ++i) { 10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((*i)->Equals(in_value)) { 10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete in_value; 10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list_.push_back(in_value); 10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ListValue::Insert(size_t index, Value* in_value) { 10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(in_value); 10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (index > list_.size()) 10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list_.insert(list_.begin() + index, in_value); 10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ListValue::const_iterator ListValue::Find(const Value& value) const { 10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return std::find_if(list_.begin(), list_.end(), ValueEquals(&value)); 10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ListValue::Swap(ListValue* other) { 10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list_.swap(other->list_); 10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ListValue::GetAsList(ListValue** out_value) { 10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (out_value) 10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out_value = this; 10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ListValue::GetAsList(const ListValue** out_value) const { 10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (out_value) 10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out_value = this; 10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ListValue* ListValue::DeepCopy() const { 10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ListValue* result = new ListValue; 10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (ValueVector::const_iterator i(list_.begin()); i != list_.end(); ++i) 10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result->Append((*i)->DeepCopy()); 10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return result; 10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ListValue::Equals(const Value* other) const { 10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (other->GetType() != GetType()) 10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ListValue* other_list = 10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<const ListValue*>(other); 10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const_iterator lhs_it, rhs_it; 10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (lhs_it = begin(), rhs_it = other_list->begin(); 10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lhs_it != end() && rhs_it != other_list->end(); 10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++lhs_it, ++rhs_it) { 10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!(*lhs_it)->Equals(*rhs_it)) 10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (lhs_it != end() || rhs_it != other_list->end()) 11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ValueSerializer::~ValueSerializer() { 11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::ostream& operator<<(std::ostream& out, const Value& value) { 11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string json; 11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) JSONWriter::WriteWithOptions(&value, 11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) JSONWriter::OPTIONS_PRETTY_PRINT, 11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &json); 11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return out << json; 11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace base 1118