Now that OsinfoInstallConfig has access to the OsinfoInstallConfigParamList for the OsinfoInstallScript that is being configured, we can use the OsinfoDatamap that is optionally set on a given parameter to automatically translate a value for this parameter from a generic libosinfo value to an OS-specific one. --- osinfo/Makefile.am | 1 + osinfo/osinfo_install_config.c | 85 ++++++++++++++++++++++++++++++++++ osinfo/osinfo_install_config_private.h | 38 +++++++++++++++ 3 files changed, 124 insertions(+) create mode 100644 osinfo/osinfo_install_config_private.h diff --git a/osinfo/Makefile.am b/osinfo/Makefile.am index 9d03a34..9f3c20d 100644 --- a/osinfo/Makefile.am +++ b/osinfo/Makefile.am @@ -116,6 +116,7 @@ libosinfo_1_0_la_SOURCES = \ osinfo_install_config.c \ osinfo_install_config_param.c \ osinfo_install_config_paramlist.c \ + osinfo_install_config_private.h \ osinfo_install_script.c \ osinfo_install_script_private.h \ osinfo_install_scriptlist.c \ diff --git a/osinfo/osinfo_install_config.c b/osinfo/osinfo_install_config.c index 8078f8c..7f75841 100644 --- a/osinfo/osinfo_install_config.c +++ b/osinfo/osinfo_install_config.c @@ -24,6 +24,7 @@ #include <config.h> #include <osinfo/osinfo.h> +#include "osinfo/osinfo_install_config_private.h" #include <glib/gi18n-lib.h> G_DEFINE_TYPE (OsinfoInstallConfig, osinfo_install_config, OSINFO_TYPE_ENTITY); @@ -730,6 +731,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 new file mode 100644 index 0000000..e08f863 --- /dev/null +++ b/osinfo/osinfo_install_config_private.h @@ -0,0 +1,38 @@ +/* + * libosinfo: OS installation config + * + * Copyright (C) 2012 Red Hat, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Authors: + * Christophe Fergeau <cfergeau@xxxxxxxxxx> + */ + +#include <osinfo/osinfo_install_config.h> + +#ifndef __OSINFO_INSTALL_CONFIG_PRIVATE_H__ +#define __OSINFO_INSTALL_CONFIG_PRIVATE_H__ + +GList *osinfo_install_config_get_param_value_list(OsinfoInstallConfig *config, const gchar *key); + +#endif /* __OSINFO_INSTALL_CONFIG_PRIVATE_H__ */ +/* + * Local variables: + * indent-tabs-mode: nil + * c-indent-level: 4 + * c-basic-offset: 4 + * End: + */ -- 1.8.0.2