dav/sync.c

changeset 48
08d5544c92fb
parent 47
fbbbeed4ba8f
child 49
c5759ac76c1b
equal deleted inserted replaced
47:fbbbeed4ba8f 48:08d5544c92fb
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

mercurial