aboutsummaryrefslogtreecommitdiffstats
path: root/android/avd/hw-config.c
diff options
context:
space:
mode:
Diffstat (limited to 'android/avd/hw-config.c')
-rw-r--r--android/avd/hw-config.c78
1 files changed, 73 insertions, 5 deletions
diff --git a/android/avd/hw-config.c b/android/avd/hw-config.c
index b449bb3..65796d9 100644
--- a/android/avd/hw-config.c
+++ b/android/avd/hw-config.c
@@ -11,6 +11,7 @@
*/
#include "android/avd/hw-config.h"
#include "android/utils/ini.h"
+#include "android/utils/system.h"
#include <string.h>
#include <stdlib.h>
@@ -18,6 +19,61 @@
/* 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 )
@@ -27,11 +83,11 @@ androidHwConfig_read( AndroidHwConfig* config,
/* use the magic of macros to implement the hardware configuration loaded */
-#define HWCFG_BOOL(n,s,d,a,t) config->n = iniFile_getBoolean(ini, s, d);
-#define HWCFG_INT(n,s,d,a,t) config->n = iniFile_getInteger(ini, s, d);
-#define HWCFG_STRING(n,s,d,a,t) config->n = iniFile_getString(ini, s, d);
-#define HWCFG_DOUBLE(n,s,d,a,t) config->n = iniFile_getDouble(ini, s, d);
-#define HWCFG_DISKSIZE(n,s,d,a,t) config->n = iniFile_getDiskSize(ini, s, d);
+#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"
@@ -57,3 +113,15 @@ androidHwConfig_write( AndroidHwConfig* config,
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"
+}