243 UcxKey dav_property_key(char *ns, char *name) { |
243 UcxKey dav_property_key(char *ns, char *name) { |
244 sstr_t ns_str = sstr(ns); |
244 sstr_t ns_str = sstr(ns); |
245 sstr_t name_str = sstr(name); |
245 sstr_t name_str = sstr(name); |
246 |
246 |
247 sstr_t key; |
247 sstr_t key; |
248 key = sstrcat(3, ns_str, S(" "), name_str); |
248 key = sstrcat(4, ns_str, S("\0"), name_str, S("\0")); |
249 |
249 |
250 return ucx_key(key.ptr, key.length); |
250 return ucx_key(key.ptr, key.length); |
251 } |
251 } |
252 |
252 |
253 |
253 |
352 namespace->prefix = NULL; |
352 namespace->prefix = NULL; |
353 namespace->name = sstrdup_a(a, sstr(ns)).ptr; |
353 namespace->name = sstrdup_a(a, sstr(ns)).ptr; |
354 property->ns = namespace; |
354 property->ns = namespace; |
355 |
355 |
356 data->remove = ucx_list_append_a(a, data->remove, property); |
356 data->remove = ucx_list_append_a(a, data->remove, property); |
|
357 } |
|
358 |
|
359 static int compare_propname(const void *a, const void *b) { |
|
360 const DavPropName *p1 = a; |
|
361 const DavPropName *p2 = b; |
|
362 |
|
363 int result = strcmp(p1->ns, p2->ns); |
|
364 if(result) { |
|
365 return result; |
|
366 } else { |
|
367 return strcmp(p1->name, p2->name); |
|
368 } |
|
369 } |
|
370 |
|
371 DavPropName* dav_get_property_names(DavResource *res, size_t *count) { |
|
372 DavResourceData *data = res->data; |
|
373 |
|
374 *count = data->properties->count; |
|
375 DavPropName *names = dav_session_calloc( |
|
376 res->session, |
|
377 *count, |
|
378 sizeof(DavPropName)); |
|
379 |
|
380 |
|
381 UcxMapIterator i = ucx_map_iterator(data->properties); |
|
382 void *value; |
|
383 int j = 0; |
|
384 UCX_MAP_FOREACH(key, value, i) { |
|
385 DavPropName *name = &names[j]; |
|
386 // the map key is namespace + '\0' + name |
|
387 name->ns = key.data; |
|
388 for(int k=0;j<key.len;k++) { |
|
389 if(((char*)key.data)[k] == '\0') { |
|
390 name->name = key.data + k + 1; |
|
391 break; |
|
392 } |
|
393 } |
|
394 j++; |
|
395 } |
|
396 |
|
397 qsort(names, *count, sizeof(DavPropName), compare_propname); |
|
398 |
|
399 return names; |
357 } |
400 } |
358 |
401 |
359 |
402 |
360 void dav_set_content(DavResource *res, void *stream, dav_read_func read_func) { |
403 void dav_set_content(DavResource *res, void *stream, dav_read_func read_func) { |
361 DavResourceData *data = res->data; |
404 DavResourceData *data = res->data; |