diff options
author | Graham Leggett <minfrin@apache.org> | 2020-07-15 15:56:55 +0200 |
---|---|---|
committer | Graham Leggett <minfrin@apache.org> | 2020-07-15 15:56:55 +0200 |
commit | c52f3e8c6c376387a9002a777b98e2ddba64564a (patch) | |
tree | bb2013358d260b1c822dbe658b75cc9721df9c59 /modules/dav | |
parent | mod_dav: Add utility functions dav_validate_root_ns(), (diff) | |
download | apache2-c52f3e8c6c376387a9002a777b98e2ddba64564a.tar.xz apache2-c52f3e8c6c376387a9002a777b98e2ddba64564a.zip |
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 under the
DAV_PROP_ELEMENT key in the resource pool.
git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1879889 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'modules/dav')
-rw-r--r-- | modules/dav/main/mod_dav.h | 22 | ||||
-rw-r--r-- | modules/dav/main/props.c | 10 |
2 files changed, 32 insertions, 0 deletions
diff --git a/modules/dav/main/mod_dav.h b/modules/dav/main/mod_dav.h index 05364f3e9d..b6a6a5f8e4 100644 --- a/modules/dav/main/mod_dav.h +++ b/modules/dav/main/mod_dav.h @@ -913,6 +913,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 + ** DAV_PROP_ELEMENT key in the resource pool, accessible as follows: + ** + ** apr_pool_userdata_get(&elem, DAV_PROP_ELEMENT, resource->pool); + ** ** Returns one of DAV_PROP_INSERT_* based on what happened. ** ** ### we may need more context... ie. the lock database @@ -1061,6 +1069,20 @@ DAV_DECLARE(void) dav_add_all_liveprop_xmlns(apr_pool_t *p, apr_text_header *phdr); /* + ** When calling insert_prop(), the request element is associated with + ** the pool userdata attached to the resource. Access as follows: + ** + ** apr_pool_userdata_get(&elem, DAV_PROP_ELEMENT, resource->pool); + ** + */ +#define DAV_PROP_ELEMENT "mod_dav-element" + +typedef struct { + const apr_xml_doc *doc; + const apr_xml_elem *elem; +} dav_liveprop_elem; + +/* ** 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. */ diff --git a/modules/dav/main/props.c b/modules/dav/main/props.c index 8b0e1212d8..37c5666ac1 100644 --- a/modules/dav/main/props.c +++ b/modules/dav/main/props.c @@ -795,10 +795,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 */ @@ -822,6 +830,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. |