static gboolean print_documents (const char *app_id, Column *columns, GCancellable *cancellable, GError **error) { g_autoptr(GDBusConnection) session_bus = NULL; XdpDbusDocuments *documents; g_autoptr(GVariant) apps = NULL; g_autoptr(GVariantIter) iter = NULL; const char *id; const char *origin; FlatpakTablePrinter *printer; g_autofree char *mountpoint = NULL; gboolean need_perms = FALSE; int i; if (columns[0].name == NULL) return TRUE; session_bus = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, error); if (session_bus == NULL) return FALSE; documents = xdp_dbus_documents_proxy_new_sync (session_bus, 0, "org.freedesktop.portal.Documents", "/org/freedesktop/portal/documents", NULL, error); if (documents == NULL) return FALSE; if (!xdp_dbus_documents_call_list_sync (documents, app_id ? app_id : "", &apps, NULL, error)) return FALSE; if (!xdp_dbus_documents_call_get_mount_point_sync (documents, &mountpoint, NULL, error)) return FALSE; printer = flatpak_table_printer_new (); flatpak_table_printer_set_columns (printer, columns); for (i = 0; columns[i].name; i++) { if (strcmp (columns[i].name, "permissions") == 0 || strcmp (columns[i].name, "application") == 0) { need_perms = TRUE; break; } } iter = g_variant_iter_new (apps); while (g_variant_iter_next (iter, "{&s^&ay}", &id, &origin)) { g_autoptr(GVariant) apps2 = NULL; g_autoptr(GVariantIter) iter2 = NULL; const char *app_id2 = NULL; const char **perms = NULL; gboolean just_perms = FALSE; if (need_perms) { g_autofree char *origin2 = NULL; if (!xdp_dbus_documents_call_info_sync (documents, id, &origin2, &apps2, NULL, error)) return FALSE; iter2 = g_variant_iter_new (apps2); } while ((iter2 && g_variant_iter_next (iter2, "{&s^a&s}", &app_id2, &perms)) || !just_perms) { for (i = 0; columns[i].name; i++) { if (strcmp (columns[i].name, "application") == 0) flatpak_table_printer_add_column (printer, app_id2); else if (strcmp (columns[i].name, "permissions") == 0) { g_autofree char *value = NULL; if (perms) value = g_strjoinv (" ", (char **)perms); flatpak_table_printer_add_column (printer, value); } else if (just_perms) flatpak_table_printer_add_column (printer, ""); else if (strcmp (columns[i].name, "id") == 0) flatpak_table_printer_add_column (printer, id); else if (strcmp (columns[i].name, "origin") == 0) flatpak_table_printer_add_column (printer, origin); else if (strcmp (columns[i].name, "path") == 0) { g_autofree char *basename = g_path_get_basename (origin); g_autofree char *path = g_build_filename (mountpoint, id, basename, NULL); flatpak_table_printer_add_column (printer, path); } } flatpak_table_printer_finish_row (printer); just_perms = TRUE; } } flatpak_table_printer_print (printer); flatpak_table_printer_free (printer); return TRUE; }
static gboolean enumerate_instances (Column *columns, GError **error) { g_autoptr(GPtrArray) instances = NULL; FlatpakTablePrinter *printer; int i, j; if (columns[0].name == NULL) return TRUE; printer = flatpak_table_printer_new (); flatpak_table_printer_set_columns (printer, columns); instances = flatpak_instance_get_all (); if (instances->len == 0) { /* nothing to show */ return TRUE; } for (j = 0; j < instances->len; j++) { FlatpakInstance *instance = (FlatpakInstance *) g_ptr_array_index (instances, j); flatpak_table_printer_add_column (printer, flatpak_instance_get_id (instance)); for (i = 0; columns[i].name; i++) { if (strcmp (columns[i].name, "pid") == 0) { g_autofree char *pid = g_strdup_printf ("%d", flatpak_instance_get_pid (instance)); flatpak_table_printer_add_column (printer, pid); } else if (strcmp (columns[i].name, "child-pid") == 0) { g_autofree char *pid = g_strdup_printf ("%d", flatpak_instance_get_child_pid (instance)); flatpak_table_printer_add_column (printer, pid); } else if (strcmp (columns[i].name, "application") == 0) flatpak_table_printer_add_column (printer, flatpak_instance_get_app (instance)); else if (strcmp (columns[i].name, "arch") == 0) flatpak_table_printer_add_column (printer, flatpak_instance_get_arch (instance)); else if (strcmp (columns[i].name, "branch") == 0) flatpak_table_printer_add_column (printer, flatpak_instance_get_branch (instance)); else if (strcmp (columns[i].name, "commit") == 0) flatpak_table_printer_add_column_len (printer, flatpak_instance_get_commit (instance), 12); else if (strcmp (columns[i].name, "runtime") == 0) { const char *full_ref = flatpak_instance_get_runtime (instance); if (full_ref != NULL) { g_auto(GStrv) ref = flatpak_decompose_ref (full_ref, NULL); flatpak_table_printer_add_column (printer, ref[1]); } } else if (strcmp (columns[i].name, "runtime-branch") == 0) { const char *full_ref = flatpak_instance_get_runtime (instance); if (full_ref != NULL) { g_auto(GStrv) ref = flatpak_decompose_ref (full_ref, NULL); flatpak_table_printer_add_column (printer, ref[3]); } } else if (strcmp (columns[i].name, "runtime-commit") == 0) flatpak_table_printer_add_column_len (printer, flatpak_instance_get_runtime_commit (instance), 12); } flatpak_table_printer_finish_row (printer); } flatpak_table_printer_print (printer); flatpak_table_printer_free (printer); return TRUE; }