diff options
Diffstat (limited to 'main/stasis_cache_pattern.c')
-rw-r--r-- | main/stasis_cache_pattern.c | 49 |
1 files changed, 40 insertions, 9 deletions
diff --git a/main/stasis_cache_pattern.c b/main/stasis_cache_pattern.c index 9e3de367a..ccc9ebf08 100644 --- a/main/stasis_cache_pattern.c +++ b/main/stasis_cache_pattern.c @@ -138,6 +138,30 @@ struct stasis_cp_single *stasis_cp_single_create(struct stasis_cp_all *all, { RAII_VAR(struct stasis_cp_single *, one, NULL, ao2_cleanup); + one = stasis_cp_single_create_only(all, name); + if (!one) { + return NULL; + } + + one->forward_topic_to_all = stasis_forward_all(one->topic, all->topic); + if (!one->forward_topic_to_all) { + return NULL; + } + one->forward_cached_to_all = stasis_forward_all( + stasis_caching_get_topic(one->topic_cached), all->topic_cached); + if (!one->forward_cached_to_all) { + return NULL; + } + + ao2_ref(one, +1); + return one; +} + +struct stasis_cp_single *stasis_cp_single_create_only(struct stasis_cp_all *all, + const char *name) +{ + RAII_VAR(struct stasis_cp_single *, one, NULL, ao2_cleanup); + one = ao2_t_alloc(sizeof(*one), one_dtor, name); if (!one) { return NULL; @@ -152,18 +176,25 @@ struct stasis_cp_single *stasis_cp_single_create(struct stasis_cp_all *all, return NULL; } - one->forward_topic_to_all = stasis_forward_all(one->topic, all->topic); - if (!one->forward_topic_to_all) { - return NULL; + ao2_ref(one, +1); + return one; +} + +int stasis_cp_single_forward(struct stasis_cp_single *from, struct stasis_cp_single *to) +{ + from->forward_topic_to_all = stasis_forward_all(from->topic, to->topic); + if (!from->forward_topic_to_all) { + return -1;; } - one->forward_cached_to_all = stasis_forward_all( - stasis_caching_get_topic(one->topic_cached), all->topic_cached); - if (!one->forward_cached_to_all) { - return NULL; + + from->forward_cached_to_all = stasis_forward_all( + stasis_caching_get_topic(from->topic_cached), + stasis_caching_get_topic(to->topic_cached)); + if (!from->forward_cached_to_all) { + return -1; } - ao2_ref(one, +1); - return one; + return 0; } void stasis_cp_single_unsubscribe(struct stasis_cp_single *one) |