165 |
165 |
166 int sync_get_resource(SyncDirectory *dir, DavResource *res, UcxMap *db) { |
166 int sync_get_resource(SyncDirectory *dir, DavResource *res, UcxMap *db) { |
167 LocalResource *local = ucx_map_cstr_get(db, res->path); |
167 LocalResource *local = ucx_map_cstr_get(db, res->path); |
168 char *etag = dav_get_property(res, "D:getetag"); |
168 char *etag = dav_get_property(res, "D:getetag"); |
169 if(local) { |
169 if(local) { |
170 if(local->etag && !strcmp(etag, local->etag)) { |
170 if(local->etag) { |
171 // resource is already up-to-date on the client |
171 sstr_t e = sstr(etag); |
172 return 0; |
172 if(sstrprefix(e, S("W/"))) { |
|
173 e = sstrsubs(e, 2); |
|
174 } |
|
175 if(!strcmp(e.ptr, local->etag)) { |
|
176 // resource is already up-to-date on the client |
|
177 return 0; |
|
178 } |
173 } |
179 } |
174 } |
180 } |
175 |
181 |
176 char *local_path = util_concat_path(dir->path, res->path); |
182 char *local_path = util_concat_path(dir->path, res->path); |
177 int ret = 0; |
183 int ret = 0; |
178 if(res->iscollection) { |
184 if(res->iscollection) { |
179 mode_t mode = S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH; |
185 mode_t mode = S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH; |
180 printf("mkdir %s\n", local_path); |
186 //printf("mkdir %s\n", local_path); |
181 if(util_mkdir(local_path, mode) && errno != EEXIST) { |
187 if(util_mkdir(local_path, mode) && errno != EEXIST) { |
182 ret = -1; |
188 ret = -1; |
183 } |
189 } |
184 } else { |
190 } else { |
185 FILE *out = fopen(local_path, "w"); |
191 FILE *out = fopen(local_path, "w"); |
376 break; |
382 break; |
377 } |
383 } |
378 if(dav_store(res)) { |
384 if(dav_store(res)) { |
379 break; |
385 break; |
380 } |
386 } |
381 if(dav_load(res)) { |
|
382 break; |
|
383 } |
|
384 ret = 0; |
387 ret = 0; |
385 break; |
388 break; |
386 } |
389 } |
387 |
390 |
388 if(ret == 0) { |
391 if(ret == 0) { |
389 LocalResource *local_res = ucx_map_cstr_get(db, res->path); |
392 LocalResource *local_res = ucx_map_cstr_get(db, res->path); |
390 if(local_res->etag) { |
393 if(local_res->etag) { |
391 free(local_res->etag); |
394 free(local_res->etag); |
392 } |
395 } |
393 char *etag = dav_get_property(res, "D:getetag"); |
396 |
394 if(etag) { |
397 DavResource *up_res = dav_get(res->session, res->path, "D:getetag"); |
395 local_res->etag = strdup(dav_get_property(res, "D:getetag")); |
398 char *etag_str = dav_get_property(up_res, "D:getetag"); |
|
399 sstr_t etag; |
|
400 etag.ptr = NULL; |
|
401 if(etag_str) { |
|
402 etag = sstr(etag_str); |
|
403 } |
|
404 if(sstrprefix(etag, S("W/"))) { |
|
405 etag = sstrsubs(etag, 2); |
|
406 } |
|
407 |
|
408 |
|
409 if(etag.ptr) { |
|
410 local_res->etag = strdup(etag.ptr); |
396 } else { |
411 } else { |
397 local_res->etag = NULL; |
412 local_res->etag = NULL; |
398 } |
413 } |
399 } |
414 } |
400 |
415 |