diff options
Diffstat (limited to 'apps')
-rw-r--r-- | apps/app_chanspy.c | 109 | ||||
-rw-r--r-- | apps/app_fax.c | 50 | ||||
-rw-r--r-- | apps/app_minivm.c | 53 | ||||
-rw-r--r-- | apps/app_voicemail.c | 51 |
4 files changed, 156 insertions, 107 deletions
diff --git a/apps/app_chanspy.c b/apps/app_chanspy.c index 8e4590781..4e241b96f 100644 --- a/apps/app_chanspy.c +++ b/apps/app_chanspy.c @@ -55,6 +55,8 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$") #include "asterisk/lock.h" #include "asterisk/options.h" #include "asterisk/autochan.h" +#include "asterisk/stasis_channels.h" +#include "asterisk/json.h" #define AST_NAME_STRLEN 256 #define NUM_SPYGROUPS 128 @@ -188,6 +190,8 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$") </description> <see-also> <ref type="application">ExtenSpy</ref> + <ref type="managerEvent">ChanSpyStart</ref> + <ref type="managerEvent">ChanSpyStop</ref> </see-also> </application> <application name="ExtenSpy" language="en_US"> @@ -322,9 +326,10 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$") </description> <see-also> <ref type="application">ChanSpy</ref> + <ref type="managerEvent">ChanSpyStart</ref> + <ref type="managerEvent">ChanSpyStop</ref> </see-also> </application> - <application name="DAHDIScan" language="en_US"> <synopsis> Scan DAHDI channels to monitor calls. @@ -338,6 +343,10 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$") <para>Allows a call center manager to monitor DAHDI channels in a convenient way. Use <literal>#</literal> to select the next channel and use <literal>*</literal> to exit.</para> </description> + <see-also> + <ref type="managerEvent">ChanSpyStart</ref> + <ref type="managerEvent">ChanSpyStop</ref> + </see-also> </application> ***/ @@ -512,6 +521,68 @@ static void change_spy_mode(const char digit, struct ast_flags *flags) } } +static int pack_channel_into_message(struct ast_channel *chan, const char *role, + struct ast_multi_channel_blob *payload) +{ + RAII_VAR(struct ast_channel_snapshot *, snapshot, + ast_channel_snapshot_get_latest(ast_channel_uniqueid(chan)), + ao2_cleanup); + + if (!snapshot) { + return -1; + } + ast_multi_channel_blob_add_channel(payload, role, snapshot); + return 0; +} + +/*! \internal + * \brief Publish the chanspy message over Stasis-Core + * \param spyer The channel doing the spying + * \param spyee Who is being spied upon + * \start start If non-zero, the spying is starting. Otherwise, the spyer is + * finishing + */ +static void publish_chanspy_message(struct ast_channel *spyer, + struct ast_channel *spyee, + int start) +{ + RAII_VAR(struct ast_json *, blob, NULL, ast_json_unref); + RAII_VAR(struct ast_multi_channel_blob *, payload, NULL, ao2_cleanup); + RAII_VAR(struct stasis_message *, message, NULL, ao2_cleanup); + + if (!spyer) { + ast_log(AST_LOG_WARNING, "Attempt to publish ChanSpy message for NULL spyer channel\n"); + return; + } + blob = ast_json_null(); + if (!blob) { + return; + } + + payload = ast_multi_channel_blob_create(blob); + if (!payload) { + return; + } + + if (pack_channel_into_message(spyer, "spyer_channel", payload)) { + return; + } + + if (spyee) { + if (pack_channel_into_message(spyee, "spyee_channel", payload)) { + return; + } + } + + message = stasis_message_create( + start ? ast_channel_chanspy_start_type(): ast_channel_chanspy_stop_type(), + payload); + if (!message) { + return; + } + stasis_publish(ast_channel_topic(spyer), message); +} + static int channel_spy(struct ast_channel *chan, struct ast_autochan *spyee_autochan, int *volfactor, int fd, struct spy_dtmf_options *user_options, struct ast_flags *flags, char *exitcontext) @@ -524,38 +595,22 @@ static int channel_spy(struct ast_channel *chan, struct ast_autochan *spyee_auto struct ast_silence_generator *silgen = NULL; struct ast_autochan *spyee_bridge_autochan = NULL; const char *spyer_name; - struct ast_channel *chans[] = { chan, spyee_autochan->chan }; - - ast_channel_lock(chan); - spyer_name = ast_strdupa(ast_channel_name(chan)); - ast_channel_unlock(chan); - - /* We now hold the channel lock on spyee */ if (ast_check_hangup(chan) || ast_check_hangup(spyee_autochan->chan) || ast_test_flag(ast_channel_flags(spyee_autochan->chan), AST_FLAG_ZOMBIE)) { return 0; } + ast_channel_lock(chan); + spyer_name = ast_strdupa(ast_channel_name(chan)); + ast_channel_unlock(chan); + ast_channel_lock(spyee_autochan->chan); name = ast_strdupa(ast_channel_name(spyee_autochan->chan)); ast_channel_unlock(spyee_autochan->chan); ast_verb(2, "Spying on channel %s\n", name); - /*** DOCUMENTATION - <managerEventInstance> - <synopsis>Raised when a channel has started spying on another channel.</synopsis> - <see-also> - <ref type="application">ChanSpy</ref> - <ref type="application">ExtenSpy</ref> - <ref type="managerEvent">ChanSpyStop</ref> - </see-also> - </managerEventInstance> - ***/ - ast_manager_event_multichan(EVENT_FLAG_CALL, "ChanSpyStart", 2, chans, - "SpyerChannel: %s\r\n" - "SpyeeChannel: %s\r\n", - spyer_name, name); + publish_chanspy_message(chan, spyee_autochan->chan, 1); memset(&csth, 0, sizeof(csth)); ast_copy_flags(&csth.flags, flags, AST_FLAGS_ALL); @@ -740,15 +795,7 @@ static int channel_spy(struct ast_channel *chan, struct ast_autochan *spyee_auto } ast_verb(2, "Done Spying on channel %s\n", name); - /*** DOCUMENTATION - <managerEventInstance> - <synopsis>Raised when a channel has stopped spying on another channel.</synopsis> - <see-also> - <ref type="managerEvent">ChanSpyStart</ref> - </see-also> - </managerEventInstance> - ***/ - ast_manager_event(chan, EVENT_FLAG_CALL, "ChanSpyStop", "SpyeeChannel: %s\r\n", name); + publish_chanspy_message(chan, NULL, 0); return running; } diff --git a/apps/app_fax.c b/apps/app_fax.c index adee8f4bd..a7b9e53d1 100644 --- a/apps/app_fax.c +++ b/apps/app_fax.c @@ -43,7 +43,8 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$") #include "asterisk/app.h" #include "asterisk/dsp.h" #include "asterisk/module.h" -#include "asterisk/manager.h" +#include "asterisk/stasis.h" +#include "asterisk/stasis_channels.h" /*** DOCUMENTATION <application name="SendFAX" language="en_US" module="app_fax"> @@ -202,6 +203,9 @@ static int t38_tx_packet_handler(t38_core_state_t *s, void *user_data, const uin static void phase_e_handler(t30_state_t *f, void *user_data, int result) { + RAII_VAR(struct ast_json *, json_object, NULL, ast_json_unref); + RAII_VAR(struct ast_json *, json_filenames, NULL, ast_json_unref); + RAII_VAR(struct stasis_message *, message, NULL, ao2_cleanup); const char *local_ident; const char *far_ident; char buf[20]; @@ -251,32 +255,24 @@ static void phase_e_handler(t30_state_t *f, void *user_data, int result) ast_debug(1, " Image resolution: %d x %d\n", stat.x_resolution, stat.y_resolution); ast_debug(1, " Transfer Rate: %d\n", stat.bit_rate); - ast_manager_event(s->chan, EVENT_FLAG_CALL, - s->direction ? "FaxSent" : "FaxReceived", - "Channel: %s\r\n" - "Exten: %s\r\n" - "CallerID: %s\r\n" - "CallerIDName: %s\r\n" - "ConnectedLineNum: %s\r\n" - "ConnectedLineName: %s\r\n" - "RemoteStationID: %s\r\n" - "LocalStationID: %s\r\n" - "PagesTransferred: %d\r\n" - "Resolution: %d\r\n" - "TransferRate: %d\r\n" - "FileName: %s\r\n", - ast_channel_name(s->chan), - ast_channel_exten(s->chan), - S_COR(ast_channel_caller(s->chan)->id.number.valid, ast_channel_caller(s->chan)->id.number.str, ""), - S_COR(ast_channel_caller(s->chan)->id.name.valid, ast_channel_caller(s->chan)->id.name.str, ""), - S_COR(ast_channel_connected(s->chan)->id.number.valid, ast_channel_connected(s->chan)->id.number.str, ""), - S_COR(ast_channel_connected(s->chan)->id.name.valid, ast_channel_connected(s->chan)->id.name.str, ""), - far_ident, - local_ident, - pages_transferred, - stat.y_resolution, - stat.bit_rate, - s->file_name); + json_filenames = ast_json_pack("[s]", s->file_name); + if (!json_filenames) { + return; + } + ast_json_ref(json_filenames); + json_object = ast_json_pack("{s: s, s: s, s: s, s: i, s: i, s: i, s: o}", + "type", s->direction ? "send" : "receive", + "remote_station_id", far_ident, + "local_station_id", local_ident, + "fax_pages", pages_transferred, + "fax_resolution", stat.y_resolution, + "fax_bitrate", stat.bit_rate, + "filenames", json_filenames); + message = ast_channel_cached_blob_create(s->chan, ast_channel_fax_type(), json_object); + if (!message) { + return; + } + stasis_publish(ast_channel_topic(s->chan), message); } /* === Helper functions to configure fax === */ diff --git a/apps/app_minivm.c b/apps/app_minivm.c index 53c5f0937..ba6d6e5a2 100644 --- a/apps/app_minivm.c +++ b/apps/app_minivm.c @@ -166,14 +166,15 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$") #include "asterisk/say.h" #include "asterisk/module.h" #include "asterisk/app.h" -#include "asterisk/manager.h" #include "asterisk/dsp.h" #include "asterisk/localtime.h" #include "asterisk/cli.h" #include "asterisk/utils.h" #include "asterisk/linkedlists.h" #include "asterisk/callerid.h" -#include "asterisk/event.h" +#include "asterisk/stasis.h" +#include "asterisk/stasis_channels.h" +#include "asterisk/json.h" /*** DOCUMENTATION <application name="MinivmRecord" language="en_US"> @@ -495,7 +496,23 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$") <ref type="function">MINIVMCOUNTER</ref> </see-also> </function> - + <managerEvent language="en_US" name="MiniVoiceMail"> + <managerEventInstance class="EVENT_FLAG_CALL"> + <synopsis>Raised when a notification is sent out by a MiniVoiceMail application</synopsis> + <syntax> + <xi:include xpointer="xpointer(/docs/managerEvent[@name='Newchannel']/managerEventInstance/syntax/parameter)" /> + <parameter name="Action"> + <para>What action was taken. Currently, this will always be <literal>SentNotification</literal></para> + </parameter> + <parameter name="Mailbox"> + <para>The mailbox that the notification was about, specified as <literal>mailbox</literal>@<literal>context</literal></para> + </parameter> + <parameter name="Counter"> + <para>A message counter derived from the <literal>MVM_COUNTER</literal> channel variable.</para> + </parameter> + </syntax> + </managerEventInstance> + </managerEvent> ***/ #ifndef TRUE @@ -1761,6 +1778,9 @@ static void run_externnotify(struct ast_channel *chan, struct minivm_account *vm * \brief Send message to voicemail account owner */ static int notify_new_message(struct ast_channel *chan, const char *templatename, struct minivm_account *vmu, const char *filename, long duration, const char *format, char *cidnum, char *cidname) { + RAII_VAR(struct ast_json *, json_object, NULL, ast_json_unref); + RAII_VAR(struct stasis_message *, message, NULL, ao2_cleanup); + RAII_VAR(struct ast_mwi_state *, mwi_state, NULL, ao2_cleanup); char *stringp; struct minivm_template *etemplate; char *messageformat; @@ -1826,8 +1846,26 @@ static int notify_new_message(struct ast_channel *chan, const char *templatename res = sendmail(etemplate, vmu, cidnum, cidname, filename, messageformat, duration, etemplate->attachment, MVM_MESSAGE_PAGE, counter); } - ast_manager_event(chan, EVENT_FLAG_CALL, "MiniVoiceMail", "Action: SentNotification\rn\nMailbox: %s@%s\r\nCounter: %s\r\n", vmu->username, vmu->domain, counter); + mwi_state = ast_mwi_create(vmu->username, vmu->domain); + if (!mwi_state) { + goto notify_cleanup; + } + mwi_state->snapshot = ast_channel_snapshot_get_latest(ast_channel_uniqueid(chan)); + + json_object = ast_json_pack("{s: s, s: s}", + "Event", "MiniVoiceMail" + "Action", "SentNotification", + "Counter", counter); + if (!json_object) { + goto notify_cleanup; + } + message = ast_mwi_blob_create(mwi_state, ast_mwi_vm_app_type(), json_object); + if (!message) { + goto notify_cleanup; + } + stasis_publish(ast_mwi_topic(mwi_state->uniqueid), message); +notify_cleanup: run_externnotify(chan, vmu); /* Run external notification */ if (etemplate->locale) { @@ -2011,7 +2049,7 @@ static int leave_voicemail(struct ast_channel *chan, char *username, struct leav /*!\internal * \brief Queue a message waiting event */ -static void queue_mwi_event(const char *mbx, const char *ctx, int urgent, int new, int old) +static void queue_mwi_event(const char *channel_id, const char *mbx, const char *ctx, int urgent, int new, int old) { char *mailbox, *context; @@ -2021,7 +2059,7 @@ static void queue_mwi_event(const char *mbx, const char *ctx, int urgent, int ne context = "default"; } - stasis_publish_mwi_state(mailbox, context, new + urgent, old); + ast_publish_mwi_state_channel(mailbox, context, new + urgent, old, channel_id); } /*!\internal @@ -2056,7 +2094,7 @@ static int minivm_mwi_exec(struct ast_channel *chan, const char *data) ast_log(LOG_ERROR, "Need mailbox@context as argument. Sorry. Argument 0 %s\n", argv[0]); return -1; } - queue_mwi_event(mailbox, domain, atoi(argv[1]), atoi(argv[2]), atoi(argv[3])); + queue_mwi_event(ast_channel_uniqueid(chan), mailbox, domain, atoi(argv[1]), atoi(argv[2]), atoi(argv[3])); return res; } @@ -2078,7 +2116,6 @@ static int minivm_notify_exec(struct ast_channel *chan, const char *data) const char *filename; const char *format; const char *duration_string; - if (ast_strlen_zero(data)) { ast_log(LOG_ERROR, "Minivm needs at least an account argument \n"); return -1; diff --git a/apps/app_voicemail.c b/apps/app_voicemail.c index b3ceeebc9..90458bb31 100644 --- a/apps/app_voicemail.c +++ b/apps/app_voicemail.c @@ -7741,7 +7741,7 @@ static int vm_forwardoptions(struct ast_channel *chan, struct ast_vm_user *vmu, return cmd; } -static void queue_mwi_event(const char *box, int urgent, int new, int old) +static void queue_mwi_event(const char *channel_id, const char *box, int urgent, int new, int old) { char *mailbox, *context; @@ -7752,7 +7752,7 @@ static void queue_mwi_event(const char *box, int urgent, int new, int old) context = "default"; } - stasis_publish_mwi_state(mailbox, context, new + urgent, old); + ast_publish_mwi_state_channel(mailbox, context, new + urgent, old, channel_id); } /*! @@ -7842,32 +7842,7 @@ static int notify_new_message(struct ast_channel *chan, struct ast_vm_user *vmu, if (ast_app_has_voicemail(ext_context, NULL)) ast_app_inboxcount2(ext_context, &urgentmsgs, &newmsgs, &oldmsgs); - queue_mwi_event(ext_context, urgentmsgs, newmsgs, oldmsgs); - - /*** DOCUMENTATION - <managerEventInstance> - <synopsis>Raised when a new message has been left in a voicemail mailbox.</synopsis> - <syntax> - <parameter name="Mailbox"> - <para>The mailbox with the new message, specified as <emphasis>mailbox</emphasis>@<emphasis>context</emphasis></para> - </parameter> - <parameter name="Waiting"> - <para>Whether or not the mailbox has access to a voicemail application.</para> - </parameter> - <parameter name="New"> - <para>The number of new messages.</para> - </parameter> - <parameter name="Old"> - <para>The number of old messages.</para> - </parameter> - </syntax> - </managerEventInstance> - ***/ - ast_manager_event(chan, EVENT_FLAG_CALL, "MessageWaiting", - "Mailbox: %s@%s\r\n" - "Waiting: %d\r\n" - "New: %d\r\n" - "Old: %d\r\n", vmu->mailbox, vmu->context, ast_app_has_voicemail(ext_context, NULL), newmsgs, oldmsgs); + queue_mwi_event(ast_channel_uniqueid(chan), ext_context, urgentmsgs, newmsgs, oldmsgs); run_externnotify(vmu->context, vmu->mailbox, flag); #ifdef IMAP_STORAGE @@ -11538,16 +11513,10 @@ out: if (valid) { int new = 0, old = 0, urgent = 0; snprintf(ext_context, sizeof(ext_context), "%s@%s", vms.username, vmu->context); - /*** DOCUMENTATION - <managerEventInstance> - <synopsis>Raised when a user has finished listening to their messages.</synopsis> - </managerEventInstance> - ***/ - ast_manager_event(chan, EVENT_FLAG_CALL, "MessageWaiting", "Mailbox: %s\r\nWaiting: %d\r\n", ext_context, has_voicemail(ext_context, NULL)); /* Urgent flag not passwd to externnotify here */ run_externnotify(vmu->context, vmu->mailbox, NULL); ast_app_inboxcount2(ext_context, &urgent, &new, &old); - queue_mwi_event(ext_context, urgent, new, old); + queue_mwi_event(ast_channel_uniqueid(chan), ext_context, urgent, new, old); } #ifdef IMAP_STORAGE /* expunge message - use UID Expunge if supported on IMAP server*/ @@ -11766,7 +11735,7 @@ static int append_mailbox(const char *context, const char *box, const char *data strcat(mailbox_full, context); inboxcount2(mailbox_full, &urgent, &new, &old); - queue_mwi_event(mailbox_full, urgent, new, old); + queue_mwi_event(NULL, mailbox_full, urgent, new, old); return 0; } @@ -12502,7 +12471,7 @@ static void poll_subscribed_mailbox(struct mwi_sub *mwi_sub) mwi_sub->old_urgent = urgent; mwi_sub->old_new = new; mwi_sub->old_old = old; - queue_mwi_event(mwi_sub->mailbox, urgent, new, old); + queue_mwi_event(NULL, mwi_sub->mailbox, urgent, new, old); run_externnotify(NULL, mwi_sub->mailbox, NULL); } } @@ -12647,7 +12616,7 @@ static void mwi_event_cb(void *userdata, struct stasis_subscription *sub, struct } change = stasis_message_data(msg); - if (change->topic == stasis_mwi_topic_all()) { + if (change->topic == ast_mwi_topic_all()) { return; } @@ -12668,10 +12637,10 @@ static int dump_cache(void *obj, void *arg, int flags) static void start_poll_thread(void) { int errcode; - mwi_sub_sub = stasis_subscribe(stasis_mwi_topic_all(), mwi_event_cb, NULL); + mwi_sub_sub = stasis_subscribe(ast_mwi_topic_all(), mwi_event_cb, NULL); if (mwi_sub_sub) { - struct ao2_container *cached = stasis_cache_dump(stasis_mwi_topic_cached(), stasis_subscription_change_type()); + struct ao2_container *cached = stasis_cache_dump(ast_mwi_topic_cached(), stasis_subscription_change_type()); if (cached) { ao2_callback(cached, OBJ_MULTIPLE | OBJ_NODATA, dump_cache, NULL); } @@ -15263,7 +15232,7 @@ static void notify_new_state(struct ast_vm_user *vmu) snprintf(ext_context, sizeof(ext_context), "%s@%s", vmu->mailbox, vmu->context); run_externnotify(vmu->context, vmu->mailbox, NULL); ast_app_inboxcount2(ext_context, &urgent, &new, &old); - queue_mwi_event(ext_context, urgent, new, old); + queue_mwi_event(NULL, ext_context, urgent, new, old); } static int vm_msg_forward(const char *from_mailbox, |