values.cc revision a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7
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) 758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include <string.h> 858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <algorithm> 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <ostream> 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/float_util.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/json/json_writer.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 1558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/move.h" 16868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h" 17868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)namespace base { 207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Make a deep copy of |node|, but don't include empty lists or dictionaries 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// in the copy. It's possible for this function to return NULL and it 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// expects |node| to always be non-NULL. 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)Value* CopyWithoutEmptyChildren(const Value* node) { 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(node); 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (node->GetType()) { 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case Value::TYPE_LIST: { 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ListValue* list = static_cast<const ListValue*>(node); 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ListValue* copy = new ListValue; 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (ListValue::const_iterator it = list->begin(); it != list->end(); 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++it) { 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Value* child_copy = CopyWithoutEmptyChildren(*it); 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (child_copy) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) copy->Append(child_copy); 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!copy->empty()) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return copy; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete copy; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case Value::TYPE_DICTIONARY: { 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const DictionaryValue* dict = static_cast<const DictionaryValue*>(node); 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DictionaryValue* copy = new DictionaryValue; 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (DictionaryValue::Iterator it(*dict); !it.IsAtEnd(); it.Advance()) { 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Value* child_copy = CopyWithoutEmptyChildren(&it.value()); 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (child_copy) 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) copy->SetWithoutPathExpansion(it.key(), child_copy); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!copy->empty()) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return copy; 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete copy; 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For everything else, just make a copy. 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return node->DeepCopy(); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A small functor for comparing Values for std::find_if and similar. 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ValueEquals { 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Pass the value against which all consecutive calls of the () operator will 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // compare their argument to. This Value object must not be destroyed while 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the ValueEquals is in use. 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) explicit ValueEquals(const Value* first) : first_(first) { } 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool operator ()(const Value* second) const { 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return first_->Equals(second); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Value* first_; 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::~Value() { 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value* Value::CreateNullValue() { 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new Value(TYPE_NULL); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FundamentalValue* Value::CreateBooleanValue(bool in_value) { 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new FundamentalValue(in_value); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FundamentalValue* Value::CreateIntegerValue(int in_value) { 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new FundamentalValue(in_value); 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FundamentalValue* Value::CreateDoubleValue(double in_value) { 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new FundamentalValue(in_value); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)StringValue* Value::CreateStringValue(const std::string& in_value) { 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new StringValue(in_value); 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)StringValue* Value::CreateStringValue(const string16& in_value) { 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new StringValue(in_value); 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Value::GetAsBoolean(bool* out_value) const { 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Value::GetAsInteger(int* out_value) const { 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Value::GetAsDouble(double* out_value) const { 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Value::GetAsString(std::string* out_value) const { 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Value::GetAsString(string16* out_value) const { 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Value::GetAsList(ListValue** out_value) { 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Value::GetAsList(const ListValue** out_value) const { 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Value::GetAsDictionary(DictionaryValue** out_value) { 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Value::GetAsDictionary(const DictionaryValue** out_value) const { 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value* Value::DeepCopy() const { 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This method should only be getting called for null Values--all subclasses 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // need to provide their own implementation;. 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(IsType(TYPE_NULL)); 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return CreateNullValue(); 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Value::Equals(const Value* other) const { 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This method should only be getting called for null Values--all subclasses 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // need to provide their own implementation;. 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(IsType(TYPE_NULL)); 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return other->IsType(TYPE_NULL); 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Value::Equals(const Value* a, const Value* b) { 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((a == NULL) && (b == NULL)) return true; 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((a == NULL) ^ (b == NULL)) return false; 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return a->Equals(b); 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)Value::Value(Type type) : type_(type) {} 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)Value::Value(const Value& that) : type_(that.type_) {} 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)Value& Value::operator=(const Value& that) { 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) type_ = that.type_; 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return *this; 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)///////////////////// FundamentalValue //////////////////// 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FundamentalValue::FundamentalValue(bool in_value) 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : Value(TYPE_BOOLEAN), boolean_value_(in_value) { 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FundamentalValue::FundamentalValue(int in_value) 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : Value(TYPE_INTEGER), integer_value_(in_value) { 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FundamentalValue::FundamentalValue(double in_value) 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : Value(TYPE_DOUBLE), double_value_(in_value) { 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!IsFinite(double_value_)) { 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED() << "Non-finite (i.e. NaN or positive/negative infinity) " 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << "values cannot be represented in JSON"; 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double_value_ = 0.0; 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FundamentalValue::~FundamentalValue() { 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool FundamentalValue::GetAsBoolean(bool* out_value) const { 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (out_value && IsType(TYPE_BOOLEAN)) 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out_value = boolean_value_; 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (IsType(TYPE_BOOLEAN)); 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool FundamentalValue::GetAsInteger(int* out_value) const { 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (out_value && IsType(TYPE_INTEGER)) 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out_value = integer_value_; 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (IsType(TYPE_INTEGER)); 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool FundamentalValue::GetAsDouble(double* out_value) const { 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (out_value && IsType(TYPE_DOUBLE)) 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out_value = double_value_; 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (out_value && IsType(TYPE_INTEGER)) 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out_value = integer_value_; 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (IsType(TYPE_DOUBLE) || IsType(TYPE_INTEGER)); 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FundamentalValue* FundamentalValue::DeepCopy() const { 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (GetType()) { 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TYPE_BOOLEAN: 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return CreateBooleanValue(boolean_value_); 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TYPE_INTEGER: 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return CreateIntegerValue(integer_value_); 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TYPE_DOUBLE: 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return CreateDoubleValue(double_value_); 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool FundamentalValue::Equals(const Value* other) const { 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (other->GetType() != GetType()) 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (GetType()) { 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TYPE_BOOLEAN: { 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool lhs, rhs; 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetAsBoolean(&lhs) && other->GetAsBoolean(&rhs) && lhs == rhs; 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TYPE_INTEGER: { 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int lhs, rhs; 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetAsInteger(&lhs) && other->GetAsInteger(&rhs) && lhs == rhs; 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TYPE_DOUBLE: { 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double lhs, rhs; 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetAsDouble(&lhs) && other->GetAsDouble(&rhs) && lhs == rhs; 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)///////////////////// StringValue //////////////////// 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)StringValue::StringValue(const std::string& in_value) 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : Value(TYPE_STRING), 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value_(in_value) { 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(IsStringUTF8(in_value)); 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)StringValue::StringValue(const string16& in_value) 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : Value(TYPE_STRING), 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value_(UTF16ToUTF8(in_value)) { 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)StringValue::~StringValue() { 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool StringValue::GetAsString(std::string* out_value) const { 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (out_value) 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out_value = value_; 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool StringValue::GetAsString(string16* out_value) const { 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (out_value) 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out_value = UTF8ToUTF16(value_); 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)StringValue* StringValue::DeepCopy() const { 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return CreateStringValue(value_); 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool StringValue::Equals(const Value* other) const { 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (other->GetType() != GetType()) 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string lhs, rhs; 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetAsString(&lhs) && other->GetAsString(&rhs) && lhs == rhs; 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)///////////////////// BinaryValue //////////////////// 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)BinaryValue::BinaryValue() 3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : Value(TYPE_BINARY), 3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_(0) { 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)BinaryValue::BinaryValue(scoped_ptr<char[]> buffer, size_t size) 3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : Value(TYPE_BINARY), 3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) buffer_(buffer.Pass()), 3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_(size) { 3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)BinaryValue::~BinaryValue() { 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BinaryValue* BinaryValue::CreateWithCopiedBuffer(const char* buffer, 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t size) { 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char* buffer_copy = new char[size]; 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memcpy(buffer_copy, buffer, size); 3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<char[]> scoped_buffer_copy(buffer_copy); 3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return new BinaryValue(scoped_buffer_copy.Pass(), size); 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BinaryValue* BinaryValue::DeepCopy() const { 3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return CreateWithCopiedBuffer(buffer_.get(), size_); 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool BinaryValue::Equals(const Value* other) const { 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (other->GetType() != GetType()) 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const BinaryValue* other_binary = static_cast<const BinaryValue*>(other); 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (other_binary->size_ != size_) 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return !memcmp(GetBuffer(), other_binary->GetBuffer(), size_); 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)///////////////////// DictionaryValue //////////////////// 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DictionaryValue::DictionaryValue() 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : Value(TYPE_DICTIONARY) { 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DictionaryValue::~DictionaryValue() { 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Clear(); 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DictionaryValue::GetAsDictionary(DictionaryValue** out_value) { 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (out_value) 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out_value = this; 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DictionaryValue::GetAsDictionary(const DictionaryValue** out_value) const { 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (out_value) 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out_value = this; 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DictionaryValue::HasKey(const std::string& key) const { 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(IsStringUTF8(key)); 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ValueMap::const_iterator current_entry = dictionary_.find(key); 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK((current_entry == dictionary_.end()) || current_entry->second); 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return current_entry != dictionary_.end(); 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DictionaryValue::Clear() { 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ValueMap::iterator dict_iterator = dictionary_.begin(); 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (dict_iterator != dictionary_.end()) { 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete dict_iterator->second; 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++dict_iterator; 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dictionary_.clear(); 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DictionaryValue::Set(const std::string& path, Value* in_value) { 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(IsStringUTF8(path)); 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(in_value); 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string current_path(path); 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DictionaryValue* current_dictionary = this; 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t delimiter_position = current_path.find('.'); 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delimiter_position != std::string::npos; 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delimiter_position = current_path.find('.')) { 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Assume that we're indexing into a dictionary. 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string key(current_path, 0, delimiter_position); 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DictionaryValue* child_dictionary = NULL; 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!current_dictionary->GetDictionary(key, &child_dictionary)) { 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child_dictionary = new DictionaryValue; 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_dictionary->SetWithoutPathExpansion(key, child_dictionary); 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_dictionary = child_dictionary; 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_path.erase(0, delimiter_position + 1); 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_dictionary->SetWithoutPathExpansion(current_path, in_value); 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DictionaryValue::SetBoolean(const std::string& path, bool in_value) { 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Set(path, CreateBooleanValue(in_value)); 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DictionaryValue::SetInteger(const std::string& path, int in_value) { 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Set(path, CreateIntegerValue(in_value)); 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DictionaryValue::SetDouble(const std::string& path, double in_value) { 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Set(path, CreateDoubleValue(in_value)); 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DictionaryValue::SetString(const std::string& path, 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& in_value) { 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Set(path, CreateStringValue(in_value)); 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DictionaryValue::SetString(const std::string& path, 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& in_value) { 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Set(path, CreateStringValue(in_value)); 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DictionaryValue::SetWithoutPathExpansion(const std::string& key, 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Value* in_value) { 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If there's an existing value here, we need to delete it, because 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // we own all our children. 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::pair<ValueMap::iterator, bool> ins_res = 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dictionary_.insert(std::make_pair(key, in_value)); 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!ins_res.second) { 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_NE(ins_res.first->second, in_value); // This would be bogus 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete ins_res.first->second; 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ins_res.first->second = in_value; 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DictionaryValue::SetBooleanWithoutPathExpansion( 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& path, bool in_value) { 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetWithoutPathExpansion(path, CreateBooleanValue(in_value)); 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DictionaryValue::SetIntegerWithoutPathExpansion( 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& path, int in_value) { 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetWithoutPathExpansion(path, CreateIntegerValue(in_value)); 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DictionaryValue::SetDoubleWithoutPathExpansion( 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& path, double in_value) { 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetWithoutPathExpansion(path, CreateDoubleValue(in_value)); 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DictionaryValue::SetStringWithoutPathExpansion( 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& path, const std::string& in_value) { 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetWithoutPathExpansion(path, CreateStringValue(in_value)); 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DictionaryValue::SetStringWithoutPathExpansion( 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& path, const string16& in_value) { 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetWithoutPathExpansion(path, CreateStringValue(in_value)); 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 465f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)bool DictionaryValue::Get(const std::string& path, 466f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const Value** out_value) const { 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(IsStringUTF8(path)); 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string current_path(path); 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const DictionaryValue* current_dictionary = this; 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t delimiter_position = current_path.find('.'); 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delimiter_position != std::string::npos; 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delimiter_position = current_path.find('.')) { 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const DictionaryValue* child_dictionary = NULL; 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!current_dictionary->GetDictionary( 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_path.substr(0, delimiter_position), &child_dictionary)) 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_dictionary = child_dictionary; 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_path.erase(0, delimiter_position + 1); 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 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) 7223240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdochbool DictionaryValue::Remove(const std::string& path, 7233240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch scoped_ptr<Value>* out_value) { 7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(IsStringUTF8(path)); 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string current_path(path); 7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DictionaryValue* current_dictionary = this; 7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t delimiter_position = current_path.rfind('.'); 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delimiter_position != std::string::npos) { 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!GetDictionary(current_path.substr(0, delimiter_position), 7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ¤t_dictionary)) 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_path.erase(0, delimiter_position + 1); 7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return current_dictionary->RemoveWithoutPathExpansion(current_path, 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) out_value); 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DictionaryValue::RemoveWithoutPathExpansion(const std::string& key, 7403240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch scoped_ptr<Value>* out_value) { 7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(IsStringUTF8(key)); 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ValueMap::iterator entry_iterator = dictionary_.find(key); 7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (entry_iterator == dictionary_.end()) 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Value* entry = entry_iterator->second; 7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (out_value) 7483240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch out_value->reset(entry); 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete entry; 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dictionary_.erase(entry_iterator); 7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 755f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)bool DictionaryValue::RemovePath(const std::string& path, 756f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<Value>* out_value) { 757f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bool result = false; 758f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) size_t delimiter_position = path.find('.'); 759f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 760f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (delimiter_position == std::string::npos) 761f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return RemoveWithoutPathExpansion(path, out_value); 762f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 763f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const std::string subdict_path = path.substr(0, delimiter_position); 764f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DictionaryValue* subdict = NULL; 765f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (!GetDictionary(subdict_path, &subdict)) 766f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return false; 767f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) result = subdict->RemovePath(path.substr(delimiter_position + 1), 768f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) out_value); 769f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (result && subdict->empty()) 770f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) RemoveWithoutPathExpansion(subdict_path, NULL); 771f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 772f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return result; 773f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 774f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 77558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)DictionaryValue* DictionaryValue::DeepCopyWithoutEmptyChildren() const { 7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Value* copy = CopyWithoutEmptyChildren(this); 7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return copy ? static_cast<DictionaryValue*>(copy) : new DictionaryValue; 7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DictionaryValue::MergeDictionary(const DictionaryValue* dictionary) { 7812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (DictionaryValue::Iterator it(*dictionary); !it.IsAtEnd(); it.Advance()) { 7822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const Value* merge_value = &it.value(); 7832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Check whether we have to merge dictionaries. 7842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (merge_value->IsType(Value::TYPE_DICTIONARY)) { 7852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DictionaryValue* sub_dict; 7862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (GetDictionaryWithoutPathExpansion(it.key(), &sub_dict)) { 7872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sub_dict->MergeDictionary( 7882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static_cast<const DictionaryValue*>(merge_value)); 7892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) continue; 7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // All other cases: Make a copy and hook it up. 7932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetWithoutPathExpansion(it.key(), merge_value->DeepCopy()); 7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DictionaryValue::Swap(DictionaryValue* other) { 7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dictionary_.swap(other->dictionary_); 7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DictionaryValue::Iterator::Iterator(const DictionaryValue& target) 8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : target_(target), 8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it_(target.dictionary_.begin()) {} 8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 805a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)DictionaryValue::Iterator::~Iterator() {} 806a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DictionaryValue* DictionaryValue::DeepCopy() const { 8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DictionaryValue* result = new DictionaryValue; 8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (ValueMap::const_iterator current_entry(dictionary_.begin()); 8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_entry != dictionary_.end(); ++current_entry) { 8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result->SetWithoutPathExpansion(current_entry->first, 8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_entry->second->DeepCopy()); 8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return result; 8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DictionaryValue::Equals(const Value* other) const { 8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (other->GetType() != GetType()) 8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const DictionaryValue* other_dict = 8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<const DictionaryValue*>(other); 8252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Iterator lhs_it(*this); 8262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Iterator rhs_it(*other_dict); 8272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) while (!lhs_it.IsAtEnd() && !rhs_it.IsAtEnd()) { 8282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (lhs_it.key() != rhs_it.key() || 8292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !lhs_it.value().Equals(&rhs_it.value())) { 8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) lhs_it.Advance(); 8332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rhs_it.Advance(); 8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!lhs_it.IsAtEnd() || !rhs_it.IsAtEnd()) 8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)///////////////////// ListValue //////////////////// 8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ListValue::ListValue() : Value(TYPE_LIST) { 8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ListValue::~ListValue() { 8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Clear(); 8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ListValue::Clear() { 8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (ValueVector::iterator i(list_.begin()); i != list_.end(); ++i) 8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete *i; 8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list_.clear(); 8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ListValue::Set(size_t index, Value* in_value) { 8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!in_value) 8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (index >= list_.size()) { 8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Pad out any intermediate indexes with null settings 8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (index > list_.size()) 8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Append(CreateNullValue()); 8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Append(in_value); 8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(list_[index] != in_value); 8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete list_[index]; 8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list_[index] = in_value; 8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ListValue::Get(size_t index, const Value** out_value) const { 8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (index >= list_.size()) 8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (out_value) 8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out_value = list_[index]; 8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ListValue::Get(size_t index, Value** out_value) { 8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return static_cast<const ListValue&>(*this).Get( 8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) index, 8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const_cast<const Value**>(out_value)); 8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ListValue::GetBoolean(size_t index, bool* bool_value) const { 8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Value* value; 8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!Get(index, &value)) 8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return value->GetAsBoolean(bool_value); 8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ListValue::GetInteger(size_t index, int* out_value) const { 8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Value* value; 8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!Get(index, &value)) 9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return value->GetAsInteger(out_value); 9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ListValue::GetDouble(size_t index, double* out_value) const { 9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Value* value; 9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!Get(index, &value)) 9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return value->GetAsDouble(out_value); 9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ListValue::GetString(size_t index, std::string* out_value) const { 9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Value* value; 9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!Get(index, &value)) 9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return value->GetAsString(out_value); 9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ListValue::GetString(size_t index, string16* out_value) const { 9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Value* value; 9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!Get(index, &value)) 9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return value->GetAsString(out_value); 9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ListValue::GetBinary(size_t index, const BinaryValue** out_value) const { 9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Value* value; 9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool result = Get(index, &value); 9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!result || !value->IsType(TYPE_BINARY)) 9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (out_value) 9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out_value = static_cast<const BinaryValue*>(value); 9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ListValue::GetBinary(size_t index, BinaryValue** out_value) { 9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return static_cast<const ListValue&>(*this).GetBinary( 9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) index, 9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const_cast<const BinaryValue**>(out_value)); 9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ListValue::GetDictionary(size_t index, 9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const DictionaryValue** out_value) const { 9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Value* value; 9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool result = Get(index, &value); 9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!result || !value->IsType(TYPE_DICTIONARY)) 9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (out_value) 9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out_value = static_cast<const DictionaryValue*>(value); 9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ListValue::GetDictionary(size_t index, DictionaryValue** out_value) { 9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return static_cast<const ListValue&>(*this).GetDictionary( 9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) index, 9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const_cast<const DictionaryValue**>(out_value)); 9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ListValue::GetList(size_t index, const ListValue** out_value) const { 9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Value* value; 9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool result = Get(index, &value); 9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!result || !value->IsType(TYPE_LIST)) 9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (out_value) 9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out_value = static_cast<const ListValue*>(value); 9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ListValue::GetList(size_t index, ListValue** out_value) { 9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return static_cast<const ListValue&>(*this).GetList( 9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) index, 9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const_cast<const ListValue**>(out_value)); 9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9843240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdochbool ListValue::Remove(size_t index, scoped_ptr<Value>* out_value) { 9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (index >= list_.size()) 9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (out_value) 9893240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch out_value->reset(list_[index]); 9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete list_[index]; 9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list_.erase(list_.begin() + index); 9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ListValue::Remove(const Value& value, size_t* index) { 9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (ValueVector::iterator i(list_.begin()); i != list_.end(); ++i) { 9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((*i)->Equals(&value)) { 10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t previous_index = i - list_.begin(); 10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete *i; 10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list_.erase(i); 10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (index) 10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *index = previous_index; 10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10123240926e260ce088908e02ac07a6cf7b0c0cbf44Ben MurdochListValue::iterator ListValue::Erase(iterator iter, 10133240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch scoped_ptr<Value>* out_value) { 10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (out_value) 10153240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch out_value->reset(*iter); 10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete *iter; 10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return list_.erase(iter); 10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ListValue::Append(Value* in_value) { 10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(in_value); 10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list_.push_back(in_value); 10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ListValue::AppendBoolean(bool in_value) { 10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Append(CreateBooleanValue(in_value)); 10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ListValue::AppendInteger(int in_value) { 10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Append(CreateIntegerValue(in_value)); 10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ListValue::AppendDouble(double in_value) { 10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Append(CreateDoubleValue(in_value)); 10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ListValue::AppendString(const std::string& in_value) { 10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Append(CreateStringValue(in_value)); 10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ListValue::AppendString(const string16& in_value) { 10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Append(CreateStringValue(in_value)); 10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ListValue::AppendStrings(const std::vector<std::string>& in_values) { 10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (std::vector<std::string>::const_iterator it = in_values.begin(); 10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it != in_values.end(); ++it) { 10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AppendString(*it); 10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ListValue::AppendStrings(const std::vector<string16>& in_values) { 10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (std::vector<string16>::const_iterator it = in_values.begin(); 10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it != in_values.end(); ++it) { 10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AppendString(*it); 10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ListValue::AppendIfNotPresent(Value* in_value) { 10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(in_value); 10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (ValueVector::const_iterator i(list_.begin()); i != list_.end(); ++i) { 10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((*i)->Equals(in_value)) { 10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete in_value; 10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list_.push_back(in_value); 10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ListValue::Insert(size_t index, Value* in_value) { 10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(in_value); 10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (index > list_.size()) 10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list_.insert(list_.begin() + index, in_value); 10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ListValue::const_iterator ListValue::Find(const Value& value) const { 10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return std::find_if(list_.begin(), list_.end(), ValueEquals(&value)); 10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ListValue::Swap(ListValue* other) { 10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list_.swap(other->list_); 10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ListValue::GetAsList(ListValue** out_value) { 10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (out_value) 10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out_value = this; 10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ListValue::GetAsList(const ListValue** out_value) const { 10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (out_value) 10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out_value = this; 10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ListValue* ListValue::DeepCopy() const { 11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ListValue* result = new ListValue; 11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (ValueVector::const_iterator i(list_.begin()); i != list_.end(); ++i) 11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result->Append((*i)->DeepCopy()); 11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return result; 11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ListValue::Equals(const Value* other) const { 11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (other->GetType() != GetType()) 11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ListValue* other_list = 11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<const ListValue*>(other); 11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const_iterator lhs_it, rhs_it; 11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (lhs_it = begin(), rhs_it = other_list->begin(); 11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lhs_it != end() && rhs_it != other_list->end(); 11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++lhs_it, ++rhs_it) { 11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!(*lhs_it)->Equals(*rhs_it)) 11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (lhs_it != end() || rhs_it != other_list->end()) 11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ValueSerializer::~ValueSerializer() { 11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::ostream& operator<<(std::ostream& out, const Value& value) { 11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string json; 11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) JSONWriter::WriteWithOptions(&value, 11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) JSONWriter::OPTIONS_PRETTY_PRINT, 11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &json); 11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return out << json; 11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace base 1142