[gnome-software] Support getting cached content from /var/cache and /usr/share
- From: Richard Hughes <rhughes src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-software] Support getting cached content from /var/cache and /usr/share
- Date: Wed, 27 Apr 2016 14:44:07 +0000 (UTC)
commit bf7f61c5a4719621102c826e071fd2b53f707292
Author: Richard Hughes <richard hughsie com>
Date: Wed Apr 27 15:39:45 2016 +0100
Support getting cached content from /var/cache and /usr/share
We only return a system cache filename if we don't need it to be writeable.
src/Makefile.am | 1 +
src/gs-screenshot-image.c | 41 +++++++++++++-------
src/gs-utils.c | 48 +++++++++++++++++++++---
src/gs-utils.h | 10 ++++-
src/plugins/gs-appstream.c | 7 ++-
src/plugins/gs-plugin-fedora-distro-upgrades.c | 11 +++--
src/plugins/gs-plugin-fwupd.c | 43 ++++++++++++---------
src/plugins/gs-plugin-odrs.c | 36 +++++++++++-------
src/plugins/gs-plugin-shell-extensions.c | 9 ++--
src/plugins/gs-plugin-steam.c | 25 ++++++++----
10 files changed, 156 insertions(+), 75 deletions(-)
---
diff --git a/src/Makefile.am b/src/Makefile.am
index dbfc813..52d460c 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -16,6 +16,7 @@ AM_CPPFLAGS = \
-DDATADIR=\"$(datadir)\" \
-DVERSION="\"$(VERSION)\"" \
-DLOCALEDIR=\""$(localedir)"\" \
+ -DLOCALSTATEDIR=\""$(localstatedir)"\" \
-DTESTDATADIR=\""$(top_srcdir)/data"\" \
-DGS_DATA=\"$(pkgdatadir)\"
diff --git a/src/gs-screenshot-image.c b/src/gs-screenshot-image.c
index b72dda1..5966645 100644
--- a/src/gs-screenshot-image.c
+++ b/src/gs-screenshot-image.c
@@ -347,11 +347,9 @@ gs_screenshot_image_load_async (GsScreenshotImage *ssimg,
AsImage *im = NULL;
SoupURI *base_uri = NULL;
const gchar *url;
- gint rc;
g_autofree gchar *basename = NULL;
- g_autofree gchar *cachedir_full = NULL;
- g_autofree gchar *cachedir = NULL;
- g_autofree gchar *cachedir_thumb = NULL;
+ g_autofree gchar *cache_kind = NULL;
+ g_autofree gchar *cachefn_thumb = NULL;
g_autofree gchar *sizedir = NULL;
g_return_if_fail (GS_IS_SCREENSHOT_IMAGE (ssimg));
@@ -396,10 +394,12 @@ gs_screenshot_image_load_async (GsScreenshotImage *ssimg,
} else {
sizedir = g_strdup_printf ("%ux%u", ssimg->width * ssimg->scale, ssimg->height *
ssimg->scale);
}
- cachedir = gs_utils_get_cachedir ("screenshots", NULL);
- cachedir_full = g_build_filename (cachedir, sizedir, NULL);
- rc = g_mkdir_with_parents (cachedir_full, 0700);
- if (rc != 0) {
+ cache_kind = g_build_filename ("screenshots", sizedir, NULL);
+ ssimg->filename = gs_utils_get_cache_filename (cache_kind,
+ basename,
+ GS_UTILS_CACHE_FLAG_NONE,
+ NULL);
+ if (ssimg->filename == NULL) {
/* TRANSLATORS: this is when we try create the cache directory
* but we were out of space or permission was denied */
gs_screenshot_image_set_error (ssimg, _("Could not create cache"));
@@ -407,7 +407,6 @@ gs_screenshot_image_load_async (GsScreenshotImage *ssimg,
}
/* does local file already exist */
- ssimg->filename = g_build_filename (cachedir_full, basename, NULL);
if (g_file_test (ssimg->filename, G_FILE_TEST_EXISTS)) {
as_screenshot_show_image (ssimg);
return;
@@ -416,14 +415,26 @@ gs_screenshot_image_load_async (GsScreenshotImage *ssimg,
/* can we load a blurred smaller version of this straight away */
if (ssimg->width > AS_IMAGE_THUMBNAIL_WIDTH &&
ssimg->height > AS_IMAGE_THUMBNAIL_HEIGHT) {
- cachedir_thumb = g_build_filename (cachedir,
- "112x63",
- basename,
- NULL);
- if (g_file_test (cachedir_thumb, G_FILE_TEST_EXISTS))
- gs_screenshot_image_show_blurred (ssimg, cachedir_thumb);
+ g_autofree gchar *cache_kind_thumb = NULL;
+ cache_kind_thumb = g_build_filename ("screenshots", "112x63", NULL);
+ cachefn_thumb = gs_utils_get_cache_filename (cache_kind_thumb,
+ basename,
+ GS_UTILS_CACHE_FLAG_NONE,
+ NULL);
+ if (cachefn_thumb == NULL)
+ return;
+ if (g_file_test (cachefn_thumb, G_FILE_TEST_EXISTS))
+ gs_screenshot_image_show_blurred (ssimg, cachefn_thumb);
}
+ /* re-request the cache filename, which might be different as it needs
+ * to be writable this time */
+ g_free (ssimg->filename);
+ ssimg->filename = gs_utils_get_cache_filename (cache_kind,
+ basename,
+ GS_UTILS_CACHE_FLAG_WRITEABLE,
+ NULL);
+
/* download file */
g_debug ("downloading %s to %s", url, ssimg->filename);
base_uri = soup_uri_new (url);
diff --git a/src/gs-utils.c b/src/gs-utils.c
index 2f7d050..977f183 100644
--- a/src/gs-utils.c
+++ b/src/gs-utils.c
@@ -480,27 +480,63 @@ gs_user_agent (void)
}
/**
- * gs_utils_get_cachedir:
+ * gs_utils_get_cache_filename:
+ *
+ * Returns a filename that points into the cache. This may be per-system
+ * or per-user, the latter being more likely when %GS_UTILS_CACHE_FLAG_WRITEABLE
+ * is specified in @flags.
+ *
+ * Returns: The full path and filename, which may or may not exist.
**/
gchar *
-gs_utils_get_cachedir (const gchar *kind, GError **error)
+gs_utils_get_cache_filename (const gchar *kind,
+ const gchar *basename,
+ GsUtilsCacheFlags flags, /* ignored */
+ GError **error)
{
- g_autofree gchar *vername = NULL;
g_autofree gchar *cachedir = NULL;
+ g_autofree gchar *vername = NULL;
g_auto(GStrv) version = g_strsplit (VERSION, ".", 3);
g_autoptr(GFile) cachedir_file = NULL;
+ /* not writable, so try the system cache first */
+ if ((flags & GS_UTILS_CACHE_FLAG_WRITEABLE) == 0) {
+ g_autofree gchar *cachefn = NULL;
+ cachefn = g_build_filename (LOCALSTATEDIR,
+ "cache",
+ "gnome-software",
+ basename,
+ NULL);
+ if (g_file_test (cachefn, G_FILE_TEST_EXISTS))
+ return g_steal_pointer (&cachefn);
+ }
+
+ /* not writable, so try the system cache first */
+ if ((flags & GS_UTILS_CACHE_FLAG_WRITEABLE) == 0) {
+ g_autofree gchar *cachefn = NULL;
+ cachefn = g_build_filename (DATADIR,
+ "gnome-software",
+ "cache",
+ kind,
+ basename,
+ NULL);
+ if (g_file_test (cachefn, G_FILE_TEST_EXISTS))
+ return g_steal_pointer (&cachefn);
+ }
+
/* create the cachedir in a per-release location, creating
* if it does not already exist */
vername = g_strdup_printf ("%s.%s", version[0], version[1]);
cachedir = g_build_filename (g_get_user_cache_dir (),
- "gnome-software", vername, kind, NULL);
+ "gnome-software",
+ vername,
+ kind,
+ NULL);
cachedir_file = g_file_new_for_path (cachedir);
if (!g_file_query_exists (cachedir_file, NULL) &&
!g_file_make_directory_with_parents (cachedir_file, NULL, error))
return NULL;
-
- return g_steal_pointer (&cachedir);
+ return g_build_filename (cachedir, basename, NULL);
}
/**
diff --git a/src/gs-utils.h b/src/gs-utils.h
index 2524d44..828a90b 100644
--- a/src/gs-utils.h
+++ b/src/gs-utils.h
@@ -30,6 +30,12 @@
G_BEGIN_DECLS
+typedef enum {
+ GS_UTILS_CACHE_FLAG_NONE = 0,
+ GS_UTILS_CACHE_FLAG_WRITEABLE = 1 << 0,
+ GS_UTILS_CACHE_FLAG_LAST
+} GsUtilsCacheFlags;
+
void gs_start_spinner (GtkSpinner *spinner);
void gs_stop_spinner (GtkSpinner *spinner);
void gs_container_remove_all (GtkContainer *container);
@@ -61,7 +67,9 @@ void gs_image_set_from_pixbuf (GtkImage *image,
const GdkPixbuf *pixbuf);
const gchar *gs_user_agent (void);
-gchar *gs_utils_get_cachedir (const gchar *kind,
+gchar *gs_utils_get_cache_filename (const gchar *kind,
+ const gchar *basename,
+ GsUtilsCacheFlags flags,
GError **error);
gchar *gs_utils_get_user_hash (GError **error);
GPermission *gs_utils_get_permission (const gchar *id);
diff --git a/src/plugins/gs-appstream.c b/src/plugins/gs-appstream.c
index 8101f6f..82451ad 100644
--- a/src/plugins/gs-appstream.c
+++ b/src/plugins/gs-appstream.c
@@ -45,9 +45,12 @@ gs_refine_item_pixbuf (GsPlugin *plugin, GsApp *app, AsApp *item)
case AS_ICON_KIND_REMOTE:
gs_app_set_icon (app, icon);
if (as_icon_get_filename (icon) == NULL) {
- cachedir = gs_utils_get_cachedir ("icons", NULL);
- fn = g_build_filename (cachedir, as_icon_get_name (icon), NULL);
+ fn = gs_utils_get_cache_filename ("icons",
+ as_icon_get_name (icon),
+ GS_UTILS_CACHE_FLAG_WRITEABLE,
+ NULL);
as_icon_set_filename (icon, fn);
+ cachedir = g_path_get_basename (fn);
as_icon_set_prefix (icon, cachedir);
}
if (g_file_test (fn, G_FILE_TEST_EXISTS)) {
diff --git a/src/plugins/gs-plugin-fedora-distro-upgrades.c b/src/plugins/gs-plugin-fedora-distro-upgrades.c
index d29e519..082f824 100644
--- a/src/plugins/gs-plugin-fedora-distro-upgrades.c
+++ b/src/plugins/gs-plugin-fedora-distro-upgrades.c
@@ -98,15 +98,16 @@ gs_plugin_setup (GsPlugin *plugin, GCancellable *cancellable, GError **error)
{
GsPluginData *priv = gs_plugin_get_data (plugin);
gchar *endptr = NULL;
- g_autofree gchar *cachedir = NULL;
g_autofree gchar *verstr = NULL;
g_autoptr(GFile) file = NULL;
- /* create the cachedir */
- cachedir = gs_utils_get_cachedir ("upgrades", error);
- if (cachedir == NULL)
+ /* get the file to cache */
+ priv->cachefn = gs_utils_get_cache_filename ("upgrades",
+ "fedora.json",
+ GS_UTILS_CACHE_FLAG_WRITEABLE,
+ error);
+ if (priv->cachefn == NULL)
return FALSE;
- priv->cachefn = g_build_filename (cachedir, "fedora.json", NULL);
/* watch this in case it is changed by the user */
file = g_file_new_for_path (priv->cachefn);
diff --git a/src/plugins/gs-plugin-fwupd.c b/src/plugins/gs-plugin-fwupd.c
index 0802cf5..8f5a790 100644
--- a/src/plugins/gs-plugin-fwupd.c
+++ b/src/plugins/gs-plugin-fwupd.c
@@ -44,7 +44,6 @@ struct GsPluginData {
FwupdClient *client;
GPtrArray *to_download;
GPtrArray *to_ignore;
- gchar *cachedir;
gchar *lvfs_sig_fn;
gchar *lvfs_sig_hash;
gchar *config_fn;
@@ -78,7 +77,6 @@ void
gs_plugin_destroy (GsPlugin *plugin)
{
GsPluginData *priv = gs_plugin_get_data (plugin);
- g_free (priv->cachedir);
g_free (priv->lvfs_sig_fn);
g_free (priv->lvfs_sig_hash);
g_free (priv->config_fn);
@@ -116,24 +114,18 @@ gs_plugin_setup (GsPlugin *plugin, GCancellable *cancellable, GError **error)
gsize len;
g_autofree gchar *data = NULL;
- /* already done */
- if (priv->cachedir != NULL)
- return TRUE;
-
/* register D-Bus errors */
fwupd_error_quark ();
g_signal_connect (priv->client, "changed",
G_CALLBACK (gs_plugin_fwupd_changed_cb), plugin);
- /* create the cache location */
- priv->cachedir = gs_utils_get_cachedir ("firmware", error);
- if (priv->cachedir == NULL)
- return FALSE;
-
/* get the hash of the previously downloaded file */
- priv->lvfs_sig_fn = g_build_filename (priv->cachedir,
- "firmware.xml.gz.asc",
- NULL);
+ priv->lvfs_sig_fn = gs_utils_get_cache_filename ("firmware",
+ "firmware.xml.gz.asc",
+ GS_UTILS_CACHE_FLAG_WRITEABLE,
+ error);
+ if (priv->lvfs_sig_fn == NULL)
+ return FALSE;
if (g_file_test (priv->lvfs_sig_fn, G_FILE_TEST_EXISTS)) {
if (!g_file_get_contents (priv->lvfs_sig_fn,
&data, &len, error))
@@ -276,7 +268,6 @@ gs_plugin_add_update_app (GsPlugin *plugin,
FwupdResult *res,
GError **error)
{
- GsPluginData *priv = gs_plugin_get_data (plugin);
FwupdDeviceFlags flags = 0;
const gchar *update_hash;
const gchar *update_uri;
@@ -339,8 +330,12 @@ gs_plugin_add_update_app (GsPlugin *plugin,
/* does the firmware already exist in the cache? */
basename = g_path_get_basename (update_uri);
- filename_cache = g_build_filename (priv->cachedir,
- basename, NULL);
+ filename_cache = gs_utils_get_cache_filename ("firmware",
+ basename,
+ GS_UTILS_CACHE_FLAG_NONE,
+ error);
+ if (filename_cache == NULL)
+ return FALSE;
if (!g_file_test (filename_cache, G_FILE_TEST_EXISTS)) {
gs_plugin_fwupd_add_required_location (plugin, update_uri);
g_set_error (error,
@@ -539,7 +534,12 @@ gs_plugin_fwupd_check_lvfs_metadata (GsPlugin *plugin,
/* download the payload and save to file */
basename_data = g_path_get_basename (url_data);
- cache_fn_data = g_build_filename (priv->cachedir, basename_data, NULL);
+ cache_fn_data = gs_utils_get_cache_filename ("firmware",
+ basename_data,
+ GS_UTILS_CACHE_FLAG_WRITEABLE,
+ error);
+ if (cache_fn_data == NULL)
+ return FALSE;
g_debug ("saving new LVFS data to %s:", cache_fn_data);
if (!gs_plugin_download_file (plugin,
app_dl,
@@ -597,7 +597,12 @@ gs_plugin_refresh (GsPlugin *plugin,
tmp = g_ptr_array_index (priv->to_download, i);
basename = g_path_get_basename (tmp);
- filename_cache = g_build_filename (priv->cachedir, basename, NULL);
+ filename_cache = gs_utils_get_cache_filename ("firmware",
+ basename,
+ GS_UTILS_CACHE_FLAG_WRITEABLE,
+ error);
+ if (filename_cache == NULL)
+ return FALSE;
g_debug ("downloading %s to %s", tmp, filename_cache);
/* set sync request */
diff --git a/src/plugins/gs-plugin-odrs.c b/src/plugins/gs-plugin-odrs.c
index 7260467..1a8a661 100644
--- a/src/plugins/gs-plugin-odrs.c
+++ b/src/plugins/gs-plugin-odrs.c
@@ -403,7 +403,7 @@ gs_plugin_odrs_get_ratings (GsPlugin *plugin, GsApp *app, GError **error)
GsPluginData *priv = gs_plugin_get_data (plugin);
GArray *ratings;
guint status_code;
- g_autofree gchar *cachedir = NULL;
+ g_autofree gchar *cachefn_basename = NULL;
g_autofree gchar *cachefn = NULL;
g_autofree gchar *data = NULL;
g_autofree gchar *uri = NULL;
@@ -411,10 +411,13 @@ gs_plugin_odrs_get_ratings (GsPlugin *plugin, GsApp *app, GError **error)
g_autoptr(SoupMessage) msg = NULL;
/* look in the cache */
- cachedir = gs_utils_get_cachedir ("ratings", error);
- if (cachedir == NULL)
+ cachefn_basename = g_strdup_printf ("%s.json", gs_app_get_id_no_prefix (app));
+ cachefn = gs_utils_get_cache_filename ("ratings",
+ cachefn_basename,
+ GS_UTILS_CACHE_FLAG_WRITEABLE,
+ error);
+ if (cachefn == NULL)
return NULL;
- cachefn = g_strdup_printf ("%s/%s.json", cachedir, gs_app_get_id_no_prefix (app));
cachefn_file = g_file_new_for_path (cachefn);
if (gs_utils_get_file_age (cachefn_file) < XDG_APP_REVIEW_CACHE_AGE_MAX) {
g_autofree gchar *json_data = NULL;
@@ -506,7 +509,7 @@ gs_plugin_odrs_fetch_for_app (GsPlugin *plugin, GsApp *app, GError **error)
const gchar *version;
guint karma_min;
guint status_code;
- g_autofree gchar *cachedir = NULL;
+ g_autofree gchar *cachefn_basename = NULL;
g_autofree gchar *cachefn = NULL;
g_autofree gchar *data = NULL;
g_autofree gchar *uri = NULL;
@@ -518,10 +521,13 @@ gs_plugin_odrs_fetch_for_app (GsPlugin *plugin, GsApp *app, GError **error)
g_autoptr(SoupMessage) msg = NULL;
/* look in the cache */
- cachedir = gs_utils_get_cachedir ("reviews", error);
- if (cachedir == NULL)
+ cachefn_basename = g_strdup_printf ("%s.json", gs_app_get_id_no_prefix (app));
+ cachefn = gs_utils_get_cache_filename ("reviews",
+ cachefn_basename,
+ GS_UTILS_CACHE_FLAG_WRITEABLE,
+ error);
+ if (cachefn == NULL)
return NULL;
- cachefn = g_strdup_printf ("%s/%s.json", cachedir, gs_app_get_id_no_prefix (app));
cachefn_file = g_file_new_for_path (cachefn);
if (gs_utils_get_file_age (cachefn_file) < XDG_APP_REVIEW_CACHE_AGE_MAX) {
g_autofree gchar *json_data = NULL;
@@ -701,17 +707,19 @@ gs_plugin_odrs_sanitize_version (const gchar *version)
static gboolean
gs_plugin_odrs_invalidate_cache (GsReview *review, GError **error)
{
- g_autofree gchar *cachedir = NULL;
+ g_autofree gchar *cachefn_basename = NULL;
g_autofree gchar *cachefn = NULL;
g_autoptr(GFile) cachefn_file = NULL;
/* look in the cache */
- cachedir = gs_utils_get_cachedir ("reviews", error);
- if (cachedir == NULL)
+ cachefn_basename = g_strdup_printf ("%s.json",
+ gs_review_get_metadata_item (review, "app_id"));
+ cachefn = gs_utils_get_cache_filename ("reviews",
+ cachefn_basename,
+ GS_UTILS_CACHE_FLAG_WRITEABLE,
+ error);
+ if (cachefn == NULL)
return FALSE;
- cachefn = g_strdup_printf ("%s/%s.json",
- cachedir,
- gs_review_get_metadata_item (review, "app_id"));
cachefn_file = g_file_new_for_path (cachefn);
if (!g_file_query_exists (cachefn_file, NULL))
return TRUE;
diff --git a/src/plugins/gs-plugin-shell-extensions.c b/src/plugins/gs-plugin-shell-extensions.c
index 12910f6..e66e027 100644
--- a/src/plugins/gs-plugin-shell-extensions.c
+++ b/src/plugins/gs-plugin-shell-extensions.c
@@ -586,7 +586,6 @@ gs_plugin_shell_extensions_get_apps (GsPlugin *plugin,
{
GsPluginData *priv = gs_plugin_get_data (plugin);
GPtrArray *apps;
- g_autofree gchar *cachedir = NULL;
g_autofree gchar *cachefn = NULL;
g_autofree gchar *uri = NULL;
g_autoptr(GFile) cachefn_file = NULL;
@@ -594,10 +593,12 @@ gs_plugin_shell_extensions_get_apps (GsPlugin *plugin,
g_autoptr(GsApp) dummy = gs_app_new (gs_plugin_get_name (plugin));
/* look in the cache */
- cachedir = gs_utils_get_cachedir ("extensions", error);
- if (cachedir == NULL)
+ cachefn = gs_utils_get_cache_filename ("extensions",
+ "gnome.json",
+ GS_UTILS_CACHE_FLAG_WRITEABLE,
+ error);
+ if (cachefn == NULL)
return NULL;
- cachefn = g_strdup_printf ("%s/gnome.json", cachedir);
cachefn_file = g_file_new_for_path (cachefn);
if (gs_utils_get_file_age (cachefn_file) < cache_age) {
g_autofree gchar *json_data = NULL;
diff --git a/src/plugins/gs-plugin-steam.c b/src/plugins/gs-plugin-steam.c
index cbb95ec..58465d5 100644
--- a/src/plugins/gs-plugin-steam.c
+++ b/src/plugins/gs-plugin-steam.c
@@ -399,7 +399,6 @@ gs_plugin_steam_download_icon (GsPlugin *plugin,
{
gsize data_len;
g_autofree gchar *cache_basename = NULL;
- g_autofree gchar *cachedir = NULL;
g_autofree gchar *cache_fn = NULL;
g_autofree gchar *cache_png = NULL;
g_autofree gchar *data = NULL;
@@ -408,10 +407,12 @@ gs_plugin_steam_download_icon (GsPlugin *plugin,
/* download icons from the cdn */
cache_basename = g_path_get_basename (uri);
- cachedir = gs_utils_get_cachedir ("steam", error);
- if (cachedir == NULL)
+ cache_fn = gs_utils_get_cache_filename ("steam",
+ cache_basename,
+ GS_UTILS_CACHE_FLAG_NONE,
+ error);
+ if (cache_fn == NULL)
return FALSE;
- cache_fn = g_build_filename (cachedir, cache_basename, NULL);
if (g_file_test (cache_fn, G_FILE_TEST_EXISTS)) {
if (!g_file_get_contents (cache_fn, &data, &data_len, error))
return FALSE;
@@ -446,7 +447,12 @@ gs_plugin_steam_download_icon (GsPlugin *plugin,
/* save to cache */
memcpy (cache_basename + 40, ".png\0", 5);
- cache_png = g_build_filename (cachedir, cache_basename, NULL);
+ cache_png = gs_utils_get_cache_filename ("steam",
+ cache_basename,
+ GS_UTILS_CACHE_FLAG_WRITEABLE,
+ error);
+ if (cache_png == NULL)
+ return FALSE;
if (!gdk_pixbuf_save (pb, cache_png, "png", error, NULL))
return FALSE;
@@ -472,7 +478,6 @@ gs_plugin_steam_update_store_app (GsPlugin *plugin,
guint32 gameid;
gchar *app_id;
g_autofree gchar *cache_basename = NULL;
- g_autofree gchar *cachedir = NULL;
g_autofree gchar *cache_fn = NULL;
g_autofree gchar *gameid_str = NULL;
g_autofree gchar *html = NULL;
@@ -610,10 +615,12 @@ gs_plugin_steam_update_store_app (GsPlugin *plugin,
/* download page from the store */
cache_basename = g_strdup_printf ("%s.html", gameid_str);
- cachedir = gs_utils_get_cachedir ("steam", error);
- if (cachedir == NULL)
+ cache_fn = gs_utils_get_cache_filename ("steam",
+ cache_basename,
+ GS_UTILS_CACHE_FLAG_WRITEABLE,
+ error);
+ if (cache_fn == NULL)
return FALSE;
- cache_fn = g_build_filename (cachedir, cache_basename, NULL);
if (!g_file_test (cache_fn, G_FILE_TEST_EXISTS)) {
g_autoptr(GsApp) app_dl = gs_app_new (gs_plugin_get_name (plugin));
uri = g_strdup_printf ("http://store.steampowered.com/app/%s/", gameid_str);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]