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); |