diff -r a569148841ff -r efbd59642577 libidav/methods.c --- 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 +#include +#include +#include #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 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("\n"); - ucx_buffer_write(s.ptr, 1, s.length, buf); + s = CX_STR("\n"); + 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); - s = S("\n"); - ucx_buffer_write(s.ptr, 1, s.length, buf); + s = CX_STR("\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("\n"); - ucx_buffer_write(s.ptr, 1, s.length, buf); + s = CX_STR("\n"); + 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); - s = SC("\n"); - ucx_buffer_write(s.ptr, 1, s.length, buf); + s = CX_STR("\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("\n"); - ucx_buffer_write(s.ptr, 1, s.length, buf); + s = CX_STR("\n"); + cxBufferWrite(s.ptr, 1, s.length, buf); // write root element and namespaces - ucx_bprintf(buf, "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("\n"); - ucx_buffer_write(s.ptr, 1, s.length, buf); + s = CX_STR("\n"); + cxBufferWrite(s.ptr, 1, s.length, buf); - s = S("\n\n"); - ucx_buffer_write(s.ptr, 1, s.length, buf); + s = CX_STR("\n\n"); + cxBufferWrite(s.ptr, 1, s.length, buf); - s = S("\n\n"); - ucx_buffer_write(s.ptr, 1, s.length, buf); + s = CX_STR("\n\n"); + 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); // 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, "\n\n", rootelm); + cx_bprintf(buf, "\n\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("\n"); - ucx_buffer_write(s.ptr, 1, s.length, buf); + s = CX_STR("\n"); + 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); // properties - s = S("\n"); - ucx_buffer_write(s.ptr, 1, s.length, buf); - s = S("\n"); - ucx_buffer_write(s.ptr, 1, s.length, buf); - s = S("\n"); - ucx_buffer_write(s.ptr, 1, s.length, buf); - s = S("\n"); - ucx_buffer_write(s.ptr, 1, s.length, buf); - s = S("\n"); - ucx_buffer_write(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); + s = CX_STR("\n"); + cxBufferWrite(s.ptr, 1, s.length, buf); + s = CX_STR("\n"); + cxBufferWrite(s.ptr, 1, s.length, buf); + s = CX_STR("\n"); + cxBufferWrite(s.ptr, 1, s.length, buf); + s = CX_STR("\n"); + cxBufferWrite(s.ptr, 1, s.length, buf); + s = CX_STR("\n"); + cxBufferWrite(s.ptr, 1, s.length, buf); // end - s = S("\n"); - ucx_buffer_write(s.ptr, 1, s.length, buf); + s = CX_STR("\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("\n"); - ucx_buffer_write(s.ptr, 1, s.length, buf); + s = CX_STR("\n"); + cxBufferWrite(s.ptr, 1, s.length, buf); // write root element and namespaces - s = SC("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("\n\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("\n\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("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("name); + cxBufferWrite(s.ptr, 1, s.length, buf); + s = CX_STR(">\n"); + cxBufferWrite(s.ptr, 1, s.length, buf); } - s = SC("\n\n"); - ucx_buffer_write(s.ptr, 1, s.length, buf); + s = CX_STR("\n\n"); + cxBufferWrite(s.ptr, 1, s.length, buf); } if(data->remove) { - s = SC("\n\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("\n\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("\n\n"); - ucx_buffer_write(s.ptr, 1, s.length, buf); + s = CX_STR("\n\n"); + 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); // 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("\n"); - ucx_buffer_write(s.ptr, 1, s.length, buf); + s = CX_STR("\n"); + 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); - s = S("\n\n"); - ucx_buffer_write(s.ptr, 1, s.length, buf); + s = CX_STR("\n\n"); + cxBufferWrite(s.ptr, 1, s.length, buf); if(DAV_ENCRYPT_NAME(sn)) { - s = S(""); - ucx_buffer_write(s.ptr, 1, s.length, buf); + s = CX_STR(""); + 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("\n"); - ucx_buffer_write(s.ptr, 1, s.length, buf); + s = CX_STR("\n"); + cxBufferWrite(s.ptr, 1, s.length, buf); } - s = S(""); - ucx_buffer_write(s.ptr, 1, s.length, buf); - ucx_buffer_puts(buf, key->name); - s = S("\n"); - ucx_buffer_write(s.ptr, 1, s.length, buf); + s = CX_STR(""); + cxBufferWrite(s.ptr, 1, s.length, buf); + cxBufferPutString(buf, key->name); + s = CX_STR("\n"); + cxBufferWrite(s.ptr, 1, s.length, buf); if(hash) { - s = S(""); - ucx_buffer_write(s.ptr, 1, s.length, buf); - ucx_buffer_puts(buf, hash); - s = S("\n"); - ucx_buffer_write(s.ptr, 1, s.length, buf); + s = CX_STR(""); + cxBufferWrite(s.ptr, 1, s.length, buf); + cxBufferPutString(buf, hash); + s = CX_STR("\n"); + cxBufferWrite(s.ptr, 1, s.length, buf); } - s = S("\n\n\n"); - ucx_buffer_write(s.ptr, 1, s.length, buf); + s = CX_STR("\n\n\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("\n"); - ucx_buffer_write(s.ptr, 1, s.length, buf); + s = CX_STR("\n"); + cxBufferWrite(s.ptr, 1, s.length, buf); - s = S("\n" + s = CX_STR("\n" "\n" "\n" "http://davutils.org/libidav/\n"); - ucx_buffer_write(s.ptr, 1, s.length, buf); + 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); 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;