[virt-tools-list] [libosinfo 10/11] Automatically remap OsinfoInstallConfig values if needed

Christophe Fergeau cfergeau at redhat.com
Mon Dec 10 16:46:06 UTC 2012


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/osinfo_install_config.c | 204 ++++++++++++++++++++++++++++++-----------
 1 file changed, 152 insertions(+), 52 deletions(-)

diff --git a/osinfo/osinfo_install_config.c b/osinfo/osinfo_install_config.c
index d1a0dd5..b0944d3 100644
--- a/osinfo/osinfo_install_config.c
+++ b/osinfo/osinfo_install_config.c
@@ -30,6 +30,11 @@ G_DEFINE_TYPE (OsinfoInstallConfig, osinfo_install_config, OSINFO_TYPE_ENTITY);
 
 #define OSINFO_INSTALL_CONFIG_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), OSINFO_TYPE_INSTALL_CONFIG, OsinfoInstallConfigPrivate))
 
+static void osinfo_install_config_set_param(OsinfoInstallConfig *config,
+                                            const gchar *key,
+                                            const gchar *value);
+static const gchar *osinfo_install_config_get_param_value(OsinfoInstallConfig *config,
+                                                          const gchar *key);
 /**
  * SECTION:osinfo_install_config
  * @short_description: OS install configuration
@@ -106,6 +111,50 @@ osinfo_install_config_finalize (GObject *object)
 
 
 /* Init functions */
