/* Copyright (C) 2008 The Android Open Source Project ** ** This software is licensed under the terms of the GNU General Public ** License version 2, as published by the Free Software Foundation, and ** may be copied, distributed, and modified under those terms. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. */ #include "android/avd/hw-config.h" #include "android/utils/ini.h" #include "android/utils/system.h" #include #include /* the global variable containing the hardware config for this device */ AndroidHwConfig android_hw[1]; static int stringToBoolean( const char* value ) { if (!strcmp(value,"1") || !strcmp(value,"yes") || !strcmp(value,"YES") || !strcmp(value,"true") || !strcmp(value,"TRUE")) { return 1; } else return 0; } static int64_t diskSizeToInt64( const char* diskSize ) { char* end; int64_t value; value = strtoll(diskSize, &end, 10); if (*end == 'k' || *end == 'K') value *= 1024ULL; else if (*end == 'm' || *end == 'M') value *= 1024*1024ULL; else if (*end == 'g' || *end == 'G') value *= 1024*1024*1024ULL; return value; } void androidHwConfig_init( AndroidHwConfig* config, int apiLevel ) { #define HWCFG_BOOL(n,s,d,a,t) config->n = stringToBoolean(d); #define HWCFG_INT(n,s,d,a,t) config->n = d; #define HWCFG_STRING(n,s,d,a,t) config->n = ASTRDUP(d); #define HWCFG_DOUBLE(n,s,d,a,t) config->n = d; #define HWCFG_DISKSIZE(n,s,d,a,t) config->n = diskSizeToInt64(d); #include "android/avd/hw-config-defs.h" /* Special case for hw.keyboard.lid, we need to set the * default to FALSE for apiLevel >= 12. This allows platform builds * to get correct orientation emulation even if they don't bring * a custom hardware.ini */ if (apiLevel >= 12) { config->hw_keyboard_lid = 0; } } int androidHwConfig_read( AndroidHwConfig* config, IniFile* ini ) { if (ini == NULL) return -1; /* use the magic of macros to implement the hardware configuration loaded */ #define HWCFG_BOOL(n,s,d,a,t) if (iniFile_getValue(ini, s)) { config->n = iniFile_getBoolean(ini, s, d); } #define HWCFG_INT(n,s,d,a,t) if (iniFile_getValue(ini, s)) { config->n = iniFile_getInteger(ini, s, d); } #define HWCFG_STRING(n,s,d,a,t) if (iniFile_getValue(ini, s)) { AFREE(config->n); config->n = iniFile_getString(ini, s, d); } #define HWCFG_DOUBLE(n,s,d,a,t) if (iniFile_getValue(ini, s)) { config->n = iniFile_getDouble(ini, s, d); } #define HWCFG_DISKSIZE(n,s,d,a,t) if (iniFile_getValue(ini, s)) { config->n = iniFile_getDiskSize(ini, s, d); } #include "android/avd/hw-config-defs.h" return 0; } int androidHwConfig_write( AndroidHwConfig* config, IniFile* ini ) { if (ini == NULL) return -1; /* use the magic of macros to implement the hardware configuration loaded */ #define HWCFG_BOOL(n,s,d,a,t) iniFile_setBoolean(ini, s, config->n); #define HWCFG_INT(n,s,d,a,t) iniFile_setInteger(ini, s, config->n); #define HWCFG_STRING(n,s,d,a,t) iniFile_setValue(ini, s, config->n); #define HWCFG_DOUBLE(n,s,d,a,t) iniFile_setDouble(ini, s, config->n); #define HWCFG_DISKSIZE(n,s,d,a,t) iniFile_setDiskSize(ini, s, config->n); #include "android/avd/hw-config-defs.h" return 0; } void androidHwConfig_done( AndroidHwConfig* config ) { #define HWCFG_BOOL(n,s,d,a,t) config->n = 0; #define HWCFG_INT(n,s,d,a,t) config->n = 0; #define HWCFG_STRING(n,s,d,a,t) AFREE(config->n); #define HWCFG_DOUBLE(n,s,d,a,t) config->n = 0.0; #define HWCFG_DISKSIZE(n,s,d,a,t) config->n = 0; #include "android/avd/hw-config-defs.h" } int androidHwConfig_isScreenNoTouch( AndroidHwConfig* config ) { return strcmp(config->hw_screen, "no-touch") == 0; } int androidHwConfig_isScreenTouch( AndroidHwConfig* config ) { return strcmp(config->hw_screen, "touch") == 0; } int androidHwConfig_isScreenMultiTouch( AndroidHwConfig* config ) { return strcmp(config->hw_screen, "multi-touch") == 0; } int androidHwConfig_getKernelDeviceNaming( AndroidHwConfig* config ) { if (!strcmp(config->kernel_newDeviceNaming, "no")) return 0; if (!strcmp(config->kernel_newDeviceNaming, "yes")) return 1; return -1; } int androidHwConfig_getKernelYaffs2Support( AndroidHwConfig* config ) { if (!strcmp(config->kernel_supportsYaffs2, "no")) return 0; if (!strcmp(config->kernel_supportsYaffs2, "yes")) return 1; return -1; } const char* androidHwConfig_getKernelSerialPrefix(AndroidHwConfig* config ) { if (androidHwConfig_getKernelDeviceNaming(config) >= 1) { return "ttyGF"; } else { return "ttyS"; } }