diff --git a/include/asterisk/frame.h b/include/asterisk/frame.h index 542407ecc93dbe5fa50281d0be5db1c30f0464bc..b618d1965f239375ad32729f35db6c938fed8f7b 100644 --- a/include/asterisk/frame.h +++ b/include/asterisk/frame.h @@ -337,6 +337,7 @@ enum ast_control_frame_type { enum ast_frame_read_action { AST_FRAME_READ_ACTION_CONNECTED_LINE_MACRO, + AST_FRAME_READ_ACTION_SEND_TEXT, }; struct ast_control_read_action_payload { diff --git a/main/channel.c b/main/channel.c index dcb284b631e6951132dd31113d922a5d0a45b0ef..c0e3cb43eca0932ace96c1024462e32979247319 100644 --- a/main/channel.c +++ b/main/channel.c @@ -3773,6 +3773,11 @@ static struct ast_frame *__ast_read(struct ast_channel *chan, int dropaudio, int ast_party_connected_line_free(&connected); ast_channel_lock(chan); break; + case AST_FRAME_READ_ACTION_SEND_TEXT: + ast_channel_unlock(chan); + ast_sendtext(chan, (const char *) read_action_payload->payload); + ast_channel_lock(chan); + break; } ast_frfree(f); f = &ast_null_frame; diff --git a/main/manager.c b/main/manager.c index ec50cb82cc09704330ea1ab5cfa6e5bbd4851a4b..ab4243244679ed2d37bd7cf5ac9e4e2f6ac0dbcc 100644 --- a/main/manager.c +++ b/main/manager.c @@ -4745,10 +4745,13 @@ static int action_status(struct mansession *s, const struct message *m) static int action_sendtext(struct mansession *s, const struct message *m) { - struct ast_channel *c = NULL; + struct ast_channel *c; const char *name = astman_get_header(m, "Channel"); const char *textmsg = astman_get_header(m, "Message"); - int res = 0; + struct ast_control_read_action_payload *frame_payload; + int payload_size; + int frame_size; + int res; if (ast_strlen_zero(name)) { astman_send_error(s, m, "No channel specified"); @@ -4760,13 +4763,29 @@ static int action_sendtext(struct mansession *s, const struct message *m) return 0; } - if (!(c = ast_channel_get_by_name(name))) { + c = ast_channel_get_by_name(name); + if (!c) { astman_send_error(s, m, "No such channel"); return 0; } - res = ast_sendtext(c, textmsg); - c = ast_channel_unref(c); + payload_size = strlen(textmsg) + 1; + frame_size = payload_size + sizeof(*frame_payload); + + frame_payload = ast_malloc(frame_size); + if (!frame_payload) { + ast_channel_unref(c); + astman_send_error(s, m, "Failure"); + return 0; + } + + frame_payload->action = AST_FRAME_READ_ACTION_SEND_TEXT; + frame_payload->payload_size = payload_size; + memcpy(frame_payload->payload, textmsg, payload_size); + res = ast_queue_control_data(c, AST_CONTROL_READ_ACTION, frame_payload, frame_size); + + ast_free(frame_payload); + ast_channel_unref(c); if (res >= 0) { astman_send_ack(s, m, "Success");