OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "base/values.h" | 5 #include "base/values.h" |
6 | 6 |
7 #include <string.h> | 7 #include <string.h> |
8 | 8 |
9 #include <algorithm> | 9 #include <algorithm> |
10 #include <ostream> | 10 #include <ostream> |
11 | 11 |
12 #include "base/float_util.h" | 12 #include "base/float_util.h" |
13 #include "base/json/json_writer.h" | 13 #include "base/json/json_writer.h" |
14 #include "base/logging.h" | 14 #include "base/logging.h" |
15 #include "base/move.h" | 15 #include "base/move.h" |
| 16 #include "base/strings/string_number_conversions.h" |
16 #include "base/strings/string_util.h" | 17 #include "base/strings/string_util.h" |
17 #include "base/strings/utf_string_conversions.h" | 18 #include "base/strings/utf_string_conversions.h" |
18 | 19 |
19 namespace base { | 20 namespace base { |
20 | 21 |
21 namespace { | 22 namespace { |
22 | 23 |
23 // Make a deep copy of |node|, but don't include empty lists or dictionaries | 24 // Make a deep copy of |node|, but don't include empty lists or dictionaries |
24 // in the copy. It's possible for this function to return NULL and it | 25 // in the copy. It's possible for this function to return NULL and it |
25 // expects |node| to always be non-NULL. | 26 // expects |node| to always be non-NULL. |
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
131 } | 132 } |
132 | 133 |
133 bool Value::GetAsString(string16* out_value) const { | 134 bool Value::GetAsString(string16* out_value) const { |
134 return false; | 135 return false; |
135 } | 136 } |
136 | 137 |
137 bool Value::GetAsString(const StringValue** out_value) const { | 138 bool Value::GetAsString(const StringValue** out_value) const { |
138 return false; | 139 return false; |
139 } | 140 } |
140 | 141 |
| 142 bool Value::GetAsInt64(int64* out_value) const { |
| 143 return false; |
| 144 } |
| 145 |
| 146 bool Value::GetAsUint64(uint64* out_value) const { |
| 147 return false; |
| 148 } |
| 149 |
141 bool Value::GetAsList(ListValue** out_value) { | 150 bool Value::GetAsList(ListValue** out_value) { |
142 return false; | 151 return false; |
143 } | 152 } |
144 | 153 |
145 bool Value::GetAsList(const ListValue** out_value) const { | 154 bool Value::GetAsList(const ListValue** out_value) const { |
146 return false; | 155 return false; |
147 } | 156 } |
148 | 157 |
149 bool Value::GetAsDictionary(DictionaryValue** out_value) { | 158 bool Value::GetAsDictionary(DictionaryValue** out_value) { |
150 return false; | 159 return false; |
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
272 : Value(TYPE_STRING), | 281 : Value(TYPE_STRING), |
273 value_(in_value) { | 282 value_(in_value) { |
274 DCHECK(IsStringUTF8(in_value)); | 283 DCHECK(IsStringUTF8(in_value)); |
275 } | 284 } |
276 | 285 |
277 StringValue::StringValue(const string16& in_value) | 286 StringValue::StringValue(const string16& in_value) |
278 : Value(TYPE_STRING), | 287 : Value(TYPE_STRING), |
279 value_(UTF16ToUTF8(in_value)) { | 288 value_(UTF16ToUTF8(in_value)) { |
280 } | 289 } |
281 | 290 |
| 291 StringValue::StringValue(int64 in_value) |
| 292 : Value(TYPE_STRING), value_(Int64ToString(in_value)) { |
| 293 } |
| 294 |
| 295 StringValue::StringValue(uint64 in_value) |
| 296 : Value(TYPE_STRING), value_(Uint64ToString(in_value)) { |
| 297 } |
| 298 |
282 StringValue::~StringValue() { | 299 StringValue::~StringValue() { |
283 } | 300 } |
284 | 301 |
285 std::string* StringValue::GetString() { | 302 std::string* StringValue::GetString() { |
286 return &value_; | 303 return &value_; |
287 } | 304 } |
288 | 305 |
289 const std::string& StringValue::GetString() const { | 306 const std::string& StringValue::GetString() const { |
290 return value_; | 307 return value_; |
291 } | 308 } |
292 | 309 |
293 bool StringValue::GetAsString(std::string* out_value) const { | 310 bool StringValue::GetAsString(std::string* out_value) const { |
294 if (out_value) | 311 if (out_value) |
295 *out_value = value_; | 312 *out_value = value_; |
296 return true; | 313 return true; |
297 } | 314 } |
298 | 315 |
299 bool StringValue::GetAsString(string16* out_value) const { | 316 bool StringValue::GetAsString(string16* out_value) const { |
300 if (out_value) | 317 if (out_value) |
301 *out_value = UTF8ToUTF16(value_); | 318 *out_value = UTF8ToUTF16(value_); |
302 return true; | 319 return true; |
303 } | 320 } |
304 | 321 |
305 bool StringValue::GetAsString(const StringValue** out_value) const { | 322 bool StringValue::GetAsString(const StringValue** out_value) const { |
306 if (out_value) | 323 if (out_value) |
307 *out_value = this; | 324 *out_value = this; |
308 return true; | 325 return true; |
309 } | 326 } |
310 | 327 |
| 328 bool StringValue::GetAsInt64(int64* out_value) const { |
| 329 int64 stored_value; |
| 330 bool valid = StringToInt64(value_, &stored_value); |
| 331 if (valid && out_value) |
| 332 *out_value = stored_value; |
| 333 return valid; |
| 334 } |
| 335 |
| 336 bool StringValue::GetAsUint64(uint64* out_value) const { |
| 337 uint64 stored_value; |
| 338 bool valid = base::StringToUint64(value_, &stored_value); |
| 339 if (valid && out_value) |
| 340 *out_value = stored_value; |
| 341 return valid; |
| 342 } |
| 343 |
311 StringValue* StringValue::DeepCopy() const { | 344 StringValue* StringValue::DeepCopy() const { |
312 return new StringValue(value_); | 345 return new StringValue(value_); |
313 } | 346 } |
314 | 347 |
315 bool StringValue::Equals(const Value* other) const { | 348 bool StringValue::Equals(const Value* other) const { |
316 if (other->GetType() != GetType()) | 349 if (other->GetType() != GetType()) |
317 return false; | 350 return false; |
318 std::string lhs, rhs; | 351 std::string lhs, rhs; |
319 return GetAsString(&lhs) && other->GetAsString(&rhs) && lhs == rhs; | 352 return GetAsString(&lhs) && other->GetAsString(&rhs) && lhs == rhs; |
320 } | 353 } |
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
435 void DictionaryValue::SetString(const std::string& path, | 468 void DictionaryValue::SetString(const std::string& path, |
436 const std::string& in_value) { | 469 const std::string& in_value) { |
437 Set(path, new StringValue(in_value)); | 470 Set(path, new StringValue(in_value)); |
438 } | 471 } |
439 | 472 |
440 void DictionaryValue::SetString(const std::string& path, | 473 void DictionaryValue::SetString(const std::string& path, |
441 const string16& in_value) { | 474 const string16& in_value) { |
442 Set(path, new StringValue(in_value)); | 475 Set(path, new StringValue(in_value)); |
443 } | 476 } |
444 | 477 |
| 478 void DictionaryValue::SetInt64(const std::string& path, int64 in_value) { |
| 479 Set(path, new StringValue(in_value)); |
| 480 } |
| 481 |
| 482 void DictionaryValue::SetUint64(const std::string& path, uint64 in_value) { |
| 483 Set(path, new StringValue(in_value)); |
| 484 } |
| 485 |
445 void DictionaryValue::SetWithoutPathExpansion(const std::string& key, | 486 void DictionaryValue::SetWithoutPathExpansion(const std::string& key, |
446 Value* in_value) { | 487 Value* in_value) { |
447 // If there's an existing value here, we need to delete it, because | 488 // If there's an existing value here, we need to delete it, because |
448 // we own all our children. | 489 // we own all our children. |
449 std::pair<ValueMap::iterator, bool> ins_res = | 490 std::pair<ValueMap::iterator, bool> ins_res = |
450 dictionary_.insert(std::make_pair(key, in_value)); | 491 dictionary_.insert(std::make_pair(key, in_value)); |
451 if (!ins_res.second) { | 492 if (!ins_res.second) { |
452 DCHECK_NE(ins_res.first->second, in_value); // This would be bogus | 493 DCHECK_NE(ins_res.first->second, in_value); // This would be bogus |
453 delete ins_res.first->second; | 494 delete ins_res.first->second; |
454 ins_res.first->second = in_value; | 495 ins_res.first->second = in_value; |
(...skipping 18 matching lines...) Expand all Loading... |
473 void DictionaryValue::SetStringWithoutPathExpansion( | 514 void DictionaryValue::SetStringWithoutPathExpansion( |
474 const std::string& path, const std::string& in_value) { | 515 const std::string& path, const std::string& in_value) { |
475 SetWithoutPathExpansion(path, new StringValue(in_value)); | 516 SetWithoutPathExpansion(path, new StringValue(in_value)); |
476 } | 517 } |
477 | 518 |
478 void DictionaryValue::SetStringWithoutPathExpansion( | 519 void DictionaryValue::SetStringWithoutPathExpansion( |
479 const std::string& path, const string16& in_value) { | 520 const std::string& path, const string16& in_value) { |
480 SetWithoutPathExpansion(path, new StringValue(in_value)); | 521 SetWithoutPathExpansion(path, new StringValue(in_value)); |
481 } | 522 } |
482 | 523 |
| 524 void DictionaryValue::SetInt64WithoutPathExpansion(const std::string& path, |
| 525 int64 in_value) { |
| 526 SetWithoutPathExpansion(path, new StringValue(in_value)); |
| 527 } |
| 528 |
| 529 void DictionaryValue::SetUint64WithoutPathExpansion(const std::string& path, |
| 530 uint64 in_value) { |
| 531 SetWithoutPathExpansion(path, new StringValue(in_value)); |
| 532 } |
| 533 |
483 bool DictionaryValue::Get(const std::string& path, | 534 bool DictionaryValue::Get(const std::string& path, |
484 const Value** out_value) const { | 535 const Value** out_value) const { |
485 DCHECK(IsStringUTF8(path)); | 536 DCHECK(IsStringUTF8(path)); |
486 std::string current_path(path); | 537 std::string current_path(path); |
487 const DictionaryValue* current_dictionary = this; | 538 const DictionaryValue* current_dictionary = this; |
488 for (size_t delimiter_position = current_path.find('.'); | 539 for (size_t delimiter_position = current_path.find('.'); |
489 delimiter_position != std::string::npos; | 540 delimiter_position != std::string::npos; |
490 delimiter_position = current_path.find('.')) { | 541 delimiter_position = current_path.find('.')) { |
491 const DictionaryValue* child_dictionary = NULL; | 542 const DictionaryValue* child_dictionary = NULL; |
492 if (!current_dictionary->GetDictionary( | 543 if (!current_dictionary->GetDictionary( |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
544 | 595 |
545 bool DictionaryValue::GetString(const std::string& path, | 596 bool DictionaryValue::GetString(const std::string& path, |
546 string16* out_value) const { | 597 string16* out_value) const { |
547 const Value* value; | 598 const Value* value; |
548 if (!Get(path, &value)) | 599 if (!Get(path, &value)) |
549 return false; | 600 return false; |
550 | 601 |
551 return value->GetAsString(out_value); | 602 return value->GetAsString(out_value); |
552 } | 603 } |
553 | 604 |
| 605 bool DictionaryValue::GetInt64(const std::string& path, |
| 606 int64* out_value) const { |
| 607 const Value* value; |
| 608 if (!Get(path, &value)) |
| 609 return false; |
| 610 |
| 611 return value->GetAsInt64(out_value); |
| 612 } |
| 613 |
| 614 bool DictionaryValue::GetUint64(const std::string& path, |
| 615 uint64* out_value) const { |
| 616 const Value* value; |
| 617 if (!Get(path, &value)) |
| 618 return false; |
| 619 |
| 620 return value->GetAsUint64(out_value); |
| 621 } |
| 622 |
554 bool DictionaryValue::GetStringASCII(const std::string& path, | 623 bool DictionaryValue::GetStringASCII(const std::string& path, |
555 std::string* out_value) const { | 624 std::string* out_value) const { |
556 std::string out; | 625 std::string out; |
557 if (!GetString(path, &out)) | 626 if (!GetString(path, &out)) |
558 return false; | 627 return false; |
559 | 628 |
560 if (!IsStringASCII(out)) { | 629 if (!IsStringASCII(out)) { |
561 NOTREACHED(); | 630 NOTREACHED(); |
562 return false; | 631 return false; |
563 } | 632 } |
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
684 | 753 |
685 bool DictionaryValue::GetStringWithoutPathExpansion(const std::string& key, | 754 bool DictionaryValue::GetStringWithoutPathExpansion(const std::string& key, |
686 string16* out_value) const { | 755 string16* out_value) const { |
687 const Value* value; | 756 const Value* value; |
688 if (!GetWithoutPathExpansion(key, &value)) | 757 if (!GetWithoutPathExpansion(key, &value)) |
689 return false; | 758 return false; |
690 | 759 |
691 return value->GetAsString(out_value); | 760 return value->GetAsString(out_value); |
692 } | 761 } |
693 | 762 |
| 763 bool DictionaryValue::GetInt64WithoutPathExpansion(const std::string& key, |
| 764 int64* out_value) const { |
| 765 const Value* value; |
| 766 if (!GetWithoutPathExpansion(key, &value)) |
| 767 return false; |
| 768 |
| 769 return value->GetAsInt64(out_value); |
| 770 } |
| 771 |
| 772 bool DictionaryValue::GetUint64WithoutPathExpansion(const std::string& key, |
| 773 uint64* out_value) const { |
| 774 const Value* value; |
| 775 if (!GetWithoutPathExpansion(key, &value)) |
| 776 return false; |
| 777 |
| 778 return value->GetAsUint64(out_value); |
| 779 } |
| 780 |
694 bool DictionaryValue::GetDictionaryWithoutPathExpansion( | 781 bool DictionaryValue::GetDictionaryWithoutPathExpansion( |
695 const std::string& key, | 782 const std::string& key, |
696 const DictionaryValue** out_value) const { | 783 const DictionaryValue** out_value) const { |
697 const Value* value; | 784 const Value* value; |
698 bool result = GetWithoutPathExpansion(key, &value); | 785 bool result = GetWithoutPathExpansion(key, &value); |
699 if (!result || !value->IsType(TYPE_DICTIONARY)) | 786 if (!result || !value->IsType(TYPE_DICTIONARY)) |
700 return false; | 787 return false; |
701 | 788 |
702 if (out_value) | 789 if (out_value) |
703 *out_value = static_cast<const DictionaryValue*>(value); | 790 *out_value = static_cast<const DictionaryValue*>(value); |
(...skipping 233 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
937 } | 1024 } |
938 | 1025 |
939 bool ListValue::GetString(size_t index, string16* out_value) const { | 1026 bool ListValue::GetString(size_t index, string16* out_value) const { |
940 const Value* value; | 1027 const Value* value; |
941 if (!Get(index, &value)) | 1028 if (!Get(index, &value)) |
942 return false; | 1029 return false; |
943 | 1030 |
944 return value->GetAsString(out_value); | 1031 return value->GetAsString(out_value); |
945 } | 1032 } |
946 | 1033 |
| 1034 bool ListValue::GetInt64(size_t index, int64* out_value) const { |
| 1035 const Value* value; |
| 1036 if (!Get(index, &value)) |
| 1037 return false; |
| 1038 |
| 1039 return value->GetAsInt64(out_value); |
| 1040 } |
| 1041 |
| 1042 bool ListValue::GetUint64(size_t index, uint64* out_value) const { |
| 1043 const Value* value; |
| 1044 if (!Get(index, &value)) |
| 1045 return false; |
| 1046 |
| 1047 return value->GetAsUint64(out_value); |
| 1048 } |
| 1049 |
947 bool ListValue::GetBinary(size_t index, const BinaryValue** out_value) const { | 1050 bool ListValue::GetBinary(size_t index, const BinaryValue** out_value) const { |
948 const Value* value; | 1051 const Value* value; |
949 bool result = Get(index, &value); | 1052 bool result = Get(index, &value); |
950 if (!result || !value->IsType(TYPE_BINARY)) | 1053 if (!result || !value->IsType(TYPE_BINARY)) |
951 return false; | 1054 return false; |
952 | 1055 |
953 if (out_value) | 1056 if (out_value) |
954 *out_value = static_cast<const BinaryValue*>(value); | 1057 *out_value = static_cast<const BinaryValue*>(value); |
955 | 1058 |
956 return true; | 1059 return true; |
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1055 } | 1158 } |
1056 | 1159 |
1057 void ListValue::AppendString(const std::string& in_value) { | 1160 void ListValue::AppendString(const std::string& in_value) { |
1058 Append(new StringValue(in_value)); | 1161 Append(new StringValue(in_value)); |
1059 } | 1162 } |
1060 | 1163 |
1061 void ListValue::AppendString(const string16& in_value) { | 1164 void ListValue::AppendString(const string16& in_value) { |
1062 Append(new StringValue(in_value)); | 1165 Append(new StringValue(in_value)); |
1063 } | 1166 } |
1064 | 1167 |
| 1168 void ListValue::AppendInt64(int64 in_value) { |
| 1169 Append(new StringValue(in_value)); |
| 1170 } |
| 1171 |
| 1172 void ListValue::AppendUint64(uint64 in_value) { |
| 1173 Append(new StringValue(in_value)); |
| 1174 } |
| 1175 |
1065 void ListValue::AppendStrings(const std::vector<std::string>& in_values) { | 1176 void ListValue::AppendStrings(const std::vector<std::string>& in_values) { |
1066 for (std::vector<std::string>::const_iterator it = in_values.begin(); | 1177 for (std::vector<std::string>::const_iterator it = in_values.begin(); |
1067 it != in_values.end(); ++it) { | 1178 it != in_values.end(); ++it) { |
1068 AppendString(*it); | 1179 AppendString(*it); |
1069 } | 1180 } |
1070 } | 1181 } |
1071 | 1182 |
1072 void ListValue::AppendStrings(const std::vector<string16>& in_values) { | 1183 void ListValue::AppendStrings(const std::vector<string16>& in_values) { |
1073 for (std::vector<string16>::const_iterator it = in_values.begin(); | 1184 for (std::vector<string16>::const_iterator it = in_values.begin(); |
1074 it != in_values.end(); ++it) { | 1185 it != in_values.end(); ++it) { |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1150 | 1261 |
1151 std::ostream& operator<<(std::ostream& out, const Value& value) { | 1262 std::ostream& operator<<(std::ostream& out, const Value& value) { |
1152 std::string json; | 1263 std::string json; |
1153 JSONWriter::WriteWithOptions(&value, | 1264 JSONWriter::WriteWithOptions(&value, |
1154 JSONWriter::OPTIONS_PRETTY_PRINT, | 1265 JSONWriter::OPTIONS_PRETTY_PRINT, |
1155 &json); | 1266 &json); |
1156 return out << json; | 1267 return out << json; |
1157 } | 1268 } |
1158 | 1269 |
1159 } // namespace base | 1270 } // namespace base |
OLD | NEW |