diff -r 7d20ce5d235b -r 7fca3788261d libidav/resource.c --- a/libidav/resource.c Wed Apr 01 11:42:38 2015 +0200 +++ b/libidav/resource.c Fri Apr 03 14:53:28 2015 +0200 @@ -245,7 +245,7 @@ sstr_t name_str = sstr(name); sstr_t key; - key = sstrcat(3, ns_str, S(" "), name_str); + key = sstrcat(4, ns_str, S("\0"), name_str, S("\0")); return ucx_key(key.ptr, key.length); } @@ -356,6 +356,49 @@ data->remove = ucx_list_append_a(a, data->remove, property); } +static int compare_propname(const void *a, const void *b) { + const DavPropName *p1 = a; + const DavPropName *p2 = b; + + int result = strcmp(p1->ns, p2->ns); + if(result) { + return result; + } else { + return strcmp(p1->name, p2->name); + } +} + +DavPropName* dav_get_property_names(DavResource *res, size_t *count) { + DavResourceData *data = res->data; + + *count = data->properties->count; + DavPropName *names = dav_session_calloc( + res->session, + *count, + sizeof(DavPropName)); + + + UcxMapIterator i = ucx_map_iterator(data->properties); + void *value; + int j = 0; + UCX_MAP_FOREACH(key, value, i) { + DavPropName *name = &names[j]; + // the map key is namespace + '\0' + name + name->ns = key.data; + for(int k=0;jname = key.data + k + 1; + break; + } + } + j++; + } + + qsort(names, *count, sizeof(DavPropName), compare_propname); + + return names; +} + void dav_set_content(DavResource *res, void *stream, dav_read_func read_func) { DavResourceData *data = res->data;