2 * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the License);
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an AS IS BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
23 #include <sys/types.h>
30 #include <system_info.h>
31 #include <system_info_private.h>
34 #include <GLES/glext.h>
40 #define LOG_TAG "CAPI_SYSTEM_INFO"
42 #define LIB_GLES_V1 "/usr/lib/libGLESv1_CM.so"
43 #define LIB_GLES_V2 "/usr/lib/libGLESv2.so"
45 #define SIZE_OF_MODEL_NAME 8
47 int system_info_get_model(system_info_key_e key, system_info_data_type_e data_type, void **value)
52 char tmpStr[MAXBUFSIZE];
55 extern char *strcasestr(const char *s, const char *find);
57 info = fopen(INFO_FILE_PATH, "r");
59 LOGE("cannot file open %s file!!!", INFO_FILE_PATH);
60 return SYSTEM_INFO_ERROR_IO_ERROR;
62 while (fgets(str, MAXBUFSIZE, info)) {
63 if (strcasestr(str, "Model")) {
64 name = strchr(str, '=');
66 tmpStrlen = strlen(name);
68 strncpy(tmpStr, name, tmpStrlen-2);
69 tmpStr[tmpStrlen-2] = '\0';
71 MODEL = strdup(tmpStr);
73 LOGE("OUT_OF_MEMORY(0x%08x)", SYSTEM_INFO_ERROR_OUT_OF_MEMORY);
75 return SYSTEM_INFO_ERROR_OUT_OF_MEMORY;
84 return SYSTEM_INFO_ERROR_NONE;
87 int system_info_get_tizen_version(system_info_key_e key, system_info_data_type_e data_type, void **value)
89 char *TIZEN_VERSION = NULL;
92 char tmpStr[MAXBUFSIZE];
95 extern char *strcasestr(const char *s, const char *find);
97 info = fopen(OS_RELEASE_FILE_PATH, "r");
99 LOGE("cannot file open %s file!!!", OS_RELEASE_FILE_PATH);
100 return SYSTEM_INFO_ERROR_IO_ERROR;
102 while (fgets(str, MAXBUFSIZE, info)) {
103 if (strcasestr(str, "VERSION_ID")) {
104 name = strchr(str, '=');
106 tmpStrlen = strlen(name);
108 strncpy(tmpStr, name, tmpStrlen-2);
109 tmpStr[tmpStrlen-2] = '\0';
111 TIZEN_VERSION = strdup(tmpStr);
112 if (TIZEN_VERSION == NULL) {
113 LOGE("OUT_OF_MEMORY(0x%08x)", SYSTEM_INFO_ERROR_OUT_OF_MEMORY);
115 return SYSTEM_INFO_ERROR_OUT_OF_MEMORY;
122 *value = TIZEN_VERSION;
124 return SYSTEM_INFO_ERROR_NONE;
127 int system_info_get_platform_name(system_info_key_e key, system_info_data_type_e data_type, void **value)
129 char *PLATFORM_NAME = NULL;
131 char str[MAXBUFSIZE];
132 char tmpStr[MAXBUFSIZE];
136 extern char *strcasestr(const char *s, const char *find);
138 info = fopen(OS_RELEASE_FILE_PATH, "r");
140 LOGE("cannot file open %s file!!!", OS_RELEASE_FILE_PATH);
141 return SYSTEM_INFO_ERROR_IO_ERROR;
143 while (fgets(str, MAXBUFSIZE, info)) {
144 if (strcasestr(str, "NAME")) {
145 name = strchr(str, '=');
147 tmpStrlen = strlen(name);
149 strncpy(tmpStr, name, tmpStrlen-2);
150 tmpStr[tmpStrlen-2] = '\0';
152 tmpStrlen = strlen(tmpStr);
154 for (i = 0; i < tmpStrlen; i++)
155 tmpStr[i] = (char)toupper((int)tmpStr[i]);
157 PLATFORM_NAME = strdup(tmpStr);
158 if (PLATFORM_NAME == NULL) {
159 LOGE("OUT_OF_MEMORY(0x%08x)", SYSTEM_INFO_ERROR_OUT_OF_MEMORY);
161 return SYSTEM_INFO_ERROR_OUT_OF_MEMORY;
168 *value = PLATFORM_NAME;
170 return SYSTEM_INFO_ERROR_NONE;
173 int system_info_get_tizen_version_name(system_info_key_e key, system_info_data_type_e data_type, void **value)
175 char *TIZEN_VERSION_NAME = NULL;
177 char str[MAXBUFSIZE];
178 char tmpStr[MAXBUFSIZE];
181 extern char *strcasestr(const char *s, const char *find);
183 info = fopen(OS_RELEASE_FILE_PATH, "r");
185 LOGE("cannot file open %s file!!!", OS_RELEASE_FILE_PATH);
186 return SYSTEM_INFO_ERROR_IO_ERROR;
188 while (fgets(str, MAXBUFSIZE, info)) {
189 if (strcasestr(str, "VERSION")) {
190 name = strchr(str, ',');
192 tmpStrlen = strlen(name);
194 strncpy(tmpStr, name, tmpStrlen-2);
195 tmpStr[tmpStrlen-2] = '\0';
197 TIZEN_VERSION_NAME = strdup(tmpStr);
198 if (TIZEN_VERSION_NAME == NULL) {
199 LOGE("OUT_OF_MEMORY(0x%08x)", SYSTEM_INFO_ERROR_OUT_OF_MEMORY);
201 return SYSTEM_INFO_ERROR_OUT_OF_MEMORY;
208 *value = TIZEN_VERSION_NAME;
210 return SYSTEM_INFO_ERROR_NONE;
213 int system_info_get_opengles_version(system_info_key_e key, system_info_data_type_e data_type, void **value)
216 char *OPENGLES_VERSION = NULL;
217 int version_supported = 0;
219 if (!access(LIB_GLES_V1, R_OK))
220 version_supported += 1;
222 if (!access(LIB_GLES_V2, R_OK))
223 version_supported += 2;
225 switch (version_supported) {
242 if (version != NULL) {
243 OPENGLES_VERSION = strdup(version);
245 if (OPENGLES_VERSION == NULL) {
246 LOGE("OUT_OF_MEMORY(0x%08x)", SYSTEM_INFO_ERROR_OUT_OF_MEMORY);
247 return SYSTEM_INFO_ERROR_OUT_OF_MEMORY;
251 *value = OPENGLES_VERSION;
253 return SYSTEM_INFO_ERROR_NONE;
256 int system_info_get_core_cpu_arch(system_info_key_e key, system_info_data_type_e data_type, void **value)
258 FILE *cpuinfo = NULL;
259 char *CORE_CPU_ARCH = NULL;
261 char str[MAXBUFSIZE] = "";
262 char tmpStr[MAXBUFSIZE] = "";
264 cpuinfo = fopen(CPU_INFO_FILE_PATH, "r");
265 if (NULL == cpuinfo) {
266 LOGE("cannot file open %s file!!!", CPU_INFO_FILE_PATH);
267 return SYSTEM_INFO_ERROR_IO_ERROR;
269 while (fgets(str, MAXBUFSIZE, cpuinfo)) {
270 if (!strncmp("Processor", str, strlen("Processor"))) {
271 name = strchr(str, ':');
272 if (!(strncmp("ARMv7", name+2, strlen("ARMv7")))) {
273 strncpy(tmpStr, name+2, strlen("ARMv7"));
274 tmpStr[strlen("ARMv7")] = '\0';
275 } else if (!(strncmp("ARMv6", name+2, strlen("ARMv6")))) {
276 strncpy(tmpStr, name+2, strlen("ARMv6"));
277 tmpStr[strlen("ARMv6")] = '\0';
278 } else if (!(strncmp("x86", name+2, strlen("x86")))) {
279 strncpy(tmpStr, name+2, strlen("x86"));
280 tmpStr[strlen("x86")] = '\0';
286 /* x86 emulator doesn't have "Processor" field in /proc/cpuinfo */
287 if (strlen(tmpStr) == 0 && system_info_get_system_info_model_type() == SYSTEM_INFO_MODEL_TYPE_EMULATOR) {
288 strncpy(tmpStr, "x86", strlen("x86"));
289 tmpStr[strlen("x86")] = '\0';
290 } else if (strlen(tmpStr) == 0) {
291 strncpy(tmpStr, "Unkown", strlen("Unkown"));
292 tmpStr[strlen("Unkown")] = '\0';
295 CORE_CPU_ARCH = strdup(tmpStr);
297 if (CORE_CPU_ARCH == NULL) {
298 LOGE("OUT_OF_MEMORY(0x%08x)", SYSTEM_INFO_ERROR_OUT_OF_MEMORY);
300 return SYSTEM_INFO_ERROR_OUT_OF_MEMORY;
305 *value = CORE_CPU_ARCH;
307 return SYSTEM_INFO_ERROR_NONE;
310 int system_info_get_core_fpu_arch(system_info_key_e key, system_info_data_type_e data_type, void **value)
312 FILE *cpuinfo = NULL;
313 char *CORE_FPU_ARCH = NULL;
315 char str[MAXBUFSIZE] = "";
316 char tmpStr[MAXBUFSIZE] = "";
318 cpuinfo = fopen(CPU_INFO_FILE_PATH, "r");
319 if (NULL == cpuinfo) {
320 LOGE("cannot file open %s file!!!", CPU_INFO_FILE_PATH);
321 return SYSTEM_INFO_ERROR_IO_ERROR;
323 /* The target and the emulator uses the field "Features" and "flags" in /proc/cpuinfo */
324 if (system_info_get_system_info_model_type() != SYSTEM_INFO_MODEL_TYPE_EMULATOR)
325 snprintf(tmpStr, strlen("Features"), "Features");
327 snprintf(tmpStr, strlen("flags"), "flags");
329 while (fgets(str, MAXBUFSIZE, cpuinfo)) {
330 if (!strncmp(tmpStr, str, strlen(tmpStr))) {
331 name = strchr(str, ':');
332 if (strstr(name+2, "vfpv3"))
333 CORE_FPU_ARCH = strdup("vfpv3");
334 else if (strstr(name+2, "vfpv2"))
335 CORE_FPU_ARCH = strdup("vfpv2");
336 else if (strstr(name+2, "ssse3"))
337 CORE_FPU_ARCH = strdup("ssse3");
338 else if (strstr(name+2, "sse3"))
339 CORE_FPU_ARCH = strdup("sse3");
340 else if (strstr(name+2, "sse2"))
341 CORE_FPU_ARCH = strdup("sse2");
342 else if (strstr(name+2, "sse"))
343 CORE_FPU_ARCH = strdup("sse");
345 CORE_FPU_ARCH = strdup("Unkown");
347 if (CORE_FPU_ARCH == NULL) {
348 LOGE("OUT_OF_MEMORY(0x%08x)", SYSTEM_INFO_ERROR_OUT_OF_MEMORY);
350 return SYSTEM_INFO_ERROR_OUT_OF_MEMORY;
360 *value = CORE_FPU_ARCH;
362 return SYSTEM_INFO_ERROR_NONE;
365 int system_info_get_core_cpu_freq(system_info_key_e key, system_info_data_type_e data_type, void **value)
368 FILE *cpuinfo, *cpuinfo_max_freq;
369 double max_freq = 0.0;
371 char str[MAXBUFSIZE];
373 if (system_info_get_system_info_model_type() != SYSTEM_INFO_MODEL_TYPE_EMULATOR) {
374 cpuinfo_max_freq = fopen(CPU_INFO_MAX_FREQ_PATH, "r");
375 if (NULL == cpuinfo_max_freq) {
376 LOGE("cannot file open %s file!!!", CPU_INFO_MAX_FREQ_PATH);
377 return SYSTEM_INFO_ERROR_IO_ERROR;
379 if (fscanf(cpuinfo_max_freq, "%lf", &max_freq) < 1) {
380 fclose(cpuinfo_max_freq);
381 return SYSTEM_INFO_ERROR_IO_ERROR;
383 max_freq = max_freq / 1024;
385 fclose(cpuinfo_max_freq);
388 cpuinfo = fopen(CPU_INFO_FILE_PATH, "r");
389 if (NULL == cpuinfo) {
390 LOGE("cannot file open %s file!!!", CPU_INFO_FILE_PATH);
391 return SYSTEM_INFO_ERROR_IO_ERROR;
393 while (fgets(str, MAXBUFSIZE, cpuinfo)) {
394 if (!strncmp("cpu MHz", str, strlen("cpu MHz"))) {
395 name = strchr(str, ':');
396 max_freq = atof(name+2);
404 count = (double *)value;
408 return SYSTEM_INFO_ERROR_NONE;
412 int system_info_get_opengles_texture_format(system_info_key_e key, system_info_data_type_e data_type, void **value)
414 char *OPENGLES_TEXTURE_FORMAT;
415 char textureformat[MAXBUFSIZE];
417 textureformat[0] = '\0';
419 if (!access(LIB_GLES_V2, R_OK)) {
420 strcat(textureformat, "utc ");
422 if (GL_OES_compressed_paletted_texture) {
423 strcat(textureformat, "| ptc ");
425 if (GL_OES_compressed_ETC1_RGB8_texture) {
426 strcat(textureformat, "| etc ");
428 if (GL_AMD_compressed_3DC_texture) {
429 strcat(textureformat, "| 3dc ");
431 if (GL_AMD_compressed_ATC_texture) {
432 strcat(textureformat, "| atc ");
434 if (GL_IMG_texture_compression_pvrtc) {
435 strcat(textureformat, "| pvrtc");
438 OPENGLES_TEXTURE_FORMAT = strdup(textureformat);
440 if (OPENGLES_TEXTURE_FORMAT == NULL) {
441 LOGE("OUT_OF_MEMORY(0x%08x)", SYSTEM_INFO_ERROR_OUT_OF_MEMORY);
442 return SYSTEM_INFO_ERROR_OUT_OF_MEMORY;
445 *value = OPENGLES_TEXTURE_FORMAT;
447 return SYSTEM_INFO_ERROR_NONE;
450 int system_info_get_build_string(system_info_key_e key, system_info_data_type_e data_type, void **value)
452 char *BUILD_STRING = NULL;
454 char str[MAXBUFSIZE];
455 char tmpStr[MAXBUFSIZE];
458 info = fopen(INFO_FILE_PATH, "r");
460 LOGE("cannot file open %s file!!!", INFO_FILE_PATH);
461 return SYSTEM_INFO_ERROR_IO_ERROR;
463 while (fgets(str, MAXBUFSIZE, info)) {
464 if (!strncmp("Build", str, strlen("Build"))) {
465 name = strchr(str, '=');
467 strncpy(tmpStr, name, strlen(name)-2);
468 tmpStr[strlen(name)-2] = '\0';
470 BUILD_STRING = strdup(tmpStr);
471 if (BUILD_STRING == NULL) {
472 LOGE("OUT_OF_MEMORY(0x%08x)", SYSTEM_INFO_ERROR_OUT_OF_MEMORY);
474 return SYSTEM_INFO_ERROR_OUT_OF_MEMORY;
481 *value = BUILD_STRING;
483 return SYSTEM_INFO_ERROR_NONE;
486 int system_info_get_build_date(system_info_key_e key, system_info_data_type_e data_type, void **value)
488 char *BUILD_DATE = NULL;
490 char str[MAXBUFSIZE];
491 char tmpStr[MAXBUFSIZE];
494 info = fopen(INFO_FILE_PATH, "r");
496 LOGE("cannot file open %s file!!!", INFO_FILE_PATH);
497 return SYSTEM_INFO_ERROR_IO_ERROR;
499 while (fgets(str, MAXBUFSIZE, info)) {
500 if (!strncmp("Date", str, strlen("Date"))) {
501 name = strchr(str, '=');
503 strncpy(tmpStr, name, strlen(name)-2);
504 tmpStr[strlen(name)-2] = '\0';
506 BUILD_DATE = strdup(tmpStr);
507 if (BUILD_DATE == NULL) {
508 LOGE("OUT_OF_MEMORY(0x%08x)", SYSTEM_INFO_ERROR_OUT_OF_MEMORY);
510 return SYSTEM_INFO_ERROR_OUT_OF_MEMORY;
519 return SYSTEM_INFO_ERROR_NONE;
522 int system_info_get_build_time(system_info_key_e key, system_info_data_type_e data_type, void **value)
524 char *BUILD_TIME = NULL;
526 char str[MAXBUFSIZE];
527 char tmpStr[MAXBUFSIZE];
530 info = fopen(INFO_FILE_PATH, "r");
532 LOGE("cannot file open %s file!!!", INFO_FILE_PATH);
533 return SYSTEM_INFO_ERROR_IO_ERROR;
535 while (fgets(str, MAXBUFSIZE, info)) {
536 if (!strncmp("Time", str, strlen("Time"))) {
537 name = strchr(str, '=');
539 strncpy(tmpStr, name, strlen(name)-2);
540 tmpStr[strlen(name)-2] = '\0';
542 BUILD_TIME = strdup(tmpStr);
543 if (BUILD_TIME == NULL) {
544 LOGE("OUT_OF_MEMORY(0x%08x)", SYSTEM_INFO_ERROR_OUT_OF_MEMORY);
546 return SYSTEM_INFO_ERROR_OUT_OF_MEMORY;
555 return SYSTEM_INFO_ERROR_NONE;