libidav/webdav.c

changeset 747
efbd59642577
parent 645
ad61c1654dce
child 786
f9d6e4cbcb62
--- a/libidav/webdav.c	Sun Apr 16 14:12:24 2023 +0200
+++ b/libidav/webdav.c	Fri Apr 21 21:25:32 2023 +0200
@@ -35,8 +35,11 @@
 #include "webdav.h"
 #include "session.h"
 #include "methods.h"
-#include "ucx/buffer.h"
-#include "ucx/utils.h"
+#include <cx/buffer.h>
+#include <cx/utils.h>
+#include <cx/linked_list.h>
+#include <cx/hash_map.h>
+#include <cx/compare.h>
 #include "davqlparser.h"
 #include "davqlexec.h"
 
@@ -47,7 +50,7 @@
     if(!context) {
         return NULL;
     }
-    context->sessions = NULL;
+    context->sessions = cxLinkedListCreate(cxDefaultAllocator, cx_cmp_intptr, CX_STORE_POINTERS);
     context->http_proxy = calloc(1, sizeof(DavProxy));
     if(!context->http_proxy) {
         dav_context_destroy(context);
@@ -58,16 +61,16 @@
         dav_context_destroy(context);
         return NULL;
     }
-    context->namespaces = ucx_map_new(16);
+    context->namespaces = cxHashMapCreate(cxDefaultAllocator, CX_STORE_POINTERS, 16);
     if(!context->namespaces) {
         dav_context_destroy(context);
         return NULL;
     }
-    context->namespaceinfo = ucx_map_new(16);
+    context->namespaceinfo = cxHashMapCreate(cxDefaultAllocator, CX_STORE_POINTERS, 16);
     if(!context->namespaceinfo) {
         dav_context_destroy(context);
     }
