[gnome-software/wip/hughsie/cachekey: 2/4] flatpak: Use a custom GsApp GType
- From: Richard Hughes <rhughes src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-software/wip/hughsie/cachekey: 2/4] flatpak: Use a custom GsApp GType
- Date: Thu, 20 Jun 2019 10:57:53 +0000 (UTC)
commit 39505f2556d3e2efad1dddfa3a2db549dc767f46
Author: Richard Hughes <richard hughsie com>
Date: Thu Jun 20 11:37:00 2019 +0100
flatpak: Use a custom GsApp GType
plugins/flatpak/gs-flatpak-app.c | 230 +++++++++++++++++++++++++++---------
plugins/flatpak/gs-flatpak-app.h | 4 +
plugins/flatpak/gs-flatpak.c | 4 +-
plugins/flatpak/gs-plugin-flatpak.c | 6 +
4 files changed, 188 insertions(+), 56 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 dfb05a36..5fb93e67 100644
--- a/plugins/flatpak/gs-flatpak.c
+++ b/plugins/flatpak/gs-flatpak.c
@@ -231,7 +231,7 @@ gs_flatpak_create_app (GsFlatpak *self, const gchar *origin, FlatpakRef *xref)
g_autoptr(GsApp) app = NULL;
/* create a temp GsApp */
- app = gs_app_new (flatpak_ref_get_name (xref));
+ app = gs_flatpak_app_new (flatpak_ref_get_name (xref));
gs_flatpak_set_metadata (self, app, xref);
if (origin != NULL)
gs_app_set_origin (app, origin);
@@ -1772,7 +1772,7 @@ gs_flatpak_create_runtime (GsFlatpak *self, GsApp *parent, const gchar *runtime)
return NULL;
/* create the complete GsApp from the single string */
- app = gs_app_new (split[0]);
+ app = gs_flatpak_app_new (split[0]);
gs_flatpak_claim_app (self, app);
source = g_strdup_printf ("runtime/%s", runtime);
gs_app_add_source (app, source);
diff --git a/plugins/flatpak/gs-plugin-flatpak.c b/plugins/flatpak/gs-plugin-flatpak.c
index ee35be4b..cdaf0639 100644
--- a/plugins/flatpak/gs-plugin-flatpak.c
+++ b/plugins/flatpak/gs-plugin-flatpak.c
@@ -68,6 +68,12 @@ gs_plugin_initialize (GsPlugin *plugin)
priv->destdir_for_tests = g_getenv ("GS_SELF_TEST_FLATPAK_DATADIR");
}
+GsApp *
+gs_plugin_create_app (GsPlugin *plugin, const gchar *id)
+{
+ return gs_flatpak_app_new (id);
+}
+
static gboolean
_as_app_scope_is_compatible (AsAppScope scope1, AsAppScope scope2)
{
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]