[gnome-software/wip/hughsie/GsApp-custom: 4/4] flatpak: Use a custom GsApp GTypes for results
- From: Richard Hughes <rhughes src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-software/wip/hughsie/GsApp-custom: 4/4] flatpak: Use a custom GsApp GTypes for results
- Date: Thu, 28 Feb 2019 12:37:27 +0000 (UTC)
commit 2d2b9d5a463c1f8436fdca4be0c462f222fbada1
Author: Richard Hughes <richard hughsie com>
Date: Mon Feb 11 12:17:28 2019 +0000
flatpak: Use a custom GsApp GTypes for results
plugins/flatpak/gs-flatpak-app.c | 230 +++++++++++++++++++++++++++---------
plugins/flatpak/gs-flatpak-app.h | 4 +
plugins/flatpak/gs-flatpak.c | 12 +-
plugins/flatpak/gs-plugin-flatpak.c | 3 +
4 files changed, 192 insertions(+), 57 deletions(-)
---
diff --git a/plugins/flatpak/gs-flatpak-app.c b/plugins/flatpak/gs-flatpak-app.c
index 78e4e9b1..0f587877 100644
--- a/plugins/flatpak/gs-flatpak-app.c
+++ b/plugins/flatpak/gs-flatpak-app.c
@@ -11,61 +11,149 @@
#include "gs-flatpak-app.h"
+struct _GsFlatpakApp
+{
+ GsApp parent_instance;
+ FlatpakRefKind ref_kind;
+ gchar *ref_arch;
+ gchar *ref_branch;
+ gchar *ref_name;
+ gchar *commit;
+ gchar *object_id;
+ gchar *repo_gpgkey;
+ gchar *repo_url;
+ gchar *runtime_url;
+ gchar *main_app_ref;
+ GsFlatpakAppFileKind file_kind;
+};
+
+G_DEFINE_TYPE (GsFlatpakApp, gs_flatpak_app, GS_TYPE_APP)
+
+static gboolean
+_g_set_str (gchar **str_ptr, const gchar *new_str)
+{
+ if (*str_ptr == new_str || g_strcmp0 (*str_ptr, new_str) == 0)
+ return FALSE;
+ g_free (*str_ptr);
+ *str_ptr = g_strdup (new_str);
+ return TRUE;
+}
+
+static const gchar *
+gs_flatpak_app_file_kind_to_string (GsFlatpakAppFileKind file_kind)
+{
+ if (file_kind == GS_FLATPAK_APP_FILE_KIND_REPO)
+ return "flatpakrepo";
+ if (file_kind == GS_FLATPAK_APP_FILE_KIND_REF)
+ return "flatpakref";
+ if (file_kind == GS_FLATPAK_APP_FILE_KIND_BUNDLE)
+ return "flatpak";
+ return NULL;
+}
+
+static void
+gs_flatpak_app_to_string (GsApp *app, GString *str)
+{
+ GsFlatpakApp *self = GS_FLATPAK_APP (app);
+ gs_utils_append_key_value (str, 20, "flatpak::ref-kind",
+ gs_flatpak_app_get_ref_kind_as_str (app));
+ if (self->ref_name != NULL) {
+ gs_utils_append_key_value (str, 20, "flatpak::ref-name",
+ self->ref_name);
+ }
+ if (self->ref_arch != NULL) {
+ gs_utils_append_key_value (str, 20, "flatpak::ref-arch",
+ self->ref_arch);
+ }
+ if (self->ref_branch != NULL) {
+ gs_utils_append_key_value (str, 20, "flatpak::ref-branch",
+ self->ref_branch);
+ }
+ if (self->commit != NULL)
+ gs_utils_append_key_value (str, 20, "flatpak::commit",
+ self->commit);
+ if (self->object_id != NULL) {
+ gs_utils_append_key_value (str, 20, "flatpak::object-id",
+ self->object_id);
+ }
+ if (self->repo_gpgkey != NULL) {
+ gs_utils_append_key_value (str, 20, "flatpak::repo-gpgkey",
+ self->repo_gpgkey);
+ }
+ if (self->repo_url != NULL) {
+ gs_utils_append_key_value (str, 20, "flatpak::repo-url",
+ self->repo_url);
+ }
+ if (self->runtime_url != NULL) {
+ gs_utils_append_key_value (str, 20, "flatpak::runtime-url",
+ self->runtime_url);
+ }
+ if (self->main_app_ref != NULL) {
+ gs_utils_append_key_value (str, 20, "flatpak::main-app-ref",
+ self->main_app_ref);
+ }
+ if (self->file_kind != GS_FLATPAK_APP_FILE_KIND_UNKNOWN) {
+ gs_utils_append_key_value (str, 20, "flatpak::file-kind",
+ gs_flatpak_app_file_kind_to_string (self->file_kind));
+ }
+}
+
const gchar *
gs_flatpak_app_get_ref_name (GsApp *app)
{
- return gs_app_get_metadata_item (app, "flatpak::RefName");
+ GsFlatpakApp *self = GS_FLATPAK_APP (app);
+ return self->ref_name;
}
const gchar *
gs_flatpak_app_get_ref_arch (GsApp *app)
{
- return gs_app_get_metadata_item (app, "flatpak::RefArch");
+ GsFlatpakApp *self = GS_FLATPAK_APP (app);
+ return self->ref_arch;
}
const gchar *
gs_flatpak_app_get_ref_branch (GsApp *app)
{
- return gs_app_get_metadata_item (app, "flatpak::RefBranch");
+ GsFlatpakApp *self = GS_FLATPAK_APP (app);
+ return self->ref_branch;
}
const gchar *
gs_flatpak_app_get_commit (GsApp *app)
{
- return gs_app_get_metadata_item (app, "flatpak::Commit");
+ GsFlatpakApp *self = GS_FLATPAK_APP (app);
+ return self->commit;
}
GsFlatpakAppFileKind
gs_flatpak_app_get_file_kind (GsApp *app)
{
- GVariant *tmp = gs_app_get_metadata_variant (app, "flatpak::FileKind");
- if (tmp == NULL)
- return GS_FLATPAK_APP_FILE_KIND_UNKNOWN;
- return g_variant_get_uint32 (tmp);
+ GsFlatpakApp *self = GS_FLATPAK_APP (app);
+ return self->file_kind;
}
const gchar *
gs_flatpak_app_get_runtime_url (GsApp *app)
{
- return gs_app_get_metadata_item (app, "flatpak::RuntimeUrl");
+ GsFlatpakApp *self = GS_FLATPAK_APP (app);
+ return self->runtime_url;
}
FlatpakRefKind
gs_flatpak_app_get_ref_kind (GsApp *app)
{
- GVariant *tmp = gs_app_get_metadata_variant (app, "flatpak::RefKind");
- if (tmp == NULL)
- return FLATPAK_REF_KIND_APP;
- return g_variant_get_uint32 (tmp);
+ GsFlatpakApp *self = GS_FLATPAK_APP (app);
+ return self->ref_kind;
}
const gchar *
gs_flatpak_app_get_ref_kind_as_str (GsApp *app)
{
- FlatpakRefKind ref_kind = gs_flatpak_app_get_ref_kind (app);
- if (ref_kind == FLATPAK_REF_KIND_APP)
+ GsFlatpakApp *self = GS_FLATPAK_APP (app);
+ if (self->ref_kind == FLATPAK_REF_KIND_APP)
return "app";
- if (ref_kind == FLATPAK_REF_KIND_RUNTIME)
+ if (self->ref_kind == FLATPAK_REF_KIND_RUNTIME)
return "runtime";
return NULL;
}
@@ -73,117 +161,151 @@ gs_flatpak_app_get_ref_kind_as_str (GsApp *app)
const gchar *
gs_flatpak_app_get_object_id (GsApp *app)
{
- return gs_app_get_metadata_item (app, "flatpak::ObjectID");
+ GsFlatpakApp *self = GS_FLATPAK_APP (app);
+ return self->object_id;
}
const gchar *
gs_flatpak_app_get_repo_gpgkey (GsApp *app)
{
- return gs_app_get_metadata_item (app, "flatpak::RepoGpgKey");
+ GsFlatpakApp *self = GS_FLATPAK_APP (app);
+ return self->repo_gpgkey;
}
const gchar *
gs_flatpak_app_get_repo_url (GsApp *app)
{
- return gs_app_get_metadata_item (app, "flatpak::RepoUrl");
+ GsFlatpakApp *self = GS_FLATPAK_APP (app);
+ return self->repo_url;
+}
+
+const gchar *
+gs_flatpak_app_get_main_app_ref_name (GsApp *app)
+{
+ GsFlatpakApp *self = GS_FLATPAK_APP (app);
+ return self->main_app_ref;
}
gchar *
gs_flatpak_app_get_ref_display (GsApp *app)
{
- const gchar *ref_kind_as_str = gs_flatpak_app_get_ref_kind_as_str (app);
- const gchar *ref_name = gs_flatpak_app_get_ref_name (app);
- const gchar *ref_arch = gs_flatpak_app_get_ref_arch (app);
- const gchar *ref_branch = gs_flatpak_app_get_ref_branch (app);
-
- g_return_val_if_fail (ref_kind_as_str != NULL, NULL);
- g_return_val_if_fail (ref_name != NULL, NULL);
- g_return_val_if_fail (ref_arch != NULL, NULL);
- g_return_val_if_fail (ref_branch != NULL, NULL);
-
+ GsFlatpakApp *self = GS_FLATPAK_APP (app);
return g_strdup_printf ("%s/%s/%s/%s",
- ref_kind_as_str,
- ref_name,
- ref_arch,
- ref_branch);
+ gs_flatpak_app_get_ref_kind_as_str (app),
+ self->ref_name,
+ self->ref_arch,
+ self->ref_branch);
}
void
gs_flatpak_app_set_ref_name (GsApp *app, const gchar *val)
{
- gs_app_set_metadata (app, "flatpak::RefName", val);
+ GsFlatpakApp *self = GS_FLATPAK_APP (app);
+ _g_set_str (&self->ref_name, val);
}
void
gs_flatpak_app_set_ref_arch (GsApp *app, const gchar *val)
{
- gs_app_set_metadata (app, "flatpak::RefArch", val);
+ GsFlatpakApp *self = GS_FLATPAK_APP (app);
+ _g_set_str (&self->ref_arch, val);
}
void
gs_flatpak_app_set_ref_branch (GsApp *app, const gchar *val)
{
- gs_app_set_metadata (app, "flatpak::RefBranch", val);
+ GsFlatpakApp *self = GS_FLATPAK_APP (app);
+ _g_set_str (&self->ref_branch, val);
}
void
gs_flatpak_app_set_commit (GsApp *app, const gchar *val)
{
- gs_app_set_metadata (app, "flatpak::Commit", val);
+ GsFlatpakApp *self = GS_FLATPAK_APP (app);
+ _g_set_str (&self->commit, val);
}
void
gs_flatpak_app_set_file_kind (GsApp *app, GsFlatpakAppFileKind file_kind)
{
- g_autoptr(GVariant) tmp = g_variant_new_uint32 (file_kind);
- gs_app_set_metadata_variant (app, "flatpak::FileKind", tmp);
+ GsFlatpakApp *self = GS_FLATPAK_APP (app);
+ self->file_kind = file_kind;
}
void
gs_flatpak_app_set_runtime_url (GsApp *app, const gchar *val)
{
- gs_app_set_metadata (app, "flatpak::RuntimeUrl", val);
+ GsFlatpakApp *self = GS_FLATPAK_APP (app);
+ _g_set_str (&self->runtime_url, val);
}
void
gs_flatpak_app_set_ref_kind (GsApp *app, FlatpakRefKind ref_kind)
{
- g_autoptr(GVariant) tmp = g_variant_new_uint32 (ref_kind);
- gs_app_set_metadata_variant (app, "flatpak::RefKind", tmp);
+ GsFlatpakApp *self = GS_FLATPAK_APP (app);
+ self->ref_kind = ref_kind;
}
void
gs_flatpak_app_set_object_id (GsApp *app, const gchar *val)
{
- gs_app_set_metadata (app, "flatpak::ObjectID", val);
+ GsFlatpakApp *self = GS_FLATPAK_APP (app);
+ _g_set_str (&self->object_id, val);
}
void
gs_flatpak_app_set_repo_gpgkey (GsApp *app, const gchar *val)
{
- gs_app_set_metadata (app, "flatpak::RepoGpgKey", val);
+ GsFlatpakApp *self = GS_FLATPAK_APP (app);
+ _g_set_str (&self->repo_gpgkey, val);
}
void
gs_flatpak_app_set_repo_url (GsApp *app, const gchar *val)
{
- gs_app_set_metadata (app, "flatpak::RepoUrl", val);
+ GsFlatpakApp *self = GS_FLATPAK_APP (app);
+ _g_set_str (&self->repo_url, val);
}
-GsApp *
-gs_flatpak_app_new (const gchar *id)
+void
+gs_flatpak_app_set_main_app_ref_name (GsApp *app, const gchar *val)
{
- return GS_APP (g_object_new (GS_TYPE_APP, "id", id, NULL));
+ GsFlatpakApp *self = GS_FLATPAK_APP (app);
+ _g_set_str (&self->main_app_ref, val);
}
-void
-gs_flatpak_app_set_main_app_ref_name (GsApp *app, const gchar *main_app_ref)
+static void
+gs_flatpak_app_finalize (GObject *object)
{
- gs_app_set_metadata (app, "flatpak::mainApp", main_app_ref);
+ GsFlatpakApp *self = GS_FLATPAK_APP (object);
+ g_free (self->ref_arch);
+ g_free (self->ref_branch);
+ g_free (self->ref_name);
+ g_free (self->commit);
+ g_free (self->object_id);
+ g_free (self->runtime_url);
+ g_free (self->repo_gpgkey);
+ g_free (self->repo_url);
+ g_free (self->main_app_ref);
+ G_OBJECT_CLASS (gs_flatpak_app_parent_class)->finalize (object);
}
-const gchar *
-gs_flatpak_app_get_main_app_ref_name (GsApp *app)
+static void
+gs_flatpak_app_class_init (GsFlatpakAppClass *klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+ GsAppClass *klass_app = GS_APP_CLASS (klass);
+ klass_app->to_string = gs_flatpak_app_to_string;
+ object_class->finalize = gs_flatpak_app_finalize;
+}
+
+static void
+gs_flatpak_app_init (GsFlatpakApp *self)
+{
+}
+
+GsApp *
+gs_flatpak_app_new (const gchar *id)
{
- return gs_app_get_metadata_item (app, "flatpak::mainApp");
+ return GS_APP (g_object_new (GS_TYPE_FLATPAK_APP, "id", id, NULL));
}
diff --git a/plugins/flatpak/gs-flatpak-app.h b/plugins/flatpak/gs-flatpak-app.h
index ba4c23cd..496ea181 100644
--- a/plugins/flatpak/gs-flatpak-app.h
+++ b/plugins/flatpak/gs-flatpak-app.h
@@ -12,6 +12,10 @@
G_BEGIN_DECLS
+#define GS_TYPE_FLATPAK_APP (gs_flatpak_app_get_type ())
+
+G_DECLARE_FINAL_TYPE (GsFlatpakApp, gs_flatpak_app, GS, FLATPAK_APP, GsApp)
+
typedef enum {
GS_FLATPAK_APP_FILE_KIND_UNKNOWN,
GS_FLATPAK_APP_FILE_KIND_REPO,
diff --git a/plugins/flatpak/gs-flatpak.c b/plugins/flatpak/gs-flatpak.c
index d0a67791..9a896a25 100644
--- a/plugins/flatpak/gs-flatpak.c
+++ b/plugins/flatpak/gs-flatpak.c
@@ -246,10 +246,16 @@ gs_flatpak_create_app (GsFlatpak *self, const gchar *origin, FlatpakRef *xref)
if (origin != NULL)
gs_app_set_origin (app, origin);
- /* return the ref'd cached copy */
+ /* we already have one and it's a Flatpak app, return the ref'd cached copy */
app_cached = gs_plugin_cache_lookup (self->plugin, gs_app_get_unique_id (app));
- if (app_cached != NULL)
- return app_cached;
+ if (app_cached != NULL) {
+ if (GS_IS_FLATPAK_APP (app_cached)) {
+ return app_cached;
+ } else {
+ g_warning ("Found cached app in Flatpak plugin that is not a Flatpak app: %s; ",
+ gs_app_get_unique_id (app_cached));
+ }
+ }
/* fallback values */
if (gs_app_get_kind (app) == AS_APP_KIND_RUNTIME) {
diff --git a/plugins/flatpak/gs-plugin-flatpak.c b/plugins/flatpak/gs-plugin-flatpak.c
index 11f1cf20..716f2042 100644
--- a/plugins/flatpak/gs-plugin-flatpak.c
+++ b/plugins/flatpak/gs-plugin-flatpak.c
@@ -63,6 +63,9 @@ gs_plugin_initialize (GsPlugin *plugin)
g_permission_get_can_acquire (permission);
}
+ /* unique to us */
+ gs_plugin_set_app_gtype (plugin, GS_TYPE_FLATPAK_APP);
+
/* used for self tests */
priv->destdir_for_tests = g_getenv ("GS_SELF_TEST_FLATPAK_DATADIR");
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]