diff -r 54819e984a19 -r 9ca1e4706acc libidav/resource.c --- a/libidav/resource.c Thu Oct 12 20:37:46 2017 +0200 +++ b/libidav/resource.c Sun Oct 22 12:58:07 2017 +0200 @@ -40,6 +40,7 @@ #include "ucx/utils.h" #include "resource.h" +#include "xml.h" #include "davqlexec.h" #define xstreq(a,b) xmlStrEqual(BAD_CAST a, BAD_CAST b) @@ -236,25 +237,36 @@ return resource->href; } -void resource_add_property(DavResource *res, char *ns, char *name, char *val) { +void resource_add_property(DavResource *res, char *ns, char *name, xmlNode *val) { if(!val) { return; } UcxKey key = dav_property_key(ns, name); - sstr_t v = sstrdup_a(res->session->mp->allocator, sstr(val)); - ucx_map_put(((DavResourceData*)res->data)->properties, key, v.ptr); + DavXmlNode *v = dav_convert_xml(res->session, val); + ucx_map_put(((DavResourceData*)res->data)->properties, key, v); free(key.data); } -char* resource_get_property(DavResource *res, char *ns, char *name) { +void resource_add_string_property(DavResource *res, char *ns, char *name, char *val) { + if(!val) { + return; + } + UcxKey key = dav_property_key(ns, name); - char *property = resource_get_property_k(res, key); + DavXmlNode *v = dav_text_node(res->session, val); + ucx_map_put(((DavResourceData*)res->data)->properties, key, v); + free(key.data); +} + +DavXmlNode* resource_get_property(DavResource *res, char *ns, char *name) { + UcxKey key = dav_property_key(ns, name); + DavXmlNode *property = resource_get_property_k(res, key); free(key.data); return property; } -char* resource_get_property_k(DavResource *res, UcxKey key) { +DavXmlNode* resource_get_property_k(DavResource *res, UcxKey key) { DavResourceData *data = (DavResourceData*)res->data; return ucx_map_get(data->properties, key); } @@ -339,8 +351,10 @@ default: ret = 0; } } else if(cr->type == 1) { - char *value1 = resource_get_property_k(res1, cr->column.property); - char *value2 = resource_get_property_k(res2, cr->column.property); + DavXmlNode *xvalue1 = resource_get_property_k(res1, cr->column.property); + DavXmlNode *xvalue2 = resource_get_property_k(res2, cr->column.property); + char *value1 = dav_xml_getstring(xvalue1); + char *value2 = dav_xml_getstring(xvalue2); if(!value1) { ret = value2 ? -1 : 0; } else if(!value2) { @@ -403,7 +417,25 @@ } } -char* dav_get_property(DavResource *res, char *name) { +char* dav_get_string_property(DavResource *res, char *name) { + char *pns; + char *pname; + dav_get_property_namespace_str(res->session->context, name, &pns, &pname); + if(!pns || !pname) { + return NULL; + } + return dav_get_string_property_ns(res, pns, pname); +} + +char* dav_get_string_property_ns(DavResource *res, char *ns, char *name) { + DavXmlNode *prop = dav_get_property_ns(res, ns, name); + if(!prop) { + return NULL; + } + return dav_xml_getstring(prop); +} + +DavXmlNode* dav_get_property(DavResource *res, char *name) { char *pns; char *pname; dav_get_property_namespace_str(res->session->context, name, &pns, &pname); @@ -413,11 +445,11 @@ return dav_get_property_ns(res, pns, pname); } -char* dav_get_property_ns(DavResource *res, char *ns, char *name) { +DavXmlNode* dav_get_property_ns(DavResource *res, char *ns, char *name) { if(!ns || !name) { return NULL; } - char *property = resource_get_property(res, ns, name); + DavXmlNode *property = resource_get_property(res, ns, name); DavResourceData *data = res->data; // resource_get_property only returns persistent properties // check the remove and set list @@ -435,7 +467,7 @@ UCX_FOREACH(elm, data->set) { DavProperty *p = elm->data; if(!strcmp(p->name, name) && !strcmp(p->ns->name, ns)) { - return p->value; + return p->value; // TODO: fix } } // no property update @@ -457,7 +489,7 @@ res->session, sizeof(DavProperty)); property->name = dav_session_strdup(res->session, name); - property->value = dav_session_strdup(res->session, value); + property->value = dav_text_node(res->session, value); DavNamespace *namespace = dav_session_malloc( res->session, @@ -646,7 +678,7 @@ free(enc_hash); return 1; } - resource_add_property(res, DAV_NS, "crypto-hash", enc_hash); + resource_add_string_property(res, DAV_NS, "crypto-hash", enc_hash); free(enc_hash); } else { ret = do_put_request( @@ -713,7 +745,7 @@ AESDecrypter *dec = NULL; DavKey *key = NULL; if(DAV_DECRYPT_CONTENT(sn)) { - char *keyname = dav_get_property_ns(res, DAV_NS, "crypto-key"); + char *keyname = dav_get_string_property_ns(res, DAV_NS, "crypto-key"); if(keyname) { key = dav_context_get_key(sn->context, keyname); if(key) { @@ -752,7 +784,7 @@ int verify_failed = 0; if(DAV_DECRYPT_CONTENT(sn) && key) { // try to verify the content - char *res_hash = dav_get_property_ns(res, DAV_NS, "crypto-hash"); + char *res_hash = dav_get_string_property_ns(res, DAV_NS, "crypto-hash"); if(res_hash) { size_t len = 0;