Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(269)

Unified Diff: components/policy/core/common/mac_util.cc

Issue 179813008: Move PolicyLoaderMac::CreateValueFromProperty to a generic file. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: POLICY_EXPORT Created 6 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: components/policy/core/common/mac_util.cc
diff --git a/components/policy/core/common/mac_util.cc b/components/policy/core/common/mac_util.cc
new file mode 100644
index 0000000000000000000000000000000000000000..2b29a77dc7ded19b584c033ed8c7b6907a591efd
--- /dev/null
+++ b/components/policy/core/common/mac_util.cc
@@ -0,0 +1,96 @@
+// Copyright (c) 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/policy/core/common/mac_util.h"
+
+#include <string>
+
+#include "base/mac/foundation_util.h"
+#include "base/strings/sys_string_conversions.h"
+#include "base/values.h"
+
+using base::mac::CFCast;
+
+namespace policy {
+
+namespace {
+
+// Callback function for CFDictionaryApplyFunction. |key| and |value| are an
+// entry of the CFDictionary that should be converted into an equivalent entry
+// in the DictionaryValue in |context|.
+void DictionaryEntryToValue(const void* key, const void* value, void* context) {
+ if (CFStringRef cf_key = CFCast<CFStringRef>(key)) {
+ scoped_ptr<base::Value> converted =
+ PropertyToValue(static_cast<CFPropertyListRef>(value));
+ if (converted) {
+ const std::string string = base::SysCFStringRefToUTF8(cf_key);
+ static_cast<base::DictionaryValue*>(context)->Set(
+ string, converted.release());
+ }
+ }
+}
+
+// Callback function for CFArrayApplyFunction. |value| is an entry of the
+// CFArray that should be converted into an equivalent entry in the ListValue
+// in |context|.
+void ArrayEntryToValue(const void* value, void* context) {
+ scoped_ptr<base::Value> converted =
+ PropertyToValue(static_cast<CFPropertyListRef>(value));
+ if (converted)
+ static_cast<base::ListValue *>(context)->Append(converted.release());
+}
+
+} // namespace
+
+scoped_ptr<base::Value> PropertyToValue(CFPropertyListRef property) {
+ if (CFCast<CFNullRef>(property))
+ return scoped_ptr<base::Value>(base::Value::CreateNullValue());
+
+ if (CFBooleanRef boolean = CFCast<CFBooleanRef>(property)) {
+ return scoped_ptr<base::Value>(
+ base::Value::CreateBooleanValue(CFBooleanGetValue(boolean)));
+ }
+
+ if (CFNumberRef number = CFCast<CFNumberRef>(property)) {
+ // CFNumberGetValue() converts values implicitly when the conversion is not
+ // lossy. Check the type before trying to convert.
+ if (CFNumberIsFloatType(number)) {
+ double double_value = 0.0;
+ if (CFNumberGetValue(number, kCFNumberDoubleType, &double_value)) {
+ return scoped_ptr<base::Value>(
+ base::Value::CreateDoubleValue(double_value));
+ }
+ } else {
+ int int_value = 0;
+ if (CFNumberGetValue(number, kCFNumberIntType, &int_value)) {
+ return scoped_ptr<base::Value>(
+ base::Value::CreateIntegerValue(int_value));
+ }
+ }
+ }
+
+ if (CFStringRef string = CFCast<CFStringRef>(property)) {
+ return scoped_ptr<base::Value>(
+ base::Value::CreateStringValue(base::SysCFStringRefToUTF8(string)));
+ }
+
+ if (CFDictionaryRef dict = CFCast<CFDictionaryRef>(property)) {
+ scoped_ptr<base::DictionaryValue> dict_value(new base::DictionaryValue());
+ CFDictionaryApplyFunction(dict, DictionaryEntryToValue, dict_value.get());
+ return dict_value.PassAs<base::Value>();
+ }
+
+ if (CFArrayRef array = CFCast<CFArrayRef>(property)) {
+ scoped_ptr<base::ListValue> list_value(new base::ListValue());
+ CFArrayApplyFunction(array,
+ CFRangeMake(0, CFArrayGetCount(array)),
+ ArrayEntryToValue,
+ list_value.get());
+ return list_value.PassAs<base::Value>();
+ }
+
+ return scoped_ptr<base::Value>();
+}
+
+} // namespace policy

Powered by Google App Engine
This is Rietveld 408576698