src/server/webdav/xml.c

branch
webdav
changeset 318
60870dbac94f
parent 233
c5985d2fc19a
child 319
a9b9344875aa
--- 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 <ucx/string.h>
 #include <ucx/map.h>
+#include <ucx/buffer.h>
 
 #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
  *****************************************************************************/

mercurial