mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-11-03 09:01:54 -05:00
pw-dump: dump metadata contents
Fix some leaks
This commit is contained in:
parent
792c01aede
commit
13cef576c9
1 changed files with 83 additions and 0 deletions
|
|
@ -110,6 +110,7 @@ struct object {
|
|||
int changed;
|
||||
struct spa_list param_list;
|
||||
struct spa_list pending_list;
|
||||
struct spa_list data_list;
|
||||
|
||||
struct pw_proxy *proxy;
|
||||
struct spa_hook proxy_listener;
|
||||
|
|
@ -1031,6 +1032,43 @@ static const struct class link_class = {
|
|||
};
|
||||
|
||||
/* metadata */
|
||||
|
||||
struct metadata_entry {
|
||||
struct spa_list link;
|
||||
uint32_t changed;
|
||||
uint32_t subject;
|
||||
char *key;
|
||||
char *value;
|
||||
char *type;
|
||||
};
|
||||
|
||||
static void metadata_dump(struct object *o)
|
||||
{
|
||||
struct data *d = o->data;
|
||||
struct metadata_entry *e;
|
||||
put_begin(d, "metadata", "[", 0);
|
||||
spa_list_for_each(e, &o->data_list, link) {
|
||||
put_begin(d, NULL, "{", STATE_SIMPLE);
|
||||
put_int(d, "subject", e->subject);
|
||||
put_value(d, "key", e->key);
|
||||
put_value(d, "type", e->type);
|
||||
put_value(d, "value", e->value);
|
||||
put_end(d, "}", STATE_SIMPLE);
|
||||
}
|
||||
put_end(d, "]", 0);
|
||||
}
|
||||
|
||||
static struct metadata_entry *metadata_find(struct object *o, uint32_t subject, const char *key)
|
||||
{
|
||||
struct metadata_entry *e;
|
||||
spa_list_for_each(e, &o->data_list, link) {
|
||||
if ((e->subject == subject) &&
|
||||
(key == NULL || strcmp(e->key, key) == 0))
|
||||
return e;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static int metadata_property(void *object,
|
||||
uint32_t subject,
|
||||
const char *key,
|
||||
|
|
@ -1038,6 +1076,34 @@ static int metadata_property(void *object,
|
|||
const char *value)
|
||||
{
|
||||
struct object *o = object;
|
||||
struct metadata_entry *e;
|
||||
|
||||
while ((e = metadata_find(o, subject, key)) != NULL) {
|
||||
spa_list_remove(&e->link);
|
||||
free(e);
|
||||
}
|
||||
if (key != NULL && value != NULL) {
|
||||
size_t size = strlen(key) + 1;
|
||||
size += strlen(value) + 1;
|
||||
size += type ? strlen(type) + 1 : 0;
|
||||
|
||||
e = calloc(1, sizeof(*e) + size);
|
||||
if (e == NULL)
|
||||
return -errno;
|
||||
|
||||
e->key = SPA_MEMBER(e, sizeof(*e), void);
|
||||
strcpy(e->key, key);
|
||||
e->value = SPA_MEMBER(e->key, strlen(e->key) + 1, void);
|
||||
strcpy(e->value, value);
|
||||
if (type) {
|
||||
e->type = SPA_MEMBER(e->value, strlen(e->value) + 1, void);
|
||||
strcpy(e->type, type);
|
||||
} else {
|
||||
e->type = NULL;
|
||||
}
|
||||
spa_list_append(&o->data_list, &e->link);
|
||||
e->changed++;
|
||||
}
|
||||
o->changed++;
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -1047,10 +1113,21 @@ static const struct pw_metadata_events metadata_events = {
|
|||
.property = metadata_property,
|
||||
};
|
||||
|
||||
static void metadata_destroy(struct object *o)
|
||||
{
|
||||
struct metadata_entry *e;
|
||||
spa_list_consume(e, &o->data_list, link) {
|
||||
spa_list_remove(&e->link);
|
||||
free(e);
|
||||
}
|
||||
}
|
||||
|
||||
static const struct class metadata_class = {
|
||||
.type = PW_TYPE_INTERFACE_Metadata,
|
||||
.version = PW_VERSION_METADATA,
|
||||
.events = &metadata_events,
|
||||
.destroy = metadata_destroy,
|
||||
.dump = metadata_dump,
|
||||
};
|
||||
|
||||
static const struct class *classes[] =
|
||||
|
|
@ -1125,6 +1202,7 @@ static void registry_event_global(void *data, uint32_t id,
|
|||
o->props = props ? pw_properties_new_dict(props) : NULL;
|
||||
spa_list_init(&o->param_list);
|
||||
spa_list_init(&o->pending_list);
|
||||
spa_list_init(&o->data_list);
|
||||
|
||||
o->class = find_class(type, version);
|
||||
if (o->class != NULL) {
|
||||
|
|
@ -1271,6 +1349,7 @@ static void show_help(struct data *data, const char *name)
|
|||
int main(int argc, char *argv[])
|
||||
{
|
||||
struct data data = { 0 };
|
||||
struct object *o;
|
||||
struct pw_loop *l;
|
||||
const char *opt_remote = NULL;
|
||||
static const struct option long_options[] = {
|
||||
|
|
@ -1356,6 +1435,10 @@ int main(int argc, char *argv[])
|
|||
|
||||
pw_main_loop_run(data.loop);
|
||||
|
||||
spa_list_consume(o, &data.object_list, link)
|
||||
object_destroy(o);
|
||||
if (data.info)
|
||||
pw_core_info_free(data.info);
|
||||
|
||||
pw_proxy_destroy((struct pw_proxy*)data.registry);
|
||||
pw_context_destroy(data.context);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue