[Libosinfo] [PATCH 02/10] Add osinfo_install_script_generate_for_media*()
Christophe Fergeau
cfergeau at redhat.com
Tue May 12 11:31:33 UTC 2015
Hey,
On Thu, May 07, 2015 at 05:36:37PM +0100, Zeeshan Ali (Khattak) wrote:
> Add API that allows apps to pass the media matched against the OS they
> are generating the script for. Scripts can use this information to make
> decisions about how installation should be setup. For example, we are
> going to use this in the Fedora installer script to decide whether to
> install from ISO or from network, based on whether or not media is a
> network installer.
> ---
> osinfo/libosinfo.syms | 4 +
> osinfo/osinfo_install_script.c | 197 ++++++++++++++++++++++++++++++++++++-----
> osinfo/osinfo_install_script.h | 16 ++++
> 3 files changed, 196 insertions(+), 21 deletions(-)
>
> diff --git a/osinfo/libosinfo.syms b/osinfo/libosinfo.syms
> index 2dba411..ba4c020 100644
> --- a/osinfo/libosinfo.syms
> +++ b/osinfo/libosinfo.syms
> @@ -507,6 +507,10 @@ LIBOSINFO_0.2.11 {
>
> LIBOSINFO_0.2.12 {
> global:
> + osinfo_install_script_generate_for_media;
> + osinfo_install_script_generate_for_media_async;
> + osinfo_install_script_generate_for_media_finish;
> +
> osinfo_media_get_volume_size;
> } LIBOSINFO_0.2.11;
>
> diff --git a/osinfo/osinfo_install_script.c b/osinfo/osinfo_install_script.c
> index a6a5bab..621c56f 100644
> --- a/osinfo/osinfo_install_script.c
> +++ b/osinfo/osinfo_install_script.c
> @@ -533,6 +533,7 @@ OsinfoAvatarFormat *osinfo_install_script_get_avatar_format(OsinfoInstallScript
> struct _OsinfoInstallScriptGenerateData {
> GSimpleAsyncResult *res;
> OsinfoOs *os;
> + OsinfoMedia *media;
> OsinfoInstallConfig *config;
> OsinfoInstallScript *script;
> };
> @@ -541,6 +542,8 @@ struct _OsinfoInstallScriptGenerateData {
> static void osinfo_install_script_generate_data_free(OsinfoInstallScriptGenerateData *data)
> {
> g_object_unref(data->os);
> + if (data->media != NULL)
> + g_object_unref(data->media);
> g_object_unref(data->config);
> g_object_unref(data->script);
> g_object_unref(data->res);
> @@ -731,6 +734,7 @@ static xmlNodePtr osinfo_install_script_generate_entity_xml(OsinfoInstallScript
>
> static xmlDocPtr osinfo_install_script_generate_config_xml(OsinfoInstallScript *script,
> OsinfoOs *os,
> + OsinfoMedia *media,
> OsinfoInstallConfig *config,
> const gchar *node_name,
> GError **error)
> @@ -767,6 +771,19 @@ static xmlDocPtr osinfo_install_script_generate_config_xml(OsinfoInstallScript *
> goto error;
> }
>
> + if (media != NULL) {
> + if (!(node = osinfo_install_script_generate_entity_xml(script,
> + OSINFO_ENTITY(media),
> + "media",
> + error)))
> + goto error;
> + if (!(xmlAddChild(root, node))) {
> + xmlErrorPtr err = xmlGetLastError();
> + g_set_error(error, 0, 0, _("Unable to set XML root '%s'"), err ? err->message : "");
Error message could most likely be better, eg "Unable to set 'media' node: %s"
> + goto error;
> + }
> + }
> +
> if (!(node = osinfo_install_script_generate_entity_xml(script,
> OSINFO_ENTITY(config),
> "config",
> @@ -819,6 +836,7 @@ static gchar *osinfo_install_script_apply_xslt(xsltStylesheetPtr ss,
>
> static gboolean osinfo_install_script_apply_template(OsinfoInstallScript *script,
> OsinfoOs *os,
> + OsinfoMedia *media,
> const gchar *templateUri,
> const gchar *template,
> const gchar *node_name,
> @@ -828,7 +846,7 @@ static gboolean osinfo_install_script_apply_template(OsinfoInstallScript *script
> {
> gboolean ret = FALSE;
> xsltStylesheetPtr templateXsl = osinfo_install_script_load_template(templateUri, template, error);
> - xmlDocPtr configXml = osinfo_install_script_generate_config_xml(script, os, config, node_name, error);
> + xmlDocPtr configXml = osinfo_install_script_generate_config_xml(script, os, media, config, node_name, error);
>
> if (!templateXsl || !configXml)
> goto cleanup;
> @@ -871,6 +889,7 @@ static void osinfo_install_script_template_loaded(GObject *src,
>
> if (!osinfo_install_script_apply_template(data->script,
> data->os,
> + data->media,
> uri,
> input,
> "install-script-config",
> @@ -891,43 +910,35 @@ static void osinfo_install_script_template_loaded(GObject *src,
> g_free(uri);
> }
>
> -/**
> - * osinfo_install_script_generate_async:
> - * @script: the install script
> - * @os: the os
> - * @config: the install script config
> - * @cancellable: (allow-none): a #GCancellable, or %NULL
> - * @callback: Function to call when result of this call is ready
> - * @user_data: The user data to pass to @callback, or %NULL
> - *
> - * Asynchronous variant of #osinfo_install_script_generate(). From the callback,
> - * call #osinfo_install_script_generate_finish() to conclude this call and get
> - * the generated script.
> - */
> -void osinfo_install_script_generate_async(OsinfoInstallScript *script,
> - OsinfoOs *os,
> - OsinfoInstallConfig *config,
> - GCancellable *cancellable,
> - GAsyncReadyCallback callback,
> - gpointer user_data)
> +
> +static void osinfo_install_script_generate_async_common(OsinfoInstallScript *script,
> + OsinfoOs *os,
> + OsinfoMedia *media,
> + OsinfoInstallConfig *config,
> + GCancellable *cancellable,
> + GAsyncReadyCallback callback,
> + gpointer user_data)
> {
> OsinfoInstallScriptGenerateData *data = g_new0(OsinfoInstallScriptGenerateData, 1);
> const gchar *templateData = osinfo_install_script_get_template_data(script);
> const gchar *templateUri = osinfo_install_script_get_template_uri(script);
>
> data->os = g_object_ref(os);
> + if (media != NULL)
> + data->media = g_object_ref(media);
> data->config = g_object_ref(config);
> data->script = g_object_ref(script);
> data->res = g_simple_async_result_new(G_OBJECT(script),
> callback,
> user_data,
> - osinfo_install_script_generate_async);
> + osinfo_install_script_generate_async_common);
>
> if (templateData) {
> GError *error = NULL;
> gchar *output;
> if (!osinfo_install_script_apply_template(script,
> os,
> + media,
> "<data>",
> templateData,
> "install-script-config",
> @@ -954,6 +965,35 @@ void osinfo_install_script_generate_async(OsinfoInstallScript *script,
> }
> }
>
> +/**
> + * osinfo_install_script_generate_async:
> + * @script: the install script
> + * @os: the os
> + * @config: the install script config
> + * @cancellable: (allow-none): a #GCancellable, or %NULL
> + * @callback: Function to call when result of this call is ready
> + * @user_data: The user data to pass to @callback, or %NULL
> + *
> + * Asynchronous variant of #osinfo_install_script_generate(). From the callback,
> + * call #osinfo_install_script_generate_finish() to conclude this call and get
> + * the generated script.
> + */
> +void osinfo_install_script_generate_async(OsinfoInstallScript *script,
> + OsinfoOs *os,
> + OsinfoInstallConfig *config,
> + GCancellable *cancellable,
> + GAsyncReadyCallback callback,
> + gpointer user_data)
> +{
> + osinfo_install_script_generate_async_common(script,
> + os,
> + NULL,
> + config,
> + cancellable,
> + callback,
> + user_data);
> +}
> +
> static gpointer osinfo_install_script_generate_finish_common(OsinfoInstallScript *script,
> GAsyncResult *res,
> GError **error)
> @@ -986,6 +1026,25 @@ gchar *osinfo_install_script_generate_finish(OsinfoInstallScript *script,
> }
>
> /**
> + * osinfo_install_script_generate_for_media_finish:
> + * @script: the install script
> + * @res: a #GAsyncResult
> + * @error: The location where to store any error, or NULL
> + *
> + * Returns: (transfer full): the generated script, or NULL on error
> + *
> + * Since: 0.2.12
> + */
> +gchar *osinfo_install_script_generate_for_media_finish(OsinfoInstallScript *script,
> + GAsyncResult *res,
> + GError **error)
> +{
> + return osinfo_install_script_generate_finish_common(script,
> + res,
> + error);
> +}
> +
> +/**
> * osinfo_install_script_generate_output_finish:
> * @script: the install script
> * @res: a #GAsyncResult
> @@ -1094,6 +1153,101 @@ gchar *osinfo_install_script_generate(OsinfoInstallScript *script,
> return data.output;
> }
>
> +/**
> + * osinfo_install_script_generate_for_media_async:
> + * @script: the install script
> + * @media: the media
> + * @config: the install script config
> + * @cancellable: (allow-none): a #GCancellable, or %NULL
> + * @callback: Function to call when result of this call is ready
> + * @user_data: The user data to pass to @callback, or %NULL
> + *
> + * Asynchronous variant of #osinfo_install_script_generate_for_media(). From the
> + * callback, call #osinfo_install_script_generate_for_media_finish() to
> + * conclude this call and get the generated script.
> + *
> + * Since: 0.2.12
> + */
> +void osinfo_install_script_generate_for_media_async(OsinfoInstallScript *script,
> + OsinfoMedia *media,
> + OsinfoInstallConfig *config,
> + GCancellable *cancellable,
> + GAsyncReadyCallback callback,
> + gpointer user_data) {
> + OsinfoOs *os;
> +
> + g_return_if_fail (media != NULL);
> +
> + os = osinfo_media_get_os (media);
> + g_return_if_fail (os != NULL);
This bit could go in _async_common?
> +
> + osinfo_install_script_generate_async_common(script,
> + os,
> + media,
> + config,
> + cancellable,
> + callback,
> + user_data);
> +}
> +
> +static void osinfo_install_script_generate_for_media_done(GObject *src,
> + GAsyncResult *res,
> + gpointer user_data)
> +{
> + OsinfoInstallScriptGenerateSyncData *data = user_data;
> +
> + data->output =
> + osinfo_install_script_generate_for_media_finish(OSINFO_INSTALL_SCRIPT(src),
> + res,
> + &data->error);
> + g_main_loop_quit(data->loop);
> +}
> +
> +/**
> + * osinfo_install_script_generate_for_media:
> + * @script: the install script
> + * @media: the media
> + * @config: the install script config
> + * @cancellable: (allow-none): a #GCancellable, or %NULL
> + * @error: The location where to store any error, or %NULL
> + *
> + * Creates an install script. The media @media must have been identified
> + * successfully using #osinfo_db_identify_media() before calling this function.
> + *
> + * Returns: (transfer full): the script as string.
> + *
> + * Since: 0.2.12
> + */
> +gchar *osinfo_install_script_generate_for_media(OsinfoInstallScript *script,
> + OsinfoMedia *media,
> + OsinfoInstallConfig *config,
> + GCancellable *cancellable,
> + GError **error)
> +{
> + GMainLoop *loop = g_main_loop_new(g_main_context_get_thread_default(),
> + TRUE);
> + OsinfoInstallScriptGenerateSyncData data = {
> + loop, NULL, NULL, NULL
> + };
> +
> + osinfo_install_script_generate_for_media_async(script,
> + media,
> + config,
> + cancellable,
> + osinfo_install_script_generate_for_media_done,
> + &data);
> +
> + if (g_main_loop_is_running(loop))
> + g_main_loop_run(loop);
> +
> + if (data.error)
> + g_propagate_error(error, data.error);
> +
> + g_main_loop_unref(loop);
> +
> + return data.output;
Any reason not to have a generate_for_media_common helper here?
Looks good apart from these small details/questions.
Christophe
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 819 bytes
Desc: not available
URL: <http://listman.redhat.com/archives/libosinfo/attachments/20150512/2ba3979d/attachment.sig>
More information about the Libosinfo
mailing list