 Chromium Code Reviews
 Chromium Code Reviews Issue 1220683008:
  Move AppRestriction to Policy code out of //chrome  (Closed) 
  Base URL: https://chromium.googlesource.com/chromium/src.git@master
    
  
    Issue 1220683008:
  Move AppRestriction to Policy code out of //chrome  (Closed) 
  Base URL: https://chromium.googlesource.com/chromium/src.git@master| Index: components/policy/core/browser/android/policy_converter.cc | 
| diff --git a/components/policy/core/browser/android/policy_converter.cc b/components/policy/core/browser/android/policy_converter.cc | 
| new file mode 100644 | 
| index 0000000000000000000000000000000000000000..73be74ccd62b76dbfbd5600058f7c236357df3de | 
| --- /dev/null | 
| +++ b/components/policy/core/browser/android/policy_converter.cc | 
| @@ -0,0 +1,201 @@ | 
| +// Copyright 2015 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/browser/android/policy_converter.h" | 
| + | 
| +#include <vector> | 
| + | 
| +#include "base/android/jni_android.h" | 
| +#include "base/android/jni_array.h" | 
| +#include "base/android/jni_string.h" | 
| +#include "base/json/json_reader.h" | 
| +#include "base/logging.h" | 
| +#include "base/strings/string16.h" | 
| +#include "base/strings/string_number_conversions.h" | 
| +#include "base/values.h" | 
| +#include "components/policy/core/common/policy_bundle.h" | 
| +#include "components/policy/core/common/policy_map.h" | 
| +#include "components/policy/core/common/policy_namespace.h" | 
| +#include "components/policy/core/common/policy_types.h" | 
| +#include "components/policy/core/common/schema.h" | 
| +#include "jni/PolicyConverter_jni.h" | 
| + | 
| +using base::android::ConvertJavaStringToUTF8; | 
| + | 
| +namespace policy { | 
| +namespace android { | 
| + | 
| +PolicyConverter::PolicyConverter(const Schema* policy_schema) | 
| + : policy_schema_(policy_schema), policy_bundle_(new PolicyBundle) { | 
| + JNIEnv* env = base::android::AttachCurrentThread(); | 
| + java_obj_.Reset(env, Java_PolicyConverter_create( | 
| + env, reinterpret_cast<long>(this)).obj()); | 
| + DCHECK(!java_obj_.is_null()); | 
| +} | 
| + | 
| +PolicyConverter::~PolicyConverter() { | 
| + Java_PolicyConverter_onNativeDestroyed(base::android::AttachCurrentThread(), | 
| + java_obj_.obj()); | 
| +} | 
| + | 
| +scoped_ptr<PolicyBundle> PolicyConverter::GetPolicyBundle() { | 
| + scoped_ptr<PolicyBundle> filled_bundle(policy_bundle_.Pass()); | 
| + policy_bundle_.reset(new PolicyBundle); | 
| + return filled_bundle.Pass(); | 
| +} | 
| + | 
| +base::android::ScopedJavaLocalRef<jobject> PolicyConverter::GetJavaObject() { | 
| + return base::android::ScopedJavaLocalRef<jobject>(java_obj_); | 
| +} | 
| + | 
| +void PolicyConverter::SetPolicyBoolean(JNIEnv* env, | 
| + jobject obj, | 
| + jstring policyKey, | 
| + jboolean value) { | 
| + SetPolicyValue( | 
| + ConvertJavaStringToUTF8(env, policyKey), | 
| + make_scoped_ptr(new base::FundamentalValue(static_cast<bool>(value)))); | 
| +} | 
| + | 
| +void PolicyConverter::SetPolicyInteger(JNIEnv* env, | 
| + jobject obj, | 
| + jstring policyKey, | 
| + jint value) { | 
| + SetPolicyValue( | 
| + ConvertJavaStringToUTF8(env, policyKey), | 
| + make_scoped_ptr(new base::FundamentalValue(static_cast<int>(value)))); | 
| +} | 
| + | 
| +void PolicyConverter::SetPolicyString(JNIEnv* env, | 
| + jobject obj, | 
| + jstring policyKey, | 
| + jstring value) { | 
| + SetPolicyValue(ConvertJavaStringToUTF8(env, policyKey), | 
| + make_scoped_ptr(new base::StringValue( | 
| + ConvertJavaStringToUTF8(env, value)))); | 
| +} | 
| + | 
| +void PolicyConverter::SetPolicyStringArray(JNIEnv* env, | 
| + jobject obj, | 
| + jstring policyKey, | 
| + jobjectArray array) { | 
| + SetPolicyValue(ConvertJavaStringToUTF8(env, policyKey), | 
| + ConvertJavaStringArrayToListValue(env, array).Pass()); | 
| +} | 
| + | 
| +// static | 
| +scoped_ptr<base::ListValue> PolicyConverter::ConvertJavaStringArrayToListValue( | 
| + JNIEnv* env, | 
| + jobjectArray array) { | 
| + if (!array) | 
| + return scoped_ptr<base::ListValue>(); | 
| + | 
| + // GetArrayLength Could return -1 is array is not a valid Java array | 
| 
dgn
2015/07/14 17:15:46
TODO at next patch: s/Could return -1 is array/cou
 | 
| + int length = static_cast<int>(env->GetArrayLength(array)); | 
| + if (length < 0) | 
| + return scoped_ptr<base::ListValue>(); | 
| + | 
| + scoped_ptr<base::ListValue> list_value(new base::ListValue()); | 
| + for (int i = 0; i < length; ++i) { | 
| + jstring str = static_cast<jstring>(env->GetObjectArrayElement(array, i)); | 
| + list_value->AppendString(ConvertJavaStringToUTF8(env, str)); | 
| + } | 
| + | 
| + return list_value.Pass(); | 
| +} | 
| + | 
| +// static | 
| +scoped_ptr<base::Value> PolicyConverter::ConvertValueToSchema( | 
| + scoped_ptr<base::Value> value, | 
| + const Schema& schema) { | 
| + if (!schema.valid()) | 
| + return value.Pass(); | 
| + | 
| + switch (schema.type()) { | 
| + case base::Value::TYPE_NULL: | 
| + return base::Value::CreateNullValue(); | 
| + | 
| + case base::Value::TYPE_BOOLEAN: { | 
| + std::string string_value; | 
| + if (value->GetAsString(&string_value)) { | 
| + if (string_value.compare("true") == 0) | 
| + return make_scoped_ptr(new base::FundamentalValue(true)); | 
| + | 
| + if (string_value.compare("false") == 0) | 
| + return make_scoped_ptr(new base::FundamentalValue(false)); | 
| + | 
| + return value.Pass(); | 
| + } | 
| + int int_value = 0; | 
| + if (value->GetAsInteger(&int_value)) | 
| + return make_scoped_ptr(new base::FundamentalValue(int_value != 0)); | 
| + | 
| + return value.Pass(); | 
| + } | 
| + | 
| + case base::Value::TYPE_INTEGER: { | 
| + std::string string_value; | 
| + if (value->GetAsString(&string_value)) { | 
| + int int_value = 0; | 
| + if (base::StringToInt(string_value, &int_value)) | 
| + return make_scoped_ptr(new base::FundamentalValue(int_value)); | 
| + } | 
| + return value.Pass(); | 
| + } | 
| + | 
| + case base::Value::TYPE_DOUBLE: { | 
| + std::string string_value; | 
| + if (value->GetAsString(&string_value)) { | 
| + double double_value = 0; | 
| + if (base::StringToDouble(string_value, &double_value)) | 
| + return make_scoped_ptr(new base::FundamentalValue(double_value)); | 
| + } | 
| + return value.Pass(); | 
| + } | 
| + | 
| + // String can't be converted from other types. | 
| + case base::Value::TYPE_STRING: { | 
| + return value.Pass(); | 
| + } | 
| + | 
| + // Binary is not a valid schema type. | 
| + case base::Value::TYPE_BINARY: { | 
| + NOTREACHED(); | 
| + return scoped_ptr<base::Value>(); | 
| + } | 
| + | 
| + // Complex types have to be deserialized from JSON. | 
| + case base::Value::TYPE_DICTIONARY: | 
| + case base::Value::TYPE_LIST: { | 
| + std::string string_value; | 
| + if (value->GetAsString(&string_value)) { | 
| + scoped_ptr<base::Value> decoded_value = | 
| + base::JSONReader::Read(string_value); | 
| + if (decoded_value) | 
| + return decoded_value.Pass(); | 
| + } | 
| + return value.Pass(); | 
| + } | 
| + } | 
| + | 
| + NOTREACHED(); | 
| + return scoped_ptr<base::Value>(); | 
| +} | 
| + | 
| +// static | 
| +bool PolicyConverter::Register(JNIEnv* env) { | 
| + return RegisterNativesImpl(env); | 
| +} | 
| + | 
| +void PolicyConverter::SetPolicyValue(const std::string& key, | 
| + scoped_ptr<base::Value> value) { | 
| + const Schema schema = policy_schema_->GetKnownProperty(key); | 
| + const PolicyNamespace ns(POLICY_DOMAIN_CHROME, std::string()); | 
| + policy_bundle_->Get(ns) | 
| + .Set(key, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_MACHINE, | 
| + ConvertValueToSchema(value.Pass(), schema).release(), nullptr); | 
| +} | 
| + | 
| +} // namespace android | 
| +} // namespace policy |