libidav/methods.c

changeset 747
efbd59642577
parent 743
716f6bf04c30
child 753
8776125fd49c
--- a/libidav/methods.c	Sun Apr 16 14:12:24 2023 +0200
+++ b/libidav/methods.c	Fri Apr 21 21:25:32 2023 +0200
@@ -36,21 +36,23 @@
 #include "session.h"
 #include "xml.h"
 
-#include <ucx/utils.h>
+#include <cx/utils.h>
+#include <cx/printf.h>
+#include <cx/hash_map.h>
 
 #define xstreq(a,b) xmlStrEqual(BAD_CAST a, BAD_CAST b)
 
 
-int dav_buffer_seek(UcxBuffer *b, curl_off_t offset, int origin) {
-    return ucx_buffer_seek(b, offset, origin) == 0 ? 0:CURL_SEEKFUNC_CANTSEEK;
+int dav_buffer_seek(CxBuffer *b, curl_off_t offset, int origin) {
+    return cxBufferSeek(b, offset, origin) == 0 ? 0:CURL_SEEKFUNC_CANTSEEK;
 }
 
 /* ----------------------------- PROPFIND ----------------------------- */
 
 CURLcode do_propfind_request(
         DavSession *sn,
-        UcxBuffer *request,
-        UcxBuffer *response)
+        CxBuffer *request,
+        CxBuffer *response)
 {
     CURL *handle = sn->handle;
     curl_easy_setopt(handle, CURLOPT_CUSTOMREQUEST, "PROPFIND");
@@ -64,14 +66,15 @@
     CURLcode ret = 0;
     
     curl_easy_setopt(handle, CURLOPT_UPLOAD, 1); 
-    curl_easy_setopt(handle, CURLOPT_READFUNCTION, ucx_buffer_read);
-    curl_easy_setopt(handle, CURLOPT_SEEKFUNCTION, dav_buffer_seek);
+    curl_easy_setopt(handle, CURLOPT_READFUNCTION, cxBufferRead);
+    curl_easy_setopt(handle, CURLOPT_SEEKFUNCTION, cxBufferSeek);
     curl_easy_setopt(handle, CURLOPT_READDATA, request); 
     curl_easy_setopt(handle, CURLOPT_INFILESIZE, request->size);
     
-    curl_easy_setopt(handle, CURLOPT_WRITEFUNCTION, ucx_buffer_write);
+    curl_easy_setopt(handle, CURLOPT_WRITEFUNCTION, cxBufferWrite);
     curl_easy_setopt(handle, CURLOPT_WRITEDATA, response);
-    UcxMap *respheaders = ucx_map_new(32);
+    CxMap *respheaders = cxHashMapCreate(cxDefaultAllocator, CX_STORE_POINTERS, 32);
+    respheaders->simple_destructor = free;
     util_capture_header(handle, respheaders);
     
     for(int i=0;i<maxretry;i++) {
@@ -100,7 +103,7 @@
          *    => the server handled our request and we can stop requesting
          */
         char *msdavexterror;
-        msdavexterror = ucx_map_cstr_get(respheaders, "x-msdavext_error");
+        msdavexterror = cxMapGet(respheaders, cx_hash_key_str("x-msdavext_error"));
         int iishack =  depth == 1 &&
             msdavexterror && !strncmp(msdavexterror, "589831;", 7);
         
@@ -113,71 +116,72 @@
     
     // deactivate header capturing and free captured map
     util_capture_header(handle, NULL);
-    ucx_map_free_content(respheaders, free);
-    ucx_map_free(respheaders);
+    cxMapDestroy(respheaders);
        
     return ret;
 }
 
-UcxBuffer* create_allprop_propfind_request(void) {
-    UcxBuffer *buf = ucx_buffer_new(NULL, 512, UCX_BUFFER_AUTOFREE);
-    sstr_t s;
+CxBuffer* create_allprop_propfind_request(void) {
+    CxBuffer *buf = cxBufferCreate(NULL, 512, cxDefaultAllocator, CX_BUFFER_FREE_CONTENTS|CX_BUFFER_AUTO_EXTEND);
+    cxstring s;
     
-    s = S("<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n");
-    ucx_buffer_write(s.ptr, 1, s.length, buf);
+    s = CX_STR("<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n");
+    cxBufferWrite(s.ptr, 1, s.length, buf);
     
-    s = S("<D:propfind xmlns:D=\"DAV:\">\n");
-    ucx_buffer_write(s.ptr, 1, s.length, buf);
+    s = CX_STR("<D:propfind xmlns:D=\"DAV:\">\n");
+    cxBufferWrite(s.ptr, 1, s.length, buf);
     
-    s = S("<D:allprop/></D:propfind>\n");
-    ucx_buffer_write(s.ptr, 1, s.length, buf);
+    s = CX_STR("<D:allprop/></D:propfind>\n");
+    cxBufferWrite(s.ptr, 1, s.length, buf);
     
     return buf;
 }
 
-UcxBuffer* create_cryptoprop_propfind_request(void) {
-    UcxBuffer *buf = ucx_buffer_new(NULL, 256, UCX_BUFFER_AUTOFREE);
-    scstr_t s;
+CxBuffer* create_cryptoprop_propfind_request(void) {
+    CxBuffer *buf = cxBufferCreate(NULL, 256, cxDefaultAllocator, CX_BUFFER_FREE_CONTENTS|CX_BUFFER_AUTO_EXTEND);
+    cxstring s;
     
-    s = SC("<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n");
-    ucx_buffer_write(s.ptr, 1, s.length, buf);
+    s = CX_STR("<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n");
+    cxBufferWrite(s.ptr, 1, s.length, buf);
     
-    s = SC("<D:propfind xmlns:D=\"DAV:\" xmlns:idav=\"" DAV_NS "\">\n");
-    ucx_buffer_write(s.ptr, 1, s.length, buf);
+    s = CX_STR("<D:propfind xmlns:D=\"DAV:\" xmlns:idav=\"" DAV_NS "\">\n");
+    cxBufferWrite(s.ptr, 1, s.length, buf);
     
-    s = SC("<D:prop><idav:crypto-prop/></D:prop></D:propfind>\n");
-    ucx_buffer_write(s.ptr, 1, s.length, buf);
+    s = CX_STR("<D:prop><idav:crypto-prop/></D:prop></D:propfind>\n");
+    cxBufferWrite(s.ptr, 1, s.length, buf);
     
     return buf;
 }
 
-UcxBuffer* create_propfind_request(DavSession *sn, UcxList *properties, char *rootelm, DavBool nocrypt) {
-    UcxBuffer *buf = ucx_buffer_new(NULL, 512, UCX_BUFFER_AUTOEXTEND);
-    sstr_t s;
+CxBuffer* create_propfind_request(DavSession *sn, CxList *properties, char *rootelm, DavBool nocrypt) {
+    CxBuffer *buf = cxBufferCreate(NULL, 512, cxDefaultAllocator, CX_BUFFER_FREE_CONTENTS|CX_BUFFER_AUTO_EXTEND);
+    cxstring s;
     
     int add_crypto_name = 1;
     int add_crypto_key = 1;
     int add_crypto_hash = 1;
     char *crypto_ns = "idav";
-    UcxMap *namespaces = ucx_map_new(8);
-    UCX_FOREACH(elm, properties) {
-        DavProperty *p = elm->data;
-        if(strcmp(p->ns->name, "DAV:")) {
-            ucx_map_cstr_put(namespaces, p->ns->prefix, p->ns);
-        }
-        
-        // if the properties list contains the idav properties crypto-name
-        // and crypto-key, mark them as existent 
-        if(!strcmp(p->ns->name, DAV_NS)) {
-            if(!strcmp(p->name, "crypto-name")) {
-                add_crypto_name = 0;
-                crypto_ns = p->ns->prefix;
-            } else if(!strcmp(p->name, "crypto-key")) {
-                add_crypto_key = 0;
-                crypto_ns = p->ns->prefix;
-            } else if(!strcmp(p->name, "crypto-hash")) {
-                add_crypto_hash = 0;
-                crypto_ns = p->ns->prefix;
+    CxMap *namespaces = cxHashMapCreate(cxDefaultAllocator, CX_STORE_POINTERS, 8);
+    if(properties) {
+        CxIterator i = cxListIterator(properties);
+        cx_foreach(DavProperty*, p, i) {
+            if(strcmp(p->ns->name, "DAV:")) {
+                cxMapPut(namespaces, cx_hash_key_str(p->ns->prefix), p->ns);
+            }
+
+            // if the properties list contains the idav properties crypto-name
+            // and crypto-key, mark them as existent 
+            if(!strcmp(p->ns->name, DAV_NS)) {
+                if(!strcmp(p->name, "crypto-name")) {
+                    add_crypto_name = 0;
+                    crypto_ns = p->ns->prefix;
+                } else if(!strcmp(p->name, "crypto-key")) {
+                    add_crypto_key = 0;
+                    crypto_ns = p->ns->prefix;
+                } else if(!strcmp(p->name, "crypto-hash")) {
+                    add_crypto_hash = 0;
+                    crypto_ns = p->ns->prefix;
+                }
             }
         }
     }
@@ -186,126 +190,126 @@
     if(add_crypto_name && add_crypto_key && DAV_CRYPTO(sn) && !nocrypt) {
         idav_ns.prefix = "idav";
         idav_ns.name = DAV_NS;
-        ucx_map_cstr_put(namespaces, "idav", &idav_ns);
+        cxMapPut(namespaces, cx_hash_key_str("idav"), &idav_ns);
     }
     
-    s = S("<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n");
-    ucx_buffer_write(s.ptr, 1, s.length, buf);
+    s = CX_STR("<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n");
+    cxBufferWrite(s.ptr, 1, s.length, buf);
     
     // write root element and namespaces
-    ucx_bprintf(buf, "<D:%s xmlns:D=\"DAV:\"", rootelm);
+    cx_bprintf(buf, "<D:%s xmlns:D=\"DAV:\"", rootelm);
     
-    UcxMapIterator mapi = ucx_map_iterator(namespaces);
-    UcxKey key;
-    DavNamespace *ns;
-    UCX_MAP_FOREACH(key, ns, mapi) {
-        s = S(" xmlns:");
-        ucx_buffer_write(s.ptr, 1, s.length, buf);
-        s = sstr(ns->prefix);
-        ucx_buffer_write(s.ptr, 1, s.length, buf);
-        s = S("=\"");
-        ucx_buffer_write(s.ptr, 1, s.length, buf);
-        s = sstr(ns->name);
-        ucx_buffer_write(s.ptr, 1, s.length, buf);
-        s = S("\"");
-        ucx_buffer_write(s.ptr, 1, s.length, buf);
+    CxIterator mapi = cxMapIteratorValues(namespaces);
+    cx_foreach(DavNamespace*, ns, mapi) {
+        s = CX_STR(" xmlns:");
+        cxBufferWrite(s.ptr, 1, s.length, buf);
+        s = cx_str(ns->prefix);
+        cxBufferWrite(s.ptr, 1, s.length, buf);
+        s = CX_STR("=\"");
+        cxBufferWrite(s.ptr, 1, s.length, buf);
+        s = cx_str(ns->name);
+        cxBufferWrite(s.ptr, 1, s.length, buf);
+        s = CX_STR("\"");
+        cxBufferWrite(s.ptr, 1, s.length, buf);
     }
-    s = S(">\n");
-    ucx_buffer_write(s.ptr, 1, s.length, buf);
+    s = CX_STR(">\n");
+    cxBufferWrite(s.ptr, 1, s.length, buf);
     
     // default properties
-    s = S("<D:prop>\n");
-    ucx_buffer_write(s.ptr, 1, s.length, buf);
+    s = CX_STR("<D:prop>\n");
+    cxBufferWrite(s.ptr, 1, s.length, buf);
     
-    s = S("<D:creationdate />\n<D:getlastmodified />\n");
-    ucx_buffer_write(s.ptr, 1, s.length, buf);
+    s = CX_STR("<D:creationdate />\n<D:getlastmodified />\n");
+    cxBufferWrite(s.ptr, 1, s.length, buf);
     
-    s = S("<D:getcontentlength />\n<D:getcontenttype />\n");
-    ucx_buffer_write(s.ptr, 1, s.length, buf);
+    s = CX_STR("<D:getcontentlength />\n<D:getcontenttype />\n");
+    cxBufferWrite(s.ptr, 1, s.length, buf);
     
-    s = S("<D:resourcetype />\n");
-    ucx_buffer_write(s.ptr, 1, s.length, buf);
+    s = CX_STR("<D:resourcetype />\n");
+    cxBufferWrite(s.ptr, 1, s.length, buf);
     
     // crypto properties
     if(DAV_CRYPTO(sn) && !nocrypt) {
         if(add_crypto_name) {
-            ucx_buffer_putc(buf, '<');
-            ucx_buffer_puts(buf, crypto_ns);
-            s = S(":crypto-name />\n");
-            ucx_buffer_write(s.ptr, 1, s.length, buf);
+            cxBufferPut(buf, '<');
+            cxBufferPutString(buf, crypto_ns);
+            s = CX_STR(":crypto-name />\n");
+            cxBufferWrite(s.ptr, 1, s.length, buf);
         }
         if(add_crypto_key) {
-            ucx_buffer_putc(buf, '<');
-            ucx_buffer_puts(buf, crypto_ns);
-            s = S(":crypto-key />\n");
-            ucx_buffer_write(s.ptr, 1, s.length, buf);
+            cxBufferPut(buf, '<');
+            cxBufferPutString(buf, crypto_ns);
+            s = CX_STR(":crypto-key />\n");
+            cxBufferWrite(s.ptr, 1, s.length, buf);
         }
         if(add_crypto_hash) {
-            ucx_buffer_putc(buf, '<');
-            ucx_buffer_puts(buf, crypto_ns);
-            s = S(":crypto-hash />\n");
-            ucx_buffer_write(s.ptr, 1, s.length, buf);
+            cxBufferPut(buf, '<');
+            cxBufferPutString(buf, crypto_ns);
+            s = CX_STR(":crypto-hash />\n");
+            cxBufferWrite(s.ptr, 1, s.length, buf);
         }
     }
     
     // extra properties
-    UCX_FOREACH(elm, properties) {
-        DavProperty *prop = elm->data;
-        s = S("<");
-        ucx_buffer_write(s.ptr, 1, s.length, buf);
-        s = sstr(prop->ns->prefix);
-        ucx_buffer_write(s.ptr, 1, s.length, buf);
-        s = S(":");
-        ucx_buffer_write(s.ptr, 1, s.length, buf);
-        s = sstr(prop->name);
-        ucx_buffer_write(s.ptr, 1, s.length, buf);
-        s = S(" />\n");
-        ucx_buffer_write(s.ptr, 1, s.length, buf);
+    if(properties) {
+        CxIterator i = cxListIterator(properties);
+        cx_foreach(DavProperty*, prop, i) {
+            s = CX_STR("<");
+            cxBufferWrite(s.ptr, 1, s.length, buf);
+            s = cx_str(prop->ns->prefix);
+            cxBufferWrite(s.ptr, 1, s.length, buf);
+            s = CX_STR(":");
+            cxBufferWrite(s.ptr, 1, s.length, buf);
+            s = cx_str(prop->name);
+            cxBufferWrite(s.ptr, 1, s.length, buf);
+            s = CX_STR(" />\n");
+            cxBufferWrite(s.ptr, 1, s.length, buf);
+        }
     }
     
     // end
-    ucx_bprintf(buf, "</D:prop>\n</D:%s>\n", rootelm);
+    cx_bprintf(buf, "</D:prop>\n</D:%s>\n", rootelm);
     
-    ucx_map_free(namespaces);
+    cxMapDestroy(namespaces);
     return buf;
 }
 
-UcxBuffer* create_basic_propfind_request(void) {
-    UcxBuffer *buf = ucx_buffer_new(NULL, 512, UCX_BUFFER_AUTOEXTEND);
-    sstr_t s;
+CxBuffer* create_basic_propfind_request(void) {
+    CxBuffer *buf = cxBufferCreate(NULL, 512, cxDefaultAllocator, CX_BUFFER_FREE_CONTENTS|CX_BUFFER_AUTO_EXTEND);
+    cxstring s;
     
-    s = S("<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n");
-    ucx_buffer_write(s.ptr, 1, s.length, buf);
+    s = CX_STR("<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n");
+    cxBufferWrite(s.ptr, 1, s.length, buf);
     
-    s = S("<D:propfind xmlns:D=\"DAV:\" xmlns:i=\"");
-    ucx_buffer_write(s.ptr, 1, s.length, buf);  
-    s = S(DAV_NS);
-    ucx_buffer_write(s.ptr, 1, s.length, buf);
-    s = S("\" >\n");
-    ucx_buffer_write(s.ptr, 1, s.length, buf);
+    s = CX_STR("<D:propfind xmlns:D=\"DAV:\" xmlns:i=\"");
+    cxBufferWrite(s.ptr, 1, s.length, buf);  
+    s = CX_STR(DAV_NS);
+    cxBufferWrite(s.ptr, 1, s.length, buf);
+    s = CX_STR("\" >\n");
+    cxBufferWrite(s.ptr, 1, s.length, buf);
     
     // properties
-    s = S("<D:prop>\n");
-    ucx_buffer_write(s.ptr, 1, s.length, buf);
-    s = S("<D:resourcetype />\n");
-    ucx_buffer_write(s.ptr, 1, s.length, buf);
-    s = S("<i:crypto-key />\n");
-    ucx_buffer_write(s.ptr, 1, s.length, buf);
-    s = S("<i:crypto-name />\n");
-    ucx_buffer_write(s.ptr, 1, s.length, buf);
-    s = S("<i:crypto-hash />\n");
-    ucx_buffer_write(s.ptr, 1, s.length, buf);
-    s = S("</D:prop>\n");
-    ucx_buffer_write(s.ptr, 1, s.length, buf);
+    s = CX_STR("<D:prop>\n");
+    cxBufferWrite(s.ptr, 1, s.length, buf);
+    s = CX_STR("<D:resourcetype />\n");
+    cxBufferWrite(s.ptr, 1, s.length, buf);
+    s = CX_STR("<i:crypto-key />\n");
+    cxBufferWrite(s.ptr, 1, s.length, buf);
+    s = CX_STR("<i:crypto-name />\n");
+    cxBufferWrite(s.ptr, 1, s.length, buf);
+    s = CX_STR("<i:crypto-hash />\n");
+    cxBufferWrite(s.ptr, 1, s.length, buf);
+    s = CX_STR("</D:prop>\n");
+    cxBufferWrite(s.ptr, 1, s.length, buf);
     
     // end
-    s = S("</D:propfind>\n");
-    ucx_buffer_write(s.ptr, 1, s.length, buf);
+    s = CX_STR("</D:propfind>\n");
+    cxBufferWrite(s.ptr, 1, s.length, buf);
     
     return buf;
 }
 
-PropfindParser* create_propfind_parser(UcxBuffer *response, char *url) {
+PropfindParser* create_propfind_parser(CxBuffer *response, char *url) {
     PropfindParser *parser = malloc(sizeof(PropfindParser));
     if(!parser) {
         return NULL;
@@ -349,11 +353,10 @@
     
     char *href = NULL;
     int iscollection = 0;
-    UcxList *properties = NULL; // xmlNode list
     char *crypto_name = NULL; // name set by crypto-name property
     char *crypto_key = NULL;
     
-    result->properties = NULL;
+    result->properties = cxLinkedListCreateSimple(CX_STORE_POINTERS); // xmlNode list
     
     xmlNode *node = parser->current->children;
     while(node) {
@@ -380,13 +383,13 @@
                                 // error
                                 return -1;
                             }
-                            sstr_t status_str = sstr((char*)status_node->content);
+                            cxstring status_str = cx_str((char*)status_node->content);
                             if(status_str.length < 13) {
                                 // error
                                 return -1;
                             }
-                            status_str = sstrsubsl(status_str, 9, 3);
-                            if(!sstrcmp(status_str, S("200"))) {
+                            status_str = cx_strsubsl(status_str, 9, 3);
+                            if(!cx_strcmp(status_str, CX_STR("200"))) {
                                 ok = 1;
                             }
                         }
@@ -398,7 +401,7 @@
                     n = prop_node->children;
                     while(n) {
                         if(n->type == XML_ELEMENT_NODE) {
-                            properties = ucx_list_append(properties, n);
+                            cxListAdd(result->properties, n);
                             if(xstreq(n->name, "resourcetype")) {
                                 if(parse_resource_type(n)) {
                                     iscollection = TRUE;
@@ -421,7 +424,6 @@
     
     result->href = util_url_path(href);
     result->iscollection = iscollection;
-    result->properties = properties;
     result->crypto_name = crypto_name;
     result->crypto_key = crypto_key;
     
@@ -442,27 +444,27 @@
 
 void cleanup_response(ResponseTag *result) {
     if(result) {
-        ucx_list_free(result->properties);
+        cxListDestroy(result->properties);
     }
 }
 
-int hrefeq(DavSession *sn, char *href1, char *href2) {
-    sstr_t href_s = sstr(util_url_decode(sn, href1));
-    sstr_t href_r = sstr(util_url_decode(sn, href2));
+int hrefeq(DavSession *sn, const char *href1, const char *href2) {
+    cxmutstr href_s = cx_mutstr(util_url_decode(sn, href1));
+    cxmutstr href_r = cx_mutstr(util_url_decode(sn, href2));
     int ret = 0;
-    if(!sstrcmp(href_s, href_r)) {
+    if(!cx_strcmp(cx_strcast(href_s), cx_strcast(href_r))) {
         ret = 1;
     } else if(href_s.length == href_r.length + 1) {
         if(href_s.ptr[href_s.length-1] == '/') {
             href_s.length--;
-            if(!sstrcmp(href_s, href_r)) {
+            if(!cx_strcmp(cx_strcast(href_s), cx_strcast(href_r))) {
                 ret = 1;
             }
         }
     } else if(href_r.length == href_s.length + 1) {
         if(href_r.ptr[href_r.length-1] == '/') {
             href_r.length--;
-            if(!sstrcmp(href_s, href_r)) {
+            if(!cx_strcmp(cx_strcast(href_s), cx_strcast(href_r))) {
                 ret = 1;
             }
         }
@@ -475,7 +477,7 @@
 }
 
 
-DavResource* parse_propfind_response(DavSession *sn, DavResource *root, UcxBuffer *response) {
+DavResource* parse_propfind_response(DavSession *sn, DavResource *root, CxBuffer *response) {
     char *url = NULL;
     curl_easy_getinfo(sn->handle, CURLINFO_EFFECTIVE_URL, &url);
     if(!root) {
@@ -523,7 +525,7 @@
             return NULL;
         }
     } else {
-        sstr_t resname = sstr(util_resource_name(response->href));
+        cxstring resname = cx_str(util_resource_name(response->href));
         int nlen = 0;
         char *uname = curl_easy_unescape(
                 sn->handle,
@@ -555,19 +557,21 @@
     char *crypto_key = NULL;
     
     // add properties
-    UCX_FOREACH(elm, response->properties) {
-        xmlNode *prop = elm->data;
-        resource_add_property(res, (char*)prop->ns->href, (char*)prop->name, prop->children);
+    if(response->properties) {
+        CxIterator i = cxListIterator(response->properties);
+        cx_foreach(xmlNode*, prop, i) {
+            resource_add_property(res, (char*)prop->ns->href, (char*)prop->name, prop->children);
         
-        if (decrypt_props &&
-            prop->children &&
-            prop->children->type == XML_TEXT_NODE &&
-            xstreq(prop->ns->href, DAV_NS))
-        {
-            if(xstreq(prop->name, "crypto-prop")) {
-                crypto_prop = prop;
-            } else if(xstreq(prop->name, "crypto-key")) {
-                crypto_key = util_xml_get_text(prop);
+            if (decrypt_props &&
+                prop->children &&
+                prop->children->type == XML_TEXT_NODE &&
+                xstreq(prop->ns->href, DAV_NS))
+            {
+                if(xstreq(prop->name, "crypto-prop")) {
+                    crypto_prop = prop;
+                } else if(xstreq(prop->name, "crypto-key")) {
+                    crypto_key = util_xml_get_text(prop);
+                }
             }
         }
     }
@@ -576,7 +580,7 @@
         char *crypto_prop_content = util_xml_get_text(crypto_prop);
         DavKey *key = dav_context_get_key(res->session->context, crypto_key);
         if(crypto_prop_content) {
-            UcxMap *cprops = parse_crypto_prop_str(res->session, key, crypto_prop_content);
+            CxMap *cprops = parse_crypto_prop_str(res->session, key, crypto_prop_content);
             resource_set_crypto_properties(res, cprops);
         }
     }
@@ -589,8 +593,8 @@
     
     //DavResource *res = resource;
     DavResource *res = NULL;
-    char *href = NULL;
-    UcxList *properties = NULL; // xmlNode list
+    const char *href = NULL;
+    CxList *properties = cxLinkedListCreateSimple(CX_STORE_POINTERS); // xmlNode list
     char *crypto_name = NULL; // name set by crypto-name property
     char *crypto_key = NULL;
     
@@ -607,7 +611,7 @@
                     return 1;
                 }
                 //char *href = (char*)href_node->content;
-                href = util_url_path((char*)href_node->content);
+                href = util_url_path((const char*)href_node->content);
                 
                 char *href_s = util_url_decode(resource->session, href);
                 char *href_r = util_url_decode(resource->session, resource->href);
@@ -633,13 +637,13 @@
                                 sn->error = DAV_ERROR;
                                 return 1;
                             }
-                            sstr_t status_str = sstr((char*)status_node->content);
+                            cxstring status_str = cx_str((char*)status_node->content);
                             if(status_str.length < 13) {
                                 sn->error = DAV_ERROR;
                                 return 1;
                             }
-                            status_str = sstrsubsl(status_str, 9, 3);
-                            if(!sstrcmp(status_str, S("200"))) {
+                            status_str = cx_strsubsl(status_str, 9, 3);
+                            if(!cx_strcmp(status_str, CX_STR("200"))) {
                                 ok = 1;
                             }
                         }
@@ -651,7 +655,7 @@
                     n = prop_node->children;
                     while(n) {
                         if(n->type == XML_ELEMENT_NODE) {
-                            properties = ucx_list_append(properties, n);
+                            cxListAdd(properties, n);
                             if(xstreq(n->name, "resourcetype")) {
                                 if(parse_resource_type(n)) {
                                     iscollection = TRUE;
@@ -689,7 +693,7 @@
                 return -1;
             }
         } else {
-            sstr_t resname = sstr(util_resource_name(href));
+            cxstring resname = cx_str(util_resource_name(href));
             int nlen = 0;
             char *uname = curl_easy_unescape(
                     sn->handle,
@@ -700,8 +704,8 @@
             curl_free(uname);
         }
         
-        href = dav_session_strdup(sn, href);
-        res = dav_resource_new_full(sn, resource->path, name, href);
+        char *href_cp = dav_session_strdup(sn, href);
+        res = dav_resource_new_full(sn, resource->path, name, href_cp);
         
         dav_session_free(sn, name);
     }
@@ -711,8 +715,8 @@
     int decrypt_props = DAV_ENCRYPT_PROPERTIES(res->session);
     xmlNode *crypto_prop = NULL;
     
-    UCX_FOREACH(elm, properties) {
-        xmlNode *prop = elm->data;
+    CxIterator i = cxListIterator(properties);
+    cx_foreach(xmlNode*, prop, i) {
         if(!prop->ns) {
             continue;
         }
@@ -728,13 +732,13 @@
             }
         }
     }
-    ucx_list_free(properties);
+    cxListDestroy(properties);
     
     if(crypto_prop && crypto_key) {
         char *crypto_prop_content = util_xml_get_text(crypto_prop);
         DavKey *key = dav_context_get_key(res->session->context, crypto_key);
         if(crypto_prop_content && key) {
-            UcxMap *cprops = parse_crypto_prop_str(res->session, key, crypto_prop_content);
+            CxMap *cprops = parse_crypto_prop_str(res->session, key, crypto_prop_content);
             resource_set_crypto_properties(res, cprops);
         }
     }
@@ -784,8 +788,8 @@
 CURLcode do_proppatch_request(
         DavSession *sn,
         char *lock,
-        UcxBuffer *request,
-        UcxBuffer *response)
+        CxBuffer *request,
+        CxBuffer *response)
 {       
     CURL *handle = sn->handle;
     curl_easy_setopt(handle, CURLOPT_CUSTOMREQUEST, "PROPPATCH");
@@ -795,7 +799,7 @@
     if(lock) {
         char *url = NULL;
         curl_easy_getinfo(handle, CURLINFO_EFFECTIVE_URL, &url);
-        char *ltheader = ucx_sprintf("If: <%s> (<%s>)", url, lock).ptr;
+        char *ltheader = cx_asprintf("If: <%s> (<%s>)", url, lock).ptr;
         headers = curl_slist_append(headers, ltheader);
         free(ltheader);
         curl_easy_setopt(handle, CURLOPT_HTTPHEADER, headers);
@@ -803,15 +807,15 @@
     curl_easy_setopt(handle, CURLOPT_HTTPHEADER, headers);
     
     curl_easy_setopt(handle, CURLOPT_UPLOAD, 1); 
-    curl_easy_setopt(handle, CURLOPT_READFUNCTION, ucx_buffer_read);
-    curl_easy_setopt(handle, CURLOPT_SEEKFUNCTION, dav_buffer_seek);
+    curl_easy_setopt(handle, CURLOPT_READFUNCTION, cxBufferRead);
+    curl_easy_setopt(handle, CURLOPT_SEEKFUNCTION, cxBufferSeek);
     curl_easy_setopt(handle, CURLOPT_READDATA, request); 
     curl_easy_setopt(handle, CURLOPT_INFILESIZE, request->size);
     
-    curl_easy_setopt(handle, CURLOPT_WRITEFUNCTION, ucx_buffer_write);
+    curl_easy_setopt(handle, CURLOPT_WRITEFUNCTION, cxBufferWrite);
     curl_easy_setopt(handle, CURLOPT_WRITEDATA, response);
     
-    ucx_buffer_seek(request, 0, SEEK_SET);
+    cxBufferSeek(request, 0, SEEK_SET);
     CURLcode ret = dav_session_curl_perform_buf(sn, request, response, NULL);
     curl_slist_free_all(headers);
     
@@ -820,168 +824,171 @@
     return ret;
 }
 
-UcxBuffer* create_proppatch_request(DavResourceData *data) {
-    UcxBuffer *buf = ucx_buffer_new(NULL, 512, UCX_BUFFER_AUTOEXTEND);
-    scstr_t s;
+CxBuffer* create_proppatch_request(DavResourceData *data) {
+    CxBuffer *buf = cxBufferCreate(NULL, 512, cxDefaultAllocator, CX_BUFFER_FREE_CONTENTS|CX_BUFFER_AUTO_EXTEND);
+    cxstring s;
     
-    UcxMap *namespaces = ucx_map_new(8);
+    CxMap *namespaces = cxHashMapCreate(cxDefaultAllocator, CX_STORE_POINTERS, 8);
+    namespaces->simple_destructor = free;
+    
     char prefix[8];
     int pfxnum = 0;
-    UCX_FOREACH(elm, data->set) {
-        DavProperty *p = elm->data;
-        if(strcmp(p->ns->name, "DAV:")) {
-            snprintf(prefix, 8, "x%d", pfxnum++);
-            ucx_map_cstr_put(namespaces, p->ns->name, strdup(prefix));
+    if(data->set) {
+        CxIterator i = cxListIterator(data->set);
+        cx_foreach(DavProperty*, p, i) {
+            if(strcmp(p->ns->name, "DAV:")) {
+                snprintf(prefix, 8, "x%d", pfxnum++);
+                cxMapPut(namespaces, cx_hash_key_str(p->ns->name), strdup(prefix));
+            }
         }
     }
-    UCX_FOREACH(elm, data->remove) {
-        DavProperty *p = elm->data;
-        if(strcmp(p->ns->name, "DAV:")) {
-            snprintf(prefix, 8, "x%d", pfxnum++);
-            ucx_map_cstr_put(namespaces, p->ns->name, strdup(prefix));
+    if(data->remove) {
+        CxIterator i = cxListIterator(data->remove);
+        cx_foreach(DavProperty*, p, i) {
+            if(strcmp(p->ns->name, "DAV:")) {
+                snprintf(prefix, 8, "x%d", pfxnum++);
+                cxMapPut(namespaces, cx_hash_key_str(p->ns->name), strdup(prefix));
+            }
         }
     }
     
-    s = SC("<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n");
-    ucx_buffer_write(s.ptr, 1, s.length, buf);
+    s = CX_STR("<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n");
+    cxBufferWrite(s.ptr, 1, s.length, buf);
     
     // write root element and namespaces
-    s = SC("<D:propertyupdate xmlns:D=\"DAV:\"");
-    ucx_buffer_write(s.ptr, 1, s.length, buf);
-    UcxMapIterator mapi = ucx_map_iterator(namespaces);
-    UcxKey key;
-    char *pfxval;
-    UCX_MAP_FOREACH(key, pfxval, mapi) {
-        s = SC(" xmlns:");
-        ucx_buffer_write(s.ptr, 1, s.length, buf);
-        s = scstr(pfxval);
-        ucx_buffer_write(s.ptr, 1, s.length, buf);
-        s = SC("=\"");
-        ucx_buffer_write(s.ptr, 1, s.length, buf);
-        s = scstrn(key.data, key.len);
-        ucx_buffer_write(s.ptr, 1, s.length, buf);
-        s = SC("\"");
-        ucx_buffer_write(s.ptr, 1, s.length, buf);
+    s = CX_STR("<D:propertyupdate xmlns:D=\"DAV:\"");
+    cxBufferWrite(s.ptr, 1, s.length, buf);
+    CxIterator mapi = cxMapIterator(namespaces);
+    cx_foreach(CxMapEntry*, entry, mapi) {
+        s = CX_STR(" xmlns:");
+        cxBufferWrite(s.ptr, 1, s.length, buf);
+        s = cx_str(entry->value);
+        cxBufferWrite(s.ptr, 1, s.length, buf);
+        s = CX_STR("=\"");
+        cxBufferWrite(s.ptr, 1, s.length, buf);
+        s = cx_strn(entry->key->data, entry->key->len);
+        cxBufferWrite(s.ptr, 1, s.length, buf);
+        s = CX_STR("\"");
+        cxBufferWrite(s.ptr, 1, s.length, buf);
     }
-    s = SC(">\n");
-    ucx_buffer_write(s.ptr, 1, s.length, buf);
+    s = CX_STR(">\n");
+    cxBufferWrite(s.ptr, 1, s.length, buf);
     
     if(data->set) {
-        s = SC("<D:set>\n<D:prop>\n");
-        ucx_buffer_write(s.ptr, 1, s.length, buf);
-        UCX_FOREACH(elm, data->set) {
-            DavProperty *property = elm->data;
-            char *prefix = ucx_map_cstr_get(namespaces, property->ns->name);
+        s = CX_STR("<D:set>\n<D:prop>\n");
+        cxBufferWrite(s.ptr, 1, s.length, buf);
+        CxIterator i = cxListIterator(data->set);
+        cx_foreach(DavProperty*, property, i) {
+            char *prefix = cxMapGet(namespaces, cx_hash_key_str(property->ns->name));
             if(!prefix) {
                 prefix = "D";
             }
             
             // begin tag
-            s = SC("<");
-            ucx_buffer_write(s.ptr, 1, s.length, buf);
-            s = scstr(prefix);
-            ucx_buffer_write(s.ptr, 1, s.length, buf);
-            s = SC(":");
-            ucx_buffer_write(s.ptr, 1, s.length, buf);
-            s = scstr(property->name);
-            ucx_buffer_write(s.ptr, 1, s.length, buf);
-            s = SC(">");
-            ucx_buffer_write(s.ptr, 1, s.length, buf);
+            s = CX_STR("<");
+            cxBufferWrite(s.ptr, 1, s.length, buf);
+            s = cx_str(prefix);
+            cxBufferWrite(s.ptr, 1, s.length, buf);
+            s = CX_STR(":");
+            cxBufferWrite(s.ptr, 1, s.length, buf);
+            s = cx_str(property->name);
+            cxBufferWrite(s.ptr, 1, s.length, buf);
+            s = CX_STR(">");
+            cxBufferWrite(s.ptr, 1, s.length, buf);
             
             // content
             DavXmlNode *content = property->value;
             if(content->type == DAV_XML_TEXT && !content->next) {
-                ucx_buffer_write(content->content, 1, content->contentlength, buf);
+                cxBufferWrite(content->content, 1, content->contentlength, buf);
             } else {
-                dav_print_node(buf, (write_func)ucx_buffer_write, namespaces, content);
+                dav_print_node(buf, (cx_write_func)cxBufferWrite, namespaces, content);
             }
             
             // end tag
-            s = SC("</");
-            ucx_buffer_write(s.ptr, 1, s.length, buf);
-            s = scstr(prefix);
-            ucx_buffer_write(s.ptr, 1, s.length, buf);
-            s = SC(":");
-            ucx_buffer_write(s.ptr, 1, s.length, buf);
-            s = scstr(property->name);
-            ucx_buffer_write(s.ptr, 1, s.length, buf);
-            s = SC(">\n");
-            ucx_buffer_write(s.ptr, 1, s.length, buf);
+            s = CX_STR("</");
+            cxBufferWrite(s.ptr, 1, s.length, buf);
+            s = cx_str(prefix);
+            cxBufferWrite(s.ptr, 1, s.length, buf);
+            s = CX_STR(":");
+            cxBufferWrite(s.ptr, 1, s.length, buf);
+            s = cx_str(property->name);
+            cxBufferWrite(s.ptr, 1, s.length, buf);
+            s = CX_STR(">\n");
+            cxBufferWrite(s.ptr, 1, s.length, buf);
         }
-        s = SC("</D:prop>\n</D:set>\n");
-        ucx_buffer_write(s.ptr, 1, s.length, buf);
+        s = CX_STR("</D:prop>\n</D:set>\n");
+        cxBufferWrite(s.ptr, 1, s.length, buf);
     }
     if(data->remove) {
-        s = SC("<D:remove>\n<D:prop>\n");
-        ucx_buffer_write(s.ptr, 1, s.length, buf);
-        UCX_FOREACH(elm, data->remove) {
-            DavProperty *property = elm->data;
-            char *prefix = ucx_map_cstr_get(namespaces, property->ns->name);
+        s = CX_STR("<D:remove>\n<D:prop>\n");
+        cxBufferWrite(s.ptr, 1, s.length, buf);
+        CxIterator i = cxListIterator(data->remove);
+        cx_foreach(DavProperty*, property, i) {
+            char *prefix = cxMapGet(namespaces, cx_hash_key_str(property->ns->name));
             
-            s = SC("<");
-            ucx_buffer_write(s.ptr, 1, s.length, buf);
-            s = scstr(prefix);
-            ucx_buffer_write(s.ptr, 1, s.length, buf);
-            s = SC(":");
-            ucx_buffer_write(s.ptr, 1, s.length, buf);
-            s = scstr(property->name);
-            ucx_buffer_write(s.ptr, 1, s.length, buf);
-            s = SC(" />\n");
-            ucx_buffer_write(s.ptr, 1, s.length, buf);
+            s = CX_STR("<");
+            cxBufferWrite(s.ptr, 1, s.length, buf);
+            s = cx_str(prefix);
+            cxBufferWrite(s.ptr, 1, s.length, buf);
+            s = CX_STR(":");
+            cxBufferWrite(s.ptr, 1, s.length, buf);
+            s = cx_str(property->name);
+            cxBufferWrite(s.ptr, 1, s.length, buf);
+            s = CX_STR(" />\n");
+            cxBufferWrite(s.ptr, 1, s.length, buf);
         }
-        s = SC("</D:prop>\n</D:remove>\n");
-        ucx_buffer_write(s.ptr, 1, s.length, buf);
+        s = CX_STR("</D:prop>\n</D:remove>\n");
+        cxBufferWrite(s.ptr, 1, s.length, buf);
     }
     
-    s = SC("</D:propertyupdate>\n");
-    ucx_buffer_write(s.ptr, 1, s.length, buf);
+    s = CX_STR("</D:propertyupdate>\n");
+    cxBufferWrite(s.ptr, 1, s.length, buf);
     
     // cleanup namespace map
-    ucx_map_free_content(namespaces, free);
-    ucx_map_free(namespaces);
+    cxMapDestroy(namespaces);
     
     return buf;
 }
 
-UcxBuffer* create_crypto_proppatch_request(DavSession *sn, DavKey *key, const char *name, const char *hash) {
-    UcxBuffer *buf = ucx_buffer_new(NULL, 512, UCX_BUFFER_AUTOEXTEND);
-    sstr_t s;
+CxBuffer* create_crypto_proppatch_request(DavSession *sn, DavKey *key, const char *name, const char *hash) {
+    CxBuffer *buf = cxBufferCreate(NULL, 512, cxDefaultAllocator, CX_BUFFER_FREE_CONTENTS|CX_BUFFER_AUTO_EXTEND);
+    cxstring s;
     
-    s = S("<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n");
-    ucx_buffer_write(s.ptr, 1, s.length, buf);
+    s = CX_STR("<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n");
+    cxBufferWrite(s.ptr, 1, s.length, buf);
     
-    s = S("<D:propertyupdate xmlns:D=\"DAV:\" xmlns:idav=\"" DAV_NS "\">\n");
-    ucx_buffer_write(s.ptr, 1, s.length, buf);
+    s = CX_STR("<D:propertyupdate xmlns:D=\"DAV:\" xmlns:idav=\"" DAV_NS "\">\n");
+    cxBufferWrite(s.ptr, 1, s.length, buf);
     
-    s = S("<D:set>\n<D:prop>\n");
-    ucx_buffer_write(s.ptr, 1, s.length, buf);
+    s = CX_STR("<D:set>\n<D:prop>\n");
+    cxBufferWrite(s.ptr, 1, s.length, buf);
     
     if(DAV_ENCRYPT_NAME(sn)) {
-        s = S("<idav:crypto-name>");
-        ucx_buffer_write(s.ptr, 1, s.length, buf);
+        s = CX_STR("<idav:crypto-name>");
+        cxBufferWrite(s.ptr, 1, s.length, buf);
         char *crname = aes_encrypt(name, strlen(name), key);
-        ucx_buffer_puts(buf, crname);
+        cxBufferPutString(buf, crname);
         free(crname);
-        s = S("</idav:crypto-name>\n");
-        ucx_buffer_write(s.ptr, 1, s.length, buf);
+        s = CX_STR("</idav:crypto-name>\n");
+        cxBufferWrite(s.ptr, 1, s.length, buf);
     }
     
-    s = S("<idav:crypto-key>");
-    ucx_buffer_write(s.ptr, 1, s.length, buf);
-    ucx_buffer_puts(buf, key->name);
-    s = S("</idav:crypto-key>\n");
-    ucx_buffer_write(s.ptr, 1, s.length, buf);
+    s = CX_STR("<idav:crypto-key>");
+    cxBufferWrite(s.ptr, 1, s.length, buf);
+    cxBufferPutString(buf, key->name);
+    s = CX_STR("</idav:crypto-key>\n");
+    cxBufferWrite(s.ptr, 1, s.length, buf);
     
     if(hash) {
-        s = S("<idav:crypto-hash>");
-        ucx_buffer_write(s.ptr, 1, s.length, buf);
-        ucx_buffer_puts(buf, hash);
-        s = S("</idav:crypto-hash>\n");
-        ucx_buffer_write(s.ptr, 1, s.length, buf);
+        s = CX_STR("<idav:crypto-hash>");
+        cxBufferWrite(s.ptr, 1, s.length, buf);
+        cxBufferPutString(buf, hash);
+        s = CX_STR("</idav:crypto-hash>\n");
+        cxBufferWrite(s.ptr, 1, s.length, buf);
     }
     
-    s = S("</D:prop>\n</D:set>\n</D:propertyupdate>\n");
-    ucx_buffer_write(s.ptr, 1, s.length, buf);
+    s = CX_STR("</D:prop>\n</D:set>\n</D:propertyupdate>\n");
+    cxBufferWrite(s.ptr, 1, s.length, buf);
     
     return buf;
 }
@@ -1006,10 +1013,10 @@
         char *ltheader = NULL;
         if(create) {
             url = util_parent_path(url);
-            ltheader = ucx_sprintf("If: <%s> (<%s>)", url, lock).ptr;
+            ltheader = cx_asprintf("If: <%s> (<%s>)", url, lock).ptr;
             free(url);
         } else {
-            ltheader = ucx_sprintf("If: <%s> (<%s>)", url, lock).ptr;
+            ltheader = cx_asprintf("If: <%s> (<%s>)", url, lock).ptr;
         }
         headers = curl_slist_append(headers, ltheader);
         free(ltheader);
@@ -1017,12 +1024,12 @@
     }
     curl_easy_setopt(handle, CURLOPT_HTTPHEADER, headers);
     
-    UcxBuffer *buf = NULL;
+    CxBuffer *buf = NULL;
     if(!read_func) {
-        buf = ucx_buffer_new(data, length, 0);
+        buf = cxBufferCreate(data, length, cxDefaultAllocator, 0);
         buf->size = length;
         data = buf;
-        read_func = (dav_read_func)ucx_buffer_read;
+        read_func = (dav_read_func)cxBufferRead;
         curl_easy_setopt(handle, CURLOPT_INFILESIZE_LARGE, (curl_off_t)length);
     } else if(length == 0) {
         headers = curl_slist_append(headers, "Transfer-Encoding: chunked");
@@ -1042,19 +1049,19 @@
     CURLcode ret = dav_session_curl_perform(sn, NULL);
     curl_slist_free_all(headers);
     if(buf) {
-        ucx_buffer_free(buf);
+        cxBufferFree(buf);
     }
     
     return ret;
 }
 
-CURLcode do_delete_request(DavSession *sn, char *lock, UcxBuffer *response) { 
+CURLcode do_delete_request(DavSession *sn, char *lock, CxBuffer *response) { 
     CURL *handle = sn->handle;
     struct curl_slist *headers = NULL;
     if(lock) {
         char *url = NULL;
         curl_easy_getinfo(handle, CURLINFO_EFFECTIVE_URL, &url);
-        char *ltheader = ucx_sprintf("If: <%s> (<%s>)", url, lock).ptr;
+        char *ltheader = cx_asprintf("If: <%s> (<%s>)", url, lock).ptr;
         headers = curl_slist_append(headers, ltheader);
         free(ltheader);
         curl_easy_setopt(handle, CURLOPT_HTTPHEADER, headers);
@@ -1065,7 +1072,7 @@
     curl_easy_setopt(handle, CURLOPT_CUSTOMREQUEST, "DELETE");
     curl_easy_setopt(handle, CURLOPT_UPLOAD, 0L);
     
-    curl_easy_setopt(handle, CURLOPT_WRITEFUNCTION, ucx_buffer_write);
+    curl_easy_setopt(handle, CURLOPT_WRITEFUNCTION, cxBufferWrite);
     curl_easy_setopt(handle, CURLOPT_WRITEDATA, response);
     
     CURLcode ret = dav_session_curl_perform(sn, NULL);
@@ -1080,7 +1087,7 @@
         char *url = NULL;
         curl_easy_getinfo(handle, CURLINFO_EFFECTIVE_URL, &url);
         url = util_parent_path(url);
-        char *ltheader = ucx_sprintf("If: <%s> (<%s>)", url, lock).ptr;
+        char *ltheader = cx_asprintf("If: <%s> (<%s>)", url, lock).ptr;
         free(url);
         headers = curl_slist_append(headers, ltheader);
         free(ltheader);
@@ -1138,12 +1145,12 @@
     if(lock) {
         char *url = NULL;
         curl_easy_getinfo(handle, CURLINFO_EFFECTIVE_URL, &url);
-        char *ltheader = ucx_sprintf("If: <%s> (<%s>)", url, lock).ptr;
+        char *ltheader = cx_asprintf("If: <%s> (<%s>)", url, lock).ptr;
         headers = curl_slist_append(headers, ltheader);
         free(ltheader);
     }
-    //sstr_t deststr = ucx_sprintf("Destination: %s", dest);
-    sstr_t deststr = sstrcat(2, S("Destination: "), sstr(dest));
+    //cxstring deststr = ucx_sprintf("Destination: %s", dest);
+    cxmutstr deststr = cx_strcat(2, CX_STR("Destination: "), cx_str(dest));
     headers = curl_slist_append(headers, deststr.ptr);
     if(override) {
         headers = curl_slist_append(headers, "Overwrite: T");
@@ -1161,26 +1168,26 @@
 }
 
 
-UcxBuffer* create_lock_request(void) {
-    UcxBuffer *buf = ucx_buffer_new(NULL, 512, UCX_BUFFER_AUTOEXTEND);
-    sstr_t s;
+CxBuffer* create_lock_request(void) {
+    CxBuffer *buf = cxBufferCreate(NULL, 512, cxDefaultAllocator, CX_BUFFER_FREE_CONTENTS|CX_BUFFER_AUTO_EXTEND);
+    cxstring s;
     
-    s = S("<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n");
-    ucx_buffer_write(s.ptr, 1, s.length, buf);
+    s = CX_STR("<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n");
+    cxBufferWrite(s.ptr, 1, s.length, buf);
     
-    s = S("<D:lockinfo xmlns:D=\"DAV:\">\n"
+    s = CX_STR("<D:lockinfo xmlns:D=\"DAV:\">\n"
           "<D:lockscope><D:exclusive/></D:lockscope>\n"
           "<D:locktype><D:write/></D:locktype>\n"
           "<D:owner><D:href>http://davutils.org/libidav/</D:href></D:owner>\n");
-    ucx_buffer_write(s.ptr, 1, s.length, buf);
+    cxBufferWrite(s.ptr, 1, s.length, buf);
     
-    s = S("</D:lockinfo>\n");
-    ucx_buffer_write(s.ptr, 1, s.length, buf);
+    s = CX_STR("</D:lockinfo>\n");
+    cxBufferWrite(s.ptr, 1, s.length, buf);
     
     return buf;
 }
 
-int parse_lock_response(DavSession *sn, UcxBuffer *response, LockDiscovery *lock) {
+int parse_lock_response(DavSession *sn, CxBuffer *response, LockDiscovery *lock) {
     lock->locktoken = NULL;
     lock->timeout = NULL;
     
@@ -1240,7 +1247,7 @@
     return ret;
 }
 
-CURLcode do_lock_request(DavSession *sn, UcxBuffer *request, UcxBuffer *response, time_t timeout) { 
+CURLcode do_lock_request(DavSession *sn, CxBuffer *request, CxBuffer *response, time_t timeout) { 
     CURL *handle = sn->handle;
     curl_easy_setopt(handle, CURLOPT_CUSTOMREQUEST, "LOCK");  
     curl_easy_setopt(handle, CURLOPT_UPLOAD, 1L);
@@ -1250,11 +1257,11 @@
     struct curl_slist *headers = NULL;
     
     if(timeout != 0) {
-        sstr_t thdr;
+        cxmutstr thdr;
         if(timeout < 0) {
-            thdr = ucx_sprintf("%s", "Timeout: Infinite");
+            thdr = cx_asprintf("%s", "Timeout: Infinite");
         } else {
-            thdr = ucx_sprintf("Timeout: Second-%u", (unsigned int)timeout);
+            thdr = cx_asprintf("Timeout: Second-%u", (unsigned int)timeout);
         }
         headers = curl_slist_append(headers, thdr.ptr);
         free(thdr.ptr);
@@ -1262,12 +1269,12 @@
     curl_easy_setopt(handle, CURLOPT_HTTPHEADER, headers);
     
     curl_easy_setopt(handle, CURLOPT_UPLOAD, 1); 
-    curl_easy_setopt(handle, CURLOPT_READFUNCTION, ucx_buffer_read);
-    curl_easy_setopt(handle, CURLOPT_SEEKFUNCTION, dav_buffer_seek);
+    curl_easy_setopt(handle, CURLOPT_READFUNCTION, cxBufferRead);
+    curl_easy_setopt(handle, CURLOPT_SEEKFUNCTION, cxBufferSeek);
     curl_easy_setopt(handle, CURLOPT_READDATA, request); 
     curl_easy_setopt(handle, CURLOPT_INFILESIZE, request->size);
     
-    curl_easy_setopt(handle, CURLOPT_WRITEFUNCTION, ucx_buffer_write);
+    curl_easy_setopt(handle, CURLOPT_WRITEFUNCTION, cxBufferWrite);
     curl_easy_setopt(handle, CURLOPT_WRITEDATA, response);
     
     CURLcode ret = dav_session_curl_perform_buf(sn, request, response, NULL);
@@ -1288,7 +1295,7 @@
     curl_easy_setopt(handle, CURLOPT_WRITEDATA, NULL);
     
     // set lock-token header
-    sstr_t ltheader = ucx_sprintf("Lock-Token: <%s>", locktoken);
+    cxmutstr ltheader = cx_asprintf("Lock-Token: <%s>", locktoken);
     struct curl_slist *headers = curl_slist_append(NULL, ltheader.ptr);
     curl_easy_setopt(handle, CURLOPT_HTTPHEADER, headers);
     
@@ -1308,10 +1315,10 @@
     curl_easy_setopt(handle, CURLOPT_WRITEDATA, NULL);
     
     // set lock-token header
-    sstr_t ltheader;
+    cxmutstr ltheader;
     struct curl_slist *headers = NULL;
     if(locktoken) {
-        ltheader = ucx_sprintf("Lock-Token: <%s>", locktoken);
+        ltheader = cx_asprintf("Lock-Token: <%s>", locktoken);
         headers = curl_slist_append(NULL, ltheader.ptr);
     }
     curl_easy_setopt(handle, CURLOPT_HTTPHEADER, headers);
@@ -1326,17 +1333,17 @@
 }
 
 
-CURLcode do_report_request(DavSession *sn, UcxBuffer *request, UcxBuffer *response) {
+CURLcode do_report_request(DavSession *sn, CxBuffer *request, CxBuffer *response) {
     CURL *handle = sn->handle;
     curl_easy_setopt(handle, CURLOPT_CUSTOMREQUEST, "REPORT");
     
     curl_easy_setopt(handle, CURLOPT_UPLOAD, 1); 
-    curl_easy_setopt(handle, CURLOPT_READFUNCTION, ucx_buffer_read);
-    curl_easy_setopt(handle, CURLOPT_SEEKFUNCTION, dav_buffer_seek);
+    curl_easy_setopt(handle, CURLOPT_READFUNCTION, cxBufferRead);
+    curl_easy_setopt(handle, CURLOPT_SEEKFUNCTION, cxBufferSeek);
     curl_easy_setopt(handle, CURLOPT_READDATA, request); 
     curl_easy_setopt(handle, CURLOPT_INFILESIZE, request->size);
     
-    curl_easy_setopt(handle, CURLOPT_WRITEFUNCTION, ucx_buffer_write);
+    curl_easy_setopt(handle, CURLOPT_WRITEFUNCTION, cxBufferWrite);
     curl_easy_setopt(handle, CURLOPT_WRITEDATA, response);
     
     struct curl_slist *headers = NULL;

mercurial