libidav/versioning.c

changeset 747
efbd59642577
parent 624
27985062cd2c
equal deleted inserted replaced
746:a569148841ff 747:efbd59642577
72 72
73 DavResource* dav_versiontree(DavResource *res, char *properties) { 73 DavResource* dav_versiontree(DavResource *res, char *properties) {
74 DavSession *sn = res->session; 74 DavSession *sn = res->session;
75 util_set_url(sn, dav_resource_get_href(res)); 75 util_set_url(sn, dav_resource_get_href(res));
76 76
77 UcxList *proplist = NULL; 77 CxList *proplist = NULL;
78 if(properties) { 78 if(properties) {
79 proplist = parse_properties_string(sn->context, sstr(properties)); 79 proplist = parse_properties_string(sn->context, cx_str(properties));
80
81 // check if the list already contains a D:version-name property
82 int add_vname = 1;
83 CxIterator i = cxListIterator(proplist);
84 cx_foreach(DavProperty *, p, i) {
85 if(!strcmp(p->ns->name, "DAV:") && !strcmp(p->name, "version-name")) {
86 add_vname = 0;
87 break;
88 }
89 }
90 if(add_vname) {
91 // we need at least the D:version-name prop
92 DavProperty p;
93 p.ns = dav_get_namespace(sn->context, "D");
94 p.name = strdup("version-name");
95 p.value = NULL;
96 cxListInsert(proplist, 0, &p);
97 }
80 } 98 }
81 99
82 // check if the list already contains a D:version-name property 100
83 int add_vname = 1;
84 UCX_FOREACH(elm, proplist) {
85 DavProperty *p = elm->data;
86 if(!strcmp(p->ns->name, "DAV:") && !strcmp(p->name, "version-name")) {
87 add_vname = 0;
88 break;
89 }
90 }
91 if(add_vname) {
92 // we need at least the D:version-name prop
93 DavProperty *p = malloc(sizeof(DavProperty));
94 p->ns = dav_get_namespace(sn->context, "D");
95 p->name = strdup("version-name");
96 p->value = NULL;
97 proplist = ucx_list_prepend(proplist, p);
98 }
99 101
100 // create a version-tree request, which is almost the same as propfind 102 // create a version-tree request, which is almost the same as propfind
101 UcxBuffer *rqbuf = create_propfind_request(sn, proplist, "version-tree", 1); 103 CxBuffer *rqbuf = create_propfind_request(sn, proplist, "version-tree", 1);
102 UcxBuffer *rpbuf = ucx_buffer_new(NULL, 4096, UCX_BUFFER_AUTOEXTEND); 104 CxBuffer *rpbuf = cxBufferCreate(NULL, 4096, cxDefaultAllocator, CX_BUFFER_FREE_CONTENTS|CX_BUFFER_AUTO_EXTEND);
103 105
104 // do the request 106 // do the request
105 CURLcode ret = do_report_request(sn, rqbuf, rpbuf); 107 CURLcode ret = do_report_request(sn, rqbuf, rpbuf);
106 long status = 0; 108 long status = 0;
107 curl_easy_getinfo (sn->handle, CURLINFO_RESPONSE_CODE, &status); 109 curl_easy_getinfo (sn->handle, CURLINFO_RESPONSE_CODE, &status);
149 dav_session_set_error(sn, ret, status); 151 dav_session_set_error(sn, ret, status);
150 error = 1; 152 error = 1;
151 } 153 }
152 154
153 // cleanup 155 // cleanup
154 while(proplist) { 156 if(proplist) {
155 DavProperty *p = proplist->data; 157 CxIterator i = cxListIterator(proplist);
156 free(p->name); 158 cx_foreach(DavProperty*, p, i) {
157 free(p); 159 free(p->name);
158 UcxList *next = proplist->next; 160 }
159 free(proplist); 161 cxListDestroy(proplist);
160 proplist = next;
161 } 162 }
163
162 if(error && versions) { 164 if(error && versions) {
163 DavResource *cur = versions; 165 DavResource *cur = versions;
164 while(cur) { 166 while(cur) {
165 DavResource *next = cur->next; 167 DavResource *next = cur->next;
166 dav_resource_free(cur); 168 dav_resource_free(cur);

mercurial