diff --git a/apps/app_chanspy.c b/apps/app_chanspy.c index c66d25030dbe932d866692b76fb616b9de209631..e02f25d920fed91283effebfa232a56b3cdc97b0 100644 --- a/apps/app_chanspy.c +++ b/apps/app_chanspy.c @@ -845,13 +845,13 @@ static int channel_spy(struct ast_channel *chan, struct ast_autochan *spyee_auto ast_audiohook_unlock(&csth.spy_audiohook); ast_audiohook_destroy(&csth.spy_audiohook); + ast_verb(2, "Done Spying on channel %s\n", name); + publish_chanspy_message(chan, spyee_autochan->chan, 0); + if (spyee_bridge_autochan) { ast_autochan_destroy(spyee_bridge_autochan); } - ast_verb(2, "Done Spying on channel %s\n", name); - publish_chanspy_message(chan, NULL, 0); - return running; } diff --git a/main/manager_channels.c b/main/manager_channels.c index 2655cf67231217cc6da6816041bbfdc620893018..73b76c88b9fae2bc430932f41a86a4a5ebfc8708 100644 --- a/main/manager_channels.c +++ b/main/manager_channels.c @@ -808,12 +808,15 @@ static void channel_chanspy_stop_cb(void *data, struct stasis_subscription *sub, struct stasis_message *message) { RAII_VAR(struct ast_str *, spyer_channel_string, NULL, ast_free); + RAII_VAR(struct ast_str *, spyee_channel_string, NULL, ast_free); struct ast_channel_snapshot *spyer; + struct ast_channel_snapshot *spyee; + const char *spyee_info = ""; struct ast_multi_channel_blob *payload = stasis_message_data(message); spyer = ast_multi_channel_blob_get_channel(payload, "spyer_channel"); if (!spyer) { - ast_log(AST_LOG_WARNING, "Received ChanSpy Start event with no spyer channel!\n"); + ast_log(AST_LOG_WARNING, "Received ChanSpy Stop event with no spyer channel!\n"); return; } @@ -822,9 +825,18 @@ static void channel_chanspy_stop_cb(void *data, struct stasis_subscription *sub, return; } + spyee = ast_multi_channel_blob_get_channel(payload, "spyee_channel"); + if (spyee) { + spyee_channel_string = ast_manager_build_channel_state_string_prefix(spyee, "Spyee"); + if (spyee_channel_string) { + spyee_info = ast_str_buffer(spyee_channel_string); + } + } + manager_event(EVENT_FLAG_CALL, "ChanSpyStop", - "%s", - ast_str_buffer(spyer_channel_string)); + "%s%s", + ast_str_buffer(spyer_channel_string), + spyee_info); } static void channel_chanspy_start_cb(void *data, struct stasis_subscription *sub, diff --git a/res/res_stasis_snoop.c b/res/res_stasis_snoop.c index b234de111815953f05e6543211b97cf7aca2f1a8..7e8761165dcb2d4a235782249a98c7c0fd89462a 100644 --- a/res/res_stasis_snoop.c +++ b/res/res_stasis_snoop.c @@ -66,12 +66,12 @@ struct stasis_app_snoop { struct ast_str *app; /*! \brief Snoop channel */ struct ast_channel *chan; + /*! \brief The channel that the Snoop channel is snooping on */ + struct ast_channel *spyee_chan; /*! \brief Whether the spy capability is active or not */ unsigned int spy_active:1; /*! \brief Whether the whisper capability is active or not */ unsigned int whisper_active:1; - /*! \brief Uniqueid of the channel this snoop is snooping on */ - char uniqueid[AST_MAX_UNIQUEID]; /*! \brief A frame of silence to use when the audiohook returns null */ struct ast_frame silence; }; @@ -100,6 +100,7 @@ static void snoop_destroy(void *obj) ast_free(snoop->app); + ast_channel_cleanup(snoop->spyee_chan); ast_channel_cleanup(snoop->chan); } @@ -134,7 +135,7 @@ static void publish_chanspy_message(struct stasis_app_snoop *snoop, int start) } ast_multi_channel_blob_add_channel(payload, "spyer_channel", snoop_snapshot); - spyee_snapshot = ast_channel_snapshot_get_latest(snoop->uniqueid); + spyee_snapshot = ast_channel_snapshot_get_latest(ast_channel_uniqueid(snoop->spyee_chan)); if (spyee_snapshot) { ast_multi_channel_blob_add_channel(payload, "spyee_channel", spyee_snapshot); } @@ -354,8 +355,6 @@ struct ast_channel *stasis_app_control_snoop(struct ast_channel *chan, return NULL; } - ast_copy_string(snoop->uniqueid, ast_channel_uniqueid(chan), sizeof(snoop->uniqueid)); - /* To keep the channel valid on the Snoop structure until it is destroyed we bump the ref up here */ ast_channel_ref(snoop->chan); @@ -425,6 +424,9 @@ struct ast_channel *stasis_app_control_snoop(struct ast_channel *chan, return NULL; } + /* Keep a reference to the channel we are spying on */ + snoop->spyee_chan = ast_channel_ref(chan); + publish_chanspy_message(snoop, 1); /* The caller of this has a reference as well */