From ccd118368e76e8a455f26e978ab75c7b5c46d80e Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Fri, 14 Apr 2023 15:06:55 +0200 Subject: [PATCH] pw-metadata: add -l option to list available metadata --- man/pw-metadata.1.rst.in | 3 +++ src/tools/pw-metadata.c | 32 +++++++++++++++++++++++++------- 2 files changed, 28 insertions(+), 7 deletions(-) diff --git a/man/pw-metadata.1.rst.in b/man/pw-metadata.1.rst.in index 650104293..32f9c5117 100644 --- a/man/pw-metadata.1.rst.in +++ b/man/pw-metadata.1.rst.in @@ -44,6 +44,9 @@ OPTIONS --version Show version information. +-l | --list + List available metadata objects + -m | --monitor Keeps running and log the changes to the metadata. diff --git a/src/tools/pw-metadata.c b/src/tools/pw-metadata.c index 15844f290..d321dde45 100644 --- a/src/tools/pw-metadata.c +++ b/src/tools/pw-metadata.c @@ -21,6 +21,7 @@ struct data { const char *opt_remote; const char *opt_name; + bool opt_list; bool opt_monitor; bool opt_delete; uint32_t opt_id; @@ -48,6 +49,9 @@ static int metadata_property(void *data, uint32_t id, { struct data *d = data; + if (d->opt_list) + return 0; + if ((d->opt_id == SPA_ID_INVALID || d->opt_id == id) && (d->opt_key == NULL || spa_streq(d->opt_key, key))) { if (key == NULL) { @@ -72,22 +76,30 @@ static void registry_event_global(void *data, uint32_t id, uint32_t permissions, const struct spa_dict *props) { struct data *d = data; - const char *str; + const char *name; if (!spa_streq(type, PW_TYPE_INTERFACE_Metadata)) return; - if (props != NULL && - (str = spa_dict_lookup(props, PW_KEY_METADATA_NAME)) != NULL && - !spa_streq(str, d->opt_name)) + if (props == NULL) return; - if (d->metadata != NULL) { + name = spa_dict_lookup(props, PW_KEY_METADATA_NAME); + if (name == NULL) + return; + + if (d->opt_name && !spa_streq(name, d->opt_name)) + return; + + if (!d->opt_list && d->metadata != NULL) { pw_log_warn("Multiple metadata: ignoring metadata %d", id); return; } - printf("Found \"%s\" metadata %d\n", d->opt_name, id); + printf("Found \"%s\" metadata %d\n", name, id); + if (d->opt_list) + return; + d->metadata = pw_registry_bind(d->registry, id, type, PW_VERSION_METADATA, 0); @@ -157,6 +169,7 @@ static void show_help(struct data *data, const char *name, bool error) " -h, --help Show this help\n" " --version Show version\n" " -r, --remote Remote daemon name\n" + " -l, --list List available metadata\n" " -m, --monitor Monitor metadata\n" " -d, --delete Delete metadata\n" " -n, --name Metadata name (default: \"%s\")\n", @@ -171,6 +184,7 @@ int main(int argc, char *argv[]) { "help", no_argument, NULL, 'h' }, { "version", no_argument, NULL, 'V' }, { "remote", required_argument, NULL, 'r' }, + { "list", no_argument, NULL, 'l' }, { "monitor", no_argument, NULL, 'm' }, { "delete", no_argument, NULL, 'd' }, { "name", required_argument, NULL, 'n' }, @@ -184,7 +198,7 @@ int main(int argc, char *argv[]) data.opt_name = "default"; - while ((c = getopt_long(argc, argv, "hVr:mdn:", long_options, NULL)) != -1) { + while ((c = getopt_long(argc, argv, "hVr:lmdn:", long_options, NULL)) != -1) { switch (c) { case 'h': show_help(&data, argv[0], false); @@ -200,6 +214,10 @@ int main(int argc, char *argv[]) case 'r': data.opt_remote = optarg; break; + case 'l': + data.opt_name = NULL; + data.opt_list = true; + break; case 'm': data.opt_monitor = true; break;