fwupd/libfwupd/fwupd-result.c
Richard Hughes 7ceb318a27 Add fwupd_result_get_device_version_bootloader()
This functionality is required so that AppStream metadata can check the fwupd
version, the firmware version, bootloader version or a combination of all three.
2016-12-23 11:21:22 +00:00

2060 lines
53 KiB
C

/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
*
* Copyright (C) 2015-2016 Richard Hughes <richard@hughsie.com>
*
* Licensed under the GNU Lesser General Public License Version 2.1
*
* 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
*/
#include "config.h"
#include <glib-object.h>
#include <gio/gio.h>
#include <string.h>
#include "fwupd-enums-private.h"
#include "fwupd-error.h"
#include "fwupd-result.h"
static void fwupd_result_finalize (GObject *object);
typedef struct {
GPtrArray *guids;
gchar *unique_id;
/* device-specific */
gchar *device_checksum;
GChecksumType device_checksum_kind;
gchar *device_description;
gchar *device_id;
gchar *device_name;
gchar *device_provider;
gchar *device_vendor;
gchar *device_version;
gchar *device_version_lowest;
gchar *device_version_bootloader;
guint32 device_flashes_left;
guint64 device_created;
guint64 device_flags;
guint64 device_modified;
/* update-specific */
FwupdTrustFlags update_trust_flags;
FwupdUpdateState update_state;
gchar *update_checksum;
GChecksumType update_checksum_kind;
gchar *update_description;
gchar *update_error;
gchar *update_filename;
gchar *update_homepage;
gchar *update_id;
gchar *update_license;
gchar *update_name;
gchar *update_summary;
gchar *update_uri;
gchar *update_vendor;
gchar *update_version;
guint64 update_size;
} FwupdResultPrivate;
enum {
SIGNAL_LAST
};
enum {
PROP_0,
PROP_DEVICE_ID,
PROP_UNIQUE_ID,
PROP_LAST
};
G_DEFINE_TYPE_WITH_PRIVATE (FwupdResult, fwupd_result, G_TYPE_OBJECT)
#define GET_PRIVATE(o) (fwupd_result_get_instance_private (o))
/**
* fwupd_result_get_unique_id:
* @result: A #FwupdResult
*
* Gets the unique ID that can be used for caching.
*
* Returns: the ID, or %NULL if unset
*
* Since: 0.7.3
**/
const gchar *
fwupd_result_get_unique_id (FwupdResult *result)
{
FwupdResultPrivate *priv = GET_PRIVATE (result);
g_return_val_if_fail (FWUPD_IS_RESULT (result), NULL);
return priv->unique_id;
}
/**
* fwupd_result_set_unique_id:
* @result: A #FwupdResult
* @unique_id: the result ID, e.g. "USB:foo"
*
* Sets the unique ID that can be used for caching.
*
* Since: 0.7.3
**/
void
fwupd_result_set_unique_id (FwupdResult *result, const gchar *unique_id)
{
FwupdResultPrivate *priv = GET_PRIVATE (result);
g_return_if_fail (FWUPD_IS_RESULT (result));
g_free (priv->unique_id);
priv->unique_id = g_strdup (unique_id);
}
/**
* fwupd_result_get_device_id:
* @result: A #FwupdResult
*
* Gets the ID.
*
* Returns: the ID, or %NULL if unset
*
* Since: 0.7.0
**/
const gchar *
fwupd_result_get_device_id (FwupdResult *result)
{
FwupdResultPrivate *priv = GET_PRIVATE (result);
g_return_val_if_fail (FWUPD_IS_RESULT (result), NULL);
return priv->device_id;
}
/**
* fwupd_result_set_device_id:
* @result: A #FwupdResult
* @device_id: the result ID, e.g. "USB:foo"
*
* Sets the ID.
*
* Since: 0.7.0
**/
void
fwupd_result_set_device_id (FwupdResult *result, const gchar *device_id)
{
FwupdResultPrivate *priv = GET_PRIVATE (result);
g_return_if_fail (FWUPD_IS_RESULT (result));
g_free (priv->device_id);
priv->device_id = g_strdup (device_id);
}
/**
* fwupd_result_get_guids:
* @result: A #FwupdResult
*
* Gets the GUIDs.
*
* Returns: (element-type utf8) (transfer none): the GUIDs
*
* Since: 0.7.2
**/
GPtrArray *
fwupd_result_get_guids (FwupdResult *result)
{
FwupdResultPrivate *priv = GET_PRIVATE (result);
g_return_val_if_fail (FWUPD_IS_RESULT (result), NULL);
return priv->guids;
}
/**
* fwupd_result_has_guid:
* @result: A #FwupdResult
* @guid: the GUID, e.g. "2082b5e0-7a64-478a-b1b2-e3404fab6dad"
*
* Finds out if the device has this specific GUID.
*
* Returns: %TRUE if the GUID is found
*
* Since: 0.7.2
**/
gboolean
fwupd_result_has_guid (FwupdResult *result, const gchar *guid)
{
FwupdResultPrivate *priv = GET_PRIVATE (result);
guint i;
g_return_val_if_fail (FWUPD_IS_RESULT (result), FALSE);
for (i = 0; i < priv->guids->len; i++) {
const gchar *guid_tmp = g_ptr_array_index (priv->guids, i);
if (g_strcmp0 (guid, guid_tmp) == 0)
return TRUE;
}
return FALSE;
}
/**
* fwupd_result_add_guid:
* @result: A #FwupdResult
* @guid: the GUID, e.g. "2082b5e0-7a64-478a-b1b2-e3404fab6dad"
*
* Adds the GUID if it does not already exist.
*
* Since: 0.7.2
**/
void
fwupd_result_add_guid (FwupdResult *result, const gchar *guid)
{
FwupdResultPrivate *priv = GET_PRIVATE (result);
g_return_if_fail (FWUPD_IS_RESULT (result));
if (fwupd_result_has_guid (result, guid))
return;
g_ptr_array_add (priv->guids, g_strdup (guid));
}
/**
* fwupd_result_get_guid_default:
* @result: A #FwupdResult
*
* Gets the default GUID.
*
* Returns: the GUID, or %NULL if unset
*
* Since: 0.7.2
**/
const gchar *
fwupd_result_get_guid_default (FwupdResult *result)
{
FwupdResultPrivate *priv = GET_PRIVATE (result);
g_return_val_if_fail (FWUPD_IS_RESULT (result), NULL);
if (priv->guids->len == 0)
return NULL;
return g_ptr_array_index (priv->guids, 0);
}
/**
* fwupd_result_get_guid:
* @result: A #FwupdResult
*
* Gets the GUID.
*
* Returns: the GUID, or %NULL if unset
*
* This function has been deprecated since 0.7.2.
*
* Since: 0.7.0
**/
const gchar *
fwupd_result_get_guid (FwupdResult *result)
{
return fwupd_result_get_guid_default (result);
}
/**
* fwupd_result_set_guid:
* @result: A #FwupdResult
* @guid: the GUID, e.g. "2082b5e0-7a64-478a-b1b2-e3404fab6dad"
*
* Sets the GUID.
*
* This function has been deprecated since 0.7.2.
*
* Since: 0.7.0
**/
void
fwupd_result_set_guid (FwupdResult *result, const gchar *guid)
{
fwupd_result_add_guid (result, guid);
}
/**
* fwupd_result_get_device_name:
* @result: A #FwupdResult
*
* Gets the device name.
*
* Returns: the device name, or %NULL if unset
*
* Since: 0.7.0
**/
const gchar *
fwupd_result_get_device_name (FwupdResult *result)
{
FwupdResultPrivate *priv = GET_PRIVATE (result);
g_return_val_if_fail (FWUPD_IS_RESULT (result), NULL);
return priv->device_name;
}
/**
* fwupd_result_set_device_name:
* @result: A #FwupdResult
* @device_name: the device update_name, e.g. "ColorHug2"
*
* Sets the device update_name.
*
* Since: 0.7.0
**/
void
fwupd_result_set_device_name (FwupdResult *result, const gchar *device_name)
{
FwupdResultPrivate *priv = GET_PRIVATE (result);
g_return_if_fail (FWUPD_IS_RESULT (result));
g_free (priv->device_name);
priv->device_name = g_strdup (device_name);
}
/**
* fwupd_result_get_device_vendor:
* @result: A #FwupdResult
*
* Gets the device vendor.
*
* Returns: the device vendor, or %NULL if unset
*
* Since: 0.7.0
**/
const gchar *
fwupd_result_get_device_vendor (FwupdResult *result)
{
FwupdResultPrivate *priv = GET_PRIVATE (result);
g_return_val_if_fail (FWUPD_IS_RESULT (result), NULL);
return priv->device_vendor;
}
/**
* fwupd_result_set_device_vendor:
* @result: A #FwupdResult
* @device_vendor: the description
*
* Sets the device vendor.
*
* Since: 0.7.0
**/
void
fwupd_result_set_device_vendor (FwupdResult *result, const gchar *device_vendor)
{
FwupdResultPrivate *priv = GET_PRIVATE (result);
g_return_if_fail (FWUPD_IS_RESULT (result));
g_free (priv->device_vendor);
priv->device_vendor = g_strdup (device_vendor);
}
/**
* fwupd_result_get_device_description:
* @result: A #FwupdResult
*
* Gets the device description in AppStream markup format.
*
* Returns: the device description, or %NULL if unset
*
* Since: 0.7.0
**/
const gchar *
fwupd_result_get_device_description (FwupdResult *result)
{
FwupdResultPrivate *priv = GET_PRIVATE (result);
g_return_val_if_fail (FWUPD_IS_RESULT (result), NULL);
return priv->device_description;
}
/**
* fwupd_result_set_device_description:
* @result: A #FwupdResult
* @device_description: the description in AppStream markup format
*
* Sets the device description.
*
* Since: 0.7.0
**/
void
fwupd_result_set_device_description (FwupdResult *result, const gchar *device_description)
{
FwupdResultPrivate *priv = GET_PRIVATE (result);
g_return_if_fail (FWUPD_IS_RESULT (result));
g_free (priv->device_description);
priv->device_description = g_strdup (device_description);
}
/**
* fwupd_result_get_device_version:
* @result: A #FwupdResult
*
* Gets the device version.
*
* Returns: the device version, or %NULL if unset
*
* Since: 0.7.0
**/
const gchar *
fwupd_result_get_device_version (FwupdResult *result)
{
FwupdResultPrivate *priv = GET_PRIVATE (result);
g_return_val_if_fail (FWUPD_IS_RESULT (result), NULL);
return priv->device_version;
}
/**
* fwupd_result_set_device_version:
* @result: A #FwupdResult
* @device_version: the device version, e.g. "1.2.3"
*
* Sets the device version.
*
* Since: 0.7.0
**/
void
fwupd_result_set_device_version (FwupdResult *result, const gchar *device_version)
{
FwupdResultPrivate *priv = GET_PRIVATE (result);
g_return_if_fail (FWUPD_IS_RESULT (result));
g_free (priv->device_version);
priv->device_version = g_strdup (device_version);
}
/**
* fwupd_result_get_update_version:
* @result: A #FwupdResult
*
* Gets the update version.
*
* Returns: the update version, or %NULL if unset
*
* Since: 0.7.0
**/
const gchar *
fwupd_result_get_update_version (FwupdResult *result)
{
FwupdResultPrivate *priv = GET_PRIVATE (result);
g_return_val_if_fail (FWUPD_IS_RESULT (result), NULL);
return priv->update_version;
}
/**
* fwupd_result_get_device_version_lowest:
* @result: A #FwupdResult
*
* Gets the lowest version of firmware the device will accept.
*
* Returns: the device version_lowest, or %NULL if unset
*
* Since: 0.7.0
**/
const gchar *
fwupd_result_get_device_version_lowest (FwupdResult *result)
{
FwupdResultPrivate *priv = GET_PRIVATE (result);
g_return_val_if_fail (FWUPD_IS_RESULT (result), NULL);
return priv->device_version_lowest;
}
/**
* fwupd_result_set_device_version_lowest:
* @result: A #FwupdResult
* @device_version_lowest: the description
*
* Sets the lowest version of firmware the device will accept.
*
* Since: 0.7.0
**/
void
fwupd_result_set_device_version_lowest (FwupdResult *result, const gchar *device_version_lowest)
{
FwupdResultPrivate *priv = GET_PRIVATE (result);
g_return_if_fail (FWUPD_IS_RESULT (result));
g_free (priv->device_version_lowest);
priv->device_version_lowest = g_strdup (device_version_lowest);
}
/**
* fwupd_result_get_device_version_bootloader:
* @result: A #FwupdResult
*
* Gets the version of the bootloader.
*
* Returns: the device version_bootloader, or %NULL if unset
*
* Since: 0.8.0
**/
const gchar *
fwupd_result_get_device_version_bootloader (FwupdResult *result)
{
FwupdResultPrivate *priv = GET_PRIVATE (result);
g_return_val_if_fail (FWUPD_IS_RESULT (result), NULL);
return priv->device_version_bootloader;
}
/**
* fwupd_result_set_device_version_bootloader:
* @result: A #FwupdResult
* @device_version_bootloader: the description
*
* Sets the bootloader version.
*
* Since: 0.8.0
**/
void
fwupd_result_set_device_version_bootloader (FwupdResult *result,
const gchar *device_version_bootloader)
{
FwupdResultPrivate *priv = GET_PRIVATE (result);
g_return_if_fail (FWUPD_IS_RESULT (result));
g_free (priv->device_version_bootloader);
priv->device_version_bootloader = g_strdup (device_version_bootloader);
}
/**
* fwupd_result_device_get_flashes_left:
* @result: A #FwupdResult
*
* Gets the number of flash cycles left on the device
*
* Returns: the flash cycles left, or %NULL if unset
*
* Since: 0.7.1
**/
guint32
fwupd_result_get_device_flashes_left (FwupdResult *result)
{
FwupdResultPrivate *priv = GET_PRIVATE (result);
g_return_val_if_fail (FWUPD_IS_RESULT (result), 0);
return priv->device_flashes_left;
}
/**
* fwupd_result_device_set_flashes_left:
* @result: A #FwupdResult
* @flashes_left: the description
*
* Sets the number of flash cycles left on the device
*
* Since: 0.7.1
**/
void
fwupd_result_set_device_flashes_left (FwupdResult *result, guint32 flashes_left)
{
FwupdResultPrivate *priv = GET_PRIVATE (result);
g_return_if_fail (FWUPD_IS_RESULT (result));
priv->device_flashes_left = flashes_left;
}
/**
* fwupd_result_set_update_version:
* @result: A #FwupdResult
* @update_version: the update version, e.g. "1.2.4"
*
* Sets the update version.
*
* Since: 0.7.0
**/
void
fwupd_result_set_update_version (FwupdResult *result, const gchar *update_version)
{
FwupdResultPrivate *priv = GET_PRIVATE (result);
g_return_if_fail (FWUPD_IS_RESULT (result));
g_free (priv->update_version);
priv->update_version = g_strdup (update_version);
}
/**
* fwupd_result_get_update_filename:
* @result: A #FwupdResult
*
* Gets the update filename.
*
* Returns: the update filename, or %NULL if unset
*
* Since: 0.7.0
**/
const gchar *
fwupd_result_get_update_filename (FwupdResult *result)
{
FwupdResultPrivate *priv = GET_PRIVATE (result);
g_return_val_if_fail (FWUPD_IS_RESULT (result), NULL);
return priv->update_filename;
}
/**
* fwupd_result_set_update_filename:
* @result: A #FwupdResult
* @update_filename: the update filename on disk
*
* Sets the update filename.
*
* Since: 0.7.0
**/
void
fwupd_result_set_update_filename (FwupdResult *result, const gchar *update_filename)
{
FwupdResultPrivate *priv = GET_PRIVATE (result);
g_return_if_fail (FWUPD_IS_RESULT (result));
g_free (priv->update_filename);
priv->update_filename = g_strdup (update_filename);
}
/**
* fwupd_result_get_update_state:
* @result: A #FwupdResult
*
* Gets the update state.
*
* Returns: the update state, or %FWUPD_UPDATE_STATE_UNKNOWN if unset
*
* Since: 0.7.0
**/
FwupdUpdateState
fwupd_result_get_update_state (FwupdResult *result)
{
FwupdResultPrivate *priv = GET_PRIVATE (result);
g_return_val_if_fail (FWUPD_IS_RESULT (result), FWUPD_UPDATE_STATE_UNKNOWN);
return priv->update_state;
}
/**
* fwupd_result_set_update_state:
* @result: A #FwupdResult
* @update_state: the state, e.g. %FWUPD_UPDATE_STATE_PENDING
*
* Sets the update state.
*
* Since: 0.7.0
**/
void
fwupd_result_set_update_state (FwupdResult *result, FwupdUpdateState update_state)
{
FwupdResultPrivate *priv = GET_PRIVATE (result);
g_return_if_fail (FWUPD_IS_RESULT (result));
priv->update_state = update_state;
}
/**
* fwupd_result_get_update_checksum:
* @result: A #FwupdResult
*
* Gets the update checksum.
*
* Returns: the update checksum, or %NULL if unset
*
* Since: 0.7.0
**/
const gchar *
fwupd_result_get_update_checksum (FwupdResult *result)
{
FwupdResultPrivate *priv = GET_PRIVATE (result);
g_return_val_if_fail (FWUPD_IS_RESULT (result), NULL);
return priv->update_checksum;
}
/**
* fwupd_result_set_update_checksum:
* @result: A #FwupdResult
* @update_checksum: the update checksum
*
* Sets the update checksum.
*
* Since: 0.7.0
**/
void
fwupd_result_set_update_checksum (FwupdResult *result, const gchar *update_checksum)
{
FwupdResultPrivate *priv = GET_PRIVATE (result);
g_return_if_fail (FWUPD_IS_RESULT (result));
g_free (priv->update_checksum);
priv->update_checksum = g_strdup (update_checksum);
}
/**
* fwupd_result_get_update_checksum_kind:
* @result: A #FwupdResult
*
* Gets the update checkum kind.
*
* Returns: the #GChecksumType
*
* Since: 0.7.0
**/
GChecksumType
fwupd_result_get_update_checksum_kind (FwupdResult *result)
{
FwupdResultPrivate *priv = GET_PRIVATE (result);
g_return_val_if_fail (FWUPD_IS_RESULT (result), 0);
return priv->update_checksum_kind;
}
/**
* fwupd_result_set_update_checksum_kind:
* @result: A #FwupdResult
* @checkum_kind: the checksum kind, e.g. %G_CHECKSUM_SHA1
*
* Sets the update checkum kind.
*
* Since: 0.7.0
**/
void
fwupd_result_set_update_checksum_kind (FwupdResult *result, GChecksumType checkum_kind)
{
FwupdResultPrivate *priv = GET_PRIVATE (result);
g_return_if_fail (FWUPD_IS_RESULT (result));
priv->update_checksum_kind = checkum_kind;
}
/**
* fwupd_result_get_update_uri:
* @result: A #FwupdResult
*
* Gets the update uri.
*
* Returns: the update uri, or %NULL if unset
*
* Since: 0.7.0
**/
const gchar *
fwupd_result_get_update_uri (FwupdResult *result)
{
FwupdResultPrivate *priv = GET_PRIVATE (result);
g_return_val_if_fail (FWUPD_IS_RESULT (result), NULL);
return priv->update_uri;
}
/**
* fwupd_result_set_update_uri:
* @result: A #FwupdResult
* @update_uri: the update URI
*
* Sets the update uri, i.e. where you can download the firmware from.
*
* Since: 0.7.0
**/
void
fwupd_result_set_update_uri (FwupdResult *result, const gchar *update_uri)
{
FwupdResultPrivate *priv = GET_PRIVATE (result);
g_return_if_fail (FWUPD_IS_RESULT (result));
g_free (priv->update_uri);
priv->update_uri = g_strdup (update_uri);
}
/**
* fwupd_result_get_update_homepage:
* @result: A #FwupdResult
*
* Gets the update homepage.
*
* Returns: the update homepage, or %NULL if unset
*
* Since: 0.7.0
**/
const gchar *
fwupd_result_get_update_homepage (FwupdResult *result)
{
FwupdResultPrivate *priv = GET_PRIVATE (result);
g_return_val_if_fail (FWUPD_IS_RESULT (result), NULL);
return priv->update_homepage;
}
/**
* fwupd_result_set_update_homepage:
* @result: A #FwupdResult
* @update_homepage: the description
*
* Sets the update homepage.
*
* Since: 0.7.0
**/
void
fwupd_result_set_update_homepage (FwupdResult *result, const gchar *update_homepage)
{
FwupdResultPrivate *priv = GET_PRIVATE (result);
g_return_if_fail (FWUPD_IS_RESULT (result));
g_free (priv->update_homepage);
priv->update_homepage = g_strdup (update_homepage);
}
/**
* fwupd_result_get_update_description:
* @result: A #FwupdResult
*
* Gets the update description in AppStream markup format.
*
* Returns: the update description, or %NULL if unset
*
* Since: 0.7.0
**/
const gchar *
fwupd_result_get_update_description (FwupdResult *result)
{
FwupdResultPrivate *priv = GET_PRIVATE (result);
g_return_val_if_fail (FWUPD_IS_RESULT (result), NULL);
return priv->update_description;
}
/**
* fwupd_result_set_update_description:
* @result: A #FwupdResult
* @update_description: the update description in AppStream markup format
*
* Sets the update description.
*
* Since: 0.7.0
**/
void
fwupd_result_set_update_description (FwupdResult *result, const gchar *update_description)
{
FwupdResultPrivate *priv = GET_PRIVATE (result);
g_return_if_fail (FWUPD_IS_RESULT (result));
g_free (priv->update_description);
priv->update_description = g_strdup (update_description);
}
/**
* fwupd_result_get_update_id:
* @result: A #FwupdResult
*
* Gets the update id.
*
* Returns: the update id, or %NULL if unset
*
* Since: 0.7.0
**/
const gchar *
fwupd_result_get_update_id (FwupdResult *result)
{
FwupdResultPrivate *priv = GET_PRIVATE (result);
g_return_val_if_fail (FWUPD_IS_RESULT (result), NULL);
return priv->update_id;
}
/**
* fwupd_result_set_update_id:
* @result: A #FwupdResult
* @update_id: the AppStream component ID, e.g. "org.hughski.ColorHug2.firmware"
*
* Sets the update id.
*
* Since: 0.7.0
**/
void
fwupd_result_set_update_id (FwupdResult *result, const gchar *update_id)
{
FwupdResultPrivate *priv = GET_PRIVATE (result);
g_return_if_fail (FWUPD_IS_RESULT (result));
g_free (priv->update_id);
priv->update_id = g_strdup (update_id);
}
/**
* fwupd_result_get_update_size:
* @result: A #FwupdResult
*
* Gets the update size.
*
* Returns: the update size in bytes, or 0 if unset
*
* Since: 0.7.0
**/
guint64
fwupd_result_get_update_size (FwupdResult *result)
{
FwupdResultPrivate *priv = GET_PRIVATE (result);
g_return_val_if_fail (FWUPD_IS_RESULT (result), 0);
return priv->update_size;
}
/**
* fwupd_result_set_update_size:
* @result: A #FwupdResult
* @update_size: the update size in bytes
*
* Sets the update size.
*
* Since: 0.7.0
**/
void
fwupd_result_set_update_size (FwupdResult *result, guint64 update_size)
{
FwupdResultPrivate *priv = GET_PRIVATE (result);
g_return_if_fail (FWUPD_IS_RESULT (result));
priv->update_size = update_size;
}
/**
* fwupd_result_get_device_checksum:
* @result: A #FwupdResult
*
* Gets the device checksum.
*
* Returns: the device checksum, or %NULL if unset
*
* Since: 0.7.0
**/
const gchar *
fwupd_result_get_device_checksum (FwupdResult *result)
{
FwupdResultPrivate *priv = GET_PRIVATE (result);
g_return_val_if_fail (FWUPD_IS_RESULT (result), NULL);
return priv->device_checksum;
}
/**
* fwupd_result_set_device_checksum:
* @result: A #FwupdResult
* @device_checksum: the device checksum
*
* Sets the device checksum, i.e. what is on the device right now.
*
* Since: 0.7.0
**/
void
fwupd_result_set_device_checksum (FwupdResult *result, const gchar *device_checksum)
{
FwupdResultPrivate *priv = GET_PRIVATE (result);
g_return_if_fail (FWUPD_IS_RESULT (result));
g_free (priv->device_checksum);
priv->device_checksum = g_strdup (device_checksum);
}
/**
* fwupd_result_get_device_checksum_kind:
* @result: A #FwupdResult
*
* Gets the device checkum kind.
*
* Returns: the #GChecksumType
*
* Since: 0.7.0
**/
GChecksumType
fwupd_result_get_device_checksum_kind (FwupdResult *result)
{
FwupdResultPrivate *priv = GET_PRIVATE (result);
g_return_val_if_fail (FWUPD_IS_RESULT (result), 0);
return priv->device_checksum_kind;
}
/**
* fwupd_result_set_device_checksum_kind:
* @result: A #FwupdResult
* @checkum_kind: the checksum kind, e.g. %G_CHECKSUM_SHA1
*
* Sets the device checkum kind.
*
* Since: 0.7.0
**/
void
fwupd_result_set_device_checksum_kind (FwupdResult *result, GChecksumType checkum_kind)
{
FwupdResultPrivate *priv = GET_PRIVATE (result);
g_return_if_fail (FWUPD_IS_RESULT (result));
priv->device_checksum_kind = checkum_kind;
}
/**
* fwupd_result_get_update_summary:
* @result: A #FwupdResult
*
* Gets the update summary.
*
* Returns: the update summary, or %NULL if unset
*
* Since: 0.7.0
**/
const gchar *
fwupd_result_get_update_summary (FwupdResult *result)
{
FwupdResultPrivate *priv = GET_PRIVATE (result);
g_return_val_if_fail (FWUPD_IS_RESULT (result), NULL);
return priv->update_summary;
}
/**
* fwupd_result_set_update_summary:
* @result: A #FwupdResult
* @update_summary: the update one line summary
*
* Sets the update summary.
*
* Since: 0.7.0
**/
void
fwupd_result_set_update_summary (FwupdResult *result, const gchar *update_summary)
{
FwupdResultPrivate *priv = GET_PRIVATE (result);
g_return_if_fail (FWUPD_IS_RESULT (result));
g_free (priv->update_summary);
priv->update_summary = g_strdup (update_summary);
}
/**
* fwupd_result_get_device_provider:
* @result: A #FwupdResult
*
* Gets the device provider.
*
* Returns: the device provider, or %NULL if unset
*
* Since: 0.7.0
**/
const gchar *
fwupd_result_get_device_provider (FwupdResult *result)
{
FwupdResultPrivate *priv = GET_PRIVATE (result);
g_return_val_if_fail (FWUPD_IS_RESULT (result), NULL);
return priv->device_provider;
}
/**
* fwupd_result_set_device_provider:
* @result: A #FwupdResult
* @device_provider: the provider name, e.g. "colorhug"
*
* Sets the device provider.
*
* Since: 0.7.0
**/
void
fwupd_result_set_device_provider (FwupdResult *result, const gchar *device_provider)
{
FwupdResultPrivate *priv = GET_PRIVATE (result);
g_return_if_fail (FWUPD_IS_RESULT (result));
g_free (priv->device_provider);
priv->device_provider = g_strdup (device_provider);
}
/**
* fwupd_result_get_update_error:
* @result: A #FwupdResult
*
* Gets the update error.
*
* Returns: the update error, or %NULL if unset
*
* Since: 0.7.0
**/
const gchar *
fwupd_result_get_update_error (FwupdResult *result)
{
FwupdResultPrivate *priv = GET_PRIVATE (result);
g_return_val_if_fail (FWUPD_IS_RESULT (result), NULL);
return priv->update_error;
}
/**
* fwupd_result_set_update_error:
* @result: A #FwupdResult
* @update_error: the update error string
*
* Sets the update error.
*
* Since: 0.7.0
**/
void
fwupd_result_set_update_error (FwupdResult *result, const gchar *update_error)
{
FwupdResultPrivate *priv = GET_PRIVATE (result);
g_return_if_fail (FWUPD_IS_RESULT (result));
g_free (priv->update_error);
priv->update_error = g_strdup (update_error);
}
/**
* fwupd_result_get_update_trust_flags:
* @result: A #FwupdResult
*
* Gets the update trust_flags.
*
* Returns: the #FwupdTrustFlags, or 0 if unset
*
* Since: 0.7.0
**/
FwupdTrustFlags
fwupd_result_get_update_trust_flags (FwupdResult *result)
{
FwupdResultPrivate *priv = GET_PRIVATE (result);
g_return_val_if_fail (FWUPD_IS_RESULT (result), 0);
return priv->update_trust_flags;
}
/**
* fwupd_result_set_update_trust_flags:
* @result: A #FwupdResult
* @trust_flags: the trust flags, e.g. %FWUPD_TRUST_FLAG_PAYLOAD
*
* Sets the update trust_flags.
*
* Since: 0.7.0
**/
void
fwupd_result_set_update_trust_flags (FwupdResult *result, FwupdTrustFlags trust_flags)
{
FwupdResultPrivate *priv = GET_PRIVATE (result);
g_return_if_fail (FWUPD_IS_RESULT (result));
priv->update_trust_flags = trust_flags;
}
/**
* fwupd_result_get_update_vendor:
* @result: A #FwupdResult
*
* Gets the update vendor.
*
* Returns: the update vendor, or %NULL if unset
*
* Since: 0.7.0
**/
const gchar *
fwupd_result_get_update_vendor (FwupdResult *result)
{
FwupdResultPrivate *priv = GET_PRIVATE (result);
g_return_val_if_fail (FWUPD_IS_RESULT (result), NULL);
return priv->update_vendor;
}
/**
* fwupd_result_set_update_vendor:
* @result: A #FwupdResult
* @update_vendor: the vendor name, e.g. "Hughski Limited"
*
* Sets the update vendor.
*
* Since: 0.7.0
**/
void
fwupd_result_set_update_vendor (FwupdResult *result, const gchar *update_vendor)
{
FwupdResultPrivate *priv = GET_PRIVATE (result);
g_return_if_fail (FWUPD_IS_RESULT (result));
g_free (priv->update_vendor);
priv->update_vendor = g_strdup (update_vendor);
}
/**
* fwupd_result_get_update_license:
* @result: A #FwupdResult
*
* Gets the update license.
*
* Returns: the update license, or %NULL if unset
*
* Since: 0.7.0
**/
const gchar *
fwupd_result_get_update_license (FwupdResult *result)
{
FwupdResultPrivate *priv = GET_PRIVATE (result);
g_return_val_if_fail (FWUPD_IS_RESULT (result), NULL);
return priv->update_license;
}
/**
* fwupd_result_set_update_license:
* @result: A #FwupdResult
* @update_license: the description
*
* Sets the update license.
*
* Since: 0.7.0
**/
void
fwupd_result_set_update_license (FwupdResult *result, const gchar *update_license)
{
FwupdResultPrivate *priv = GET_PRIVATE (result);
g_return_if_fail (FWUPD_IS_RESULT (result));
g_free (priv->update_license);
priv->update_license = g_strdup (update_license);
}
/**
* fwupd_result_get_update_name:
* @result: A #FwupdResult
*
* Gets the update name.
*
* Returns: the update name, or %NULL if unset
*
* Since: 0.7.0
**/
const gchar *
fwupd_result_get_update_name (FwupdResult *result)
{
FwupdResultPrivate *priv = GET_PRIVATE (result);
g_return_val_if_fail (FWUPD_IS_RESULT (result), NULL);
return priv->update_name;
}
/**
* fwupd_result_set_update_name:
* @result: A #FwupdResult
* @update_name: the description
*
* Sets the update name.
*
* Since: 0.7.0
**/
void
fwupd_result_set_update_name (FwupdResult *result, const gchar *update_name)
{
FwupdResultPrivate *priv = GET_PRIVATE (result);
g_return_if_fail (FWUPD_IS_RESULT (result));
g_free (priv->update_name);
priv->update_name = g_strdup (update_name);
}
/**
* fwupd_result_get_device_flags:
* @result: A #FwupdResult
*
* Gets the device flags.
*
* Returns: the device flags, or 0 if unset
*
* Since: 0.7.0
**/
guint64
fwupd_result_get_device_flags (FwupdResult *result)
{
FwupdResultPrivate *priv = GET_PRIVATE (result);
g_return_val_if_fail (FWUPD_IS_RESULT (result), 0);
return priv->device_flags;
}
/**
* fwupd_result_set_device_flags:
* @result: A #FwupdResult
* @device_flags: the device flags, e.g. %FWUPD_DEVICE_FLAG_REQUIRE_AC
*
* Sets the device flags.
*
* Since: 0.7.0
**/
void
fwupd_result_set_device_flags (FwupdResult *result, guint64 device_flags)
{
FwupdResultPrivate *priv = GET_PRIVATE (result);
g_return_if_fail (FWUPD_IS_RESULT (result));
priv->device_flags = device_flags;
}
/**
* fwupd_result_add_device_flag:
* @result: A #FwupdResult
* @flag: the #FwupdDeviceFlags
*
* Adds a specific device flag to the result.
*
* Since: 0.7.0
**/
void
fwupd_result_add_device_flag (FwupdResult *result, FwupdDeviceFlags flag)
{
FwupdResultPrivate *priv = GET_PRIVATE (result);
g_return_if_fail (FWUPD_IS_RESULT (result));
priv->device_flags |= flag;
}
/**
* fwupd_result_remove_device_flag:
* @result: A #FwupdResult
* @flag: the #FwupdDeviceFlags
*
* Removes a specific device flag from the result.
*
* Since: 0.7.3
**/
void
fwupd_result_remove_device_flag (FwupdResult *result, FwupdDeviceFlags flag)
{
FwupdResultPrivate *priv = GET_PRIVATE (result);
g_return_if_fail (FWUPD_IS_RESULT (result));
priv->device_flags &= ~flag;
}
/**
* fwupd_result_has_device_flag:
* @result: A #FwupdResult
* @flag: the #FwupdDeviceFlags
*
* Finds if the device has a specific device flag.
*
* Returns: %TRUE if the flag is set
*
* Since: 0.7.0
**/
gboolean
fwupd_result_has_device_flag (FwupdResult *result, FwupdDeviceFlags flag)
{
FwupdResultPrivate *priv = GET_PRIVATE (result);
g_return_val_if_fail (FWUPD_IS_RESULT (result), FALSE);
return (priv->device_flags & flag) > 0;
}
/**
* fwupd_result_get_device_created:
* @result: A #FwupdResult
*
* Gets when the result was device_created.
*
* Returns: the UNIX time, or 0 if unset
*
* Since: 0.7.0
**/
guint64
fwupd_result_get_device_created (FwupdResult *result)
{
FwupdResultPrivate *priv = GET_PRIVATE (result);
g_return_val_if_fail (FWUPD_IS_RESULT (result), 0);
return priv->device_created;
}
/**
* fwupd_result_set_device_created:
* @result: A #FwupdResult
* @device_created: the UNIX time
*
* Sets when the result was device_created.
*
* Since: 0.7.0
**/
void
fwupd_result_set_device_created (FwupdResult *result, guint64 device_created)
{
FwupdResultPrivate *priv = GET_PRIVATE (result);
g_return_if_fail (FWUPD_IS_RESULT (result));
priv->device_created = device_created;
}
/**
* fwupd_result_get_device_modified:
* @result: A #FwupdResult
*
* Gets when the result was device_modified.
*
* Returns: the UNIX time, or 0 if unset
*
* Since: 0.7.0
**/
guint64
fwupd_result_get_device_modified (FwupdResult *result)
{
FwupdResultPrivate *priv = GET_PRIVATE (result);
g_return_val_if_fail (FWUPD_IS_RESULT (result), 0);
return priv->device_modified;
}
/**
* fwupd_result_set_device_modified:
* @result: A #FwupdResult
* @device_modified: the UNIX time
*
* Sets when the result was device_modified.
*
* Since: 0.7.0
**/
void
fwupd_result_set_device_modified (FwupdResult *result, guint64 device_modified)
{
FwupdResultPrivate *priv = GET_PRIVATE (result);
g_return_if_fail (FWUPD_IS_RESULT (result));
priv->device_modified = device_modified;
}
/**
* fwupd_result_to_data:
* @result: A #FwupdResult
* @type_string: The Gvariant type string, e.g. "{sa{sv}}" or "(a{sv})"
*
* Creates a GVariant from the result data.
*
* Returns: the GVariant, or %NULL for error
*
* Since: 0.7.0
**/
GVariant *
fwupd_result_to_data (FwupdResult *result, const gchar *type_string)
{
FwupdResultPrivate *priv = GET_PRIVATE (result);
GVariantBuilder builder;
g_return_val_if_fail (FWUPD_IS_RESULT (result), NULL);
g_return_val_if_fail (type_string != NULL, NULL);
/* create an array with all the metadata in */
g_variant_builder_init (&builder, G_VARIANT_TYPE_ARRAY);
if (priv->guids->len > 0) {
guint i;
g_autoptr(GString) str = g_string_new ("");
for (i = 0; i < priv->guids->len; i++) {
const gchar *guid = g_ptr_array_index (priv->guids, i);
g_string_append_printf (str, "%s,", guid);
}
if (str->len > 0)
g_string_truncate (str, str->len - 1);
g_variant_builder_add (&builder, "{sv}",
FWUPD_RESULT_KEY_GUID,
g_variant_new_string (str->str));
}
if (priv->unique_id != NULL) {
g_variant_builder_add (&builder, "{sv}",
FWUPD_RESULT_KEY_UNIQUE_ID,
g_variant_new_string (priv->unique_id));
}
if (priv->device_name != NULL) {
g_variant_builder_add (&builder, "{sv}",
FWUPD_RESULT_KEY_DEVICE_NAME,
g_variant_new_string (priv->device_name));
}
if (priv->device_vendor != NULL) {
g_variant_builder_add (&builder, "{sv}",
FWUPD_RESULT_KEY_DEVICE_VENDOR,
g_variant_new_string (priv->device_vendor));
}
if (priv->device_flags > 0) {
g_variant_builder_add (&builder, "{sv}",
FWUPD_RESULT_KEY_DEVICE_FLAGS,
g_variant_new_uint64 (priv->device_flags));
}
if (priv->device_created > 0) {
g_variant_builder_add (&builder, "{sv}",
FWUPD_RESULT_KEY_DEVICE_CREATED,
g_variant_new_uint64 (priv->device_created));
}
if (priv->device_modified > 0) {
g_variant_builder_add (&builder, "{sv}",
FWUPD_RESULT_KEY_DEVICE_MODIFIED,
g_variant_new_uint64 (priv->device_modified));
}
if (priv->update_id != NULL) {
g_variant_builder_add (&builder, "{sv}",
FWUPD_RESULT_KEY_UPDATE_ID,
g_variant_new_string (priv->update_id));
}
if (priv->device_description != NULL) {
g_variant_builder_add (&builder, "{sv}",
FWUPD_RESULT_KEY_DEVICE_DESCRIPTION,
g_variant_new_string (priv->device_description));
}
if (priv->update_filename != NULL) {
g_variant_builder_add (&builder, "{sv}",
FWUPD_RESULT_KEY_UPDATE_FILENAME,
g_variant_new_string (priv->update_filename));
}
if (priv->device_checksum != NULL) {
g_variant_builder_add (&builder, "{sv}",
FWUPD_RESULT_KEY_DEVICE_CHECKSUM,
g_variant_new_string (priv->device_checksum));
g_variant_builder_add (&builder, "{sv}",
FWUPD_RESULT_KEY_DEVICE_CHECKSUM_KIND,
g_variant_new_uint32 (priv->device_checksum_kind));
}
if (priv->update_license != NULL) {
g_variant_builder_add (&builder, "{sv}",
FWUPD_RESULT_KEY_UPDATE_LICENSE,
g_variant_new_string (priv->update_license));
}
if (priv->update_name != NULL) {
g_variant_builder_add (&builder, "{sv}",
FWUPD_RESULT_KEY_UPDATE_NAME,
g_variant_new_string (priv->update_name));
}
if (priv->update_error != NULL) {
g_variant_builder_add (&builder, "{sv}",
FWUPD_RESULT_KEY_UPDATE_ERROR,
g_variant_new_string (priv->update_error));
}
if (priv->update_state != FWUPD_UPDATE_STATE_UNKNOWN) {
g_variant_builder_add (&builder, "{sv}",
FWUPD_RESULT_KEY_UPDATE_STATE,
g_variant_new_uint32 (priv->update_state));
}
if (priv->device_provider != NULL) {
g_variant_builder_add (&builder, "{sv}",
FWUPD_RESULT_KEY_DEVICE_PLUGIN,
g_variant_new_string (priv->device_provider));
}
if (priv->update_size != 0) {
g_variant_builder_add (&builder, "{sv}",
FWUPD_RESULT_KEY_UPDATE_SIZE,
g_variant_new_uint64 (priv->update_size));
}
if (priv->update_trust_flags != 0) {
g_variant_builder_add (&builder, "{sv}",
FWUPD_RESULT_KEY_UPDATE_TRUST_FLAGS,
g_variant_new_uint64 (priv->update_trust_flags));
}
if (priv->update_summary != NULL) {
g_variant_builder_add (&builder, "{sv}",
FWUPD_RESULT_KEY_UPDATE_SUMMARY,
g_variant_new_string (priv->update_summary));
}
if (priv->update_description != NULL) {
g_variant_builder_add (&builder, "{sv}",
FWUPD_RESULT_KEY_UPDATE_DESCRIPTION,
g_variant_new_string (priv->update_description));
}
if (priv->update_checksum != NULL) {
g_variant_builder_add (&builder, "{sv}",
FWUPD_RESULT_KEY_UPDATE_CHECKSUM,
g_variant_new_string (priv->update_checksum));
g_variant_builder_add (&builder, "{sv}",
FWUPD_RESULT_KEY_UPDATE_CHECKSUM_KIND,
g_variant_new_uint32 (priv->update_checksum_kind));
}
if (priv->update_uri != NULL) {
g_variant_builder_add (&builder, "{sv}",
FWUPD_RESULT_KEY_UPDATE_URI,
g_variant_new_string (priv->update_uri));
}
if (priv->update_homepage != NULL) {
g_variant_builder_add (&builder, "{sv}",
FWUPD_RESULT_KEY_UPDATE_HOMEPAGE,
g_variant_new_string (priv->update_homepage));
}
if (priv->update_version != NULL) {
g_variant_builder_add (&builder, "{sv}",
FWUPD_RESULT_KEY_UPDATE_VERSION,
g_variant_new_string (priv->update_version));
}
if (priv->update_vendor != NULL) {
g_variant_builder_add (&builder, "{sv}",
FWUPD_RESULT_KEY_UPDATE_VENDOR,
g_variant_new_string (priv->update_vendor));
}
if (priv->device_version != NULL) {
g_variant_builder_add (&builder, "{sv}",
FWUPD_RESULT_KEY_DEVICE_VERSION,
g_variant_new_string (priv->device_version));
}
if (priv->device_version_lowest != NULL) {
g_variant_builder_add (&builder, "{sv}",
FWUPD_RESULT_KEY_DEVICE_VERSION_LOWEST,
g_variant_new_string (priv->device_version_lowest));
}
if (priv->device_version_bootloader != NULL) {
g_variant_builder_add (&builder, "{sv}",
FWUPD_RESULT_KEY_DEVICE_VERSION_BOOTLOADER,
g_variant_new_string (priv->device_version_bootloader));
}
if (priv->device_flashes_left > 0) {
g_variant_builder_add (&builder, "{sv}",
FWUPD_RESULT_KEY_DEVICE_FLASHES_LEFT,
g_variant_new_uint32 (priv->device_flashes_left));
}
/* supported types */
if (g_strcmp0 (type_string, "{sa{sv}}") == 0) {
const gchar *device_id = priv->device_id;
if (device_id == NULL)
device_id = "";
return g_variant_new ("{sa{sv}}", device_id, &builder);
}
if (g_strcmp0 (type_string, "(a{sv})") == 0)
return g_variant_new ("(a{sv})", &builder);
return NULL;
}
static void
fwupd_result_from_kv (FwupdResult *result, const gchar *key, GVariant *value)
{
if (g_strcmp0 (key, FWUPD_RESULT_KEY_DEVICE_FLAGS) == 0) {
fwupd_result_set_device_flags (result, g_variant_get_uint64 (value));
return;
}
if (g_strcmp0 (key, FWUPD_RESULT_KEY_DEVICE_CREATED) == 0) {
fwupd_result_set_device_created (result, g_variant_get_uint64 (value));
return;
}
if (g_strcmp0 (key, FWUPD_RESULT_KEY_DEVICE_MODIFIED) == 0) {
fwupd_result_set_device_modified (result, g_variant_get_uint64 (value));
return;
}
if (g_strcmp0 (key, FWUPD_RESULT_KEY_GUID) == 0) {
guint i;
const gchar *guids = g_variant_get_string (value, NULL);
g_auto(GStrv) split = g_strsplit (guids, ",", -1);
for (i = 0; split[i] != NULL; i++)
fwupd_result_add_guid (result, split[i]);
return;
}
if (g_strcmp0 (key, FWUPD_RESULT_KEY_UNIQUE_ID) == 0) {
fwupd_result_set_unique_id (result, g_variant_get_string (value, NULL));
return;
}
if (g_strcmp0 (key, FWUPD_RESULT_KEY_DEVICE_NAME) == 0) {
fwupd_result_set_device_name (result, g_variant_get_string (value, NULL));
return;
}
if (g_strcmp0 (key, FWUPD_RESULT_KEY_DEVICE_VENDOR) == 0) {
fwupd_result_set_device_vendor (result, g_variant_get_string (value, NULL));
return;
}
if (g_strcmp0 (key, FWUPD_RESULT_KEY_UPDATE_TRUST_FLAGS) == 0) {
fwupd_result_set_update_trust_flags (result, g_variant_get_uint64 (value));
return;
}
if (g_strcmp0 (key, FWUPD_RESULT_KEY_UPDATE_ID) == 0) {
fwupd_result_set_update_id (result, g_variant_get_string (value, NULL));
return;
}
if (g_strcmp0 (key, FWUPD_RESULT_KEY_DEVICE_DESCRIPTION) == 0) {
fwupd_result_set_device_description (result, g_variant_get_string (value, NULL));
return;
}
if (g_strcmp0 (key, FWUPD_RESULT_KEY_UPDATE_FILENAME) == 0) {
fwupd_result_set_update_filename (result, g_variant_get_string (value, NULL));
return;
}
if (g_strcmp0 (key, FWUPD_RESULT_KEY_DEVICE_CHECKSUM) == 0) {
fwupd_result_set_device_checksum (result, g_variant_get_string (value, NULL));
return;
}
if (g_strcmp0 (key, FWUPD_RESULT_KEY_DEVICE_CHECKSUM_KIND) == 0) {
fwupd_result_set_device_checksum_kind (result, g_variant_get_uint32 (value));
return;
}
if (g_strcmp0 (key, FWUPD_RESULT_KEY_UPDATE_LICENSE) == 0) {
fwupd_result_set_update_license (result, g_variant_get_string (value, NULL));
return;
}
if (g_strcmp0 (key, FWUPD_RESULT_KEY_UPDATE_NAME) == 0) {
fwupd_result_set_update_name (result, g_variant_get_string (value, NULL));
return;
}
if (g_strcmp0 (key, FWUPD_RESULT_KEY_UPDATE_ERROR) == 0) {
fwupd_result_set_update_error (result, g_variant_get_string (value, NULL));
return;
}
if (g_strcmp0 (key, FWUPD_RESULT_KEY_UPDATE_STATE) == 0) {
/* old daemon version and new client */
if (g_strcmp0 (g_variant_get_type_string (value), "s") == 0) {
FwupdUpdateState tmp;
tmp = fwupd_update_state_from_string (g_variant_get_string (value, NULL));
fwupd_result_set_update_state (result, tmp);
} else {
fwupd_result_set_update_state (result, g_variant_get_uint32 (value));
}
return;
}
if (g_strcmp0 (key, FWUPD_RESULT_KEY_DEVICE_PLUGIN) == 0) {
fwupd_result_set_device_provider (result, g_variant_get_string (value, NULL));
return;
}
if (g_strcmp0 (key, FWUPD_RESULT_KEY_UPDATE_SIZE) == 0) {
fwupd_result_set_update_size (result, g_variant_get_uint64 (value));
return;
}
if (g_strcmp0 (key, FWUPD_RESULT_KEY_UPDATE_SUMMARY) == 0) {
fwupd_result_set_update_summary (result, g_variant_get_string (value, NULL));
return;
}
if (g_strcmp0 (key, FWUPD_RESULT_KEY_UPDATE_DESCRIPTION) == 0) {
fwupd_result_set_update_description (result, g_variant_get_string (value, NULL));
return;
}
if (g_strcmp0 (key, FWUPD_RESULT_KEY_UPDATE_CHECKSUM) == 0) {
fwupd_result_set_update_checksum (result, g_variant_get_string (value, NULL));
return;
}
if (g_strcmp0 (key, FWUPD_RESULT_KEY_UPDATE_CHECKSUM_KIND) == 0) {
fwupd_result_set_update_checksum_kind (result, g_variant_get_uint32 (value));
return;
}
if (g_strcmp0 (key, FWUPD_RESULT_KEY_UPDATE_URI) == 0) {
fwupd_result_set_update_uri (result, g_variant_get_string (value, NULL));
return;
}
if (g_strcmp0 (key, FWUPD_RESULT_KEY_UPDATE_HOMEPAGE) == 0) {
fwupd_result_set_update_homepage (result, g_variant_get_string (value, NULL));
return;
}
if (g_strcmp0 (key, FWUPD_RESULT_KEY_UPDATE_VERSION) == 0) {
fwupd_result_set_update_version (result, g_variant_get_string (value, NULL));
return;
}
if (g_strcmp0 (key, FWUPD_RESULT_KEY_UPDATE_VENDOR) == 0) {
fwupd_result_set_update_vendor (result, g_variant_get_string (value, NULL));
return;
}
if (g_strcmp0 (key, FWUPD_RESULT_KEY_DEVICE_VERSION) == 0) {
fwupd_result_set_device_version (result, g_variant_get_string (value, NULL));
return;
}
if (g_strcmp0 (key, FWUPD_RESULT_KEY_DEVICE_VERSION_LOWEST) == 0) {
fwupd_result_set_device_version_lowest (result, g_variant_get_string (value, NULL));
return;
}
if (g_strcmp0 (key, FWUPD_RESULT_KEY_DEVICE_VERSION_BOOTLOADER) == 0) {
fwupd_result_set_device_version_bootloader (result, g_variant_get_string (value, NULL));
return;
}
if (g_strcmp0 (key, FWUPD_RESULT_KEY_DEVICE_FLASHES_LEFT) == 0) {
fwupd_result_set_device_flashes_left (result, g_variant_get_uint32 (value));
return;
}
}
static void
fwupd_pad_kv_str (GString *str, const gchar *key, const gchar *value)
{
/* ignore */
if (key == NULL || value == NULL)
return;
g_string_append_printf (str, " %s: ", key);
for (gsize i = strlen (key); i < 20; i++)
g_string_append (str, " ");
g_string_append_printf (str, "%s\n", value);
}
static void
fwupd_pad_kv_unx (GString *str, const gchar *key, guint64 value)
{
g_autoptr(GDateTime) date = NULL;
g_autofree gchar *tmp = NULL;
/* ignore */
if (value == 0)
return;
date = g_date_time_new_from_unix_utc ((gint64) value);
tmp = g_date_time_format (date, "%F");
fwupd_pad_kv_str (str, key, tmp);
}
static void
fwupd_pad_kv_ups (GString *str, const gchar *key, FwupdUpdateState value)
{
if (value == FWUPD_UPDATE_STATE_UNKNOWN)
return;
fwupd_pad_kv_str (str, key, fwupd_update_state_to_string (value));
}
static void
fwupd_pad_kv_siz (GString *str, const gchar *key, guint64 value)
{
g_autofree gchar *tmp = NULL;
/* ignore */
if (value == 0)
return;
tmp = g_format_size (value);
fwupd_pad_kv_str (str, key, tmp);
}
static void
fwupd_pad_kv_int (GString *str, const gchar *key, guint32 value)
{
g_autofree gchar *tmp = NULL;
/* ignore */
if (value == 0)
return;
tmp = g_strdup_printf("%" G_GUINT32_FORMAT, value);
fwupd_pad_kv_str (str, key, tmp);
}
static void
fwupd_pad_kv_dfl (GString *str, const gchar *key, guint64 device_flags)
{
guint i;
g_autoptr(GString) tmp = NULL;
tmp = g_string_new ("");
for (i = 0; i < 64; i++) {
if ((device_flags & ((guint64) 1 << i)) == 0)
continue;
g_string_append_printf (tmp, "%s|",
fwupd_device_flag_to_string ((guint64) 1 << i));
}
if (tmp->len == 0) {
g_string_append (tmp, fwupd_device_flag_to_string (0));
} else {
g_string_truncate (tmp, tmp->len - 1);
}
fwupd_pad_kv_str (str, key, tmp->str);
}
static void
fwupd_pad_kv_tfl (GString *str, const gchar *key, FwupdTrustFlags trust_flags)
{
guint i;
g_autoptr(GString) tmp = NULL;
tmp = g_string_new ("");
for (i = 1; i < FWUPD_TRUST_FLAG_LAST; i *= 2) {
if ((trust_flags & i) == 0)
continue;
g_string_append_printf (tmp, "%s|",
fwupd_trust_flag_to_string (i));
}
if (tmp->len == 0) {
g_string_append (tmp, fwupd_trust_flag_to_string (0));
} else {
g_string_truncate (tmp, tmp->len - 1);
}
fwupd_pad_kv_str (str, key, tmp->str);
}
static void
fwupd_pad_kv_csk (GString *str, const gchar *key, GChecksumType checksum_type)
{
const gchar *tmp = "unknown";
if (checksum_type == G_CHECKSUM_SHA1)
tmp = "sha1";
else if (checksum_type == G_CHECKSUM_SHA256)
tmp = "sha256";
else if (checksum_type == G_CHECKSUM_SHA512)
tmp = "sha512";
fwupd_pad_kv_str (str, key, tmp);
}
/**
* fwupd_result_to_string:
* @result: A #FwupdResult
*
* Builds a text representation of the object.
*
* Returns: text, or %NULL for invalid
*
* Since: 0.7.0
**/
gchar *
fwupd_result_to_string (FwupdResult *result)
{
FwupdResultPrivate *priv = GET_PRIVATE (result);
GString *str;
guint i;
g_return_val_if_fail (FWUPD_IS_RESULT (result), NULL);
str = g_string_new ("");
/* not set when using GetDetails */
if (priv->device_name != NULL)
g_string_append_printf (str, "%s\n", priv->device_name);
else {
if (priv->update_name != NULL)
g_string_append_printf( str, "%s\n", priv->update_name);
else
g_string_append_printf (str, "%s\n", "Unknown Device");
}
/* device */
for (i = 0; i < priv->guids->len; i++) {
const gchar *guid = g_ptr_array_index (priv->guids, i);
fwupd_pad_kv_str (str, FWUPD_RESULT_KEY_GUID, guid);
}
fwupd_pad_kv_str (str, FWUPD_RESULT_KEY_UNIQUE_ID, priv->unique_id);
fwupd_pad_kv_str (str, FWUPD_RESULT_KEY_DEVICE_ID, priv->device_id);
fwupd_pad_kv_str (str, FWUPD_RESULT_KEY_DEVICE_DESCRIPTION, priv->device_description);
fwupd_pad_kv_str (str, FWUPD_RESULT_KEY_DEVICE_PLUGIN, priv->device_provider);
fwupd_pad_kv_dfl (str, FWUPD_RESULT_KEY_DEVICE_FLAGS, priv->device_flags);
fwupd_pad_kv_str (str, FWUPD_RESULT_KEY_DEVICE_CHECKSUM, priv->device_checksum);
if (priv->device_checksum != NULL)
fwupd_pad_kv_csk (str, FWUPD_RESULT_KEY_DEVICE_CHECKSUM_KIND, priv->device_checksum_kind);
fwupd_pad_kv_str (str, FWUPD_RESULT_KEY_DEVICE_VENDOR, priv->device_vendor);
fwupd_pad_kv_str (str, FWUPD_RESULT_KEY_DEVICE_VERSION, priv->device_version);
fwupd_pad_kv_str (str, FWUPD_RESULT_KEY_DEVICE_VERSION_LOWEST, priv->device_version_lowest);
fwupd_pad_kv_str (str, FWUPD_RESULT_KEY_DEVICE_VERSION_BOOTLOADER, priv->device_version_bootloader);
if (priv->device_flashes_left < 2)
fwupd_pad_kv_int (str, FWUPD_RESULT_KEY_DEVICE_FLASHES_LEFT, priv->device_flashes_left);
fwupd_pad_kv_unx (str, FWUPD_RESULT_KEY_DEVICE_CREATED, priv->device_created);
fwupd_pad_kv_unx (str, FWUPD_RESULT_KEY_DEVICE_MODIFIED, priv->device_modified);
/* updates */
fwupd_pad_kv_str (str, FWUPD_RESULT_KEY_UPDATE_ID, priv->update_id);
fwupd_pad_kv_str (str, FWUPD_RESULT_KEY_UPDATE_SUMMARY, priv->update_summary);
fwupd_pad_kv_str (str, FWUPD_RESULT_KEY_UPDATE_DESCRIPTION, priv->update_description);
fwupd_pad_kv_str (str, FWUPD_RESULT_KEY_UPDATE_VERSION, priv->update_version);
fwupd_pad_kv_str (str, FWUPD_RESULT_KEY_UPDATE_FILENAME, priv->update_filename);
fwupd_pad_kv_str (str, FWUPD_RESULT_KEY_UPDATE_CHECKSUM, priv->update_checksum);
if (priv->update_checksum != NULL)
fwupd_pad_kv_csk (str, FWUPD_RESULT_KEY_UPDATE_CHECKSUM_KIND, priv->update_checksum_kind);
fwupd_pad_kv_str (str, FWUPD_RESULT_KEY_UPDATE_LICENSE, priv->update_license);
fwupd_pad_kv_siz (str, FWUPD_RESULT_KEY_UPDATE_SIZE, priv->update_size);
fwupd_pad_kv_str (str, FWUPD_RESULT_KEY_UPDATE_URI, priv->update_uri);
fwupd_pad_kv_str (str, FWUPD_RESULT_KEY_UPDATE_HOMEPAGE, priv->update_homepage);
fwupd_pad_kv_str (str, FWUPD_RESULT_KEY_UPDATE_VENDOR, priv->update_vendor);
fwupd_pad_kv_ups (str, FWUPD_RESULT_KEY_UPDATE_STATE, priv->update_state);
fwupd_pad_kv_str (str, FWUPD_RESULT_KEY_UPDATE_ERROR, priv->update_error);
if (priv->update_version != NULL)
fwupd_pad_kv_tfl (str, FWUPD_RESULT_KEY_UPDATE_TRUST_FLAGS, priv->update_trust_flags);
return g_string_free (str, FALSE);
}
static void
fwupd_result_get_property (GObject *object, guint prop_id,
GValue *value, GParamSpec *pspec)
{
FwupdResult *result = FWUPD_RESULT (object);
FwupdResultPrivate *priv = GET_PRIVATE (result);
switch (prop_id) {
case PROP_DEVICE_ID:
g_value_set_string (value, priv->device_id);
break;
case PROP_UNIQUE_ID:
g_value_set_string (value, priv->unique_id);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
}
static void
fwupd_result_set_property (GObject *object, guint prop_id,
const GValue *value, GParamSpec *pspec)
{
FwupdResult *result = FWUPD_RESULT (object);
FwupdResultPrivate *priv = GET_PRIVATE (result);
switch (prop_id) {
case PROP_DEVICE_ID:
g_free (priv->device_id);
priv->device_id = g_strdup (g_value_get_string (value));
break;
case PROP_UNIQUE_ID:
g_free (priv->unique_id);
priv->unique_id = g_strdup (g_value_get_string (value));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
}
static void
fwupd_result_class_init (FwupdResultClass *klass)
{
GParamSpec *pspec;
GObjectClass *object_class = G_OBJECT_CLASS (klass);
object_class->finalize = fwupd_result_finalize;
object_class->get_property = fwupd_result_get_property;
object_class->set_property = fwupd_result_set_property;
/**
* FwupdResult:device-id:
*
* The device ID for this result.
*
* Since: 0.7.0
*/
pspec = g_param_spec_string ("device-id", NULL, NULL,
NULL,
G_PARAM_READWRITE);
g_object_class_install_property (object_class, PROP_DEVICE_ID, pspec);
}
static void
fwupd_result_init (FwupdResult *result)
{
FwupdResultPrivate *priv = GET_PRIVATE (result);
priv->device_checksum_kind = G_CHECKSUM_SHA1;
priv->update_checksum_kind = G_CHECKSUM_SHA1;
priv->guids = g_ptr_array_new_with_free_func (g_free);
}
static void
fwupd_result_finalize (GObject *object)
{
FwupdResult *result = FWUPD_RESULT (object);
FwupdResultPrivate *priv = GET_PRIVATE (result);
g_ptr_array_unref (priv->guids);
g_free (priv->unique_id);
g_free (priv->device_description);
g_free (priv->device_checksum);
g_free (priv->device_id);
g_free (priv->device_name);
g_free (priv->device_vendor);
g_free (priv->device_provider);
g_free (priv->device_version);
g_free (priv->device_version_lowest);
g_free (priv->device_version_bootloader);
g_free (priv->update_description);
g_free (priv->update_error);
g_free (priv->update_filename);
g_free (priv->update_checksum);
g_free (priv->update_id);
g_free (priv->update_license);
g_free (priv->update_name);
g_free (priv->update_summary);
g_free (priv->update_uri);
g_free (priv->update_homepage);
g_free (priv->update_vendor);
g_free (priv->update_version);
G_OBJECT_CLASS (fwupd_result_parent_class)->finalize (object);
}
static void
fwupd_result_from_variant_iter (FwupdResult *result, GVariantIter *iter)
{
GVariant *value;
const gchar *key;
while (g_variant_iter_next (iter, "{&sv}", &key, &value)) {
fwupd_result_from_kv (result, key, value);
g_variant_unref (value);
}
}
/**
* fwupd_result_new_from_data:
* @data: a #GVariant
*
* Creates a new result using packed data.
*
* Returns: a new #FwupdResult, or %NULL if @data was invalid
*
* Since: 0.7.0
**/
FwupdResult *
fwupd_result_new_from_data (GVariant *data)
{
FwupdResult *res = NULL;
const gchar *id;
const gchar *type_string;
g_autoptr(GVariantIter) iter = NULL;
/* format from GetDetails */
type_string = g_variant_get_type_string (data);
if (g_strcmp0 (type_string, "(a{sv})") == 0) {
res = fwupd_result_new ();
g_variant_get (data, "(a{sv})", &iter);
fwupd_result_from_variant_iter (res, iter);
} else if (g_strcmp0 (type_string, "{sa{sv}}") == 0) {
res = fwupd_result_new ();
g_variant_get (data, "{&sa{sv}}", &id, &iter);
fwupd_result_set_device_id (res, id);
fwupd_result_from_variant_iter (res, iter);
} else {
g_warning ("type %s not known", type_string);
}
return res;
}
/**
* fwupd_result_new:
*
* Creates a new result.
*
* Returns: a new #FwupdResult
*
* Since: 0.7.0
**/
FwupdResult *
fwupd_result_new (void)
{
FwupdResult *result;
result = g_object_new (FWUPD_TYPE_RESULT, NULL);
return FWUPD_RESULT (result);
}