dav/methods.c

changeset 27
e584c351b402
parent 24
a317202ae787
child 29
938957a4eea7
equal deleted inserted replaced
26:146171b57e69 27:e584c351b402
30 #include <stdlib.h> 30 #include <stdlib.h>
31 #include <string.h> 31 #include <string.h>
32 32
33 #include "utils.h" 33 #include "utils.h"
34 #include "methods.h" 34 #include "methods.h"
35 #include "davql.h"
35 36
36 #define xstreq(a,b) xmlStrEqual(BAD_CAST a, BAD_CAST b) 37 #define xstreq(a,b) xmlStrEqual(BAD_CAST a, BAD_CAST b)
37 38
38 /* ----------------------------- PROPFIND ----------------------------- */ 39 /* ----------------------------- PROPFIND ----------------------------- */
39 40
148 ucx_buffer_write(s.ptr, 1, s.length, buf); 149 ucx_buffer_write(s.ptr, 1, s.length, buf);
149 150
150 return buf; 151 return buf;
151 } 152 }
152 153
153 DavResource* parse_propfind_response(DavSession *sn, DavResource *root, UcxBuffer *response) { 154 DavResource* parse_propfind_response(DavSession *sn, DavResource *root, UcxBuffer *response, DavQOp *cond, size_t len) {
154 char *url = NULL; 155 char *url = NULL;
155 curl_easy_getinfo(sn->handle, CURLINFO_EFFECTIVE_URL, &url); 156 curl_easy_getinfo(sn->handle, CURLINFO_EFFECTIVE_URL, &url);
156 if(!root) { 157 if(!root) {
157 root = resource_new_href(sn, util_url_path(url)); 158 root = resource_new_href(sn, util_url_path(url));
158 } 159 }
167 xmlNode *xml_root = xmlDocGetRootElement(doc); 168 xmlNode *xml_root = xmlDocGetRootElement(doc);
168 xmlNode *node = xml_root->children; 169 xmlNode *node = xml_root->children;
169 while(node) { 170 while(node) {
170 if(node->type == XML_ELEMENT_NODE) { 171 if(node->type == XML_ELEMENT_NODE) {
171 if(xstreq(node->name, "response")) { 172 if(xstreq(node->name, "response")) {
172 parse_response_tag(root, node); 173 parse_response_tag(root, node, cond, len);
173 } 174 }
174 } 175 }
175 176
176 node = node->next; 177 node = node->next;
177 } 178 }
178 179
179 return root; 180 return root;
180 } 181 }
181 182
182 int parse_response_tag(DavResource *resource, xmlNode *node) { 183 int parse_response_tag(DavResource *resource, xmlNode *node, DavQOp *cond, size_t clen) {
183 DavResource *res = resource; 184 DavResource *res = resource;
184 node = node->children; 185 node = node->children;
185 while(node) { 186 while(node) {
186 if(node->type == XML_ELEMENT_NODE) { 187 if(node->type == XML_ELEMENT_NODE) {
187 if(xstreq(node->name, "href")) { 188 if(xstreq(node->name, "href")) {
193 } 194 }
194 if(xstreq(resource->href, href_content->content)) { 195 if(xstreq(resource->href, href_content->content)) {
195 res = resource; 196 res = resource;
196 } else { 197 } else {
197 res = resource_new_href(resource->session, (char*)href_content->content); 198 res = resource_new_href(resource->session, (char*)href_content->content);
198 resource_add_child(resource, res); 199 res->parent = resource;
199 } 200 }
200 } else if(xstreq(node->name, "propstat")) { 201 } else if(xstreq(node->name, "propstat")) {
201 xmlNode *n = node->children; 202 xmlNode *n = node->children;
202 xmlNode *prop_node = NULL; 203 xmlNode *prop_node = NULL;
203 int ok = 0; 204 int ok = 0;
256 257
257 node = node->next; 258 node = node->next;
258 } 259 }
259 260
260 set_davprops(res); 261 set_davprops(res);
262 if(res != resource) {
263 if(clen > 0) {
264 if(!condition_eval(res, cond, clen)) {
265 // skip resource
266 return 0;
267 }
268 }
269 resource_add_child(resource, res);
270 }
261 271
262 return 0; 272 return 0;
263 } 273 }
264 274
265 void set_davprops(DavResource *res) { 275 void set_davprops(DavResource *res) {

mercurial