diff options
-rw-r--r-- | polyp/cli.c | 4 | ||||
-rw-r--r-- | polyp/module-zeroconf-publish.c | 104 |
2 files changed, 61 insertions, 47 deletions
diff --git a/polyp/cli.c b/polyp/cli.c index 04fbb7e0..4d4342bf 100644 --- a/polyp/cli.c +++ b/polyp/cli.c @@ -102,7 +102,7 @@ static void client_kill(struct pa_client *client) { assert(client && client->userdata); c = client->userdata; - pa_log(__FILE__": CLI client killed.\n"); + pa_log_debug(__FILE__": CLI client killed.\n"); if (c->defer_kill) c->kill_requested = 1; else { @@ -118,7 +118,7 @@ static void line_callback(struct pa_ioline *line, const char *s, void *userdata) assert(line && c); if (!s) { - pa_log(__FILE__": CLI got EOF from user.\n"); + pa_log_debug(__FILE__": CLI got EOF from user.\n"); if (c->eof_callback) c->eof_callback(c, c->userdata); diff --git a/polyp/module-zeroconf-publish.c b/polyp/module-zeroconf-publish.c index 6eee143b..363c2419 100644 --- a/polyp/module-zeroconf-publish.c +++ b/polyp/module-zeroconf-publish.c @@ -39,6 +39,7 @@ #include "util.h" #include "log.h" #include "subscribe.h" +#include "dynarray.h" PA_MODULE_AUTHOR("Lennart Poettering") PA_MODULE_DESCRIPTION("mDNS/DNS-SD Service Publisher") @@ -70,6 +71,7 @@ struct userdata { struct pa_core *core; struct pa_howl_wrapper *howl_wrapper; struct pa_hashmap *services; + struct pa_dynarray *sink_dynarray, *source_dynarray, *autoload_dynarray; struct pa_subscription *subscription; }; @@ -198,6 +200,8 @@ static int publish_sink(struct userdata *u, struct pa_sink *s) { svc->loaded.type = PA_NAMEREG_SINK; svc->loaded.index = s->index; + pa_dynarray_put(u->sink_dynarray, s->index, svc); + return publish_service(u, svc); } @@ -212,6 +216,8 @@ static int publish_source(struct userdata *u, struct pa_source *s) { svc->loaded.valid = 1; svc->loaded.type = PA_NAMEREG_SOURCE; svc->loaded.index = s->index; + + pa_dynarray_put(u->source_dynarray, s->index, svc); return publish_service(u, svc); } @@ -227,49 +233,57 @@ static int publish_autoload(struct userdata *u, struct pa_autoload_entry *s) { svc->autoload.valid = 1; svc->autoload.type = s->type; svc->autoload.index = s->index; + + pa_dynarray_put(u->autoload_dynarray, s->index, svc); return publish_service(u, svc); } -static int remove_sink(struct userdata *u, struct pa_sink *s) { +static int remove_sink(struct userdata *u, uint32_t index) { struct service *svc; - assert(u && s); + assert(u && index != PA_INVALID_INDEX); - if (!(svc = pa_hashmap_get(u->services, s->name))) + if (!(svc = pa_dynarray_get(u->sink_dynarray, index))) return 0; if (!svc->loaded.valid || svc->loaded.type != PA_NAMEREG_SINK) return 0; svc->loaded.valid = 0; + pa_dynarray_put(u->sink_dynarray, index, NULL); + return publish_service(u, svc); } -static int remove_source(struct userdata *u, struct pa_source *s) { +static int remove_source(struct userdata *u, uint32_t index) { struct service *svc; - assert(u && s); + assert(u && index != PA_INVALID_INDEX); - if (!(svc = pa_hashmap_get(u->services, s->name))) + if (!(svc = pa_dynarray_get(u->source_dynarray, index))) return 0; if (!svc->loaded.valid || svc->loaded.type != PA_NAMEREG_SOURCE) return 0; svc->loaded.valid = 0; + pa_dynarray_put(u->source_dynarray, index, NULL); + return publish_service(u, svc); } -static int remove_autoload(struct userdata *u, struct pa_autoload_entry *s) { +static int remove_autoload(struct userdata *u, uint32_t index) { struct service *svc; - assert(u && s); + assert(u && index != PA_INVALID_INDEX); - if (!(svc = pa_hashmap_get(u->services, s->name))) + if (!(svc = pa_dynarray_get(u->autoload_dynarray, index))) return 0; - if (!svc->autoload.valid || svc->autoload.type != s->type) + if (!svc->autoload.valid) return 0; svc->autoload.valid = 0; + pa_dynarray_put(u->autoload_dynarray, index, NULL); + return publish_service(u, svc); } @@ -277,63 +291,52 @@ static void subscribe_callback(struct pa_core *c, enum pa_subscription_event_typ struct userdata *u = userdata; assert(u && c); - switch (t & PA_SUBSCRIPTION_EVENT_FACILITY_MASK) { + switch (t & PA_SUBSCRIPTION_EVENT_FACILITY_MASK) case PA_SUBSCRIPTION_EVENT_SINK: { - struct pa_sink *sink; + if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_NEW) { + struct pa_sink *sink; - pa_log("subscribe: %x\n", t); - - - - - if ((sink = pa_idxset_get_by_index(c->sinks, index))) { - if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_NEW) { - pa_log("add\n"); + if ((sink = pa_idxset_get_by_index(c->sinks, index))) { if (publish_sink(u, sink) < 0) goto fail; - } else if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_REMOVE) { - pa_log("remove\n"); - - - if (remove_sink(u, sink) < 0) - goto fail; } + } else if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_REMOVE) { + if (remove_sink(u, index) < 0) + goto fail; } break; - } - case PA_SUBSCRIPTION_EVENT_SOURCE: { - struct pa_source *source; + case PA_SUBSCRIPTION_EVENT_SOURCE: - if ((source = pa_idxset_get_by_index(c->sources, index))) { - if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_NEW) { + if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_NEW) { + struct pa_source *source; + + if ((source = pa_idxset_get_by_index(c->sources, index))) { if (publish_source(u, source) < 0) goto fail; - } else if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_REMOVE) { - if (remove_source(u, source) < 0) - goto fail; } + } else if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_REMOVE) { + if (remove_source(u, index) < 0) + goto fail; } break; - } - case PA_SUBSCRIPTION_EVENT_AUTOLOAD: { - struct pa_autoload_entry *autoload; - - if ((autoload = pa_idxset_get_by_index(c->autoload_idxset, index))) { - if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_NEW) { + case PA_SUBSCRIPTION_EVENT_AUTOLOAD: + if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_NEW) { + struct pa_autoload_entry *autoload; + + if ((autoload = pa_idxset_get_by_index(c->autoload_idxset, index))) { if (publish_autoload(u, autoload) < 0) goto fail; - } else if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_REMOVE) { - if (remove_autoload(u, autoload) < 0) - goto fail; } + } else if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_REMOVE) { + if (remove_autoload(u, index) < 0) + goto fail; } break; - } } return; @@ -359,7 +362,10 @@ int pa__init(struct pa_core *c, struct pa_module*m) { goto fail; u->services = pa_hashmap_new(pa_idxset_string_hash_func, pa_idxset_string_compare_func); - + u->sink_dynarray = pa_dynarray_new(); + u->source_dynarray = pa_dynarray_new(); + u->autoload_dynarray = pa_dynarray_new(); + u->subscription = pa_subscription_new(c, PA_SUBSCRIPTION_MASK_SINK| PA_SUBSCRIPTION_MASK_SOURCE| @@ -404,11 +410,19 @@ void pa__done(struct pa_core *c, struct pa_module*m) { if (u->services) pa_hashmap_free(u->services, service_free, u); + if (u->sink_dynarray) + pa_dynarray_free(u->sink_dynarray, NULL, NULL); + if (u->source_dynarray) + pa_dynarray_free(u->source_dynarray, NULL, NULL); + if (u->autoload_dynarray) + pa_dynarray_free(u->autoload_dynarray, NULL, NULL); + if (u->subscription) pa_subscription_free(u->subscription); if (u->howl_wrapper) pa_howl_wrapper_unref(u->howl_wrapper); + pa_xfree(u); } |