From 68bab16e37b534801a4d388553a672d8e0c8fa17 Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Sat, 11 Nov 2006 19:32:45 +0000 Subject: [PATCH] make event_serialize dynamic git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@3314 d0543943-73ff-0310-b7d9-9358b9ac24b2 --- src/include/switch_event.h | 8 +-- .../mod_event_multicast/mod_event_multicast.c | 17 +++-- .../mod_event_socket/mod_event_socket.c | 26 +++---- .../mod_event_test/mod_event_test.c | 6 +- .../mod_xmpp_event/mod_xmpp_event.c | 5 +- .../mod_spidermonkey/mod_spidermonkey.c | 8 ++- src/switch_core.c | 3 - src/switch_event.c | 68 ++++++++++--------- 8 files changed, 71 insertions(+), 70 deletions(-) diff --git a/src/include/switch_event.h b/src/include/switch_event.h index 9b760ee3d6..b7c5cfcdcd 100644 --- a/src/include/switch_event.h +++ b/src/include/switch_event.h @@ -238,13 +238,11 @@ SWITCH_DECLARE(switch_status_t) switch_event_reserve_subclass_detailed(char *own /*! \brief Render a string representation of an event sutable for printing or network transport \param event the event to render - \param buf a string buffer to write the data to - \param buflen the size in bytes of the buffer - \param fmt optional body of the event (varargs see standard sprintf family) + \param str a string pointer to point at the allocated data \return SWITCH_STATUS_SUCCESS if the operation was successful - \note the body supplied by this function will supersede an existing body the event may have + \note you must free the resulting string when you are finished with it */ -SWITCH_DECLARE(switch_status_t) switch_event_serialize(switch_event_t *event, char *buf, switch_size_t buflen, char *fmt, ...); +SWITCH_DECLARE(switch_status_t) switch_event_serialize(switch_event_t *event, char **str); /*! \brief Render a XML representation of an event sutable for printing or network transport diff --git a/src/mod/event_handlers/mod_event_multicast/mod_event_multicast.c b/src/mod/event_handlers/mod_event_multicast/mod_event_multicast.c index c9e0524dd7..d2e9119fad 100644 --- a/src/mod/event_handlers/mod_event_multicast/mod_event_multicast.c +++ b/src/mod/event_handlers/mod_event_multicast/mod_event_multicast.c @@ -158,17 +158,20 @@ static void event_handler(switch_event_t *event) if (send) { char *packet; - memcpy(buf, &globals.host_hash, sizeof(globals.host_hash)); - packet = buf + sizeof(globals.host_hash); - switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Multicast-Sender", globals.hostname); + switch (event->event_id) { case SWITCH_EVENT_LOG: return; default: - switch_event_serialize(event, packet, sizeof(buf) - sizeof(globals.host_hash), NULL); - len = strlen(packet) + sizeof(globals.host_hash);; - //switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "\nEVENT\n--------------------------------\n%s\n", buf); - switch_socket_sendto(globals.udp_socket, globals.addr, 0, buf, &len); + switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Multicast-Sender", globals.hostname); + if (switch_event_serialize(event, &packet) == SWITCH_STATUS_SUCCESS) { + memcpy(buf, &globals.host_hash, sizeof(globals.host_hash)); + switch_copy_string(buf + sizeof(globals.host_hash), packet, sizeof(buf) - sizeof(globals.host_hash)); + len = strlen(packet) + sizeof(globals.host_hash);; + //switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "\nEVENT\n--------------------------------\n%s\n", buf); + switch_socket_sendto(globals.udp_socket, globals.addr, 0, buf, &len); + switch_safe_free(packet); + } break; } } diff --git a/src/mod/event_handlers/mod_event_socket/mod_event_socket.c b/src/mod/event_handlers/mod_event_socket/mod_event_socket.c index a56e14931c..5c7c71e29d 100644 --- a/src/mod/event_handlers/mod_event_socket/mod_event_socket.c +++ b/src/mod/event_handlers/mod_event_socket/mod_event_socket.c @@ -345,24 +345,18 @@ static switch_status_t read_packet(listener_t *listener, switch_event_t **event, if (switch_queue_trypop(listener->event_queue, &pop) == SWITCH_STATUS_SUCCESS) { char hbuf[512]; switch_event_t *event = (switch_event_t *) pop; - char *etype, *packet, *xmlstr = NULL; - - if (!listener->ebuf) { - listener->ebuf = switch_core_alloc(listener->pool, CMD_BUFLEN); - } + char *etype; do_sleep = 0; if (listener->format == EVENT_FORMAT_PLAIN) { etype = "plain"; - switch_event_serialize(event, listener->ebuf, CMD_BUFLEN, NULL); - packet = listener->ebuf; + switch_event_serialize(event, &listener->ebuf); } else { switch_xml_t xml; etype = "xml"; if ((xml = switch_event_xmlize(event, NULL))) { - xmlstr = switch_xml_toxml(xml); - packet = xmlstr; + listener->ebuf = switch_xml_toxml(xml); switch_xml_free(xml); } else { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "XML ERROR!\n"); @@ -370,7 +364,7 @@ static switch_status_t read_packet(listener_t *listener, switch_event_t **event, } } - len = strlen(packet); + len = strlen(listener->ebuf); snprintf(hbuf, sizeof(hbuf), "Content-Length: %"APR_SSIZE_T_FMT"\n" "Content-Type: text/event-%s\n" @@ -379,12 +373,10 @@ static switch_status_t read_packet(listener_t *listener, switch_event_t **event, len = strlen(hbuf); switch_socket_send(listener->sock, hbuf, &len); - len = strlen(packet); - switch_socket_send(listener->sock, packet, &len); + len = strlen(listener->ebuf); + switch_socket_send(listener->sock, listener->ebuf, &len); - if (xmlstr) { - free(xmlstr); - } + switch_safe_free(listener->ebuf); } } } @@ -392,7 +384,9 @@ static switch_status_t read_packet(listener_t *listener, switch_event_t **event, switch_yield(1000); } } - + + + return status; } diff --git a/src/mod/event_handlers/mod_event_test/mod_event_test.c b/src/mod/event_handlers/mod_event_test/mod_event_test.c index c941bff45c..56c8563faa 100644 --- a/src/mod/event_handlers/mod_event_test/mod_event_test.c +++ b/src/mod/event_handlers/mod_event_test/mod_event_test.c @@ -38,7 +38,7 @@ static const char modname[] = "mod_event_test"; static void event_handler(switch_event_t *event) { - char buf[1024]; + char *buf; switch_xml_t xml; char *xmlstr = "N/A"; uint8_t dofree = 0; @@ -47,7 +47,7 @@ static void event_handler(switch_event_t *event) case SWITCH_EVENT_LOG: return; default: - switch_event_serialize(event, buf, sizeof(buf), NULL); + switch_event_serialize(event, &buf); if ((xml = switch_event_xmlize(event, NULL))) { xmlstr = switch_xml_toxml(xml); dofree++; @@ -58,6 +58,8 @@ static void event_handler(switch_event_t *event) break; } + switch_safe_free(buf); + if (dofree) { if (xml) { switch_xml_free(xml); diff --git a/src/mod/event_handlers/mod_xmpp_event/mod_xmpp_event.c b/src/mod/event_handlers/mod_xmpp_event/mod_xmpp_event.c index 015ad8d73a..32f5e3b1bd 100644 --- a/src/mod/event_handlers/mod_xmpp_event/mod_xmpp_event.c +++ b/src/mod/event_handlers/mod_xmpp_event/mod_xmpp_event.c @@ -60,7 +60,7 @@ static struct { static void event_handler(switch_event_t *event) { - char buf[1024]; + char *buf; iks *msg; int loops = 0; @@ -78,12 +78,13 @@ static void event_handler(switch_event_t *event) switch (event->event_id) { default: - switch_event_serialize(event, buf, sizeof(buf), NULL); + switch_event_serialize(event, &buf); //switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "\nEVENT\n--------------------------------\n%s\n", buf); msg = iks_make_msg(IKS_TYPE_NONE, globals.target_jid, buf); iks_insert_attrib(msg, "subject", "Event"); iks_send(globals.session.parser, msg); iks_delete(msg); + switch_safe_free(buf); break; } } diff --git a/src/mod/languages/mod_spidermonkey/mod_spidermonkey.c b/src/mod/languages/mod_spidermonkey/mod_spidermonkey.c index 006f3f1232..6589c2007e 100644 --- a/src/mod/languages/mod_spidermonkey/mod_spidermonkey.c +++ b/src/mod/languages/mod_spidermonkey/mod_spidermonkey.c @@ -264,7 +264,7 @@ static JSBool event_get_type(JSContext *cx, JSObject *obj, uintN argc, jsval *ar static JSBool event_serialize(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { struct event_obj *eo = JS_GetPrivate(cx, obj); - char buf[1024]; + char *buf; uint8_t isxml = 0; if (!eo) { @@ -291,8 +291,10 @@ static JSBool event_serialize(JSContext *cx, JSObject *obj, uintN argc, jsval *a *rval = BOOLEAN_TO_JSVAL( JS_FALSE ); } } else { - switch_event_serialize(eo->event, buf, sizeof(buf), NULL); - *rval = STRING_TO_JSVAL (JS_NewStringCopyZ(cx, buf)); + if (switch_event_serialize(eo->event, &buf) == SWITCH_STATUS_SUCCESS) { + *rval = STRING_TO_JSVAL (JS_NewStringCopyZ(cx, buf)); + switch_safe_free(buf); + } } return JS_TRUE; diff --git a/src/switch_core.c b/src/switch_core.c index 15db1b084e..f65377a2dc 100644 --- a/src/switch_core.c +++ b/src/switch_core.c @@ -3695,9 +3695,6 @@ static void core_event_handler(switch_event_t *event) ); break; default: - //buf[0] = '\0'; - //switch_event_serialize(event, buf, sizeof(buf), NULL); - //switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\nCORE EVENT\n--------------------------------\n%s\n", buf); break; } diff --git a/src/switch_event.c b/src/switch_event.c index c53ff1dec0..278230b62b 100644 --- a/src/switch_event.c +++ b/src/switch_event.c @@ -596,55 +596,59 @@ SWITCH_DECLARE(switch_status_t) switch_event_dup(switch_event_t **event, switch_ return SWITCH_STATUS_SUCCESS; } -SWITCH_DECLARE(switch_status_t) switch_event_serialize(switch_event_t *event, char *buf, switch_size_t buflen, char *fmt, ...) +SWITCH_DECLARE(switch_status_t) switch_event_serialize(switch_event_t *event, char **str) { switch_size_t len = 0; switch_event_header_t *hp; - char *data = NULL, *body = NULL; - int ret = 0; - va_list ap; + switch_size_t llen = 0, dlen = 0, blocksize = 512; + char *buf; + + *str = NULL; - if (fmt) { - va_start(ap, fmt); -#ifdef HAVE_VASPRINTF - ret = vasprintf(&data, fmt, ap); -#else - data = (char *) malloc(2048); - ret = vsnprintf(data, 2048, fmt, ap); -#endif - va_end(ap); - if (ret == -1) { - return SWITCH_STATUS_MEMERR; - } + if (!(buf = malloc(blocksize))) { + return SWITCH_STATUS_MEMERR; } + dlen = blocksize; + for (hp = event->headers; hp; hp = hp->next) { - snprintf(buf + len, buflen - len, "%s: %s\n", hp->name, hp->value); + llen = strlen(hp->name) + strlen(hp->value) + 2; + + if ((len + llen) > dlen) { + dlen += (blocksize + (len + llen)); + buf = realloc(buf, dlen); + } + + snprintf(buf + len, dlen - len, "%s: %s\n", hp->name, hp->value); len = strlen(buf); - } - if (data) { - body = data; - } else if (event->body) { - body = event->body; - } + if (event->body) { + int blen = (int) strlen(event->body); + llen = blen; - if (body) { - int blen = (int) strlen(body); if (blen) { - snprintf(buf + len, buflen - len, "Content-Length: %d\n\n%s", blen, body); + llen += 25; } else { - snprintf(buf + len, buflen - len, "\n"); + llen += 5; + } + + if ((len + llen) > dlen) { + dlen += (blocksize + (len + llen)); + buf = realloc(buf, dlen); + } + + if (blen) { + snprintf(buf + len, dlen - len, "Content-Length: %d\n\n%s", blen, event->body); + } else { + snprintf(buf + len, dlen - len, "\n"); } } else { - snprintf(buf + len, buflen - len, "\n"); - } - - if (data) { - free(data); + snprintf(buf + len, dlen - len, "\n"); } + *str = buf; + return SWITCH_STATUS_SUCCESS; }