Index: manager.c =================================================================== --- manager.c (revision 28257) +++ manager.c (working copy) @@ -1631,6 +1631,31 @@ return ret; } +static char mandescr_userevent[] = +"Description: Send an event to manager sessions.\n" +"Variables: (Names marked with * are required)\n" +" *UserEvent: EventStringToSend\n" +" Header1: Content1\n" +" HeaderN: ContentN\n"; + +static int action_userevent(struct mansession *s, struct message *m) +{ + char *event = astman_get_header(m, "UserEvent"); + char body[2048] = ""; + int x, bodylen = 0; + for (x = 0; x < m->hdrcount; x++) { + if (strncasecmp("UserEvent:", m->headers[x], strlen("UserEvent:"))) { + ast_copy_string(body + bodylen, m->headers[x], sizeof(body) - bodylen - 3); + bodylen += strlen(m->headers[x]); + ast_copy_string(body + bodylen, "\r\n", 3); + bodylen += 2; + } + } + + manager_event(EVENT_FLAG_USER, "UserEvent", "UserEvent: %s\r\n%s", event, body); + return 0; +} + static int process_message(struct mansession *s, struct message *m) { char action[80] = ""; @@ -2327,6 +2352,7 @@ ast_manager_register2("MailboxStatus", EVENT_FLAG_CALL, action_mailboxstatus, "Check Mailbox", mandescr_mailboxstatus ); ast_manager_register2("MailboxCount", EVENT_FLAG_CALL, action_mailboxcount, "Check Mailbox Message Count", mandescr_mailboxcount ); ast_manager_register2("ListCommands", 0, action_listcommands, "List available manager commands", mandescr_listcommands); + ast_manager_register2("UserEvent", EVENT_FLAG_USER, action_userevent, "Send an arbitrary event", mandescr_userevent); ast_manager_register2("WaitEvent", 0, action_waitevent, "Wait for an event to occur", mandescr_waitevent); ast_cli_register(&show_mancmd_cli); Index: apps/app_userevent.c =================================================================== --- apps/app_userevent.c (revision 28257) +++ apps/app_userevent.c (working copy) @@ -38,6 +38,7 @@ #include "asterisk/pbx.h" #include "asterisk/module.h" #include "asterisk/manager.h" +#include "asterisk/app.h" static char *tdesc = "Custom User Event Application"; @@ -46,24 +47,25 @@ static char *synopsis = "Send an arbitrary event to the manager interface"; static char *descrip = -" UserEvent(eventname[|body]): Sends an arbitrary event to the\n" -"manager interface, with an optional body representing additional\n" -"arguments. The format of the event will be:\n" -" Event: UserEvent\n" -" Channel: \n" -" Uniqueid: \n" +" UserEvent(eventname[|body]): Sends an arbitrary event to the manager\n" +"interface, with an optional body representing additional arguments. The\n" +"format of the event will be:\n" +" Event: UserEvent\n" +" UserEvent: \n" " [body]\n" -"If the body is not specified, only Event, Channel, and Uniqueid fields\n" -"will be present. Returns 0."; +"If no body is specified, only Event and UserEvent fields will be present.\n"; LOCAL_USER_DECL; static int userevent_exec(struct ast_channel *chan, void *data) { struct localuser *u; - char *info; - char eventname[512]; - char *eventbody; + char *parse, buf[2048] = ""; + int x, buflen = 0; + AST_DECLARE_APP_ARGS(args, + AST_APP_ARG(eventname); + AST_APP_ARG(extra)[100]; + ); if (ast_strlen_zero(data)) { ast_log(LOG_WARNING, "UserEvent requires an argument (eventname|optional event body)\n"); @@ -72,26 +74,19 @@ LOCAL_USER_ADD(u); - info = ast_strdupa(data); + parse = ast_strdupa(data); - snprintf(eventname, sizeof(eventname), "UserEvent%s", info); - eventbody = strchr(eventname, '|'); - if (eventbody) { - *eventbody = '\0'; - eventbody++; + AST_STANDARD_APP_ARGS(args, parse); + + for (x = 0; x < args.argc - 1; x++) { + ast_copy_string(buf + buflen, args.extra[x], sizeof(buf) - buflen - 2); + buflen += strlen(args.extra[x]); + ast_copy_string(buf + buflen, "\r\n", 3); + buflen += 2; } - - if(eventbody) { - ast_log(LOG_DEBUG, "Sending user event: %s, %s\n", eventname, eventbody); - manager_event(EVENT_FLAG_USER, eventname, - "Channel: %s\r\nUniqueid: %s\r\n%s\r\n", - chan->name, chan->uniqueid, eventbody); - } else { - ast_log(LOG_DEBUG, "Sending user event: %s\n", eventname); - manager_event(EVENT_FLAG_USER, eventname, - "Channel: %s\r\nUniqueid: %s\r\n", chan->name, chan->uniqueid); - } + manager_event(EVENT_FLAG_USER, "UserEvent", "UserEvent: %s\r\n%s\r\n", args.eventname, buf); + LOCAL_USER_REMOVE(u); return 0; } Index: UPGRADE.txt =================================================================== --- UPGRADE.txt (revision 28257) +++ UPGRADE.txt (working copy) @@ -121,6 +121,11 @@ call. This is useful when trying to link recording filenames back to a particular call from the queue. +* app_userevent has been modified to always send Event: UserEvent with the + additional header UserEvent: . Also, the Channel and UniqueID + headers are not automatically sent, unless you specify them as separate + arguments. Please see the application help for the new syntax. + Variables: * The builtin variables ${CALLERID}, ${CALLERIDNAME}, ${CALLERIDNUM},