dav/webdav.c

changeset 16
5dbef9e07376
parent 15
182af08b4813
child 17
11dffb40cd91
--- a/dav/webdav.c	Thu Aug 15 11:23:25 2013 +0200
+++ b/dav/webdav.c	Fri Aug 16 12:41:30 2013 +0200
@@ -35,6 +35,7 @@
 #include "webdav.h"
 #include "methods.h"
 #include "ucx/buffer.h"
+#include "ucx/utils.h"
 
 #define xstreq(a,b) xmlStrEqual(BAD_CAST a, BAD_CAST b)
 
@@ -66,6 +67,24 @@
     return context;
 }
 
+void dav_context_destroy(DavContext *ctx) {
+    // destroy all sessions assoziated with this context
+    UCX_FOREACH(elm, ctx->sessions) {
+        dav_session_destroy(elm->data);
+    }
+    
+    UcxMapIterator i = ucx_map_iterator(ctx->namespaces);
+    UcxKey k;
+    DavNamespace *ns;
+    UCX_MAP_FOREACH(k, ns, i) {
+        free(ns->prefix);
+        free(ns->name);
+        free(ns);
+    }
+    ucx_map_free(ctx->namespaces);
+    free(ctx);
+}
+
 int dav_add_namespace(DavContext *context, char *prefix, char *name) {
     DavNamespace *namespace = malloc(sizeof(DavNamespace));
     if(!namespace) {
@@ -109,6 +128,8 @@
     sn->mp = ucx_mempool_new(1024);
     sn->allocator = ucx_mempool_allocator(sn->mp);
     
+    context->sessions = ucx_list_append(context->sessions, sn);
+    
     return sn;
 }
 
@@ -140,12 +161,31 @@
             case 401: sn->error = DAV_UNAUTHORIZED; break;
             case 403: sn->error = DAV_FORBIDDEN; break;
             case 404: sn->error = DAV_NOT_FOUND; break;
+            case 405: sn->error = DAV_METHOD_NOT_ALLOWED; break;
+            case 409: sn->error = DAV_CONFLICT; break;
         }
     } else {
         sn->error = DAV_ERROR;
     }
 }
 
+void dav_session_destroy(DavSession *sn) { 
+    // remove session from context
+    UcxList *sessions = sn->context->sessions;
+    ssize_t i = ucx_list_find(sessions, sn, ucx_ptrcmp, NULL);
+    if(i > 0)  {
+        UcxList *elm = ucx_list_get(sessions, i);
+        if(elm) {
+            sn->context->sessions = ucx_list_remove(sessions, elm);
+        }
+    }
+    
+    ucx_mempool_destroy(sn->mp);
+    curl_easy_cleanup(sn->handle);
+    free(sn->base_url);
+    free(sn);
+}
+
 DavResource* dav_get(DavSession *sn, char *path, char *properties) {
     char *url = util_concat_path(sn->base_url, path);
     
@@ -514,3 +554,43 @@
         return 1;
     }
 }
+
+int dav_create(DavResource *res) {
+    char *url = util_concat_path(res->session->base_url, res->path);
+    char *parent = util_parent_path(res->path);
+    
+    DavSession *sn = res->session;
+    DavResource *parent_res = dav_get(sn, parent, NULL);
+    if(!parent_res && sn->error == DAV_NOT_FOUND) {
+        parent_res = dav_resource_new(sn, parent);
+        parent_res->iscollection = 1;
+        int r = dav_create(parent_res);
+        if(r) {
+            free(parent);
+            return r;
+        }
+    } else if(parent_res && !res->iscollection) {
+        sn->error = DAV_FORBIDDEN;
+        return 1;
+    } else if(sn->error != DAV_OK) {
+        return 1;
+    }
+    
+    CURL *handle = res->session->handle;
+    curl_easy_setopt(handle, CURLOPT_URL, url);
+    free(url);
+    free(parent);
+    
+    // TODO: check iscollection and create empty resource or collection
+    
+    CURLcode ret = do_mkcol_request(handle);
+    int status = 0;
+    curl_easy_getinfo (handle, CURLINFO_RESPONSE_CODE, &status);
+    if(ret == CURLE_OK && (status >= 200 && status < 300)) {
+        res->session->error = DAV_OK;
+        return 0;
+    } else {
+        session_set_error(res->session, ret, status);
+        return 1;
+    }
+}

mercurial