Commit 9be77d15 authored by Richard Hughes's avatar Richard Hughes

flatpak: Use a custom GsApp GTypes for results

parent 19eeb8fd
Pipeline #58275 failed with stage
in 42 minutes and 11 seconds
......@@ -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));
}
......@@ -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,
......
......@@ -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) {
......
......@@ -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");
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment