]> code.delx.au - pulseaudio/blob - src/namereg.c
9cfb7353c1208a0c26d32cda2410e5e7b878e438
[pulseaudio] / src / namereg.c
1 #include <stdlib.h>
2 #include <string.h>
3 #include <assert.h>
4 #include <string.h>
5 #include <malloc.h>
6 #include <stdio.h>
7
8 #include "namereg.h"
9
10 struct namereg_entry {
11 enum pa_namereg_type type;
12 char *name;
13 void *data;
14 };
15
16 void pa_namereg_free(struct pa_core *c) {
17 assert(c);
18 if (!c->namereg)
19 return;
20 assert(pa_hashset_ncontents(c->namereg) == 0);
21 pa_hashset_free(c->namereg, NULL, NULL);
22 }
23
24 const char *pa_namereg_register(struct pa_core *c, const char *name, enum pa_namereg_type type, void *data, int fail) {
25 struct namereg_entry *e;
26 char *n = NULL;
27 int r;
28
29 assert(c && name && data);
30
31 if (!c->namereg) {
32 c->namereg = pa_hashset_new(pa_idxset_string_hash_func, pa_idxset_string_compare_func);
33 assert(c->namereg);
34 }
35
36 if ((e = pa_hashset_get(c->namereg, name)) && fail)
37 return NULL;
38
39 if (!e)
40 n = strdup(name);
41 else {
42 unsigned i;
43 size_t l = strlen(name);
44 n = malloc(l+3);
45 assert(n);
46
47 for (i = 1; i <= 99; i++) {
48 snprintf(n, l+2, "%s%u", name, i);
49
50 if (!(e = pa_hashset_get(c->namereg, n)))
51 break;
52 }
53
54 if (e) {
55 free(n);
56 return NULL;
57 }
58 }
59
60 assert(n);
61 e = malloc(sizeof(struct namereg_entry));
62 assert(e);
63 e->type = type;
64 e->name = n;
65 e->data = data;
66
67 r = pa_hashset_put(c->namereg, e->name, e);
68 assert (r >= 0);
69
70 return e->name;
71
72 }
73
74 void pa_namereg_unregister(struct pa_core *c, const char *name) {
75 struct namereg_entry *e;
76 int r;
77 assert(c && name);
78
79 e = pa_hashset_get(c->namereg, name);
80 assert(e);
81
82 r = pa_hashset_remove(c->namereg, name);
83 assert(r >= 0);
84
85 free(e->name);
86 free(e);
87 }
88
89 void* pa_namereg_get(struct pa_core *c, const char *name, enum pa_namereg_type type) {
90 struct namereg_entry *e;
91 uint32_t index;
92 char *x = NULL;
93 void *d = NULL;
94 assert(c && name);
95
96 if ((e = pa_hashset_get(c->namereg, name)))
97 if (e->type == e->type)
98 return e->data;
99
100 index = (uint32_t) strtol(name, &x, 0);
101
102 if (!x || *x != 0)
103 return NULL;
104
105 if (type == PA_NAMEREG_SINK)
106 d = pa_idxset_get_by_index(c->sinks, index);
107 else if (type == PA_NAMEREG_SOURCE)
108 d = pa_idxset_get_by_index(c->sources, index);
109
110 return d;
111 }