1 /* //device/libs/android_runtime/android_os_SystemProperties.cpp 2 ** 3 ** Copyright 2006, The Android Open Source Project 4 ** 5 ** Licensed under the Apache License, Version 2.0 (the "License"); 6 ** you may not use this file except in compliance with the License. 7 ** You may obtain a copy of the License at 8 ** 9 ** http://www.apache.org/licenses/LICENSE-2.0 10 ** 11 ** Unless required by applicable law or agreed to in writing, software 12 ** distributed under the License is distributed on an "AS IS" BASIS, 13 ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 ** See the License for the specific language governing permissions and 15 ** limitations under the License. 16 */ 17 18 #include "cutils/properties.h" 19 #include "jni.h" 20 #include "android_runtime/AndroidRuntime.h" 21 #include <nativehelper/JNIHelp.h> 22 23 namespace android 24 { 25 26 static jstring SystemProperties_getSS(JNIEnv *env, jobject clazz, 27 jstring keyJ, jstring defJ) 28 { 29 int len; 30 const char* key; 31 char buf[PROPERTY_VALUE_MAX]; 32 jstring rvJ = NULL; 33 34 if (keyJ == NULL) { 35 jniThrowException(env, "java/lang/NullPointerException", 36 "key must not be null."); 37 goto error; 38 } 39 40 key = env->GetStringUTFChars(keyJ, NULL); 41 42 len = property_get(key, buf, ""); 43 if ((len <= 0) && (defJ != NULL)) { 44 rvJ = defJ; 45 } else if (len >= 0) { 46 rvJ = env->NewStringUTF(buf); 47 } else { 48 rvJ = env->NewStringUTF(""); 49 } 50 51 env->ReleaseStringUTFChars(keyJ, key); 52 53 error: 54 return rvJ; 55 } 56 57 static jstring SystemProperties_getS(JNIEnv *env, jobject clazz, 58 jstring keyJ) 59 { 60 return SystemProperties_getSS(env, clazz, keyJ, NULL); 61 } 62 63 static jint SystemProperties_get_int(JNIEnv *env, jobject clazz, 64 jstring keyJ, jint defJ) 65 { 66 int len; 67 const char* key; 68 char buf[PROPERTY_VALUE_MAX]; 69 jint result = defJ; 70 71 if (keyJ == NULL) { 72 jniThrowException(env, "java/lang/NullPointerException", 73 "key must not be null."); 74 goto error; 75 } 76 77 key = env->GetStringUTFChars(keyJ, NULL); 78 79 len = property_get(key, buf, ""); 80 if (len > 0) { 81 jint temp; 82 if (sscanf(buf, "%d", &temp) == 1) 83 result = temp; 84 } 85 86 env->ReleaseStringUTFChars(keyJ, key); 87 88 error: 89 return result; 90 } 91 92 static jlong SystemProperties_get_long(JNIEnv *env, jobject clazz, 93 jstring keyJ, jlong defJ) 94 { 95 int len; 96 const char* key; 97 char buf[PROPERTY_VALUE_MAX]; 98 jlong result = defJ; 99 100 if (keyJ == NULL) { 101 jniThrowException(env, "java/lang/NullPointerException", 102 "key must not be null."); 103 goto error; 104 } 105 106 key = env->GetStringUTFChars(keyJ, NULL); 107 108 len = property_get(key, buf, ""); 109 if (len > 0) { 110 jlong temp; 111 if (sscanf(buf, "%lld", &temp) == 1) 112 result = temp; 113 } 114 115 env->ReleaseStringUTFChars(keyJ, key); 116 117 error: 118 return result; 119 } 120 121 static jboolean SystemProperties_get_boolean(JNIEnv *env, jobject clazz, 122 jstring keyJ, jboolean defJ) 123 { 124 int len; 125 const char* key; 126 char buf[PROPERTY_VALUE_MAX]; 127 jboolean result = defJ; 128 129 if (keyJ == NULL) { 130 jniThrowException(env, "java/lang/NullPointerException", 131 "key must not be null."); 132 goto error; 133 } 134 135 key = env->GetStringUTFChars(keyJ, NULL); 136 137 len = property_get(key, buf, ""); 138 if (len == 1) { 139 char ch = buf[0]; 140 if (ch == '0' || ch == 'n') 141 result = false; 142 else if (ch == '1' || ch == 'y') 143 result = true; 144 } else if (len > 1) { 145 if (!strcmp(buf, "no") || !strcmp(buf, "false") || !strcmp(buf, "off")) { 146 result = false; 147 } else if (!strcmp(buf, "yes") || !strcmp(buf, "true") || !strcmp(buf, "on")) { 148 result = true; 149 } 150 } 151 152 env->ReleaseStringUTFChars(keyJ, key); 153 154 error: 155 return result; 156 } 157 158 static void SystemProperties_set(JNIEnv *env, jobject clazz, 159 jstring keyJ, jstring valJ) 160 { 161 int err; 162 const char* key; 163 const char* val; 164 165 if (keyJ == NULL) { 166 jniThrowException(env, "java/lang/NullPointerException", 167 "key must not be null."); 168 return ; 169 } 170 key = env->GetStringUTFChars(keyJ, NULL); 171 172 if (valJ == NULL) { 173 val = ""; /* NULL pointer not allowed here */ 174 } else { 175 val = env->GetStringUTFChars(valJ, NULL); 176 } 177 178 err = property_set(key, val); 179 180 env->ReleaseStringUTFChars(keyJ, key); 181 182 if (valJ != NULL) { 183 env->ReleaseStringUTFChars(valJ, val); 184 } 185 } 186 187 static JNINativeMethod method_table[] = { 188 { "native_get", "(Ljava/lang/String;)Ljava/lang/String;", 189 (void*) SystemProperties_getS }, 190 { "native_get", "(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;", 191 (void*) SystemProperties_getSS }, 192 { "native_get_int", "(Ljava/lang/String;I)I", 193 (void*) SystemProperties_get_int }, 194 { "native_get_long", "(Ljava/lang/String;J)J", 195 (void*) SystemProperties_get_long }, 196 { "native_get_boolean", "(Ljava/lang/String;Z)Z", 197 (void*) SystemProperties_get_boolean }, 198 { "native_set", "(Ljava/lang/String;Ljava/lang/String;)V", 199 (void*) SystemProperties_set }, 200 }; 201 202 int register_android_os_SystemProperties(JNIEnv *env) 203 { 204 return AndroidRuntime::registerNativeMethods( 205 env, "android/os/SystemProperties", 206 method_table, NELEM(method_table)); 207 } 208 209 }; 210