18b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Copyright (C) 2008 The Android Open Source Project 28b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** 38b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** This software is licensed under the terms of the GNU General Public 48b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** License version 2, as published by the Free Software Foundation, and 58b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** may be copied, distributed, and modified under those terms. 68b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** 78b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** This program is distributed in the hope that it will be useful, 88b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** but WITHOUT ANY WARRANTY; without even the implied warranty of 98b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** GNU General Public License for more details. 118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project*/ 128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/avd/hw-config.h" 138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/utils/ini.h" 14b64325d15d9e767c652491414c95f4fc148b0211David 'Digit' Turner#include "android/utils/system.h" 158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <string.h> 168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <stdlib.h> 178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* the global variable containing the hardware config for this device */ 208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source ProjectAndroidHwConfig android_hw[1]; 218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 22b64325d15d9e767c652491414c95f4fc148b0211David 'Digit' Turnerstatic int 23b64325d15d9e767c652491414c95f4fc148b0211David 'Digit' TurnerstringToBoolean( const char* value ) 24b64325d15d9e767c652491414c95f4fc148b0211David 'Digit' Turner{ 25b64325d15d9e767c652491414c95f4fc148b0211David 'Digit' Turner if (!strcmp(value,"1") || 26b64325d15d9e767c652491414c95f4fc148b0211David 'Digit' Turner !strcmp(value,"yes") || 27b64325d15d9e767c652491414c95f4fc148b0211David 'Digit' Turner !strcmp(value,"YES") || 28b64325d15d9e767c652491414c95f4fc148b0211David 'Digit' Turner !strcmp(value,"true") || 29b64325d15d9e767c652491414c95f4fc148b0211David 'Digit' Turner !strcmp(value,"TRUE")) 30b64325d15d9e767c652491414c95f4fc148b0211David 'Digit' Turner { 31b64325d15d9e767c652491414c95f4fc148b0211David 'Digit' Turner return 1; 32b64325d15d9e767c652491414c95f4fc148b0211David 'Digit' Turner } 33b64325d15d9e767c652491414c95f4fc148b0211David 'Digit' Turner else 34b64325d15d9e767c652491414c95f4fc148b0211David 'Digit' Turner return 0; 35b64325d15d9e767c652491414c95f4fc148b0211David 'Digit' Turner} 36b64325d15d9e767c652491414c95f4fc148b0211David 'Digit' Turner 37b64325d15d9e767c652491414c95f4fc148b0211David 'Digit' Turnerstatic int64_t 38b64325d15d9e767c652491414c95f4fc148b0211David 'Digit' TurnerdiskSizeToInt64( const char* diskSize ) 39b64325d15d9e767c652491414c95f4fc148b0211David 'Digit' Turner{ 40b64325d15d9e767c652491414c95f4fc148b0211David 'Digit' Turner char* end; 41b64325d15d9e767c652491414c95f4fc148b0211David 'Digit' Turner int64_t value; 42b64325d15d9e767c652491414c95f4fc148b0211David 'Digit' Turner 43b64325d15d9e767c652491414c95f4fc148b0211David 'Digit' Turner value = strtoll(diskSize, &end, 10); 44b64325d15d9e767c652491414c95f4fc148b0211David 'Digit' Turner if (*end == 'k' || *end == 'K') 45b64325d15d9e767c652491414c95f4fc148b0211David 'Digit' Turner value *= 1024ULL; 46b64325d15d9e767c652491414c95f4fc148b0211David 'Digit' Turner else if (*end == 'm' || *end == 'M') 47b64325d15d9e767c652491414c95f4fc148b0211David 'Digit' Turner value *= 1024*1024ULL; 48b64325d15d9e767c652491414c95f4fc148b0211David 'Digit' Turner else if (*end == 'g' || *end == 'G') 49b64325d15d9e767c652491414c95f4fc148b0211David 'Digit' Turner value *= 1024*1024*1024ULL; 50b64325d15d9e767c652491414c95f4fc148b0211David 'Digit' Turner 51b64325d15d9e767c652491414c95f4fc148b0211David 'Digit' Turner return value; 52b64325d15d9e767c652491414c95f4fc148b0211David 'Digit' Turner} 53b64325d15d9e767c652491414c95f4fc148b0211David 'Digit' Turner 54b64325d15d9e767c652491414c95f4fc148b0211David 'Digit' Turner 55b64325d15d9e767c652491414c95f4fc148b0211David 'Digit' Turnervoid 56b64325d15d9e767c652491414c95f4fc148b0211David 'Digit' TurnerandroidHwConfig_init( AndroidHwConfig* config, 57b64325d15d9e767c652491414c95f4fc148b0211David 'Digit' Turner int apiLevel ) 58b64325d15d9e767c652491414c95f4fc148b0211David 'Digit' Turner{ 59b64325d15d9e767c652491414c95f4fc148b0211David 'Digit' Turner#define HWCFG_BOOL(n,s,d,a,t) config->n = stringToBoolean(d); 60b64325d15d9e767c652491414c95f4fc148b0211David 'Digit' Turner#define HWCFG_INT(n,s,d,a,t) config->n = d; 61b64325d15d9e767c652491414c95f4fc148b0211David 'Digit' Turner#define HWCFG_STRING(n,s,d,a,t) config->n = ASTRDUP(d); 62b64325d15d9e767c652491414c95f4fc148b0211David 'Digit' Turner#define HWCFG_DOUBLE(n,s,d,a,t) config->n = d; 63b64325d15d9e767c652491414c95f4fc148b0211David 'Digit' Turner#define HWCFG_DISKSIZE(n,s,d,a,t) config->n = diskSizeToInt64(d); 64b64325d15d9e767c652491414c95f4fc148b0211David 'Digit' Turner 65b64325d15d9e767c652491414c95f4fc148b0211David 'Digit' Turner#include "android/avd/hw-config-defs.h" 66b64325d15d9e767c652491414c95f4fc148b0211David 'Digit' Turner 67b64325d15d9e767c652491414c95f4fc148b0211David 'Digit' Turner /* Special case for hw.keyboard.lid, we need to set the 68b64325d15d9e767c652491414c95f4fc148b0211David 'Digit' Turner * default to FALSE for apiLevel >= 12. This allows platform builds 69b64325d15d9e767c652491414c95f4fc148b0211David 'Digit' Turner * to get correct orientation emulation even if they don't bring 70b64325d15d9e767c652491414c95f4fc148b0211David 'Digit' Turner * a custom hardware.ini 71b64325d15d9e767c652491414c95f4fc148b0211David 'Digit' Turner */ 72b64325d15d9e767c652491414c95f4fc148b0211David 'Digit' Turner if (apiLevel >= 12) { 73b64325d15d9e767c652491414c95f4fc148b0211David 'Digit' Turner config->hw_keyboard_lid = 0; 74b64325d15d9e767c652491414c95f4fc148b0211David 'Digit' Turner } 75b64325d15d9e767c652491414c95f4fc148b0211David 'Digit' Turner} 76b64325d15d9e767c652491414c95f4fc148b0211David 'Digit' Turner 778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint 788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source ProjectandroidHwConfig_read( AndroidHwConfig* config, 798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project IniFile* ini ) 808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (ini == NULL) 828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* use the magic of macros to implement the hardware configuration loaded */ 858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 86b64325d15d9e767c652491414c95f4fc148b0211David 'Digit' Turner#define HWCFG_BOOL(n,s,d,a,t) if (iniFile_getValue(ini, s)) { config->n = iniFile_getBoolean(ini, s, d); } 87b64325d15d9e767c652491414c95f4fc148b0211David 'Digit' Turner#define HWCFG_INT(n,s,d,a,t) if (iniFile_getValue(ini, s)) { config->n = iniFile_getInteger(ini, s, d); } 88b64325d15d9e767c652491414c95f4fc148b0211David 'Digit' Turner#define HWCFG_STRING(n,s,d,a,t) if (iniFile_getValue(ini, s)) { AFREE(config->n); config->n = iniFile_getString(ini, s, d); } 89b64325d15d9e767c652491414c95f4fc148b0211David 'Digit' Turner#define HWCFG_DOUBLE(n,s,d,a,t) if (iniFile_getValue(ini, s)) { config->n = iniFile_getDouble(ini, s, d); } 90b64325d15d9e767c652491414c95f4fc148b0211David 'Digit' Turner#define HWCFG_DISKSIZE(n,s,d,a,t) if (iniFile_getValue(ini, s)) { config->n = iniFile_getDiskSize(ini, s, d); } 918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/avd/hw-config-defs.h" 938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 96622f1530c8a6badfbcaf8c59976348678fbe248bDavid 'Digit' Turner 97622f1530c8a6badfbcaf8c59976348678fbe248bDavid 'Digit' Turnerint 98622f1530c8a6badfbcaf8c59976348678fbe248bDavid 'Digit' TurnerandroidHwConfig_write( AndroidHwConfig* config, 99622f1530c8a6badfbcaf8c59976348678fbe248bDavid 'Digit' Turner IniFile* ini ) 100622f1530c8a6badfbcaf8c59976348678fbe248bDavid 'Digit' Turner{ 101622f1530c8a6badfbcaf8c59976348678fbe248bDavid 'Digit' Turner if (ini == NULL) 102622f1530c8a6badfbcaf8c59976348678fbe248bDavid 'Digit' Turner return -1; 103622f1530c8a6badfbcaf8c59976348678fbe248bDavid 'Digit' Turner 104622f1530c8a6badfbcaf8c59976348678fbe248bDavid 'Digit' Turner /* use the magic of macros to implement the hardware configuration loaded */ 105622f1530c8a6badfbcaf8c59976348678fbe248bDavid 'Digit' Turner 106622f1530c8a6badfbcaf8c59976348678fbe248bDavid 'Digit' Turner#define HWCFG_BOOL(n,s,d,a,t) iniFile_setBoolean(ini, s, config->n); 107622f1530c8a6badfbcaf8c59976348678fbe248bDavid 'Digit' Turner#define HWCFG_INT(n,s,d,a,t) iniFile_setInteger(ini, s, config->n); 108622f1530c8a6badfbcaf8c59976348678fbe248bDavid 'Digit' Turner#define HWCFG_STRING(n,s,d,a,t) iniFile_setValue(ini, s, config->n); 109622f1530c8a6badfbcaf8c59976348678fbe248bDavid 'Digit' Turner#define HWCFG_DOUBLE(n,s,d,a,t) iniFile_setDouble(ini, s, config->n); 110622f1530c8a6badfbcaf8c59976348678fbe248bDavid 'Digit' Turner#define HWCFG_DISKSIZE(n,s,d,a,t) iniFile_setDiskSize(ini, s, config->n); 111622f1530c8a6badfbcaf8c59976348678fbe248bDavid 'Digit' Turner 112622f1530c8a6badfbcaf8c59976348678fbe248bDavid 'Digit' Turner#include "android/avd/hw-config-defs.h" 113622f1530c8a6badfbcaf8c59976348678fbe248bDavid 'Digit' Turner 114622f1530c8a6badfbcaf8c59976348678fbe248bDavid 'Digit' Turner return 0; 115622f1530c8a6badfbcaf8c59976348678fbe248bDavid 'Digit' Turner} 116b64325d15d9e767c652491414c95f4fc148b0211David 'Digit' Turner 117b64325d15d9e767c652491414c95f4fc148b0211David 'Digit' Turnervoid 118b64325d15d9e767c652491414c95f4fc148b0211David 'Digit' TurnerandroidHwConfig_done( AndroidHwConfig* config ) 119b64325d15d9e767c652491414c95f4fc148b0211David 'Digit' Turner{ 120b64325d15d9e767c652491414c95f4fc148b0211David 'Digit' Turner#define HWCFG_BOOL(n,s,d,a,t) config->n = 0; 121b64325d15d9e767c652491414c95f4fc148b0211David 'Digit' Turner#define HWCFG_INT(n,s,d,a,t) config->n = 0; 122b64325d15d9e767c652491414c95f4fc148b0211David 'Digit' Turner#define HWCFG_STRING(n,s,d,a,t) AFREE(config->n); 123b64325d15d9e767c652491414c95f4fc148b0211David 'Digit' Turner#define HWCFG_DOUBLE(n,s,d,a,t) config->n = 0.0; 124b64325d15d9e767c652491414c95f4fc148b0211David 'Digit' Turner#define HWCFG_DISKSIZE(n,s,d,a,t) config->n = 0; 125b64325d15d9e767c652491414c95f4fc148b0211David 'Digit' Turner 126b64325d15d9e767c652491414c95f4fc148b0211David 'Digit' Turner#include "android/avd/hw-config-defs.h" 127b64325d15d9e767c652491414c95f4fc148b0211David 'Digit' Turner} 128863d1010d9c8fa4342b1b0ea860bcfb096806accVladimir Chtchetkine 129863d1010d9c8fa4342b1b0ea860bcfb096806accVladimir Chtchetkineint 130863d1010d9c8fa4342b1b0ea860bcfb096806accVladimir ChtchetkineandroidHwConfig_isScreenNoTouch( AndroidHwConfig* config ) 131863d1010d9c8fa4342b1b0ea860bcfb096806accVladimir Chtchetkine{ 132863d1010d9c8fa4342b1b0ea860bcfb096806accVladimir Chtchetkine return strcmp(config->hw_screen, "no-touch") == 0; 133863d1010d9c8fa4342b1b0ea860bcfb096806accVladimir Chtchetkine} 134863d1010d9c8fa4342b1b0ea860bcfb096806accVladimir Chtchetkine 135863d1010d9c8fa4342b1b0ea860bcfb096806accVladimir Chtchetkineint 136863d1010d9c8fa4342b1b0ea860bcfb096806accVladimir ChtchetkineandroidHwConfig_isScreenTouch( AndroidHwConfig* config ) 137863d1010d9c8fa4342b1b0ea860bcfb096806accVladimir Chtchetkine{ 138863d1010d9c8fa4342b1b0ea860bcfb096806accVladimir Chtchetkine return strcmp(config->hw_screen, "touch") == 0; 139863d1010d9c8fa4342b1b0ea860bcfb096806accVladimir Chtchetkine} 140863d1010d9c8fa4342b1b0ea860bcfb096806accVladimir Chtchetkine 141863d1010d9c8fa4342b1b0ea860bcfb096806accVladimir Chtchetkineint 142863d1010d9c8fa4342b1b0ea860bcfb096806accVladimir ChtchetkineandroidHwConfig_isScreenMultiTouch( AndroidHwConfig* config ) 143863d1010d9c8fa4342b1b0ea860bcfb096806accVladimir Chtchetkine{ 144863d1010d9c8fa4342b1b0ea860bcfb096806accVladimir Chtchetkine return strcmp(config->hw_screen, "multi-touch") == 0; 145863d1010d9c8fa4342b1b0ea860bcfb096806accVladimir Chtchetkine} 146