libidav/resource.c

changeset 331
9ca1e4706acc
parent 315
7db4dbf4e6f9
child 348
b79fb94f9e0a
--- a/libidav/resource.c	Thu Oct 12 20:37:46 2017 +0200
+++ b/libidav/resource.c	Sun Oct 22 12:58:07 2017 +0200
@@ -40,6 +40,7 @@
 #include "ucx/utils.h"
 
 #include "resource.h"
+#include "xml.h"
 #include "davqlexec.h"
 
 #define xstreq(a,b) xmlStrEqual(BAD_CAST a, BAD_CAST b)
@@ -236,25 +237,36 @@
     return resource->href;
 }
 
-void resource_add_property(DavResource *res, char *ns, char *name, char *val) {
+void resource_add_property(DavResource *res, char *ns, char *name, xmlNode *val) {
     if(!val) {
         return;
     }
     
     UcxKey key = dav_property_key(ns, name);
-    sstr_t v = sstrdup_a(res->session->mp->allocator, sstr(val));
-    ucx_map_put(((DavResourceData*)res->data)->properties, key, v.ptr);
+    DavXmlNode *v = dav_convert_xml(res->session, val);
+    ucx_map_put(((DavResourceData*)res->data)->properties, key, v);
     free(key.data);
 }
 
-char* resource_get_property(DavResource *res, char *ns, char *name) {
+void resource_add_string_property(DavResource *res, char *ns, char *name, char *val) {
+    if(!val) {
+        return;
+    }
+    
     UcxKey key = dav_property_key(ns, name);
-    char *property = resource_get_property_k(res, key);
+    DavXmlNode *v = dav_text_node(res->session, val);
+    ucx_map_put(((DavResourceData*)res->data)->properties, key, v);
+    free(key.data);
+}
+
+DavXmlNode* resource_get_property(DavResource *res, char *ns, char *name) {
+    UcxKey key = dav_property_key(ns, name);
+    DavXmlNode *property = resource_get_property_k(res, key);
     free(key.data);
     return property;
 }
 
-char* resource_get_property_k(DavResource *res, UcxKey key) {
+DavXmlNode* resource_get_property_k(DavResource *res, UcxKey key) {
     DavResourceData *data = (DavResourceData*)res->data;
     return ucx_map_get(data->properties, key);
 }
@@ -339,8 +351,10 @@
             default: ret = 0;
         }
     } else if(cr->type == 1) {
-        char *value1 = resource_get_property_k(res1, cr->column.property);
-        char *value2 = resource_get_property_k(res2, cr->column.property);
+        DavXmlNode *xvalue1 = resource_get_property_k(res1, cr->column.property);
+        DavXmlNode *xvalue2 = resource_get_property_k(res2, cr->column.property);
+        char *value1 = dav_xml_getstring(xvalue1);
+        char *value2 = dav_xml_getstring(xvalue2);
         if(!value1) {
             ret = value2 ? -1 : 0;
         } else if(!value2) {
@@ -403,7 +417,25 @@
     }
 }
 
-char* dav_get_property(DavResource *res, char *name) {
+char* dav_get_string_property(DavResource *res, char *name) {
+    char *pns;
+    char *pname;
+    dav_get_property_namespace_str(res->session->context, name, &pns, &pname);
+    if(!pns || !pname) {
+        return NULL;
+    }
+    return dav_get_string_property_ns(res, pns, pname);
+}
+
+char* dav_get_string_property_ns(DavResource *res, char *ns, char *name) {
+    DavXmlNode *prop = dav_get_property_ns(res, ns, name);
+    if(!prop) {
+        return NULL;
+    }
+    return dav_xml_getstring(prop);
+}
+
+DavXmlNode* dav_get_property(DavResource *res, char *name) {
     char *pns;
     char *pname;
     dav_get_property_namespace_str(res->session->context, name, &pns, &pname);
@@ -413,11 +445,11 @@
     return dav_get_property_ns(res, pns, pname);
 }
 
-char* dav_get_property_ns(DavResource *res, char *ns, char *name) {
+DavXmlNode* dav_get_property_ns(DavResource *res, char *ns, char *name) {
     if(!ns || !name) {
         return NULL;
     }
-    char *property = resource_get_property(res, ns, name);
+    DavXmlNode *property = resource_get_property(res, ns, name);
     DavResourceData *data = res->data;
     // resource_get_property only returns persistent properties
     // check the remove and set list
@@ -435,7 +467,7 @@
     UCX_FOREACH(elm, data->set) {
         DavProperty *p = elm->data;
         if(!strcmp(p->name, name) && !strcmp(p->ns->name, ns)) {
-            return p->value;
+            return p->value; // TODO: fix
         }
     }
     // no property update
@@ -457,7 +489,7 @@
             res->session,
             sizeof(DavProperty));
     property->name = dav_session_strdup(res->session, name);
-    property->value = dav_session_strdup(res->session, value);
+    property->value = dav_text_node(res->session, value);
     
     DavNamespace *namespace = dav_session_malloc(
             res->session,
@@ -646,7 +678,7 @@
                 free(enc_hash);
                 return 1;
             }
-            resource_add_property(res, DAV_NS, "crypto-hash", enc_hash);
+            resource_add_string_property(res, DAV_NS, "crypto-hash", enc_hash);
             free(enc_hash);
         } else {
             ret = do_put_request(
@@ -713,7 +745,7 @@
     AESDecrypter *dec = NULL;
     DavKey *key = NULL;
     if(DAV_DECRYPT_CONTENT(sn)) {
-        char *keyname = dav_get_property_ns(res, DAV_NS, "crypto-key");
+        char *keyname = dav_get_string_property_ns(res, DAV_NS, "crypto-key");
         if(keyname) {
             key = dav_context_get_key(sn->context, keyname);
             if(key) {
@@ -752,7 +784,7 @@
         int verify_failed = 0;
         if(DAV_DECRYPT_CONTENT(sn) && key) {
             // try to verify the content
-            char *res_hash = dav_get_property_ns(res, DAV_NS, "crypto-hash");
+            char *res_hash = dav_get_string_property_ns(res, DAV_NS, "crypto-hash");
 
             if(res_hash) {
                 size_t len = 0;

mercurial