You're already changing the API ... why not simply introduce
insert_prop_v2() with the appropriate parameters? This concept of "pass
parameters via the pool" is very disturbing.

Cheers,
-g

On Wed, Jul 15, 2020 at 8:56 AM <minf...@apache.org> wrote:

> Author: minfrin
> Date: Wed Jul 15 13:56:55 2020
> New Revision: 1879889
>
> URL: http://svn.apache.org/viewvc?rev=1879889&view=rev
> Log:
> 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.
>
> Modified:
>     httpd/httpd/trunk/CHANGES
>     httpd/httpd/trunk/include/ap_mmn.h
>     httpd/httpd/trunk/modules/dav/main/mod_dav.h
>     httpd/httpd/trunk/modules/dav/main/props.c
>
> Modified: httpd/httpd/trunk/CHANGES
> URL:
> http://svn.apache.org/viewvc/httpd/httpd/trunk/CHANGES?rev=1879889&r1=1879888&r2=1879889&view=diff
>
> ==============================================================================
> --- httpd/httpd/trunk/CHANGES [utf-8] (original)
> +++ httpd/httpd/trunk/CHANGES [utf-8] Wed Jul 15 13:56:55 2020
> @@ -1,6 +1,12 @@
>                                                           -*- coding:
> utf-8 -*-
>  Changes with Apache 2.5.1
>
> +  *) 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. [Graham Leggett]
> +
>    *) mod_dav: Add utility functions dav_validate_root_ns(),
>       dav_find_child_ns(), dav_find_next_ns(), dav_find_attr_ns() and
>       dav_find_attr() so that other modules get to play too.
>
> Modified: httpd/httpd/trunk/include/ap_mmn.h
> URL:
> http://svn.apache.org/viewvc/httpd/httpd/trunk/include/ap_mmn.h?rev=1879889&r1=1879888&r2=1879889&view=diff
>
> ==============================================================================
> --- httpd/httpd/trunk/include/ap_mmn.h (original)
> +++ httpd/httpd/trunk/include/ap_mmn.h Wed Jul 15 13:56:55 2020
> @@ -657,6 +657,8 @@
>   * 20200705.1 (2.5.1-dev)  Add dav_validate_root_ns(),
> dav_find_child_ns(),
>   *                         dav_find_next_ns(), dav_find_attr_ns() and
>   *                         dav_find_attr().
> + * 20200705.2 (2.5.1-dev)  Add dav_liveprop_elem structure and
> + *                         DAV_PROP_ELEMENT key.
>   */
>
>  #define MODULE_MAGIC_COOKIE 0x41503235UL /* "AP25" */
> @@ -664,7 +666,7 @@
>  #ifndef MODULE_MAGIC_NUMBER_MAJOR
>  #define MODULE_MAGIC_NUMBER_MAJOR 20200705
>  #endif
> -#define MODULE_MAGIC_NUMBER_MINOR 1             /* 0...n */
> +#define MODULE_MAGIC_NUMBER_MINOR 2             /* 0...n */
>
>  /**
>   * Determine if the server's current MODULE_MAGIC_NUMBER is at least a
>
> Modified: httpd/httpd/trunk/modules/dav/main/mod_dav.h
> URL:
> http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/dav/main/mod_dav.h?rev=1879889&r1=1879888&r2=1879889&view=diff
>
> ==============================================================================
> --- httpd/httpd/trunk/modules/dav/main/mod_dav.h (original)
> +++ httpd/httpd/trunk/modules/dav/main/mod_dav.h Wed Jul 15 13:56:55 2020
> @@ -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_x
>                                               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.
>  */
>
> Modified: httpd/httpd/trunk/modules/dav/main/props.c
> URL:
> http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/dav/main/props.c?rev=1879889&r1=1879888&r2=1879889&view=diff
>
> ==============================================================================
> --- httpd/httpd/trunk/modules/dav/main/props.c (original)
> +++ httpd/httpd/trunk/modules/dav/main/props.c Wed Jul 15 13:56:55 2020
> @@ -795,10 +795,18 @@ DAV_DECLARE(dav_get_props_result) dav_ge
>      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_ge
>          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.
>
>
>

Reply via email to