| Index: third_party/libaddressinput/chromium/cpp/src/util/json.cc
|
| diff --git a/third_party/libaddressinput/chromium/cpp/src/util/json.cc b/third_party/libaddressinput/chromium/cpp/src/util/json.cc
|
| index f244bf6b3c7c1fda5419290e00c003ddacb50ed3..6a95722e2147a72226c0713483c90e960bb7fa51 100644
|
| --- a/third_party/libaddressinput/chromium/cpp/src/util/json.cc
|
| +++ b/third_party/libaddressinput/chromium/cpp/src/util/json.cc
|
| @@ -19,6 +19,7 @@
|
|
|
| #include <cassert>
|
| #include <cstddef>
|
| +#include <cstring>
|
| #include <string>
|
|
|
| #include <rapidjson/document.h>
|
| @@ -31,20 +32,26 @@ namespace {
|
|
|
| class Rapidjson : public Json {
|
| public:
|
| - Rapidjson() : document_(new rapidjson::Document), valid_(false) {}
|
| + Rapidjson() : dict_() {}
|
|
|
| virtual ~Rapidjson() {}
|
|
|
| virtual bool ParseObject(const std::string& json) {
|
| - document_->Parse<rapidjson::kParseValidateEncodingFlag>(json.c_str());
|
| - valid_ = !document_->HasParseError() && document_->IsObject();
|
| - return valid_;
|
| + scoped_ptr<rapidjson::Document> document(new rapidjson::Document);
|
| + document->Parse<rapidjson::kParseValidateEncodingFlag>(json.c_str());
|
| + if (!document->HasParseError() && document->IsObject()) {
|
| + dict_.reset(document.release());
|
| + return true;
|
| + }
|
| + return false;
|
| }
|
|
|
| virtual bool GetStringValueForKey(const std::string& key,
|
| std::string* value) const {
|
| - assert(valid_);
|
| - const rapidjson::Value::Member* member = document_->FindMember(key.c_str());
|
| + assert(dict_ != NULL);
|
| +
|
| + // Owned by |dict_|.
|
| + const rapidjson::Value::Member* member = dict_->FindMember(key.c_str());
|
| if (member == NULL || !member->value.IsString()) {
|
| return false;
|
| }
|
| @@ -56,12 +63,39 @@ class Rapidjson : public Json {
|
| return true;
|
| }
|
|
|
| + virtual bool GetJsonValueForKey(const std::string& key,
|
| + scoped_ptr<Json>* value) const {
|
| + assert(dict_ != NULL);
|
| +
|
| + // Owned by |dict_|.
|
| + const rapidjson::Value::Member* member = dict_->FindMember(key.c_str());
|
| + if (member == NULL || !member->value.IsObject()) {
|
| + return false;
|
| + }
|
| +
|
| + if (value) {
|
| + scoped_ptr<rapidjson::Value> copy(new rapidjson::Value);
|
| +
|
| + // Rapidjson provides only move operations in public API, but implements
|
| + // the move operation with a memcpy and delete:
|
| + //
|
| + // https://code.google.com/p/rapidjson/source/browse/trunk/include/rapidjson/document.h?r=131#173
|
| + //
|
| + // We need a copy of the object, so we use memcpy manually.
|
| + memcpy(copy.get(), &member->value, sizeof(rapidjson::Value));
|
| +
|
| + value->reset(new Rapidjson(copy.Pass()));
|
| + }
|
| +
|
| + return true;
|
| + }
|
| +
|
| protected:
|
| - // JSON document.
|
| - scoped_ptr<rapidjson::Document> document_;
|
| + explicit Rapidjson(scoped_ptr<rapidjson::Value> dict)
|
| + : dict_(dict.Pass()) {}
|
|
|
| - // True if the parsed string is a valid JSON object.
|
| - bool valid_;
|
| + // JSON value.
|
| + scoped_ptr<rapidjson::Value> dict_;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(Rapidjson);
|
| };
|
|
|