Index: components/policy/core/common/registry_dict_win.cc |
diff --git a/components/policy/core/common/registry_dict_win.cc b/components/policy/core/common/registry_dict_win.cc |
index a2bb6880bd2fe3f17c61ebff9256a38a3719509a..80f9a34a5325495186a30b3d26f3397bb2c2a760 100644 |
--- a/components/policy/core/common/registry_dict_win.cc |
+++ b/components/policy/core/common/registry_dict_win.cc |
@@ -12,9 +12,7 @@ |
#include "base/sys_byteorder.h" |
#include "base/values.h" |
#include "base/win/registry.h" |
-#include "components/json_schema/json_schema_constants.h" |
- |
-namespace schema = json_schema_constants; |
+#include "components/policy/core/common/schema.h" |
using base::win::RegistryKeyIterator; |
using base::win::RegistryValueIterator; |
@@ -23,96 +21,39 @@ namespace policy { |
namespace { |
-// Returns the entry with key |name| in |dictionary| (can be NULL), or NULL. |
-const base::DictionaryValue* GetEntry(const base::DictionaryValue* dictionary, |
- const std::string& name) { |
- if (!dictionary) |
- return NULL; |
- const base::DictionaryValue* entry = NULL; |
- dictionary->GetDictionaryWithoutPathExpansion(name, &entry); |
- return entry; |
-} |
- |
-// Returns the Value type described in |schema|, or |default_type| if not found. |
-base::Value::Type GetValueTypeForSchema(const base::DictionaryValue* schema, |
- base::Value::Type default_type) { |
- // JSON-schema types to base::Value::Type mapping. |
- static const struct { |
- // JSON schema type. |
- const char* schema_type; |
- // Correspondent value type. |
- base::Value::Type value_type; |
- } kSchemaToValueTypeMap[] = { |
- { schema::kArray, base::Value::TYPE_LIST }, |
- { schema::kBoolean, base::Value::TYPE_BOOLEAN }, |
- { schema::kInteger, base::Value::TYPE_INTEGER }, |
- { schema::kNull, base::Value::TYPE_NULL }, |
- { schema::kNumber, base::Value::TYPE_DOUBLE }, |
- { schema::kObject, base::Value::TYPE_DICTIONARY }, |
- { schema::kString, base::Value::TYPE_STRING }, |
- }; |
- |
- if (!schema) |
- return default_type; |
- std::string type; |
- if (!schema->GetStringWithoutPathExpansion(schema::kType, &type)) |
- return default_type; |
- for (size_t i = 0; i < arraysize(kSchemaToValueTypeMap); ++i) { |
- if (type == kSchemaToValueTypeMap[i].schema_type) |
- return kSchemaToValueTypeMap[i].value_type; |
- } |
- return default_type; |
-} |
- |
-// Returns the schema for property |name| given the |schema| of an object. |
-// Returns the "additionalProperties" schema if no specific schema for |
-// |name| is present. Returns NULL if no schema is found. |
-const base::DictionaryValue* GetSchemaFor(const base::DictionaryValue* schema, |
- const std::string& name) { |
- const base::DictionaryValue* properties = |
- GetEntry(schema, schema::kProperties); |
- const base::DictionaryValue* sub_schema = GetEntry(properties, name); |
- if (sub_schema) |
- return sub_schema; |
- // "additionalProperties" can be a boolean, but that case is ignored. |
- return GetEntry(schema, schema::kAdditionalProperties); |
-} |
- |
// Converts a value (as read from the registry) to meet |schema|, converting |
// types as necessary. Unconvertible types will show up as NULL values in the |
// result. |
scoped_ptr<base::Value> ConvertValue(const base::Value& value, |
- const base::DictionaryValue* schema) { |
- // Figure out the type to convert to from the schema. |
- const base::Value::Type result_type( |
- GetValueTypeForSchema(schema, value.GetType())); |
+ const Schema& schema) { |
+ if (!schema.valid()) |
+ return make_scoped_ptr(value.DeepCopy()); |
// If the type is good already, go with it. |
- if (value.IsType(result_type)) { |
- // Recurse for complex types if there is a schema. |
- if (schema) { |
- const base::DictionaryValue* dict = NULL; |
- const base::ListValue* list = NULL; |
- if (value.GetAsDictionary(&dict)) { |
- scoped_ptr<base::DictionaryValue> result(new base::DictionaryValue()); |
- for (base::DictionaryValue::Iterator entry(*dict); !entry.IsAtEnd(); |
- entry.Advance()) { |
- scoped_ptr<base::Value> converted_value( |
- ConvertValue(entry.value(), GetSchemaFor(schema, entry.key()))); |
- result->SetWithoutPathExpansion(entry.key(), |
- converted_value.release()); |
- } |
- return result.Pass(); |
- } else if (value.GetAsList(&list)) { |
- scoped_ptr<base::ListValue> result(new base::ListValue()); |
- const base::DictionaryValue* item_schema = |
- GetEntry(schema, schema::kItems); |
- for (base::ListValue::const_iterator entry(list->begin()); |
- entry != list->end(); ++entry) { |
- result->Append(ConvertValue(**entry, item_schema).release()); |
- } |
- return result.Pass(); |
+ if (value.IsType(schema.type())) { |
+ // Recurse for complex types. |
+ const base::DictionaryValue* dict = NULL; |
+ const base::ListValue* list = NULL; |
+ if (value.GetAsDictionary(&dict)) { |
+ scoped_ptr<base::DictionaryValue> result(new base::DictionaryValue()); |
+ for (base::DictionaryValue::Iterator entry(*dict); !entry.IsAtEnd(); |
+ entry.Advance()) { |
+ scoped_ptr<base::Value> converted = |
+ ConvertValue(entry.value(), schema.GetProperty(entry.key())); |
+ if (converted) |
+ result->SetWithoutPathExpansion(entry.key(), converted.release()); |
} |
+ return result.Pass(); |
+ } else if (value.GetAsList(&list)) { |
+ scoped_ptr<base::ListValue> result(new base::ListValue()); |
+ for (base::ListValue::const_iterator entry(list->begin()); |
+ entry != list->end(); ++entry) { |
+ scoped_ptr<base::Value> converted = |
+ ConvertValue(**entry, schema.GetItems()); |
+ if (converted) |
+ result->Append(converted.release()); |
+ } |
+ return result.Pass(); |
} |
return make_scoped_ptr(value.DeepCopy()); |
} |
@@ -120,7 +61,7 @@ scoped_ptr<base::Value> ConvertValue(const base::Value& value, |
// Else, do some conversions to map windows registry data types to JSON types. |
std::string string_value; |
int int_value = 0; |
- switch (result_type) { |
+ switch (schema.type()) { |
case base::Value::TYPE_NULL: { |
return make_scoped_ptr(base::Value::CreateNullValue()); |
} |
@@ -157,13 +98,14 @@ scoped_ptr<base::Value> ConvertValue(const base::Value& value, |
const base::DictionaryValue* dict = NULL; |
if (value.GetAsDictionary(&dict)) { |
scoped_ptr<base::ListValue> result(new base::ListValue()); |
- const base::DictionaryValue* item_schema = |
- GetEntry(schema, schema::kItems); |
for (int i = 1; ; ++i) { |
const base::Value* entry = NULL; |
if (!dict->Get(base::IntToString(i), &entry)) |
break; |
- result->Append(ConvertValue(*entry, item_schema).release()); |
+ scoped_ptr<base::Value> converted = |
+ ConvertValue(*entry, schema.GetItems()); |
+ if (converted) |
+ result->Append(converted.release()); |
} |
return result.Pass(); |
} |
@@ -173,7 +115,7 @@ scoped_ptr<base::Value> ConvertValue(const base::Value& value, |
// Dictionaries may be encoded as JSON strings. |
if (value.GetAsString(&string_value)) { |
scoped_ptr<base::Value> result(base::JSONReader::Read(string_value)); |
- if (result && result->IsType(result_type)) |
+ if (result && result->IsType(schema.type())) |
return result.Pass(); |
} |
break; |
@@ -185,8 +127,8 @@ scoped_ptr<base::Value> ConvertValue(const base::Value& value, |
} |
LOG(WARNING) << "Failed to convert " << value.GetType() |
- << " to " << result_type; |
- return make_scoped_ptr(base::Value::CreateNullValue()); |
+ << " to " << schema.type(); |
+ return scoped_ptr<base::Value>(); |
} |
} // namespace |
@@ -348,42 +290,49 @@ void RegistryDict::ReadRegistry(HKEY hive, const base::string16& root) { |
} |
scoped_ptr<base::Value> RegistryDict::ConvertToJSON( |
- const base::DictionaryValue* schema) const { |
+ const Schema& schema) const { |
base::Value::Type type = |
- GetValueTypeForSchema(schema, base::Value::TYPE_DICTIONARY); |
+ schema.valid() ? schema.type() : base::Value::TYPE_DICTIONARY; |
switch (type) { |
case base::Value::TYPE_DICTIONARY: { |
scoped_ptr<base::DictionaryValue> result(new base::DictionaryValue()); |
for (RegistryDict::ValueMap::const_iterator entry(values_.begin()); |
entry != values_.end(); ++entry) { |
- result->SetWithoutPathExpansion( |
- entry->first, |
- ConvertValue(*entry->second, |
- GetSchemaFor(schema, entry->first)).release()); |
+ Schema subschema = |
+ schema.valid() ? schema.GetProperty(entry->first) : Schema(); |
+ scoped_ptr<base::Value> converted = |
+ ConvertValue(*entry->second, subschema); |
+ if (converted) |
+ result->SetWithoutPathExpansion(entry->first, converted.release()); |
} |
for (RegistryDict::KeyMap::const_iterator entry(keys_.begin()); |
entry != keys_.end(); ++entry) { |
- result->SetWithoutPathExpansion( |
- entry->first, |
- entry->second->ConvertToJSON( |
- GetSchemaFor(schema, entry->first)).release()); |
+ Schema subschema = |
+ schema.valid() ? schema.GetProperty(entry->first) : Schema(); |
+ scoped_ptr<base::Value> converted = |
+ entry->second->ConvertToJSON(subschema); |
+ if (converted) |
+ result->SetWithoutPathExpansion(entry->first, converted.release()); |
} |
return result.Pass(); |
} |
case base::Value::TYPE_LIST: { |
scoped_ptr<base::ListValue> result(new base::ListValue()); |
- const base::DictionaryValue* item_schema = |
- GetEntry(schema, schema::kItems); |
+ Schema item_schema = schema.valid() ? schema.GetItems() : Schema(); |
for (int i = 1; ; ++i) { |
const std::string name(base::IntToString(i)); |
const RegistryDict* key = GetKey(name); |
if (key) { |
- result->Append(key->ConvertToJSON(item_schema).release()); |
+ scoped_ptr<base::Value> converted = key->ConvertToJSON(item_schema); |
+ if (converted) |
+ result->Append(converted.release()); |
continue; |
} |
const base::Value* value = GetValue(name); |
if (value) { |
- result->Append(ConvertValue(*value, item_schema).release()); |
+ scoped_ptr<base::Value> converted = ConvertValue(*value, item_schema); |
+ if (converted) |
+ result->Append(converted.release()); |
continue; |
} |
break; |
@@ -394,7 +343,7 @@ scoped_ptr<base::Value> RegistryDict::ConvertToJSON( |
LOG(WARNING) << "Can't convert registry key to schema type " << type; |
} |
- return make_scoped_ptr(base::Value::CreateNullValue()); |
+ return scoped_ptr<base::Value>(); |
} |
} // namespace policy |