+static const gchar valid[] = {
+    'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
+    'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
+    'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
+    'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'X', 'W', 'X', 'Y', 'Z',
+    '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '-', '_', '+',
+    '=', '!', '@', '#', '%', '^', '&', ',', '(', ')', '[', '{', '}',
+    '[', ']', ';', ':', '<', '>', ',', '.', '?', '/', '~',
+};
+
+static void osinfo_install_config_constructed(GObject *object)
+{
+    OsinfoInstallConfig *config = OSINFO_INSTALL_CONFIG(object);
+    gchar pass[9];
+    gsize i;
+
+    G_OBJECT_CLASS(osinfo_install_config_parent_class)->constructed(object);
+
+    /* osinfo_install_config_set_param() needs the GObject properties
+     * to be set as we will get the needed datamaps from the 'valid-params'
+     * property
+     */
+    osinfo_install_config_set_param(config,
+                                    OSINFO_INSTALL_CONFIG_PROP_L10N_KEYBOARD,
+                                    "us");
+    osinfo_install_config_set_param(config,
+                                    OSINFO_INSTALL_CONFIG_PROP_L10N_TIMEZONE,
+                                    "America/New_York");
+    osinfo_install_config_set_param(config,
+                                    OSINFO_INSTALL_CONFIG_PROP_L10N_LANGUAGE,
+                                    "en_US.UTF-8");
+
+    for (i = 0 ; i < sizeof(pass)-1 ; i++) {
+        gint val = g_random_int_range(0, sizeof(valid));
+        pass[i] = valid[val];
+    }
+    pass[sizeof(pass)-1] = '\0';
+
+    osinfo_entity_set_param(OSINFO_ENTITY(config),
+                            OSINFO_INSTALL_CONFIG_PROP_ADMIN_PASSWORD,
+                            pass);
+}
+
+
 static void
 osinfo_install_config_class_init (OsinfoInstallConfigClass *klass)
 {
@@ -114,6 +163,7 @@ osinfo_install_config_class_init (OsinfoInstallConfigClass *klass)
 
     g_klass->get_property = osinfo_install_config_get_property;
     g_klass->set_property = osinfo_install_config_set_property;
+    g_klass->constructed = osinfo_install_config_constructed;
     g_klass->finalize = osinfo_install_config_finalize;
 
     pspec = g_param_spec_object("valid-params",
@@ -130,45 +180,13 @@ osinfo_install_config_class_init (OsinfoInstallConfigClass *klass)
     g_type_class_add_private (klass, sizeof (OsinfoInstallConfigPrivate));
 }
 
-static const gchar valid[] = {
-    'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
-    'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
-    'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
-    'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'X', 'W', 'X', 'Y', 'Z',
-    '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '-', '_', '+',
-    '=', '!', '@', '#', '%', '^', '&', ',', '(', ')', '[', '{', '}',
-    '[', ']', ';', ':', '<', '>', ',', '.', '?', '/', '~',
-};
-
 
 static void
 osinfo_install_config_init (OsinfoInstallConfig *config)
 {
     OsinfoInstallConfigPrivate *priv;
-    gchar pass[9];
-    gsize i;
 
     config->priv = priv = OSINFO_INSTALL_CONFIG_GET_PRIVATE(config);
-
-    osinfo_entity_set_param(OSINFO_ENTITY(config),
-                            OSINFO_INSTALL_CONFIG_PROP_L10N_KEYBOARD,
-                            "us");
-    osinfo_entity_set_param(OSINFO_ENTITY(config),
-                            OSINFO_INSTALL_CONFIG_PROP_L10N_TIMEZONE,
-                            "America/New_York");
-    osinfo_entity_set_param(OSINFO_ENTITY(config),
-                            OSINFO_INSTALL_CONFIG_PROP_L10N_LANGUAGE,
-                            "en_US.UTF-8");
-
-    for (i = 0 ; i < sizeof(pass)-1 ; i++) {
-        gint val = g_random_int_range(0, sizeof(valid));
-        pass[i] = valid[val];
-    }
-    pass[sizeof(pass)-1] = '\0';
-
-    osinfo_entity_set_param(OSINFO_ENTITY(config),
-                            OSINFO_INSTALL_CONFIG_PROP_ADMIN_PASSWORD,
-                            pass);
 }
 
 
@@ -206,16 +224,16 @@ OsinfoInstallConfig *osinfo_install_config_new_for_script(const gchar *id,
 void osinfo_install_config_set_hardware_arch(OsinfoInstallConfig *config,
                                              const gchar *arch)
 {
-    osinfo_entity_set_param(OSINFO_ENTITY(config),
-                            OSINFO_INSTALL_CONFIG_PROP_HARDWARE_ARCH,
-                            arch);
+    osinfo_install_config_set_param(config,
+                                    OSINFO_INSTALL_CONFIG_PROP_HARDWARE_ARCH,
+                                    arch);
 }
 
 
 const gchar *osinfo_install_config_get_hardware_arch(OsinfoInstallConfig *config)
 {
-    return osinfo_entity_get_param_value(OSINFO_ENTITY(config),
-                                         OSINFO_INSTALL_CONFIG_PROP_HARDWARE_ARCH);
+    return osinfo_install_config_get_param_value(config,
+                                                 OSINFO_INSTALL_CONFIG_PROP_HARDWARE_ARCH);
 }
 
 
@@ -232,16 +250,16 @@ const gchar *osinfo_install_config_get_hardware_arch(OsinfoInstallConfig *config
 void osinfo_install_config_set_l10n_keyboard(OsinfoInstallConfig *config,
                                              const gchar *keyboard)
 {
-    osinfo_entity_set_param(OSINFO_ENTITY(config),
-                            OSINFO_INSTALL_CONFIG_PROP_L10N_KEYBOARD,
-                            keyboard);
+    osinfo_install_config_set_param(config,
+                                    OSINFO_INSTALL_CONFIG_PROP_L10N_KEYBOARD,
+                                    keyboard);
 }
 
 
 const gchar *osinfo_install_config_get_l10n_keyboard(OsinfoInstallConfig *config)
 {
-    return osinfo_entity_get_param_value(OSINFO_ENTITY(config),
-                                         OSINFO_INSTALL_CONFIG_PROP_L10N_KEYBOARD);
+    return osinfo_install_config_get_param_value(config,
+                                                 OSINFO_INSTALL_CONFIG_PROP_L10N_KEYBOARD);
 }
 
 /**
@@ -261,32 +279,32 @@ const gchar *osinfo_install_config_get_l10n_keyboard(OsinfoInstallConfig *config
 void osinfo_install_config_set_l10n_language(OsinfoInstallConfig *config,
                                              const gchar *language)
 {
-    osinfo_entity_set_param(OSINFO_ENTITY(config),
-                            OSINFO_INSTALL_CONFIG_PROP_L10N_LANGUAGE,
-                            language);
+    osinfo_install_config_set_param(config,
+                                    OSINFO_INSTALL_CONFIG_PROP_L10N_LANGUAGE,
+                                    language);
 }
 
 
 const gchar *osinfo_install_config_get_l10n_language(OsinfoInstallConfig *config)
 {
-    return osinfo_entity_get_param_value(OSINFO_ENTITY(config),
-                                         OSINFO_INSTALL_CONFIG_PROP_L10N_LANGUAGE);
+    return osinfo_install_config_get_param_value(config,
+                                                 OSINFO_INSTALL_CONFIG_PROP_L10N_LANGUAGE);
 }
 
 
 void osinfo_install_config_set_l10n_timezone(OsinfoInstallConfig *config,
                                              const gchar *tz)
 {
-    osinfo_entity_set_param(OSINFO_ENTITY(config),
-                            OSINFO_INSTALL_CONFIG_PROP_L10N_TIMEZONE,
-                            tz);
+    osinfo_install_config_set_param(config,
+                                    OSINFO_INSTALL_CONFIG_PROP_L10N_TIMEZONE,
+                                    tz);
 }
 
 
 const gchar *osinfo_install_config_get_l10n_timezone(OsinfoInstallConfig *config)
 {
-    return osinfo_entity_get_param_value(OSINFO_ENTITY(config),
-                                         OSINFO_INSTALL_CONFIG_PROP_L10N_TIMEZONE);
+    return osinfo_install_config_get_param_value(config,
+                                                 OSINFO_INSTALL_CONFIG_PROP_L10N_TIMEZONE);
 }
 
 
@@ -746,6 +764,88 @@ OsinfoInstallConfigParamList *osinfo_install_config_get_valid_params(OsinfoInsta
     return config->priv->valid_params;
 }
 
+
+static const gchar *
+osinfo_install_config_transform_value_generic(OsinfoInstallConfig *config,
+                                              const gchar *(*mapping_func)(OsinfoDatamap *map, const gchar *val),
+                                              const gchar *key,
+                                              const gchar *value)
+{
+    OsinfoDatamap *map;
+    OsinfoEntity *entity;
+    OsinfoInstallConfigParam *param;
+    const gchar *transformed_value;
+
+    if (!config->priv->valid_params)
+        return value;
+
+    entity = osinfo_list_find_by_id(OSINFO_LIST(config->priv->valid_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 = mapping_func(map, value);
+    if (transformed_value == NULL) {
+        g_warning("value not present in %s datamap: %s", key, value);
+        return value;
+    }
+
+    return transformed_value;
+}
+
+
+static const gchar *
+osinfo_install_config_transform_value(OsinfoInstallConfig *config,
+                                      const gchar *key,
+                                      const gchar *value)
+{
+    return osinfo_install_config_transform_value_generic(config,
+                                                         osinfo_datamap_lookup,
+                                                         key, value);
+}
+
+
+static const gchar *
+osinfo_install_config_untransform_value(OsinfoInstallConfig *config,
+                                        const gchar *key,
+                                        const gchar *value)
+{
+    return osinfo_install_config_transform_value_generic(config,
+                                                         osinfo_datamap_reverse_lookup,
+                                                         key, value);
+}
+
+
+static void
+osinfo_install_config_set_param(OsinfoInstallConfig *config,
+                                const gchar *key,
+                                const gchar *value)
+{
+    value = osinfo_install_config_transform_value(config, key, value);
+    osinfo_entity_set_param(OSINFO_ENTITY(config), key, value);
+}
+
+
+static const gchar *
+osinfo_install_config_get_param_value(OsinfoInstallConfig *config, const gchar *key)
+{
+    const gchar *value;
+
+    value = osinfo_entity_get_param_value(OSINFO_ENTITY(config), key);
+    if (value == NULL)
+        return NULL;
+
+    return osinfo_install_config_untransform_value(config, key, value);
+}
+
 /*
  * Local variables:
  *  indent-tabs-mode: nil
-- 
1.8.0.1




More information about the virt-tools-list mailing list