/** * gs_plugin_refine_item_size: */ static gboolean gs_plugin_refine_item_size (GsPlugin *plugin, GsApp *app, GCancellable *cancellable, GError **error) { GsPluginData *priv = gs_plugin_get_data (plugin); gboolean ret; guint64 download_size; guint64 installed_size; g_autoptr(AsProfileTask) ptask = NULL; g_autoptr(GError) error_local = NULL; /* already set */ if (gs_app_get_size_installed (app) > 0 && gs_app_get_size_download (app) > 0) return TRUE; /* need commit */ if (!gs_plugin_refine_item_commit (plugin, app, cancellable, error)) return FALSE; /* need runtime */ if (!gs_plugin_refine_item_runtime (plugin, app, cancellable, error)) return FALSE; /* calculate the platform size too if the app is not installed */ if (gs_app_get_state (app) == AS_APP_STATE_AVAILABLE && gs_app_get_xdgapp_kind (app) == XDG_APP_REF_KIND_APP) { GsApp *app_runtime; /* find out what runtime the application depends on */ if (!gs_plugin_refine_item_runtime (plugin, app, cancellable, error)) return FALSE; /* is the app_runtime already installed? */ app_runtime = gs_app_get_runtime (app); if (!gs_plugin_refine_item_state (plugin, app_runtime, cancellable, error)) return FALSE; if (gs_app_get_state (app_runtime) == AS_APP_STATE_INSTALLED) { g_debug ("runtime %s is already installed, so not adding size", gs_app_get_id (app_runtime)); } else { if (!gs_plugin_refine_item_size (plugin, app_runtime, cancellable, error)) return FALSE; } } /* just get the size of the runtime */ ptask = as_profile_start_literal (gs_plugin_get_profile (plugin), "xdg-app::refine-size"); ret = xdg_app_installation_fetch_remote_size_sync (priv->installation, gs_app_get_origin (app), gs_app_get_xdgapp_commit (app), &download_size, &installed_size, cancellable, &error_local); if (!ret) { g_warning ("libxdgapp failed to return application size: %s", error_local->message); gs_app_set_size_installed (app, GS_APP_SIZE_UNKNOWABLE); gs_app_set_size_download (app, GS_APP_SIZE_UNKNOWABLE); } else { gs_app_set_size_installed (app, installed_size); gs_app_set_size_download (app, download_size); } return TRUE; }
void gs_app_row_refresh (GsAppRow *app_row) { GsAppRowPrivate *priv = gs_app_row_get_instance_private (app_row); GtkStyleContext *context; GString *str = NULL; const gchar *tmp; gboolean missing_search_result; guint64 installed_size; if (priv->app == NULL) return; /* is this a missing search result from the extras page? */ missing_search_result = (gs_app_get_state (priv->app) == AS_APP_STATE_UNAVAILABLE && gs_app_get_url (priv->app, AS_URL_KIND_MISSING) != NULL); /* do a fill bar for the current progress */ switch (gs_app_get_state (priv->app)) { case AS_APP_STATE_INSTALLING: gs_progress_button_set_progress (GS_PROGRESS_BUTTON (priv->button), gs_app_get_progress (priv->app)); gs_progress_button_set_show_progress (GS_PROGRESS_BUTTON (priv->button), TRUE); break; default: gs_progress_button_set_show_progress (GS_PROGRESS_BUTTON (priv->button), FALSE); break; } /* join the description lines */ str = gs_app_row_get_description (app_row); if (str != NULL) { as_utils_string_replace (str, "\n", " "); gtk_label_set_label (GTK_LABEL (priv->description_label), str->str); g_string_free (str, TRUE); } else { gtk_label_set_text (GTK_LABEL (priv->description_label), NULL); } /* add warning */ if (gs_app_has_quirk (priv->app, AS_APP_QUIRK_REMOVABLE_HARDWARE)) { gtk_label_set_text (GTK_LABEL (priv->label_warning), /* TRANSLATORS: during the update the device * will restart into a special update-only mode */ _("Device cannot be used during update.")); gtk_widget_show (priv->label_warning); } /* where did this app come from */ if (priv->show_source) { tmp = gs_app_get_origin_hostname (priv->app); if (tmp != NULL) { g_autofree gchar *origin_tmp = NULL; /* TRANSLATORS: this refers to where the app came from */ origin_tmp = g_strdup_printf ("%s: %s", _("Source"), tmp); gtk_label_set_label (GTK_LABEL (priv->label_origin), origin_tmp); } gtk_widget_set_visible (priv->label_origin, tmp != NULL); } else { gtk_widget_set_visible (priv->label_origin, FALSE); } /* installed tag */ if (!priv->show_buttons) { switch (gs_app_get_state (priv->app)) { case AS_APP_STATE_UPDATABLE: case AS_APP_STATE_UPDATABLE_LIVE: case AS_APP_STATE_INSTALLED: gtk_widget_set_visible (priv->label_installed, TRUE); break; default: gtk_widget_set_visible (priv->label_installed, FALSE); break; } } else { gtk_widget_set_visible (priv->label_installed, FALSE); } /* name */ if (g_strcmp0 (gs_app_get_branch (priv->app), "master") == 0) { g_autofree gchar *name = NULL; /* TRANSLATORS: not translated to match what flatpak does */ name = g_strdup_printf ("%s (Nightly)", gs_app_get_name (priv->app)); gtk_label_set_label (GTK_LABEL (priv->name_label), name); } else { gtk_label_set_label (GTK_LABEL (priv->name_label), gs_app_get_name (priv->app)); } if (priv->show_update && (gs_app_get_state (priv->app) == AS_APP_STATE_UPDATABLE || gs_app_get_state (priv->app) == AS_APP_STATE_UPDATABLE_LIVE)) { g_autofree gchar *verstr = NULL; verstr = gs_app_row_format_version_update (priv->app); gtk_label_set_label (GTK_LABEL (priv->version_label), verstr); gtk_widget_set_visible (priv->version_label, verstr != NULL); gtk_widget_hide (priv->star); } else { gtk_widget_hide (priv->version_label); if (missing_search_result || gs_app_get_rating (priv->app) <= 0) { gtk_widget_hide (priv->star); } else { gtk_widget_show (priv->star); gtk_widget_set_sensitive (priv->star, FALSE); gs_star_widget_set_rating (GS_STAR_WIDGET (priv->star), gs_app_get_rating (priv->app)); } gtk_label_set_label (GTK_LABEL (priv->version_label), gs_app_get_version_ui (priv->app)); } /* folders */ if (priv->show_folders && gs_utils_is_current_desktop ("GNOME") && g_settings_get_boolean (priv->settings, "show-folder-management")) { g_autoptr(GsFolders) folders = NULL; const gchar *folder; folders = gs_folders_get (); folder = gs_folders_get_app_folder (folders, gs_app_get_id (priv->app), gs_app_get_categories (priv->app)); if (folder != NULL) folder = gs_folders_get_folder_name (folders, folder); gtk_label_set_label (GTK_LABEL (priv->folder_label), folder); gtk_widget_set_visible (priv->folder_label, folder != NULL); } else { gtk_widget_hide (priv->folder_label); } /* pixbuf */ if (gs_app_get_pixbuf (priv->app) != NULL) gs_image_set_from_pixbuf (GTK_IMAGE (priv->image), gs_app_get_pixbuf (priv->app)); context = gtk_widget_get_style_context (priv->image); if (missing_search_result) gtk_style_context_add_class (context, "dimmer-label"); else gtk_style_context_remove_class (context, "dimmer-label"); /* pending label */ switch (gs_app_get_state (priv->app)) { case AS_APP_STATE_QUEUED_FOR_INSTALL: gtk_widget_set_visible (priv->label, TRUE); gtk_label_set_label (GTK_LABEL (priv->label), _("Pending")); break; default: gtk_widget_set_visible (priv->label, FALSE); break; } /* spinner */ switch (gs_app_get_state (priv->app)) { case AS_APP_STATE_REMOVING: gtk_spinner_start (GTK_SPINNER (priv->spinner)); gtk_widget_set_visible (priv->spinner, TRUE); break; default: gtk_widget_set_visible (priv->spinner, FALSE); break; } /* button */ gs_app_row_refresh_button (app_row, missing_search_result); /* hide buttons in the update list, unless the app is live updatable */ switch (gs_app_get_state (priv->app)) { case AS_APP_STATE_UPDATABLE_LIVE: case AS_APP_STATE_INSTALLING: gtk_widget_set_visible (priv->button_box, TRUE); break; default: gtk_widget_set_visible (priv->button_box, !priv->show_update); break; } /* checkbox */ if (priv->selectable) { if (gs_app_get_kind (priv->app) == AS_APP_KIND_DESKTOP || gs_app_get_kind (priv->app) == AS_APP_KIND_RUNTIME || gs_app_get_kind (priv->app) == AS_APP_KIND_WEB_APP) gtk_widget_set_visible (priv->checkbox, TRUE); } else { gtk_widget_set_visible (priv->checkbox, FALSE); } installed_size = gs_app_get_size_installed (priv->app); if (priv->show_installed_size && installed_size != GS_APP_SIZE_UNKNOWABLE && installed_size != 0) { g_autofree gchar *size = NULL; size = g_format_size (installed_size); gtk_label_set_label (GTK_LABEL (priv->label_app_size), size); gtk_widget_show (priv->label_app_size); } else { gtk_widget_hide (priv->label_app_size); } }
/** * gs_plugin_refine_app: */ gboolean gs_plugin_refine_app (GsPlugin *plugin, GsApp *app, GsPluginRefineFlags flags, GCancellable *cancellable, GError **error) { Header h; const gchar *fn; gint rc; g_auto(rpmdbMatchIterator) mi = NULL; g_auto(rpmts) ts = NULL; /* not required */ if ((flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_VERSION) == 0 && (flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_SIZE) == 0 && (flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_LICENSE) == 0 && (flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_SETUP_ACTION) == 0) return TRUE; /* no need to run the plugin */ if (gs_app_get_source_default (app) != NULL && gs_app_get_source_id_default (app) != NULL) return TRUE; /* open db readonly */ ts = rpmtsCreate(); rpmtsSetRootDir (ts, NULL); rc = rpmtsOpenDB (ts, O_RDONLY); if (rc != 0) { g_set_error (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_FAILED, "Failed to open rpmdb: %i", rc); return FALSE; } /* look for a specific file */ fn = gs_app_get_metadata_item (app, "appstream::source-file"); if (fn == NULL) return TRUE; if (!g_str_has_prefix (fn, "/usr")) return TRUE; mi = rpmtsInitIterator (ts, RPMDBI_INSTFILENAMES, fn, 0); if (mi == NULL) { g_debug ("rpm: no search results for %s", fn); return TRUE; } /* on rpm-ostree this package cannot be removed 'live' */ gs_app_add_quirk (app, AS_APP_QUIRK_COMPULSORY); /* process any results */ g_debug ("rpm: querying for %s with %s", gs_app_get_id (app), fn); while ((h = rpmdbNextIterator (mi)) != NULL) { guint64 epoch; const gchar *name; const gchar *version; const gchar *arch; const gchar *release; const gchar *license; /* add default source */ name = headerGetString (h, RPMTAG_NAME); if (gs_app_get_source_default (app) == NULL) { g_debug ("rpm: setting source to %s", name); gs_app_add_source (app, name); } /* set size */ if (gs_app_get_size_download (app) == 0) gs_app_set_size_download (app, 0); if (gs_app_get_size_installed (app) == 0) { guint64 tmp; tmp = headerGetNumber (h, RPMTAG_SIZE); gs_app_set_size_installed (app, tmp); } /* set license */ license = headerGetString (h, RPMTAG_LICENSE); if (gs_app_get_license (app) == NULL && license != NULL) { g_autofree gchar *tmp = NULL; tmp = as_utils_license_to_spdx (license); gs_app_set_license (app, GS_APP_QUALITY_NORMAL, tmp); } /* add version */ version = headerGetString (h, RPMTAG_VERSION); if (gs_app_get_version (app) == NULL) { g_debug ("rpm: setting version to %s", version); gs_app_set_version (app, version); } /* add source-id */ if (gs_app_get_source_id_default (app) == NULL) { g_autofree gchar *tmp = NULL; release = headerGetString (h, RPMTAG_RELEASE); arch = headerGetString (h, RPMTAG_ARCH); epoch = headerGetNumber (h, RPMTAG_EPOCH); if (epoch > 0) { tmp = g_strdup_printf ("%s;%" G_GUINT64_FORMAT ":%s-%s;%s;installed", name, epoch, version, release, arch); } else { tmp = g_strdup_printf ("%s;%s-%s;%s;installed", name, version, release, arch); } g_debug ("rpm: setting source-id to %s", tmp); gs_app_add_source_id (app, tmp); } } return TRUE; }