blob: 2d50ef714b48b7f8e1f24b01bb1e07232987e8fc [file] [log] [blame]
/* 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 <string.h>
#include <stdlib.h>
/* 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;
}