[svn-commits] trunk r29017 - in /trunk: UPGRADE.txt apps/app_userevent.c manager.c

svn-commits at lists.digium.com svn-commits at lists.digium.com
Sat May 20 06:29:22 MST 2006


Author: russell
Date: Sat May 20 08:29:22 2006
New Revision: 29017

URL: http://svn.digium.com/view/asterisk?rev=29017&view=rev
Log:
- add a UserEvent action that allows a manager client to "broadcast" an event
  to all connected manager clients
- update the UserEvent application to use the application argument parsing
  macros and to allow headers to be specified as pipe delimeted arguments
  (issue #5324, original patch by outtolunc, committed patch by Corydon)

Modified:
    trunk/UPGRADE.txt
    trunk/apps/app_userevent.c
    trunk/manager.c

Modified: trunk/UPGRADE.txt
URL: http://svn.digium.com/view/asterisk/trunk/UPGRADE.txt?rev=29017&r1=29016&r2=29017&view=diff
==============================================================================
--- trunk/UPGRADE.txt (original)
+++ trunk/UPGRADE.txt Sat May 20 08:29:22 2006
@@ -127,6 +127,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: <userspec>.  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},

Modified: trunk/apps/app_userevent.c
URL: http://svn.digium.com/view/asterisk/trunk/apps/app_userevent.c?rev=29017&r1=29016&r2=29017&view=diff
==============================================================================
--- trunk/apps/app_userevent.c (original)
+++ trunk/apps/app_userevent.c Sat May 20 08:29:22 2006
@@ -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,27 @@
 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<specified event name>\n"
-"    Channel: <channel name>\n"
-"    Uniqueid: <call uniqueid>\n"
+"  UserEvent(eventname[|body]): Sends an arbitrary event to the manager\n"
+"interface, with an optional body representing additional arguments.  The\n"
+"body may be specified as a | delimeted list of headers. Each additional\n"
+"argument will be placed on a new line in the event. The format of the\n"
+"event will be:\n"
+"    Event: UserEvent\n"
+"    UserEvent: <specified event name>\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 headers 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,25 +76,18 @@
 
 	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;

Modified: trunk/manager.c
URL: http://svn.digium.com/view/asterisk/trunk/manager.c?rev=29017&r1=29016&r2=29017&view=diff
==============================================================================
--- trunk/manager.c (original)
+++ trunk/manager.c Sat May 20 08:29:22 2006
@@ -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);



More information about the svn-commits mailing list