libidav/resource.c

changeset 49
2f71f4ee247a
parent 20
db263186edf3
equal deleted inserted replaced
48:ae61523bce20 49:2f71f4ee247a
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 }

mercurial