mirror of
https://git.proxmox.com/git/fwupd
synced 2025-08-14 05:57:41 +00:00
Add a method to return a list of upgrades for a specific device
This commit is contained in:
parent
97284b1ad8
commit
a96413a368
@ -616,6 +616,51 @@ fwupd_client_get_downgrades (FwupdClient *client, const gchar *device_id,
|
||||
return fwupd_client_parse_releases_from_variant (val);
|
||||
}
|
||||
|
||||
/**
|
||||
* fwupd_client_get_upgrades:
|
||||
* @client: A #FwupdClient
|
||||
* @device_id: the device ID
|
||||
* @cancellable: the #GCancellable, or %NULL
|
||||
* @error: the #GError, or %NULL
|
||||
*
|
||||
* Gets all the upgrades for a specific device.
|
||||
*
|
||||
* Returns: (element-type FwupdRelease) (transfer container): results
|
||||
*
|
||||
* Since: 0.9.8
|
||||
**/
|
||||
GPtrArray *
|
||||
fwupd_client_get_upgrades (FwupdClient *client, const gchar *device_id,
|
||||
GCancellable *cancellable, GError **error)
|
||||
{
|
||||
FwupdClientPrivate *priv = GET_PRIVATE (client);
|
||||
g_autoptr(GVariant) val = NULL;
|
||||
|
||||
g_return_val_if_fail (FWUPD_IS_CLIENT (client), NULL);
|
||||
g_return_val_if_fail (device_id != NULL, NULL);
|
||||
g_return_val_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable), NULL);
|
||||
g_return_val_if_fail (error == NULL || *error == NULL, NULL);
|
||||
|
||||
/* connect */
|
||||
if (!fwupd_client_connect (client, cancellable, error))
|
||||
return NULL;
|
||||
|
||||
/* call into daemon */
|
||||
val = g_dbus_proxy_call_sync (priv->proxy,
|
||||
"GetUpgrades",
|
||||
g_variant_new ("(s)", device_id),
|
||||
G_DBUS_CALL_FLAGS_NONE,
|
||||
-1,
|
||||
cancellable,
|
||||
error);
|
||||
if (val == NULL) {
|
||||
if (error != NULL)
|
||||
fwupd_client_fixup_dbus_error (*error);
|
||||
return NULL;
|
||||
}
|
||||
return fwupd_client_parse_releases_from_variant (val);
|
||||
}
|
||||
|
||||
static void
|
||||
fwupd_client_proxy_call_cb (GObject *source, GAsyncResult *res, gpointer user_data)
|
||||
{
|
||||
|
@ -71,6 +71,10 @@ GPtrArray *fwupd_client_get_downgrades (FwupdClient *client,
|
||||
const gchar *device_id,
|
||||
GCancellable *cancellable,
|
||||
GError **error);
|
||||
GPtrArray *fwupd_client_get_upgrades (FwupdClient *client,
|
||||
const gchar *device_id,
|
||||
GCancellable *cancellable,
|
||||
GError **error);
|
||||
GPtrArray *fwupd_client_get_details_local (FwupdClient *client,
|
||||
const gchar *filename,
|
||||
GCancellable *cancellable,
|
||||
|
@ -2235,6 +2235,7 @@ fu_engine_get_releases (FuEngine *self, const gchar *device_id, GError **error)
|
||||
"No releases for device");
|
||||
return NULL;
|
||||
}
|
||||
g_ptr_array_sort (releases, fu_engine_sort_releases_cb);
|
||||
return g_steal_pointer (&releases);
|
||||
}
|
||||
|
||||
@ -2331,6 +2332,86 @@ fu_engine_get_downgrades (FuEngine *self, const gchar *device_id, GError **error
|
||||
return g_steal_pointer (&releases);
|
||||
}
|
||||
|
||||
/**
|
||||
* fu_engine_get_upgrades:
|
||||
* @self: A #FuEngine
|
||||
* @device_id: A device ID
|
||||
* @error: A #GError, or %NULL
|
||||
*
|
||||
* Gets the upgrades available for a specific device.
|
||||
*
|
||||
* Returns: (transfer container) (element-type FwupdResult): results
|
||||
**/
|
||||
GPtrArray *
|
||||
fu_engine_get_upgrades (FuEngine *self, const gchar *device_id, GError **error)
|
||||
{
|
||||
FuDeviceItem *item;
|
||||
g_autoptr(GPtrArray) releases = NULL;
|
||||
g_autoptr(GPtrArray) releases_tmp = NULL;
|
||||
g_autoptr(GString) error_str = g_string_new (NULL);
|
||||
|
||||
g_return_val_if_fail (FU_IS_ENGINE (self), NULL);
|
||||
g_return_val_if_fail (device_id != NULL, NULL);
|
||||
g_return_val_if_fail (error == NULL || *error == NULL, NULL);
|
||||
|
||||
/* find the device */
|
||||
item = fu_engine_get_item_by_id (self, device_id, error);
|
||||
if (item == NULL)
|
||||
return NULL;
|
||||
|
||||
/* get all the releases for the device */
|
||||
releases_tmp = fu_engine_get_releases_for_device (self, item->device, error);
|
||||
if (releases_tmp == NULL)
|
||||
return NULL;
|
||||
releases = g_ptr_array_new_with_free_func ((GDestroyNotify) g_object_unref);
|
||||
for (guint i = 0; i < releases_tmp->len; i++) {
|
||||
FwupdRelease *rel_tmp = g_ptr_array_index (releases_tmp, i);
|
||||
gint vercmp;
|
||||
|
||||
/* only include older firmware */
|
||||
vercmp = as_utils_vercmp (fwupd_release_get_version (rel_tmp),
|
||||
fu_device_get_version (item->device));
|
||||
if (vercmp == 0) {
|
||||
g_string_append_printf (error_str, "%s=same, ",
|
||||
fwupd_release_get_version (rel_tmp));
|
||||
g_debug ("ignoring %s as the same as %s",
|
||||
fwupd_release_get_version (rel_tmp),
|
||||
fu_device_get_version (item->device));
|
||||
continue;
|
||||
}
|
||||
if (vercmp < 0) {
|
||||
g_string_append_printf (error_str, "%s=older, ",
|
||||
fwupd_release_get_version (rel_tmp));
|
||||
g_debug ("ignoring %s as older than %s",
|
||||
fwupd_release_get_version (rel_tmp),
|
||||
fu_device_get_version (item->device));
|
||||
continue;
|
||||
}
|
||||
g_ptr_array_add (releases, g_object_ref (rel_tmp));
|
||||
}
|
||||
if (error_str->len > 2)
|
||||
g_string_truncate (error_str, error_str->len - 2);
|
||||
if (releases->len == 0) {
|
||||
if (error_str->len > 0) {
|
||||
g_set_error (error,
|
||||
FWUPD_ERROR,
|
||||
FWUPD_ERROR_NOTHING_TO_DO,
|
||||
"No upgrades for device, current is %s: %s",
|
||||
fu_device_get_version (item->device),
|
||||
error_str->str);
|
||||
} else {
|
||||
g_set_error (error,
|
||||
FWUPD_ERROR,
|
||||
FWUPD_ERROR_NOTHING_TO_DO,
|
||||
"No upgrades for device, current is %s",
|
||||
fu_device_get_version (item->device));
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
g_ptr_array_sort (releases, fu_engine_sort_releases_cb);
|
||||
return g_steal_pointer (&releases);
|
||||
}
|
||||
|
||||
/**
|
||||
* fu_engine_clear_results:
|
||||
* @self: A #FuEngine
|
||||
|
@ -63,6 +63,9 @@ GPtrArray *fu_engine_get_releases (FuEngine *self,
|
||||
GPtrArray *fu_engine_get_downgrades (FuEngine *self,
|
||||
const gchar *device_id,
|
||||
GError **error);
|
||||
GPtrArray *fu_engine_get_upgrades (FuEngine *self,
|
||||
const gchar *device_id,
|
||||
GError **error);
|
||||
FwupdResult *fu_engine_get_results (FuEngine *self,
|
||||
const gchar *device_id,
|
||||
GError **error);
|
||||
|
@ -469,6 +469,20 @@ fu_main_daemon_method_call (GDBusConnection *connection, const gchar *sender,
|
||||
g_dbus_method_invocation_return_value (invocation, val);
|
||||
return;
|
||||
}
|
||||
if (g_strcmp0 (method_name, "GetUpgrades") == 0) {
|
||||
const gchar *device_id;
|
||||
g_autoptr(GPtrArray) releases = NULL;
|
||||
g_variant_get (parameters, "(&s)", &device_id);
|
||||
g_debug ("Called %s(%s)", method_name, device_id);
|
||||
releases = fu_engine_get_upgrades (priv->engine, device_id, &error);
|
||||
if (releases == NULL) {
|
||||
g_dbus_method_invocation_return_gerror (invocation, error);
|
||||
return;
|
||||
}
|
||||
val = fu_main_release_array_to_variant (releases);
|
||||
g_dbus_method_invocation_return_value (invocation, val);
|
||||
return;
|
||||
}
|
||||
if (g_strcmp0 (method_name, "GetRemotes") == 0) {
|
||||
g_autoptr(GPtrArray) remotes = NULL;
|
||||
g_debug ("Called %s()", method_name);
|
||||
|
@ -140,6 +140,36 @@
|
||||
</arg>
|
||||
</method>
|
||||
|
||||
<!--***********************************************************-->
|
||||
<method name='GetUpgrades'>
|
||||
<doc:doc>
|
||||
<doc:description>
|
||||
<doc:para>
|
||||
Gets a list of all the upgrades possible for a specific device.
|
||||
</doc:para>
|
||||
</doc:description>
|
||||
</doc:doc>
|
||||
<arg type='s' name='device_id' direction='in'>
|
||||
<doc:doc>
|
||||
<doc:summary>
|
||||
<doc:para>
|
||||
A device ID.
|
||||
</doc:para>
|
||||
</doc:summary>
|
||||
</doc:doc>
|
||||
</arg>
|
||||
<arg type='aa{sv}' name='releases' direction='out'>
|
||||
<doc:doc>
|
||||
<doc:summary>
|
||||
<doc:para>
|
||||
An array of releases (with the release number as the key),
|
||||
with any properties set on each.
|
||||
</doc:para>
|
||||
</doc:summary>
|
||||
</doc:doc>
|
||||
</arg>
|
||||
</method>
|
||||
|
||||
<!--***********************************************************-->
|
||||
<method name='GetDetailsLocal'>
|
||||
<doc:doc>
|
||||
|
Loading…
Reference in New Issue
Block a user