/*! Forward a channel's topics to an app */ static struct app_forwards *forwards_create_channel(struct stasis_app *app, struct ast_channel *chan) { struct app_forwards *forwards; if (!app) { return NULL; } forwards = forwards_create(app, chan ? ast_channel_uniqueid(chan) : CHANNEL_ALL); if (!forwards) { return NULL; } forwards->forward_type = FORWARD_CHANNEL; if (chan) { forwards->topic_forward = stasis_forward_all(ast_channel_topic(chan), app->topic); } forwards->topic_cached_forward = stasis_forward_all( chan ? ast_channel_topic_cached(chan) : ast_channel_topic_all_cached(), app->topic); if ((!forwards->topic_forward && chan) || !forwards->topic_cached_forward) { /* Half-subscribed is a bad thing */ forwards_unsubscribe(forwards); ao2_ref(forwards, -1); return NULL; } return forwards; }
struct stasis_topic *ast_channel_topic_cached(struct ast_channel *chan) { if (!chan) { return ast_channel_topic_all_cached(); } return stasis_cp_single_topic_cached(chan->topics); }
static int load_module(void) { /* You can create a message router to route messages by type */ router = stasis_message_router_create( ast_channel_topic_all_cached()); if (!router) { return AST_MODULE_LOAD_FAILURE; } stasis_message_router_add(router, stasis_cache_update_type(), updates, NULL); stasis_message_router_set_default(router, default_route, NULL); /* Or a subscription to receive all of the messages from a topic */ sub = stasis_subscribe(ast_channel_topic_all(), statsmaker, NULL); if (!sub) { return AST_MODULE_LOAD_FAILURE; } return AST_MODULE_LOAD_SUCCESS; }
int manager_confbridge_init(void) { STASIS_MESSAGE_TYPE_INIT(confbridge_start_type); STASIS_MESSAGE_TYPE_INIT(confbridge_end_type); STASIS_MESSAGE_TYPE_INIT(confbridge_join_type); STASIS_MESSAGE_TYPE_INIT(confbridge_leave_type); STASIS_MESSAGE_TYPE_INIT(confbridge_start_record_type); STASIS_MESSAGE_TYPE_INIT(confbridge_stop_record_type); STASIS_MESSAGE_TYPE_INIT(confbridge_mute_type); STASIS_MESSAGE_TYPE_INIT(confbridge_unmute_type); STASIS_MESSAGE_TYPE_INIT(confbridge_talking_type); bridge_state_router = stasis_message_router_create( ast_bridge_topic_all_cached()); if (!bridge_state_router) { return -1; } if (stasis_message_router_add(bridge_state_router, confbridge_start_type(), confbridge_start_cb, NULL)) { manager_confbridge_shutdown(); return -1; } if (stasis_message_router_add(bridge_state_router, confbridge_end_type(), confbridge_end_cb, NULL)) { manager_confbridge_shutdown(); return -1; } if (stasis_message_router_add(bridge_state_router, confbridge_join_type(), confbridge_join_cb, NULL)) { manager_confbridge_shutdown(); return -1; } if (stasis_message_router_add(bridge_state_router, confbridge_leave_type(), confbridge_leave_cb, NULL)) { manager_confbridge_shutdown(); return -1; } if (stasis_message_router_add(bridge_state_router, confbridge_start_record_type(), confbridge_start_record_cb, NULL)) { manager_confbridge_shutdown(); return -1; } if (stasis_message_router_add(bridge_state_router, confbridge_stop_record_type(), confbridge_stop_record_cb, NULL)) { manager_confbridge_shutdown(); return -1; } if (stasis_message_router_add(bridge_state_router, confbridge_mute_type(), confbridge_mute_cb, NULL)) { manager_confbridge_shutdown(); return -1; } if (stasis_message_router_add(bridge_state_router, confbridge_unmute_type(), confbridge_unmute_cb, NULL)) { manager_confbridge_shutdown(); return -1; } if (stasis_message_router_add(bridge_state_router, confbridge_talking_type(), confbridge_talking_cb, NULL)) { manager_confbridge_shutdown(); return -1; } channel_state_router = stasis_message_router_create( ast_channel_topic_all_cached()); if (!channel_state_router) { manager_confbridge_shutdown(); return -1; } if (stasis_message_router_add(channel_state_router, confbridge_start_type(), confbridge_start_cb, NULL)) { manager_confbridge_shutdown(); return -1; } if (stasis_message_router_add(channel_state_router, confbridge_end_type(), confbridge_end_cb, NULL)) { manager_confbridge_shutdown(); return -1; } if (stasis_message_router_add(channel_state_router, confbridge_join_type(), confbridge_join_cb, NULL)) { manager_confbridge_shutdown(); return -1; } if (stasis_message_router_add(channel_state_router, confbridge_leave_type(), confbridge_leave_cb, NULL)) { manager_confbridge_shutdown(); return -1; } if (stasis_message_router_add(channel_state_router, confbridge_start_record_type(), confbridge_start_record_cb, NULL)) { manager_confbridge_shutdown(); return -1; } if (stasis_message_router_add(channel_state_router, confbridge_stop_record_type(), confbridge_stop_record_cb, NULL)) { manager_confbridge_shutdown(); return -1; } if (stasis_message_router_add(channel_state_router, confbridge_mute_type(), confbridge_mute_cb, NULL)) { manager_confbridge_shutdown(); return -1; } if (stasis_message_router_add(channel_state_router, confbridge_unmute_type(), confbridge_unmute_cb, NULL)) { manager_confbridge_shutdown(); return -1; } if (stasis_message_router_add(channel_state_router, confbridge_talking_type(), confbridge_talking_cb, NULL)) { manager_confbridge_shutdown(); return -1; } return 0; }