-    context->keys = ucx_map_new(16);
+    context->keys = cxHashMapCreate(cxDefaultAllocator, CX_STORE_POINTERS, 16);
     if(!context->keys) {
         dav_context_destroy(context);
         return NULL;
@@ -97,12 +100,11 @@
 
 void dav_context_destroy(DavContext *ctx) {
     // destroy all sessions assoziated with this context
-    UcxList *elm = ctx->sessions;
-    while(elm) {
-        DavSession *sn = elm->data;
-        elm = elm->next;
+    CxIterator i = cxListIterator(ctx->sessions);
+    cx_foreach(DavSession*, sn, i) {
         dav_session_destroy(sn);
     }
+    cxListDestroy(ctx->sessions);
     if(ctx->http_proxy) {
         free(ctx->http_proxy);
     }
@@ -111,10 +113,8 @@
     }
     
     if(ctx->namespaces) {
-        UcxMapIterator i = ucx_map_iterator(ctx->namespaces);
-        UcxKey k;
-        DavNamespace *ns;
-        UCX_MAP_FOREACH(k, ns, i) {
+        i = cxMapIteratorValues(ctx->namespaces);
+        cx_foreach(DavNamespace*, ns, i) {
             if(!ns) continue;
             if(ns->prefix) {
                 free(ns->prefix);
@@ -124,16 +124,14 @@
             }
             free(ns);
         }
-        ucx_map_free(ctx->namespaces);
+        cxMapDestroy(ctx->namespaces);
     }
     if(ctx->namespaceinfo) {
         // TODO: implement
     }
     if(ctx->keys) {
-        UcxMapIterator i = ucx_map_iterator(ctx->keys);
-        UcxKey k;
-        DavKey *key;
-        UCX_MAP_FOREACH(k, key, i) {
+        i = cxMapIteratorValues(ctx->keys);
+        cx_foreach(DavKey*, key, i) {
             if(!key) continue;
             if(key->name) {
                 free(key->name);
@@ -143,19 +141,19 @@
             }
             free(key);
         }
-        ucx_map_free(ctx->keys);
+        cxMapDestroy(ctx->keys);
     }    
     
     free(ctx);
 }
 
 void dav_context_add_key(DavContext *context, DavKey *key) {
-    ucx_map_cstr_put(context->keys, key->name, key);
+    cxMapPut(context->keys, cx_hash_key_str(key->name), key);
 }
 
-DavKey* dav_context_get_key(DavContext *context, char *name) {
+DavKey* dav_context_get_key(DavContext *context, const char *name) {
     if(name) {
-        return ucx_map_cstr_get(context->keys, name);
+        return cxMapGet(context->keys, cx_hash_key_str(name));
     }
     return NULL;
 }
@@ -173,7 +171,7 @@
     if(p && n) {
         namespace->prefix = p;
         namespace->name = n;
-        err = ucx_map_cstr_put(context->namespaces, prefix, namespace);
+        err = cxMapPut(context->namespaces, cx_hash_key_str(prefix), namespace);
     }
     
     if(err) {
@@ -186,19 +184,20 @@
 }
 
 DavNamespace* dav_get_namespace(DavContext *context, const char *prefix) {
-    return ucx_map_cstr_get(context->namespaces, prefix);
+    return cxMapGet(context->namespaces, cx_hash_key_str(prefix));
 }
 
-DavNamespace* dav_get_namespace_s(DavContext *context, sstr_t prefix) {
-    return ucx_map_sstr_get(context->namespaces, prefix);
+DavNamespace* dav_get_namespace_s(DavContext *context, cxstring prefix) {
+    return cxMapGet(context->namespaces, cx_hash_key(prefix.ptr, prefix.length));
 }
 
 int dav_enable_namespace_encryption(DavContext *context, const char *ns, DavBool encrypt) {
-    DavNSInfo *info = ucx_map_cstr_get(context->namespaceinfo, ns);
+    CxHashKey hkey = cx_hash_key_str(ns);
+    DavNSInfo *info = cxMapGet(context->namespaceinfo, hkey);
     if(!info) {
         info = calloc(1, sizeof(DavNSInfo));
         info->encrypt = encrypt;
-        ucx_map_cstr_put(context->namespaceinfo, ns, info);
+        cxMapPut(context->namespaceinfo, hkey, info);
     } else {
         info->encrypt = encrypt;
     }
@@ -206,7 +205,7 @@
 }
 
 int dav_namespace_is_encrypted(DavContext *context, const char *ns) {
-    DavNSInfo *info = ucx_map_cstr_get(context->namespaceinfo, ns);
+    DavNSInfo *info = cxMapGet(context->namespaceinfo, cx_hash_key_str(ns));
     if(info) {
         return info->encrypt;
     }
@@ -226,7 +225,7 @@
     if(pname) {
         DavNamespace *ns = dav_get_namespace_s(
                 ctx,
-                sstrn(prefixed_name, pname-prefixed_name));
+                cx_strn(prefixed_name, pname-prefixed_name));
         if(ns) {
             pns = ns->name;
             pname++;
@@ -250,7 +249,7 @@
     if(pname) {
         DavNamespace *ns = dav_get_namespace_s(
                 ctx,
-                sstrn(prefixed_name, pname-prefixed_name));
+                cx_strn(prefixed_name, pname-prefixed_name));
         if(ns) {
             *name = pname +1;
             return ns;
@@ -260,7 +259,7 @@
         }
     } else {
         *name = prefixed_name;
-        return dav_get_namespace_s(ctx, S("D"));
+        return dav_get_namespace_s(ctx, cx_str("D"));
     }
 }
 
@@ -270,7 +269,7 @@
     char *eff_url;
     curl_easy_getinfo(sn->handle, CURLINFO_EFFECTIVE_URL, &eff_url);
     if(eff_url) {
-        char *href = util_url_path(eff_url);
+        const char *href = util_url_path(eff_url);
         if(strcmp(href, resource->href)) {
             dav_session_free(sn, resource->href);
             resource->href = dav_session_strdup(sn, href);
@@ -278,17 +277,17 @@
     }
 }
 
-DavResource* dav_get(DavSession *sn, char *path, char *properties) {  
+DavResource* dav_get(DavSession *sn, char *path, const char *properties) {  
     CURL *handle = sn->handle;
     DavResource *resource = dav_resource_new(sn, path);
     util_set_url(sn, dav_resource_get_href(resource));
     
-    UcxList *proplist = NULL;
+    CxList *proplist = NULL;
     if(properties) {
-        proplist = parse_properties_string(sn->context, sstr(properties));
+        proplist = parse_properties_string(sn->context, cx_str(properties));
     }
-    UcxBuffer *rqbuf = create_propfind_request(sn, proplist, "propfind", 0);
-    UcxBuffer *rpbuf = ucx_buffer_new(NULL, 4096, UCX_BUFFER_AUTOEXTEND);
+    CxBuffer *rqbuf = create_propfind_request(sn, proplist, "propfind", 0);
+    CxBuffer *rpbuf = cxBufferCreate(NULL, 4096, cxDefaultAllocator, CX_BUFFER_FREE_CONTENTS|CX_BUFFER_AUTO_EXTEND);
     
     //fwrite(rqbuf->space, 1, rqbuf->size, stdout);
     //printf("\n");
@@ -310,30 +309,30 @@
         resource = NULL;
     }
     
-    ucx_buffer_free(rqbuf);
-    ucx_buffer_free(rpbuf);
-    while(proplist) {
-        DavProperty *p = proplist->data;
-        free(p->name);
-        free(p);
-        UcxList *next = proplist->next;
-        free(proplist);
-        proplist = next;
+    cxBufferFree(rqbuf);
+    cxBufferFree(rpbuf);
+    
+    if(proplist) {
+        CxIterator i = cxListIterator(proplist);
+        cx_foreach(DavProperty*, p, i) {
+            free(p->name);
+        }
+        cxListDestroy(proplist);
     }
     
     return resource;
 }
 
 
-int dav_propfind(DavSession *sn, DavResource *root, UcxBuffer *rqbuf) {
+int dav_propfind(DavSession *sn, DavResource *root, CxBuffer *rqbuf) {
     // clean resource properties
     DavResourceData *data = root->data;
-    ucx_map_clear(data->properties); // TODO: free existing content
+    cxMapClear(data->properties); // TODO: free existing content
     
     CURL *handle = sn->handle;
     util_set_url(sn, dav_resource_get_href(root));
      
-    UcxBuffer *rpbuf = ucx_buffer_new(NULL, 4096, UCX_BUFFER_AUTOEXTEND);
+    CxBuffer *rpbuf = cxBufferCreate(NULL, 4096, cxDefaultAllocator, CX_BUFFER_FREE_CONTENTS|CX_BUFFER_AUTO_EXTEND);
     DavResource *resource = root;
     CURLcode ret = do_propfind_request(sn, rqbuf, rpbuf);
     long status = 0;
@@ -350,41 +349,40 @@
         dav_session_set_error(sn, ret, status);
         error = 1;
     }
-    ucx_buffer_free(rpbuf);
+    cxBufferFree(rpbuf);
     return error;
 }
 
-UcxList* parse_properties_string(DavContext *context, sstr_t str) {
-    UcxList *proplist = NULL;
-    ssize_t nprops = 0;
-    sstr_t *props = sstrsplit(str, S(","), &nprops);
-    for(int i=0;i<nprops;i++) {
-        sstr_t s = props[i];
-        sstr_t nsname = sstrchr(s, ':');
+CxList* parse_properties_string(DavContext *context, cxstring str) {
+    CxList *proplist = cxLinkedListCreateSimple(sizeof(DavProperty));
+    
+    CxStrtokCtx tok = cx_strtok(str, cx_str(","), INT_MAX);
+    cxstring s;
+    while(cx_strtok_next(&tok, &s)) {
+        cxstring nsname = cx_strchr(s, ':');
         if(nsname.length > 0) {
-            sstr_t nspre = sstrsubsl(s, 0, nsname.ptr - s.ptr);
+            cxstring nspre = cx_strsubsl(s, 0, nsname.ptr - s.ptr);
             nsname.ptr++;
             nsname.length--;
             
-            DavProperty *dp = malloc(sizeof(DavProperty));
-            sstr_t pre = sstrtrim(nspre);
-            dp->ns = dav_get_namespace_s(context, pre);
-            dp->name = sstrdup(nsname).ptr;
-            if(dp->ns && dp->name) {
-                proplist = ucx_list_append(proplist, dp);
+            DavProperty dp;
+            cxstring pre = cx_strtrim(nspre);
+            dp.ns = dav_get_namespace_s(context, pre);
+            dp.name = cx_strdup(nsname).ptr;
+            dp.value = NULL;
+            if(dp.ns && dp.name) {
+                cxListAdd(proplist, &dp);
             } else {
-                free(dp->name);
-                free(dp);
+                free(dp.name);
             }
         }
-        free(s.ptr);
     }
-    free(props);
+    
     return proplist;
 }
 
 DavResource* dav_query(DavSession *sn, char *query, ...) {
-    DavQLStatement *stmt = dav_parse_statement(sstr(query));
+    DavQLStatement *stmt = dav_parse_statement(cx_str(query));
     if(!stmt) {
         sn->error = DAV_ERROR;
         return NULL;

mercurial