diff -r 09676b559091 -r 60870dbac94f src/server/webdav/xml.c --- a/src/server/webdav/xml.c Tue Apr 26 18:21:25 2022 +0200 +++ b/src/server/webdav/xml.c Sat Apr 30 20:44:38 2022 +0200 @@ -32,6 +32,7 @@ #include #include +#include #include "../util/util.h" @@ -313,6 +314,49 @@ } +static ssize_t buf_writefunc(void *buf, const void *s, size_t len) { + int w = ucx_buffer_write(s, 1, len, buf); + return w == 0 ? IO_ERROR : w; +} + +WSXmlData* wsxml_node2data( + pool_handle_t *pool, + WSXmlNode *node) +{ + UcxBuffer *buf = ucx_buffer_new(NULL, 1024, UCX_BUFFER_AUTOEXTEND); + if(!buf) { + return NULL; + } + + int error = 0; + WebdavNSList *nslist = wsxml_get_required_namespaces(pool, node, &error); + if(error) { + return NULL; + } + + Writer writer; + char buffer[512]; + writer_init_with_stream(&writer, buf, buf_writefunc, buffer, 512); + + WSXmlData *data = NULL; + if(!wsxml_write_nodes_without_nsdef(pool, &writer, node) && !writer_flush(&writer)) { + data = pool_malloc(pool, sizeof(WSXmlData)); + if(data) { + data->data = pool_malloc(pool, buf->size + 1); + if(data->data) { + memcpy(data->data, buf->space, buf->size); + data->data[buf->size] = '\0'; + data->length = buf->size; + data->namespaces = nslist; + } + } + } + + ucx_buffer_free(buf); + + return data; +} + /***************************************************************************** * Non public functions *****************************************************************************/