[Libosinfo] [PATCHv4 07/11] OsinfoInstallConfig: Use config-params if set
Christophe Fergeau
cfergeau at redhat.com
Thu Dec 20 16:45:10 UTC 2012
Now that OsinfoInstallConfig has a 'config-params' property
which describes the config parameters when it's set, we can
use it when it's available. OsinfoInstallConfigParams can indeed
contain a datamap to be used to translate generic libosinfo values
to OS-specific values.
This commit introduces an osinfo_install_config_get_param_value_list
method that will be used in subsequent commits to get these
OS-specific values when generating install scripts.
---
osinfo/osinfo_install_config.c | 84 ++++++++++++++++++++++++++++++++++
osinfo/osinfo_install_config_private.h | 1 +
2 files changed, 85 insertions(+)
diff --git a/osinfo/osinfo_install_config.c b/osinfo/osinfo_install_config.c
index a77317b..4c42746 100644
--- a/osinfo/osinfo_install_config.c
+++ b/osinfo/osinfo_install_config.c
@@ -737,6 +737,90 @@ OsinfoInstallConfigParamList *osinfo_install_config_get_config_params(OsinfoInst
return config->priv->config_params;
}
+
+static const gchar *
+osinfo_install_config_transform_value(OsinfoInstallConfig *config,
+ const gchar *key,
+ const gchar *value)
+{
+ OsinfoDatamap *map;
+ OsinfoEntity *entity;
+ OsinfoInstallConfigParam *param;
+ const gchar *transformed_value;
+
+ if (!config->priv->config_params)
+ return value;
+
+ entity = osinfo_list_find_by_id(OSINFO_LIST(config->priv->config_params),
+ key);
+ if (entity == NULL) {
+ g_warning("%s is not a known parameter for this config", key);
+ return value;
+ }
+
+ param = OSINFO_INSTALL_CONFIG_PARAM(entity);;
+ map = osinfo_install_config_param_get_value_map(param);
+ if (map == NULL) {
+ g_debug("no remapping to be done for %s", key);
+ return value;
+ }
+ transformed_value = osinfo_datamap_lookup(map, value);
+ if (transformed_value == NULL) {
+ g_warning("value not present in %s datamap: %s", key, value);
+ return value;
+ }
+
+ return transformed_value;
+}
+
+static GHashTable *get_remapped_keys_once(void)
+{
+ const char *remapped_properties[] = {
+ OSINFO_INSTALL_CONFIG_PROP_HARDWARE_ARCH,
+ OSINFO_INSTALL_CONFIG_PROP_L10N_KEYBOARD,
+ OSINFO_INSTALL_CONFIG_PROP_L10N_LANGUAGE,
+ OSINFO_INSTALL_CONFIG_PROP_L10N_TIMEZONE,
+ NULL
+ };
+ const char **it;
+ GHashTable *remapped_keys;
+
+ remapped_keys = g_hash_table_new(g_str_hash, g_str_equal);
+ for (it = remapped_properties; *it != NULL; it++) {
+ g_hash_table_add(remapped_keys, (gpointer)*it);
+ }
+
+ return remapped_keys;
+}
+
+GList *
+osinfo_install_config_get_param_value_list(OsinfoInstallConfig *config,
+ const gchar *key)
+{
+ GList *values;
+ GList *it;
+ static GOnce remapped_keys_once = G_ONCE_INIT;
+ GHashTable *remapped_keys;
+
+ values = osinfo_entity_get_param_value_list(OSINFO_ENTITY(config), key);
+ if (values == NULL)
+ return NULL;
+
+ remapped_keys = g_once(&remapped_keys_once,
+ (GThreadFunc)get_remapped_keys_once,
+ NULL);
+ if (!g_hash_table_contains(remapped_keys, key))
+ return values;
+
+ for (it = values; it != NULL; it = it->next) {
+ it->data = (gpointer)osinfo_install_config_transform_value(config,
+ key,
+ it->data);
+ }
+
+ return values;
+}
+
/*
* Local variables:
* indent-tabs-mode: nil
diff --git a/osinfo/osinfo_install_config_private.h b/osinfo/osinfo_install_config_private.h
index 5a1edd3..5ad2162 100644
--- a/osinfo/osinfo_install_config_private.h
+++ b/osinfo/osinfo_install_config_private.h
@@ -28,6 +28,7 @@
void osinfo_install_config_set_config_params(OsinfoInstallConfig *config,
OsinfoInstallConfigParamList *config_params);
+GList *osinfo_install_config_get_param_value_list(OsinfoInstallConfig *config, const gchar *key);
#endif /* __OSINFO_INSTALL_CONFIG_PRIVATE_H__ */
/*
--
1.8.0.2
More information about the Libosinfo
mailing list