]> git.ipfire.org Git - thirdparty/apache/httpd.git/commitdiff
Merge r1879889,r1879889,r1893644 from trunk:
authorStefan Eissing <icing@apache.org>
Mon, 13 Dec 2021 15:02:44 +0000 (15:02 +0000)
committerStefan Eissing <icing@apache.org>
Mon, 13 Dec 2021 15:02:44 +0000 (15:02 +0000)
  *) mod_dav: Some DAV extensions, like CalDAV, specify both document
     elements and property elements that need to be taken into account
     when generating a property. The document element and property element
     are made available in the dav_liveprop_elem structure by calling
     dav_get_liveprop_element(). [Graham Leggett]

git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/2.4.x@1895893 13f79535-47bb-0310-9956-ffa450edef68

changes-entries/mod_dav-element.txt [new file with mode: 0644]
include/ap_mmn.h
modules/dav/main/mod_dav.h
modules/dav/main/props.c

diff --git a/changes-entries/mod_dav-element.txt b/changes-entries/mod_dav-element.txt
new file mode 100644 (file)
index 0000000..e797f27
--- /dev/null
@@ -0,0 +1,8 @@
+
+  *) mod_dav: Some DAV extensions, like CalDAV, specify both document
+     elements and property elements that need to be taken into account
+     when generating a property. The document element and property element
+     are made available in the dav_liveprop_elem structure by calling
+     dav_get_liveprop_element(). [Graham Leggett]
+
+
index 9d6299453ddcd4faa04b2d328da8d0a1d8f3f006..fe24261ee87c540a090b40e4ca2215dbe06c509d 100644 (file)
  * 20120211.119 (2.4.51-dev) Add dav_validate_root_ns(), dav_find_child_ns(),
  *                           dav_find_next_ns(), dav_find_attr_ns() and
  *                           dav_find_attr().
+ * 20120211.120 (2.4.51-dev) Add dav_liveprop_elem structure and
+ *                           dav_get_liveprop_element().
  * 
  */
 
 #ifndef MODULE_MAGIC_NUMBER_MAJOR
 #define MODULE_MAGIC_NUMBER_MAJOR 20120211
 #endif
-#define MODULE_MAGIC_NUMBER_MINOR 119                 /* 0...n */
+#define MODULE_MAGIC_NUMBER_MINOR 120                 /* 0...n */
 
 /**
  * Determine if the server's current MODULE_MAGIC_NUMBER is at least a
index 1c7fcad3e8b4825e1ecf1ceac9901021134281c7..943508135ef8d553cf21d03b7ba3f97d45429c05 100644 (file)
@@ -907,6 +907,14 @@ struct dav_hooks_liveprop
     ** property, and does not want it handled as a dead property, it should
     ** return DAV_PROP_INSERT_NOTSUPP.
     **
+    ** Some DAV extensions, like CalDAV, specify both document elements
+    ** and property elements that need to be taken into account when
+    ** generating a property. The document element and property element
+    ** are made available in the dav_liveprop_elem structure under the
+    ** resource, accessible as follows:
+    **
+    ** dav_get_liveprop_element(resource);
+    **
     ** Returns one of DAV_PROP_INSERT_* based on what happened.
     **
     ** ### we may need more context... ie. the lock database
@@ -1054,6 +1062,18 @@ DAV_DECLARE(long) dav_get_liveprop_ns_count(void);
 DAV_DECLARE(void) dav_add_all_liveprop_xmlns(apr_pool_t *p,
                                              apr_text_header *phdr);
 
+typedef struct {
+    const apr_xml_doc *doc;
+    const apr_xml_elem *elem;
+} dav_liveprop_elem;
+
+/*
+ ** When calling insert_prop(), the associated request element and
+ ** document is accessible using the following call.
+ */
+DAV_DECLARE(dav_liveprop_elem *) dav_get_liveprop_element(const dav_resource
+                                                          *resource);
+
 /*
 ** The following three functions are part of mod_dav's internal handling
 ** for the core WebDAV properties. They are not part of mod_dav's API.
index a0fb6542399b987a04c74c1ad709649e8e4a2c4e..a117bc0395edc94f4216d17b7d235c34ba5189a9 100644 (file)
 
 #define DAV_EMPTY_VALUE                "\0"    /* TWO null terms */
 
+#define DAV_PROP_ELEMENT "mod_dav-element"
+
 struct dav_propdb {
     apr_pool_t *p;                /* the pool we should use */
     request_rec *r;               /* the request record */
@@ -718,10 +720,18 @@ DAV_DECLARE(dav_get_props_result) dav_get_props(dav_propdb *propdb,
     apr_text_header hdr_ns = { 0 };
     int have_good = 0;
     dav_get_props_result result = { 0 };
+    dav_liveprop_elem *element;
     char *marks_liveprop;
     dav_xmlns_info *xi;
     int xi_filled = 0;
 
+    /* we lose both the document and the element when calling (insert_prop),
+     * make these available in the pool.
+     */
+    element = apr_pcalloc(propdb->resource->pool, sizeof(dav_liveprop_elem));
+    element->doc = doc;
+    apr_pool_userdata_setn(element, DAV_PROP_ELEMENT, NULL, propdb->resource->pool);
+
     /* ### NOTE: we should pass in TWO buffers -- one for keys, one for
        the marks */
 
@@ -745,6 +755,8 @@ DAV_DECLARE(dav_get_props_result) dav_get_props(dav_propdb *propdb,
         dav_prop_insert inserted;
         dav_prop_name name;
 
+        element->elem = elem;
+
         /*
         ** First try live property providers; if they don't handle
         ** the property, then try looking it up in the propdb.
@@ -922,6 +934,15 @@ DAV_DECLARE(void) dav_get_liveprop_supported(dav_propdb *propdb,
     }
 }
 
+DAV_DECLARE(dav_liveprop_elem *) dav_get_liveprop_element(const dav_resource *resource)
+{
+    dav_liveprop_elem *element;
+
+    apr_pool_userdata_get((void **)&element, DAV_PROP_ELEMENT, resource->pool);
+
+    return element;
+}
+
 DAV_DECLARE_NONSTD(void) dav_prop_validate(dav_prop_ctx *ctx)
 {
     dav_propdb *propdb = ctx->propdb;