/** * gs_plugin_xdg_app_set_metadata_installed: */ static void gs_plugin_xdg_app_set_metadata_installed (GsApp *app, XdgAppInstalledRef *xref) { guint64 mtime; guint64 size_installed; g_autofree gchar *metadata_fn = NULL; g_autoptr(GFile) file = NULL; g_autoptr(GFileInfo) info = NULL; /* for all types */ gs_plugin_xdg_app_set_metadata (app, XDG_APP_REF (xref)); /* get the last time the app was updated */ metadata_fn = g_build_filename (xdg_app_installed_ref_get_deploy_dir (xref), "..", "active", NULL); file = g_file_new_for_path (metadata_fn); info = g_file_query_info (file, G_FILE_ATTRIBUTE_TIME_MODIFIED, G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, NULL, NULL); if (info != NULL) { mtime = g_file_info_get_attribute_uint64 (info, G_FILE_ATTRIBUTE_TIME_MODIFIED); gs_app_set_install_date (app, mtime); } /* this is faster than resolving */ gs_app_set_origin (app, xdg_app_installed_ref_get_origin (xref)); /* this is faster than xdg_app_installation_fetch_remote_size_sync() */ size_installed = xdg_app_installed_ref_get_installed_size (xref); if (size_installed != 0) gs_app_set_size_installed (app, size_installed); }
gboolean gs_plugin_refine_app (GsPlugin *plugin, GsApp *app, GsPluginRefineFlags flags, GCancellable *cancellable, GError **error) { GsPluginData *priv = gs_plugin_get_data (plugin); g_autoptr(SnapdClient) client = NULL; const gchar *name; g_autoptr(SnapdSnap) local_snap = NULL; g_autoptr(SnapdSnap) store_snap = NULL; SnapdSnap *snap; const gchar *developer_name; g_autofree gchar *description = NULL; /* not us */ if (g_strcmp0 (gs_app_get_management_plugin (app), "snap") != 0) return TRUE; client = get_client (plugin, error); if (client == NULL) return FALSE; /* get information from local snaps and store */ local_snap = snapd_client_get_snap_sync (client, gs_app_get_metadata_item (app, "snap::name"), cancellable, NULL); if (local_snap == NULL || (flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_SCREENSHOTS) != 0) store_snap = get_store_snap (plugin, gs_app_get_metadata_item (app, "snap::name"), cancellable, NULL); if (local_snap == NULL && store_snap == NULL) return TRUE; if (local_snap != NULL) gs_app_set_state (app, AS_APP_STATE_INSTALLED); else gs_app_set_state (app, AS_APP_STATE_AVAILABLE); /* use store information for basic metadata over local information */ snap = store_snap != NULL ? store_snap : local_snap; name = snapd_snap_get_title (snap); if (name == NULL || g_strcmp0 (name, "") == 0) name = snapd_snap_get_name (snap); gs_app_set_name (app, GS_APP_QUALITY_NORMAL, name); gs_app_set_summary (app, GS_APP_QUALITY_NORMAL, snapd_snap_get_summary (snap)); description = gs_plugin_snap_get_description_safe (snap); if (description != NULL) gs_app_set_description (app, GS_APP_QUALITY_NORMAL, description); gs_app_set_license (app, GS_APP_QUALITY_NORMAL, snapd_snap_get_license (snap)); developer_name = snapd_snap_get_publisher_display_name (snap); if (developer_name == NULL) developer_name = snapd_snap_get_publisher_username (snap); gs_app_set_developer_name (app, developer_name); if (snapd_snap_get_publisher_validation (snap) == SNAPD_PUBLISHER_VALIDATION_VERIFIED) gs_app_add_quirk (app, GS_APP_QUIRK_DEVELOPER_VERIFIED); snap = local_snap != NULL ? local_snap : store_snap; gs_app_set_version (app, snapd_snap_get_version (snap)); switch (snapd_snap_get_snap_type (snap)) { case SNAPD_SNAP_TYPE_APP: gs_app_set_kind (app, AS_APP_KIND_DESKTOP); break; case SNAPD_SNAP_TYPE_KERNEL: case SNAPD_SNAP_TYPE_GADGET: case SNAPD_SNAP_TYPE_OS: gs_app_set_kind (app, AS_APP_KIND_RUNTIME); break; default: case SNAPD_SNAP_TYPE_UNKNOWN: gs_app_set_kind (app, AS_APP_KIND_UNKNOWN); break; } /* add information specific to installed snaps */ if (local_snap != NULL) { SnapdApp *snap_app; GDateTime *install_date; install_date = snapd_snap_get_install_date (local_snap); gs_app_set_size_installed (app, snapd_snap_get_installed_size (local_snap)); gs_app_set_install_date (app, install_date != NULL ? g_date_time_to_unix (install_date) : GS_APP_INSTALL_DATE_UNKNOWN); snap_app = get_primary_app (local_snap); if (snap_app != NULL) { gs_app_set_metadata (app, "snap::launch-name", snapd_app_get_name (snap_app)); gs_app_set_metadata (app, "snap::launch-desktop", snapd_app_get_desktop_file (snap_app)); } else { gs_app_add_quirk (app, GS_APP_QUIRK_NOT_LAUNCHABLE); } } /* add information specific to store snaps */ if (store_snap != NULL) { gs_app_set_origin (app, priv->store_name); gs_app_set_size_download (app, snapd_snap_get_download_size (store_snap)); if (flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_SCREENSHOTS && gs_app_get_screenshots (app)->len == 0) refine_screenshots (app, store_snap); } /* load icon if requested */ if (flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_ICON && gs_app_get_pixbuf (app) == NULL) load_icon (plugin, client, app, gs_app_get_metadata_item (app, "snap::name"), local_snap, store_snap, cancellable); return TRUE; }
gboolean gs_plugin_refine_app (GsPlugin *plugin, GsApp *app, GsPluginRefineFlags flags, GCancellable *cancellable, GError **error) { const gchar *gameid; const gchar *tmp; g_autofree gchar *manifest_basename = NULL; g_autofree gchar *fn = NULL; g_autoptr(GHashTable) manifest = NULL; /* check is us */ gameid = gs_app_get_metadata_item (app, "X-Steam-GameID"); if (gameid == NULL) return TRUE; /* is this true? */ gs_app_set_kind (app, AS_ID_KIND_DESKTOP); /* no way of knowing */ if (gs_app_get_size_download (app) == 0) gs_app_set_size_download (app, GS_APP_SIZE_UNKNOWABLE); /* hardcoded */ if (gs_app_get_origin_hostname (app) == NULL) gs_app_set_origin_hostname (app, "steampowered.com"); /* size */ tmp = gs_app_get_metadata_item (app, "X-Steam-Size"); if (tmp != NULL) { guint64 sz; sz = g_ascii_strtoull (tmp, NULL, 10); if (sz > 0) gs_app_set_size_installed (app, sz); } /* check manifest */ manifest_basename = g_strdup_printf ("appmanifest_%s.acf", gameid); fn = g_build_filename (g_get_user_data_dir (), "Steam", "steamapps", manifest_basename, NULL); if (!g_file_test (fn, G_FILE_TEST_EXISTS)) { /* can never have been installed */ gs_app_set_state (app, AS_APP_STATE_AVAILABLE); return TRUE; } manifest = gs_plugin_steam_load_app_manifest (fn, error); if (manifest == NULL) return FALSE; /* this is better than the download size */ tmp = g_hash_table_lookup (manifest, "SizeOnDisk"); if (tmp != NULL) { guint64 sz; sz = g_ascii_strtoull (tmp, NULL, 10); if (sz > 0) gs_app_set_size_installed (app, sz); } /* set state */ tmp = g_hash_table_lookup (manifest, "StateFlags"); if (tmp != NULL) { guint64 state_flags; /* set state */ state_flags = g_ascii_strtoull (tmp, NULL, 10); if (state_flags & GS_STEAM_STATE_FLAG_DOWNLOADING || state_flags & GS_STEAM_STATE_FLAG_PREALLOCATING || state_flags & GS_STEAM_STATE_FLAG_ADDING_FILES || state_flags & GS_STEAM_STATE_FLAG_COMMITTING || state_flags & GS_STEAM_STATE_FLAG_STAGING) gs_app_set_state (app, AS_APP_STATE_INSTALLING); else if (state_flags & GS_STEAM_STATE_FLAG_UNINSTALLING) gs_app_set_state (app, AS_APP_STATE_REMOVING); else if (state_flags & GS_STEAM_STATE_FLAG_FULLY_INSTALLED) gs_app_set_state (app, AS_APP_STATE_INSTALLED); else if (state_flags & GS_STEAM_STATE_FLAG_UNINSTALLED) gs_app_set_state (app, AS_APP_STATE_AVAILABLE); } /* set install date */ tmp = g_hash_table_lookup (manifest, "LastUpdated"); if (tmp != NULL) { guint64 ts; ts = g_ascii_strtoull (tmp, NULL, 10); if (ts > 0) gs_app_set_install_date (app, ts); } return TRUE; }
gboolean gs_plugin_add_updates_historical (GsPlugin *plugin, GsAppList *list, GCancellable *cancellable, GError **error) { gboolean ret; guint64 mtime; guint i; g_auto(GStrv) package_ids = NULL; g_autofree gchar *packages = NULL; g_autoptr(GFile) file = NULL; g_autoptr(GFileInfo) info = NULL; g_autoptr(GKeyFile) key_file = NULL; /* was any offline update attempted */ if (!g_file_test (PK_OFFLINE_UPDATE_RESULTS_FILENAME, G_FILE_TEST_EXISTS)) return TRUE; /* get the mtime of the results */ file = g_file_new_for_path (PK_OFFLINE_UPDATE_RESULTS_FILENAME); info = g_file_query_info (file, G_FILE_ATTRIBUTE_TIME_MODIFIED, G_FILE_QUERY_INFO_NONE, cancellable, error); if (info == NULL) return FALSE; mtime = g_file_info_get_attribute_uint64 (info, G_FILE_ATTRIBUTE_TIME_MODIFIED); /* open the file */ key_file = g_key_file_new (); ret = g_key_file_load_from_file (key_file, PK_OFFLINE_UPDATE_RESULTS_FILENAME, G_KEY_FILE_NONE, error); if (!ret) return FALSE; /* only return results if successful */ ret = g_key_file_get_boolean (key_file, PK_OFFLINE_UPDATE_RESULTS_GROUP, "Success", NULL); if (!ret) { g_autofree gchar *code = NULL; g_autofree gchar *details = NULL; code = g_key_file_get_string (key_file, PK_OFFLINE_UPDATE_RESULTS_GROUP, "ErrorCode", error); if (code == NULL) return FALSE; details = g_key_file_get_string (key_file, PK_OFFLINE_UPDATE_RESULTS_GROUP, "ErrorDetails", error); if (details == NULL) return FALSE; return gs_plugin_packagekit_convert_error (error, pk_error_enum_from_string (code), details); } /* get list of package-ids */ packages = g_key_file_get_string (key_file, PK_OFFLINE_UPDATE_RESULTS_GROUP, "Packages", NULL); if (packages == NULL) { g_set_error (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_NOT_SUPPORTED, "No 'Packages' in %s", PK_OFFLINE_UPDATE_RESULTS_FILENAME); return FALSE; } package_ids = g_strsplit (packages, ",", -1); for (i = 0; package_ids[i] != NULL; i++) { g_autoptr(GsApp) app = NULL; g_auto(GStrv) split = NULL; app = gs_app_new (NULL); split = g_strsplit (package_ids[i], ";", 4); gs_app_add_source (app, split[0]); gs_app_set_update_version (app, split[1]); gs_app_set_management_plugin (app, "packagekit"); gs_app_add_source_id (app, package_ids[i]); gs_app_set_state (app, AS_APP_STATE_UPDATABLE); gs_app_set_kind (app, AS_APP_KIND_GENERIC); gs_app_set_install_date (app, mtime); gs_app_set_metadata (app, "GnomeSoftware::Creator", gs_plugin_get_name (plugin)); gs_app_list_add (list, app); } return TRUE; }