libidav/resource.c

changeset 208
1fb26aca5093
parent 207
de23f8881e9f
child 222
7b73058d782e
--- a/libidav/resource.c	Mon Mar 14 11:54:55 2016 +0100
+++ b/libidav/resource.c	Mon Mar 14 17:18:33 2016 +0100
@@ -557,7 +557,10 @@
     DavResourceData *data = res->data;
     
     util_set_url(sn, dav_resource_get_href(res));
-      
+    
+    DavLock *lock = dav_get_lock(sn, res->path);
+    char *locktoken = lock ? lock->token : NULL;
+    
     // store content
     if(data->content) {
         int encryption = DAV_ENCRYPT_CONTENT(sn) && sn->key;
@@ -575,10 +578,11 @@
                         buf,
                         (dav_read_func)ucx_buffer_read);
             }
-            
+              
             // put resource
             ret = do_put_request(
                     sn->handle,
+                    locktoken,
                     enc,
                     (dav_read_func)aes_read,
                     0);
@@ -604,6 +608,7 @@
         } else {
             ret = do_put_request(
                     sn->handle,
+                    locktoken,
                     data->content,
                     data->read,
                     data->length);
@@ -632,7 +637,7 @@
         UcxBuffer *response = ucx_buffer_new(NULL, 1024, UCX_BUFFER_AUTOEXTEND);
         //printf("request:\n%.*s\n\n", request->pos, request->space);
 
-        CURLcode ret = do_proppatch_request(sn->handle, request, response);
+        CURLcode ret = do_proppatch_request(sn->handle, locktoken, request, response);
         long status = 0;
         curl_easy_getinfo (sn->handle, CURLINFO_RESPONSE_CODE, &status);
         if(ret == CURLE_OK && status == 207) {
@@ -745,8 +750,11 @@
     CURL *handle = res->session->handle;
     util_set_url(res->session, dav_resource_get_href(res));
     
+    DavLock *lock = dav_get_lock(res->session, res->path);
+    char *locktoken = lock ? lock->token : NULL;
+    
     UcxBuffer *response = ucx_buffer_new(NULL, 4096, UCX_BUFFER_AUTOEXTEND);
-    CURLcode ret = do_delete_request(handle, response);
+    CURLcode ret = do_delete_request(handle, locktoken, response);
     long status = 0;
     curl_easy_getinfo (handle, CURLINFO_RESPONSE_CODE, &status);
     if(ret == CURLE_OK && (status >= 200 && status < 300)) {
@@ -765,6 +773,10 @@
 static int create_ancestors(DavSession *sn, char *href, char *path) {
     CURL *handle = sn->handle;
     CURLcode code;
+    
+    DavLock *lock = dav_get_lock(sn, path);
+    char *locktoken = lock ? lock->token : NULL;
+    
     long status = 0;
     int ret = 0;
     
@@ -777,7 +789,7 @@
     
     for(int i=0;i<2;i++) {
         util_set_url(sn, h);
-        code = do_mkcol_request(handle);
+        code = do_mkcol_request(handle, locktoken);
         curl_easy_getinfo(handle, CURLINFO_RESPONSE_CODE, &status);
         if(status == 201) {
             // resource successfully created
@@ -816,11 +828,14 @@
     CURL *handle = sn->handle;
     util_set_url(sn, dav_resource_get_href(res));
     
+    DavLock *lock = dav_get_lock(res->session, res->path);
+    char *locktoken = lock ? lock->token : NULL;
+    
     CURLcode code;
     if(res->iscollection) {
-        code = do_mkcol_request(handle);
+        code = do_mkcol_request(handle, locktoken);
     } else {
-        code = do_put_request(handle, "", NULL, 0); 
+        code = do_put_request(handle, locktoken, "", NULL, 0); 
     }
     long s = 0;
     curl_easy_getinfo(handle, CURLINFO_RESPONSE_CODE, &s);
@@ -925,7 +940,7 @@
     return dav_cp_mv_url(res, url, false, override);
 }
 
-char* dav_lock(DavResource *res) {
+int dav_lock(DavResource *res) {
     DavSession *sn = res->session;
     CURL *handle = sn->handle;
     util_set_url(sn, dav_resource_get_href(res));
@@ -944,26 +959,50 @@
         LockDiscovery lock;
         if(parse_lock_response(sn, response, &lock)) {
             sn->error = DAV_ERROR;
-            return NULL;
+            return -1;
         }
         
+        DavLock *l = dav_create_lock(sn, lock.locktoken, lock.timeout);
+        free(lock.locktoken);
         free(lock.timeout);
-        return lock.locktoken;
+        
+        int r = 0;
+        if(res->iscollection) {
+            r = dav_add_collection_lock(sn, res->path, l);
+        } else {
+            r = dav_add_resource_lock(sn, res->path, l);
+        }
+        
+        if(r == 0) {
+            return 0;
+        } else {
+            (void)dav_unlock(res);
+            sn->error = DAV_ERROR;
+            dav_destroy_lock(sn, l);
+            return -1;
+        }
     } else {
         dav_session_set_error(sn, ret, status);
-        return NULL;
+        return -1;
     }
 }
 
-int dav_unlock(DavResource *res, char *locktoken) {
+int dav_unlock(DavResource *res) {
     DavSession *sn = res->session;
     CURL *handle = sn->handle;
     util_set_url(sn, dav_resource_get_href(res));
     
-    CURLcode ret = do_unlock_request(handle, locktoken);
+    DavLock *lock = dav_get_lock(res->session, res->path);
+    if(!lock) {
+        sn->error = DAV_ERROR;
+        return -1;
+    }
+    
+    CURLcode ret = do_unlock_request(handle, lock->token);
     long status = 0;
     curl_easy_getinfo (handle, CURLINFO_RESPONSE_CODE, &status);
     if(ret == CURLE_OK && (status >= 200 && status < 300)) {
+        dav_remove_lock(sn, res->path, lock);
         return 0;
     } else {
         dav_session_set_error(sn, ret, status);
@@ -983,7 +1022,8 @@
     UcxBuffer *response = ucx_buffer_new(NULL, 1024, UCX_BUFFER_AUTOEXTEND);
     
     util_set_url(sn, href);
-    CURLcode ret = do_proppatch_request(sn->handle, request, response);
+    // TODO: lock
+    CURLcode ret = do_proppatch_request(sn->handle, NULL, request, response);
     ucx_buffer_free(request);
     long status = 0;
     curl_easy_getinfo (sn->handle, CURLINFO_RESPONSE_CODE, &status);

mercurial