diff options
Diffstat (limited to 'chromeos/network/onc/onc_mapper.cc')
-rw-r--r-- | chromeos/network/onc/onc_mapper.cc | 92 |
1 files changed, 48 insertions, 44 deletions
diff --git a/chromeos/network/onc/onc_mapper.cc b/chromeos/network/onc/onc_mapper.cc index 8d5d723..768f0f6 100644 --- a/chromeos/network/onc/onc_mapper.cc +++ b/chromeos/network/onc/onc_mapper.cc @@ -17,28 +17,25 @@ Mapper::Mapper() { Mapper::~Mapper() { } -scoped_ptr<base::Value> Mapper::MapValue( - const OncValueSignature& signature, - const base::Value& onc_value) { +scoped_ptr<base::Value> Mapper::MapValue(const OncValueSignature& signature, + const base::Value& onc_value, + bool* error) { scoped_ptr<base::Value> result_value; switch (onc_value.GetType()) { case base::Value::TYPE_DICTIONARY: { const base::DictionaryValue* dict = NULL; onc_value.GetAsDictionary(&dict); - result_value = MapObject(signature, *dict); + result_value = MapObject(signature, *dict, error); break; } case base::Value::TYPE_LIST: { const base::ListValue* list = NULL; onc_value.GetAsList(&list); - bool nested_error_occured = false; - result_value = MapArray(signature, *list, &nested_error_occured); - if (nested_error_occured) - result_value.reset(); + result_value = MapArray(signature, *list, error); break; } default: { - result_value = MapPrimitive(signature, onc_value); + result_value = MapPrimitive(signature, onc_value, error); break; } } @@ -48,44 +45,44 @@ scoped_ptr<base::Value> Mapper::MapValue( scoped_ptr<base::DictionaryValue> Mapper::MapObject( const OncValueSignature& signature, - const base::DictionaryValue& onc_object) { + const base::DictionaryValue& onc_object, + bool* error) { scoped_ptr<base::DictionaryValue> result(new base::DictionaryValue); bool found_unknown_field = false; - bool nested_error_occured = false; - MapFields(signature, onc_object, &found_unknown_field, &nested_error_occured, - result.get()); - if (!nested_error_occured && !found_unknown_field) - return result.Pass(); - else - return scoped_ptr<base::DictionaryValue>(); + MapFields(signature, onc_object, &found_unknown_field, error, result.get()); + if (found_unknown_field) + *error = true; + return result.Pass(); } -scoped_ptr<base::Value> Mapper::MapPrimitive( - const OncValueSignature& signature, - const base::Value& onc_primitive) { +scoped_ptr<base::Value> Mapper::MapPrimitive(const OncValueSignature& signature, + const base::Value& onc_primitive, + bool* error) { return make_scoped_ptr(onc_primitive.DeepCopy()); } -void Mapper::MapFields( - const OncValueSignature& object_signature, - const base::DictionaryValue& onc_object, - bool* found_unknown_field, - bool* nested_error_occured, - base::DictionaryValue* result) { +void Mapper::MapFields(const OncValueSignature& object_signature, + const base::DictionaryValue& onc_object, + bool* found_unknown_field, + bool* nested_error, + base::DictionaryValue* result) { for (base::DictionaryValue::Iterator it(onc_object); it.HasNext(); it.Advance()) { bool current_field_unknown = false; - scoped_ptr<base::Value> result_value = MapField( - it.key(), object_signature, it.value(), ¤t_field_unknown); + scoped_ptr<base::Value> result_value = MapField(it.key(), + object_signature, + it.value(), + ¤t_field_unknown, + nested_error); if (current_field_unknown) *found_unknown_field = true; else if (result_value.get() != NULL) result->SetWithoutPathExpansion(it.key(), result_value.release()); else - *nested_error_occured = true; + DCHECK(*nested_error); } } @@ -93,18 +90,16 @@ scoped_ptr<base::Value> Mapper::MapField( const std::string& field_name, const OncValueSignature& object_signature, const base::Value& onc_value, - bool* found_unknown_field) { + bool* found_unknown_field, + bool* error) { const OncFieldSignature* field_signature = GetFieldSignature(object_signature, field_name); if (field_signature != NULL) { - if (field_signature->value_signature == NULL) { - NOTREACHED() << "Found missing value signature at field '" - << field_name << "'."; - return scoped_ptr<base::Value>(); - } + DCHECK(field_signature->value_signature != NULL) + << "Found missing value signature at field '" << field_name << "'."; - return MapValue(*field_signature->value_signature, onc_value); + return MapValue(*field_signature->value_signature, onc_value, error); } else { DVLOG(1) << "Found unknown field name: '" << field_name << "'"; *found_unknown_field = true; @@ -115,26 +110,35 @@ scoped_ptr<base::Value> Mapper::MapField( scoped_ptr<base::ListValue> Mapper::MapArray( const OncValueSignature& array_signature, const base::ListValue& onc_array, - bool* nested_error_occured) { - if (array_signature.onc_array_entry_signature == NULL) { - NOTREACHED() << "Found missing onc_array_entry_signature."; - return scoped_ptr<base::ListValue>(); - } + bool* nested_error) { + DCHECK(array_signature.onc_array_entry_signature != NULL) + << "Found missing onc_array_entry_signature."; scoped_ptr<base::ListValue> result_array(new base::ListValue); + int original_index = 0; for (base::ListValue::const_iterator it = onc_array.begin(); - it != onc_array.end(); ++it) { + it != onc_array.end(); ++it, ++original_index) { const base::Value* entry = *it; scoped_ptr<base::Value> result_entry; - result_entry = MapValue(*array_signature.onc_array_entry_signature, *entry); + result_entry = MapEntry(original_index, + *array_signature.onc_array_entry_signature, + *entry, + nested_error); if (result_entry.get() != NULL) result_array->Append(result_entry.release()); else - *nested_error_occured = true; + DCHECK(*nested_error); } return result_array.Pass(); } +scoped_ptr<base::Value> Mapper::MapEntry(int index, + const OncValueSignature& signature, + const base::Value& onc_value, + bool* error) { + return MapValue(signature, onc_value, error); +} + } // namespace onc } // namespace chromeos |