]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
make event_serialize dynamic
authorAnthony Minessale <anthony.minessale@gmail.com>
Sat, 11 Nov 2006 19:32:45 +0000 (19:32 +0000)
committerAnthony Minessale <anthony.minessale@gmail.com>
Sat, 11 Nov 2006 19:32:45 +0000 (19:32 +0000)
git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@3314 d0543943-73ff-0310-b7d9-9358b9ac24b2

src/include/switch_event.h
src/mod/event_handlers/mod_event_multicast/mod_event_multicast.c
src/mod/event_handlers/mod_event_socket/mod_event_socket.c
src/mod/event_handlers/mod_event_test/mod_event_test.c
src/mod/event_handlers/mod_xmpp_event/mod_xmpp_event.c
src/mod/languages/mod_spidermonkey/mod_spidermonkey.c
src/switch_core.c
src/switch_event.c

index 9b760ee3d68962770dc1793487260d3f33279259..b7c5cfcdcda2e435dca6b57c70eca56f7c9de519 100644 (file)
@@ -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
index c9e0524dd79cc3964b691a2530ce32bc032bd70e..d2e9119fad353c18de0612ab398e84e1d8be0c02 100644 (file)
@@ -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;
                }
        }
index a56e14931c5c7f5054f45b0c5d72b748264ce8ca..5c7c71e29d81d04c40ac9aaa9c35cbcf4c76ee8c 100644 (file)
@@ -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;
 
 }
index c941bff45c9ccf8d4ec63b68830b334f57cb4627..56c8563faae683792a4eee4ef3156a9a6b7eebbd 100644 (file)
@@ -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);
index 015ad8d73ae2fff8bcc9d472628973f4bb1c6274..32f5e3b1bd4a430078e7d78f418216b0e1a84167 100644 (file)
@@ -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;
        }
 }
index 006f3f1232c263b3566e5e3013326fb9fb43a182..6589c2007e4a30387914bcf1177d02f6ac3b3f8a 100644 (file)
@@ -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;
index 15db1b084e25a83b212b813b1cd49e110d1ebfb7..f65377a2dca0d209b871dcdd92de6aa2f7cbf5c8 100644 (file)
@@ -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;
        }
 
index c53ff1dec080937fe818e97b0d40df7964ccc310..278230b62bc44cb0f611170af220c23fb5c85f82 100644 (file)
@@ -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);
-               len = strlen(buf);
+               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);
                }
-       } else {
-               snprintf(buf + len, buflen - len, "\n");
-       }
 
-       if (data) {
-               free(data);
+               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, dlen - len, "\n");
        }
 
+       *str = buf;
+       
        return SWITCH_STATUS_SUCCESS;
 }