git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@1425 d0543943-73ff-0310-b7d9-9358b9ac24b2
This commit is contained in:
Anthony Minessale 2006-05-10 19:07:38 +00:00
parent 3230f6ef20
commit 295424544d
6 changed files with 129 additions and 11 deletions

View File

@ -229,6 +229,15 @@ SWITCH_DECLARE(switch_status_t) switch_event_reserve_subclass_detailed(char *own
*/
SWITCH_DECLARE(switch_status_t) switch_event_serialize(switch_event_t *event, char *buf, switch_size_t buflen, char *fmt, ...);
/*!
\brief Render a XML representation of an event sutable for printing or network transport
\param event the event to render
\param fmt optional body of the event (varargs see standard sprintf family)
\return the xml object if the operation was successful
\note the body supplied by this function will supersede an existing body the event may have
*/
SWITCH_DECLARE(switch_xml_t) switch_event_xmlize(switch_event_t *event, char *fmt, ...);
/*!
\brief Determine if the event system has been initilized
\return SWITCH_STATUS_SUCCESS if the system is running

View File

@ -68,6 +68,7 @@ struct switch_stream_handle {
void *end;
switch_size_t data_size;
switch_size_t data_len;
switch_event_t *event;
};
/*! \brief Node in which to store custom outgoing channel callback hooks */

View File

@ -39,15 +39,33 @@ static const char modname[] = "mod_event_test";
static void event_handler(switch_event_t *event)
{
char buf[1024];
switch_xml_t xml;
char *xmlstr = "N/A";
uint8_t dofree = 0;
switch (event->event_id) {
case SWITCH_EVENT_LOG:
return;
default:
switch_event_serialize(event, buf, sizeof(buf), NULL);
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\nEVENT\n--------------------------------\n%s\n", buf);
if ((xml = switch_event_xmlize(event, NULL))) {
xmlstr = switch_xml_toxml(xml);
dofree++;
}
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\nEVENT (text version)\n--------------------------------\n%s", buf);
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\nEVENT (xml version)\n--------------------------------\n%s\n", xmlstr);
break;
}
if (dofree) {
if (xml) {
switch_xml_free(xml);
}
if (xmlstr) {
free(xmlstr);
}
}
}

View File

@ -208,10 +208,23 @@ abyss_bool HandleHook(TSession *r)
char *m = "text/html";
switch_stream_handle_t stream = {0};
char *command;
if(strncmp(r->uri, "/api/", 5)) {
return FALSE;
}
if (switch_event_create(&stream.event, SWITCH_EVENT_API) == SWITCH_STATUS_SUCCESS) {
if (r->uri) switch_event_add_header(stream.event, SWITCH_STACK_BOTTOM, "HTTP-URI", r->uri);
if (r->query) switch_event_add_header(stream.event, SWITCH_STACK_BOTTOM, "HTTP-QUERY", r->query);
if (r->host) switch_event_add_header(stream.event, SWITCH_STACK_BOTTOM, "HTTP-HOST", r->host);
if (r->from) switch_event_add_header(stream.event, SWITCH_STACK_BOTTOM, "HTTP-FROM", r->from);
if (r->useragent) switch_event_add_header(stream.event, SWITCH_STACK_BOTTOM, "HTTP-USER-AGENT", r->useragent);
if (r->referer) switch_event_add_header(stream.event, SWITCH_STACK_BOTTOM, "HTTP-REFERER", r->referer);
if (r->requestline) switch_event_add_header(stream.event, SWITCH_STACK_BOTTOM, "HTTP-REQUESTLINE", r->requestline);
if (r->user) switch_event_add_header(stream.event, SWITCH_STACK_BOTTOM, "HTTP-USER", r->user);
if (r->port) switch_event_add_header(stream.event, SWITCH_STACK_BOTTOM, "HTTP-PORT", "%u", r->port);
}
command = r->uri + 5;
ResponseChunked(r);

View File

@ -538,6 +538,78 @@ SWITCH_DECLARE(switch_status_t) switch_event_serialize(switch_event_t *event, ch
}
static switch_xml_t add_xml_header(switch_xml_t xml, char *name, char *value, int offset)
{
switch_xml_t header = NULL;
if ((header = switch_xml_add_child_d(xml, "header", offset))) {
switch_xml_set_attr_d(header, "name", name);
switch_xml_set_attr_d(header, "value", value);
}
return header;
}
SWITCH_DECLARE(switch_xml_t) switch_event_xmlize(switch_event_t *event, char *fmt, ...)
{
switch_event_header_t *hp;
char *data = NULL, *body = NULL;
int ret = 0;
switch_xml_t xml = NULL;
uint32_t off = 0;
va_list ap;
if (!(xml = switch_xml_new("event"))) {
return xml;
}
if (fmt) {
va_start(ap, fmt);
#ifdef HAVE_VASPRINTF
ret = vasprintf(&data, fmt, ap);
#else
data = (char *) malloc(2048);
vsnprintf(data, 2048, fmt, ap);
#endif
va_end(ap);
if (ret == -1) {
return NULL;
}
}
for (hp = event->headers; hp; hp = hp->next) {
add_xml_header(xml, hp->name, hp->value, off++);
}
if (data) {
body = data;
} else if (event->body) {
body = event->body;
}
if (body) {
int blen = (int) strlen(body);
char blena[25];
snprintf(blena, sizeof(blena), "%d", blen);
if (blen) {
switch_xml_t xbody = NULL;
add_xml_header(xml, "Content-Length", blena, off++);
if ((xbody = switch_xml_add_child_d(xml, "body", 0))) {
switch_xml_set_txt_d(xbody, body);
}
}
}
if (data) {
free(data);
}
return xml;
}
SWITCH_DECLARE(switch_status_t) switch_event_fire_detailed(char *file, char *func, int line, switch_event_t **event,
void *user_data)
{

View File

@ -671,12 +671,24 @@ SWITCH_DECLARE(switch_status_t) switch_api_execute(char *cmd, char *arg, switch_
{
switch_api_interface_t *api;
switch_status_t status;
switch_event_t *event;
assert(stream != NULL);
assert(stream->data != NULL);
assert(stream->write_function != NULL);
if (!stream->event) {
switch_event_create(&stream->event, SWITCH_EVENT_API);
}
if (stream->event) {
if (cmd) {
switch_event_add_header(stream->event, SWITCH_STACK_BOTTOM, "API-Command", cmd);
}
if (arg) {
switch_event_add_header(stream->event, SWITCH_STACK_BOTTOM, "API-Command-Arguement", arg);
}
}
if ((api = switch_loadable_module_get_api_interface(cmd)) != 0) {
status = api->function(arg, stream);
} else {
@ -685,15 +697,8 @@ SWITCH_DECLARE(switch_status_t) switch_api_execute(char *cmd, char *arg, switch_
//snprintf(retbuf, len, "INVALID COMMAND [%s]", cmd);
}
if (switch_event_create(&event, SWITCH_EVENT_API) == SWITCH_STATUS_SUCCESS) {
if (cmd) {
switch_event_add_header(event, SWITCH_STACK_BOTTOM, "API-Command", cmd);
}
if (arg) {
switch_event_add_header(event, SWITCH_STACK_BOTTOM, "API-Command-Arguement", arg);
}
//switch_event_add_body(event, retbuf);
switch_event_fire(&event);
if (stream->event) {
switch_event_fire(&stream->event);
}