125 |
125 |
126 void resource_free_properties(DavSession *sn, CxMap *properties) { |
126 void resource_free_properties(DavSession *sn, CxMap *properties) { |
127 if(!properties) return; |
127 if(!properties) return; |
128 |
128 |
129 CxIterator i = cxMapIteratorValues(properties); |
129 CxIterator i = cxMapIteratorValues(properties); |
130 DavProperty *property; |
|
131 cx_foreach(DavProperty*, property, i) { |
130 cx_foreach(DavProperty*, property, i) { |
132 // TODO: free everything |
131 // TODO: free everything |
133 dav_session_free(sn, property); |
132 dav_session_free(sn, property); |
134 } |
133 } |
135 cxMapDestroy(properties); |
134 cxMapDestroy(properties); |
605 property->ns = namespace; |
604 property->ns = namespace; |
606 |
605 |
607 return property; |
606 return property; |
608 } |
607 } |
609 |
608 |
610 void dav_set_string_property(DavResource *res, char *name, char *value) { |
609 int dav_set_string_property(DavResource *res, char *name, char *value) { |
611 char *pns; |
610 char *pns; |
612 char *pname; |
611 char *pname; |
613 dav_get_property_namespace_str(res->session->context, name, &pns, &pname); |
612 dav_get_property_namespace_str(res->session->context, name, &pns, &pname); |
|
613 if(!pns) { |
|
614 res->session->errorstr = "Property namespace not found"; |
|
615 return 1; |
|
616 } |
614 dav_set_string_property_ns(res, pns, pname, value); |
617 dav_set_string_property_ns(res, pns, pname, value); |
|
618 return 0; |
615 } |
619 } |
616 |
620 |
617 static int add2propertylist(const CxAllocator *a, CxList **list, DavProperty *property) { |
621 static int add2propertylist(const CxAllocator *a, CxList **list, DavProperty *property) { |
618 if(!*list) { |
622 if(!*list) { |
619 CxList *newlist = cxLinkedListCreate(a, NULL, CX_STORE_POINTERS); |
623 CxList *newlist = cxLinkedListCreate(a, NULL, CX_STORE_POINTERS); |
728 } |
732 } |
729 |
733 |
730 DavPropName* dav_get_property_names(DavResource *res, size_t *count) { |
734 DavPropName* dav_get_property_names(DavResource *res, size_t *count) { |
731 DavResourceData *data = res->data; |
735 DavResourceData *data = res->data; |
732 |
736 |
733 *count = data->properties->size; |
737 *count = cxMapSize(data->properties); |
734 DavPropName *names = dav_session_calloc( |
738 DavPropName *names = dav_session_calloc( |
735 res->session, |
739 res->session, |
736 *count, |
740 *count, |
737 sizeof(DavPropName)); |
741 sizeof(DavPropName)); |
738 |
742 |
739 |
743 |
740 CxIterator i = cxMapIteratorValues(data->properties); |
744 CxIterator i = cxMapIteratorValues(data->properties); |
741 DavProperty *value; |
|
742 int j = 0; |
|
743 cx_foreach(DavProperty*, value, i) { |
745 cx_foreach(DavProperty*, value, i) { |
744 DavPropName *name = &names[j]; |
746 DavPropName *name = &names[i.index]; |
745 |
|
746 name->ns = value->ns->name; |
747 name->ns = value->ns->name; |
747 name->name = value->name; |
748 name->name = value->name; |
748 |
|
749 j++; |
|
750 } |
749 } |
751 |
750 |
752 qsort(names, *count, sizeof(DavPropName), compare_propname); |
751 qsort(names, *count, sizeof(DavPropName), compare_propname); |
753 |
752 |
754 return names; |
753 return names; |
996 |
995 |
997 // remove all properties |
996 // remove all properties |
998 if(data->crypto_remove) { |
997 if(data->crypto_remove) { |
999 CxIterator i = cxListIterator(data->crypto_remove); |
998 CxIterator i = cxListIterator(data->crypto_remove); |
1000 cx_foreach(DavProperty *, property, i) { |
999 cx_foreach(DavProperty *, property, i) { |
1001 if(crypto_props->size == 0) { |
1000 if(cxMapSize(crypto_props) == 0) { |
1002 break; // map already empty, can't remove any more |
1001 break; // map already empty, can't remove any more |
1003 } |
1002 } |
1004 |
1003 |
1005 cxmutstr key = dav_property_key(property->ns->name, property->name); |
1004 cxmutstr key = dav_property_key(property->ns->name, property->name); |
1006 DavProperty *existing_prop = cxMapGet(crypto_props, cx_hash_key(key.ptr, key.length)); |
1005 DavProperty *existing_prop = cxMapGet(crypto_props, cx_hash_key(key.ptr, key.length)); |
1507 |
1506 |
1508 CxBuffer *content = cxBufferCreate(NULL, 2048, cxDefaultAllocator, CX_BUFFER_FREE_CONTENTS|CX_BUFFER_AUTO_EXTEND); |
1507 CxBuffer *content = cxBufferCreate(NULL, 2048, cxDefaultAllocator, CX_BUFFER_FREE_CONTENTS|CX_BUFFER_AUTO_EXTEND); |
1509 |
1508 |
1510 // create an xml document containing all properties |
1509 // create an xml document containing all properties |
1511 CxMap *nsmap = cxHashMapCreate(cxDefaultAllocator, CX_STORE_POINTERS, 8); |
1510 CxMap *nsmap = cxHashMapCreate(cxDefaultAllocator, CX_STORE_POINTERS, 8); |
1512 nsmap->simple_destructor = free; |
1511 cxDefineDestructor(nsmap, free); |
1513 cxMapPut(nsmap, cx_hash_key_str("DAV:"), strdup("D")); |
1512 cxMapPut(nsmap, cx_hash_key_str("DAV:"), strdup("D")); |
1514 |
1513 |
1515 cxBufferPutString(content, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"); |
1514 cxBufferPutString(content, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"); |
1516 cxBufferPutString(content, "<D:prop xmlns:D=\"DAV:\">\n"); |
1515 cxBufferPutString(content, "<D:prop xmlns:D=\"DAV:\">\n"); |
1517 |
1516 |
1518 CxIterator i = cxMapIteratorValues(properties); |
1517 CxIterator i = cxMapIteratorValues(properties); |
1519 DavProperty *prop; |
|
1520 cx_foreach(DavProperty*, prop, i) { |
1518 cx_foreach(DavProperty*, prop, i) { |
1521 DavXmlNode pnode; |
1519 DavXmlNode pnode; |
1522 pnode.type = DAV_XML_ELEMENT; |
1520 pnode.type = DAV_XML_ELEMENT; |
1523 pnode.namespace = prop->ns->name; |
1521 pnode.namespace = prop->ns->name; |
1524 pnode.name = prop->name; |
1522 pnode.name = prop->name; |
1598 property->ns->name = dav_session_strdup(sn, (const char*)n->ns->href); |
1596 property->ns->name = dav_session_strdup(sn, (const char*)n->ns->href); |
1599 property->ns->prefix = n->ns->prefix ? |
1597 property->ns->prefix = n->ns->prefix ? |
1600 dav_session_strdup(sn, (const char*)n->ns->prefix) : NULL; |
1598 dav_session_strdup(sn, (const char*)n->ns->prefix) : NULL; |
1601 property->value = n->children ? dav_convert_xml(sn, n->children) : NULL; |
1599 property->value = n->children ? dav_convert_xml(sn, n->children) : NULL; |
1602 |
1600 |
1603 cxmutstr key = dav_property_key(property->ns->name, property->name); |
1601 cxmutstr propkey = dav_property_key(property->ns->name, property->name); |
1604 cxMapPut(map, cx_hash_key(key.ptr, key.length), property); |
1602 cxMapPut(map, cx_hash_key_cxstr(propkey), property); |
1605 free(key.ptr); |
1603 cx_strfree(&propkey); |
1606 } |
1604 } |
1607 n = n->next; |
1605 n = n->next; |
1608 } |
1606 } |
1609 |
1607 |
1610 xmlFreeDoc(doc); |
1608 xmlFreeDoc(doc); |
1611 if(map->size == 0) { |
1609 if(cxMapSize(map) == 0) { |
1612 cxMapDestroy(map); |
1610 cxMapDestroy(map); |
1613 return NULL; |
1611 return NULL; |
1614 } |
1612 } |
1615 return map; |
1613 return map; |
1616 } |
1614 } |