libidav/resource.c

changeset 84
7fca3788261d
parent 75
56962faf2b42
child 100
f4127c4d1018
--- 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;j<key.len;k++) {
+            if(((char*)key.data)[k] == '\0') {
+                name->name = 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;

mercurial