mirror of
https://git.proxmox.com/git/fwupd
synced 2025-08-16 01:06:09 +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);
|
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
|
static void
|
||||||
fwupd_client_proxy_call_cb (GObject *source, GAsyncResult *res, gpointer user_data)
|
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,
|
const gchar *device_id,
|
||||||
GCancellable *cancellable,
|
GCancellable *cancellable,
|
||||||
GError **error);
|
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,
|
GPtrArray *fwupd_client_get_details_local (FwupdClient *client,
|
||||||
const gchar *filename,
|
const gchar *filename,
|
||||||
GCancellable *cancellable,
|
GCancellable *cancellable,
|
||||||
|
@ -2235,6 +2235,7 @@ fu_engine_get_releases (FuEngine *self, const gchar *device_id, GError **error)
|
|||||||
"No releases for device");
|
"No releases for device");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
g_ptr_array_sort (releases, fu_engine_sort_releases_cb);
|
||||||
return g_steal_pointer (&releases);
|
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);
|
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:
|
* fu_engine_clear_results:
|
||||||
* @self: A #FuEngine
|
* @self: A #FuEngine
|
||||||
|
@ -63,6 +63,9 @@ GPtrArray *fu_engine_get_releases (FuEngine *self,
|
|||||||
GPtrArray *fu_engine_get_downgrades (FuEngine *self,
|
GPtrArray *fu_engine_get_downgrades (FuEngine *self,
|
||||||
const gchar *device_id,
|
const gchar *device_id,
|
||||||
GError **error);
|
GError **error);
|
||||||
|
GPtrArray *fu_engine_get_upgrades (FuEngine *self,
|
||||||
|
const gchar *device_id,
|
||||||
|
GError **error);
|
||||||
FwupdResult *fu_engine_get_results (FuEngine *self,
|
FwupdResult *fu_engine_get_results (FuEngine *self,
|
||||||
const gchar *device_id,
|
const gchar *device_id,
|
||||||
GError **error);
|
GError **error);
|
||||||
|
@ -469,6 +469,20 @@ fu_main_daemon_method_call (GDBusConnection *connection, const gchar *sender,
|
|||||||
g_dbus_method_invocation_return_value (invocation, val);
|
g_dbus_method_invocation_return_value (invocation, val);
|
||||||
return;
|
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) {
|
if (g_strcmp0 (method_name, "GetRemotes") == 0) {
|
||||||
g_autoptr(GPtrArray) remotes = NULL;
|
g_autoptr(GPtrArray) remotes = NULL;
|
||||||
g_debug ("Called %s()", method_name);
|
g_debug ("Called %s()", method_name);
|
||||||
|
@ -140,6 +140,36 @@
|
|||||||
</arg>
|
</arg>
|
||||||
</method>
|
</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'>
|
<method name='GetDetailsLocal'>
|
||||||
<doc:doc>
|
<doc:doc>
|
||||||
|
Loading…
Reference in New Issue
Block a user