--- 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;