| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 "components/policy/core/common/registry_dict_win.h" | 5 #include "components/policy/core/common/registry_dict_win.h" |
| 6 | 6 |
| 7 #include "base/json/json_reader.h" | 7 #include "base/json/json_reader.h" |
| 8 #include "base/stl_util.h" | 8 #include "base/stl_util.h" |
| 9 #include "base/strings/string_number_conversions.h" | 9 #include "base/strings/string_number_conversions.h" |
| 10 #include "base/strings/string_util.h" | 10 #include "base/strings/string_util.h" |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 63 int int_value = 0; | 63 int int_value = 0; |
| 64 switch (schema.type()) { | 64 switch (schema.type()) { |
| 65 case base::Value::TYPE_NULL: { | 65 case base::Value::TYPE_NULL: { |
| 66 return make_scoped_ptr(base::Value::CreateNullValue()).Pass(); | 66 return make_scoped_ptr(base::Value::CreateNullValue()).Pass(); |
| 67 } | 67 } |
| 68 case base::Value::TYPE_BOOLEAN: { | 68 case base::Value::TYPE_BOOLEAN: { |
| 69 // Accept booleans encoded as either string or integer. | 69 // Accept booleans encoded as either string or integer. |
| 70 if (value.GetAsInteger(&int_value) || | 70 if (value.GetAsInteger(&int_value) || |
| 71 (value.GetAsString(&string_value) && | 71 (value.GetAsString(&string_value) && |
| 72 base::StringToInt(string_value, &int_value))) { | 72 base::StringToInt(string_value, &int_value))) { |
| 73 return make_scoped_ptr(base::Value::CreateBooleanValue(int_value != 0)) | 73 return scoped_ptr<base::Value>( |
| 74 .PassAs<base::Value>(); | 74 base::Value::CreateBooleanValue(int_value != 0)); |
| 75 } | 75 } |
| 76 break; | 76 break; |
| 77 } | 77 } |
| 78 case base::Value::TYPE_INTEGER: { | 78 case base::Value::TYPE_INTEGER: { |
| 79 // Integers may be string-encoded. | 79 // Integers may be string-encoded. |
| 80 if (value.GetAsString(&string_value) && | 80 if (value.GetAsString(&string_value) && |
| 81 base::StringToInt(string_value, &int_value)) { | 81 base::StringToInt(string_value, &int_value)) { |
| 82 return make_scoped_ptr(base::Value::CreateIntegerValue(int_value)) | 82 return scoped_ptr<base::Value>( |
| 83 .PassAs<base::Value>(); | 83 base::Value::CreateIntegerValue(int_value)); |
| 84 } | 84 } |
| 85 break; | 85 break; |
| 86 } | 86 } |
| 87 case base::Value::TYPE_DOUBLE: { | 87 case base::Value::TYPE_DOUBLE: { |
| 88 // Doubles may be string-encoded or integer-encoded. | 88 // Doubles may be string-encoded or integer-encoded. |
| 89 double double_value = 0; | 89 double double_value = 0; |
| 90 if (value.GetAsInteger(&int_value)) { | 90 if (value.GetAsInteger(&int_value)) { |
| 91 return make_scoped_ptr(base::Value::CreateDoubleValue(int_value)) | 91 return scoped_ptr<base::Value>( |
| 92 .PassAs<base::Value>(); | 92 base::Value::CreateDoubleValue(int_value)); |
| 93 } else if (value.GetAsString(&string_value) && | 93 } else if (value.GetAsString(&string_value) && |
| 94 base::StringToDouble(string_value, &double_value)) { | 94 base::StringToDouble(string_value, &double_value)) { |
| 95 return make_scoped_ptr(base::Value::CreateDoubleValue(double_value)) | 95 return scoped_ptr<base::Value>( |
| 96 .PassAs<base::Value>(); | 96 base::Value::CreateDoubleValue(double_value)); |
| 97 } | 97 } |
| 98 break; | 98 break; |
| 99 } | 99 } |
| 100 case base::Value::TYPE_LIST: { | 100 case base::Value::TYPE_LIST: { |
| 101 // Lists are encoded as subkeys with numbered value in the registry. | 101 // Lists are encoded as subkeys with numbered value in the registry. |
| 102 const base::DictionaryValue* dict = NULL; | 102 const base::DictionaryValue* dict = NULL; |
| 103 if (value.GetAsDictionary(&dict)) { | 103 if (value.GetAsDictionary(&dict)) { |
| 104 scoped_ptr<base::ListValue> result(new base::ListValue()); | 104 scoped_ptr<base::ListValue> result(new base::ListValue()); |
| 105 for (int i = 1; ; ++i) { | 105 for (int i = 1; ; ++i) { |
| 106 const base::Value* entry = NULL; | 106 const base::Value* entry = NULL; |
| (...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 245 ClearKeys(); | 245 ClearKeys(); |
| 246 ClearValues(); | 246 ClearValues(); |
| 247 | 247 |
| 248 // First, read all the values of the key. | 248 // First, read all the values of the key. |
| 249 for (RegistryValueIterator it(hive, root.c_str()); it.Valid(); ++it) { | 249 for (RegistryValueIterator it(hive, root.c_str()); it.Valid(); ++it) { |
| 250 const std::string name = base::UTF16ToUTF8(it.Name()); | 250 const std::string name = base::UTF16ToUTF8(it.Name()); |
| 251 switch (it.Type()) { | 251 switch (it.Type()) { |
| 252 case REG_SZ: | 252 case REG_SZ: |
| 253 case REG_EXPAND_SZ: | 253 case REG_EXPAND_SZ: |
| 254 SetValue(name, | 254 SetValue(name, |
| 255 make_scoped_ptr(new base::StringValue( | 255 scoped_ptr<base::Value>( |
| 256 base::UTF16ToUTF8(it.Value()))).Pass()); | 256 new base::StringValue(base::UTF16ToUTF8(it.Value())))); |
| 257 continue; | 257 continue; |
| 258 case REG_DWORD_LITTLE_ENDIAN: | 258 case REG_DWORD_LITTLE_ENDIAN: |
| 259 case REG_DWORD_BIG_ENDIAN: | 259 case REG_DWORD_BIG_ENDIAN: |
| 260 if (it.ValueSize() == sizeof(DWORD)) { | 260 if (it.ValueSize() == sizeof(DWORD)) { |
| 261 DWORD dword_value = *(reinterpret_cast<const DWORD*>(it.Value())); | 261 DWORD dword_value = *(reinterpret_cast<const DWORD*>(it.Value())); |
| 262 if (it.Type() == REG_DWORD_BIG_ENDIAN) | 262 if (it.Type() == REG_DWORD_BIG_ENDIAN) |
| 263 dword_value = base::NetToHost32(dword_value); | 263 dword_value = base::NetToHost32(dword_value); |
| 264 else | 264 else |
| 265 dword_value = base::ByteSwapToLE32(dword_value); | 265 dword_value = base::ByteSwapToLE32(dword_value); |
| 266 SetValue(name, | 266 SetValue(name, |
| 267 make_scoped_ptr(base::Value::CreateIntegerValue(dword_value)) | 267 scoped_ptr<base::Value>( |
| 268 .PassAs<base::Value>()); | 268 base::Value::CreateIntegerValue(dword_value))); |
| 269 continue; | 269 continue; |
| 270 } | 270 } |
| 271 case REG_NONE: | 271 case REG_NONE: |
| 272 case REG_LINK: | 272 case REG_LINK: |
| 273 case REG_MULTI_SZ: | 273 case REG_MULTI_SZ: |
| 274 case REG_RESOURCE_LIST: | 274 case REG_RESOURCE_LIST: |
| 275 case REG_FULL_RESOURCE_DESCRIPTOR: | 275 case REG_FULL_RESOURCE_DESCRIPTOR: |
| 276 case REG_RESOURCE_REQUIREMENTS_LIST: | 276 case REG_RESOURCE_REQUIREMENTS_LIST: |
| 277 case REG_QWORD_LITTLE_ENDIAN: | 277 case REG_QWORD_LITTLE_ENDIAN: |
| 278 // Unsupported type, message gets logged below. | 278 // Unsupported type, message gets logged below. |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 344 return result.Pass(); | 344 return result.Pass(); |
| 345 } | 345 } |
| 346 default: | 346 default: |
| 347 LOG(WARNING) << "Can't convert registry key to schema type " << type; | 347 LOG(WARNING) << "Can't convert registry key to schema type " << type; |
| 348 } | 348 } |
| 349 | 349 |
| 350 return scoped_ptr<base::Value>(); | 350 return scoped_ptr<base::Value>(); |
| 351 } | 351 } |
| 352 | 352 |
| 353 } // namespace policy | 353 } // namespace policy |
| OLD | NEW |