📄 mod_dav.h
字号:
} dav_if_state_list;
typedef struct dav_if_header
{
const char *uri;
apr_size_t uri_len;
struct dav_if_state_list *state;
struct dav_if_header *next;
int dummy_header; /* used internally by the lock/etag validation */
} dav_if_header;
typedef struct dav_locktoken_list
{
dav_locktoken *locktoken;
struct dav_locktoken_list *next;
} dav_locktoken_list;
DAV_DECLARE(dav_error *) dav_get_locktoken_list(request_rec *r,
dav_locktoken_list **ltl);
/* --------------------------------------------------------------------
**
** LIVE PROPERTY HANDLING
*/
/* opaque type for PROPPATCH rollback information */
typedef struct dav_liveprop_rollback dav_liveprop_rollback;
struct dav_hooks_liveprop
{
/*
** Insert property information into a text block. The property to
** insert is identified by the propid value. The information to insert
** is identified by the "what" argument, as follows:
** DAV_PROP_INSERT_NAME
** property name, as an empty XML element
** DAV_PROP_INSERT_VALUE
** property name/value, as an XML element
** DAV_PROP_INSERT_SUPPORTED
** if the property is defined on the resource, then
** a DAV:supported-live-property element, as defined
** by the DeltaV extensions to RFC2518.
**
** Providers should return DAV_PROP_INSERT_NOTDEF if the property is
** known and not defined for this resource, so should be handled as a
** dead property. If a provider recognizes, but does not support, a
** property, and does not want it handled as a dead property, it should
** return DAV_PROP_INSERT_NOTSUPP.
**
** Returns one of DAV_PROP_INSERT_* based on what happened.
**
** ### we may need more context... ie. the lock database
*/
dav_prop_insert (*insert_prop)(const dav_resource *resource,
int propid, dav_prop_insert what,
apr_text_header *phdr);
/*
** Determine whether a given property is writable.
**
** ### we may want a different semantic. i.e. maybe it should be
** ### "can we write <value> into this property?"
**
** Returns 1 if the live property can be written, 0 if read-only.
*/
int (*is_writable)(const dav_resource *resource, int propid);
/*
** This member defines the set of namespace URIs that the provider
** uses for its properties. When insert_all is called, it will be
** passed a list of integers that map from indices into this list
** to namespace IDs for output generation.
**
** The last entry in this list should be a NULL value (sentinel).
*/
const char * const * namespace_uris;
/*
** ### this is not the final design. we want an open-ended way for
** ### liveprop providers to attach *new* properties. To this end,
** ### we'll have a "give me a list of the props you define", a way
** ### to check for a prop's existence, a way to validate a set/remove
** ### of a prop, and a way to execute/commit/rollback that change.
*/
/*
** Validate that the live property can be assigned a value, and that
** the provided value is valid.
**
** elem will point to the XML element that names the property. For
** example:
** <lp1:executable>T</lp1:executable>
**
** The provider can access the cdata fields and the child elements
** to extract the relevant pieces.
**
** operation is one of DAV_PROP_OP_SET or _DELETE.
**
** The provider may return a value in *context which will be passed
** to each of the exec/commit/rollback functions. For example, this
** may contain an internal value which has been processed from the
** input element.
**
** The provider must set defer_to_dead to true (non-zero) or false.
** If true, then the set/remove is deferred to the dead property
** database. Note: it will be set to zero on entry.
*/
dav_error * (*patch_validate)(const dav_resource *resource,
const apr_xml_elem *elem,
int operation,
void **context,
int *defer_to_dead);
/* ### doc... */
dav_error * (*patch_exec)(const dav_resource *resource,
const apr_xml_elem *elem,
int operation,
void *context,
dav_liveprop_rollback **rollback_ctx);
/* ### doc... */
void (*patch_commit)(const dav_resource *resource,
int operation,
void *context,
dav_liveprop_rollback *rollback_ctx);
/* ### doc... */
dav_error * (*patch_rollback)(const dav_resource *resource,
int operation,
void *context,
dav_liveprop_rollback *rollback_ctx);
/*
** If a provider needs a context to associate with this hooks structure,
** then this field may be used. In most cases, it will just be NULL.
*/
void *ctx;
};
/*
** dav_liveprop_spec: specify a live property
**
** This structure is used as a standard way to determine if a particular
** property is a live property. Its use is not part of the mandated liveprop
** interface, but can be used by liveprop providers in conjuction with the
** utility routines below.
**
** spec->name == NULL is the defined end-sentinel for a list of specs.
*/
typedef struct {
int ns; /* provider-local namespace index */
const char *name; /* name of the property */
int propid; /* provider-local property ID */
int is_writable; /* is the property writable? */
} dav_liveprop_spec;
/*
** dav_liveprop_group: specify a group of liveprops
**
** This structure specifies a group of live properties, their namespaces,
** and how to handle them.
*/
typedef struct {
const dav_liveprop_spec *specs;
const char * const *namespace_uris;
const dav_hooks_liveprop *hooks;
} dav_liveprop_group;
/* ### docco */
DAV_DECLARE(int) dav_do_find_liveprop(const char *ns_uri, const char *name,
const dav_liveprop_group *group,
const dav_hooks_liveprop **hooks);
/* ### docco */
DAV_DECLARE(int) dav_get_liveprop_info(int propid,
const dav_liveprop_group *group,
const dav_liveprop_spec **info);
/* ### docco */
DAV_DECLARE(void) dav_register_liveprop_group(apr_pool_t *pool,
const dav_liveprop_group *group);
/* ### docco */
DAV_DECLARE(int) dav_get_liveprop_ns_index(const char *uri);
/* ### docco */
DAV_DECLARE(int) dav_get_liveprop_ns_count(void);
/* ### docco */
DAV_DECLARE(void) dav_add_all_liveprop_xmlns(apr_pool_t *p,
apr_text_header *phdr);
/*
** 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.
*/
DAV_DECLARE_NONSTD(int) dav_core_find_liveprop(
const dav_resource *resource,
const char *ns_uri,
const char *name,
const dav_hooks_liveprop **hooks);
DAV_DECLARE_NONSTD(void) dav_core_insert_all_liveprops(
request_rec *r,
const dav_resource *resource,
dav_prop_insert what,
apr_text_header *phdr);
DAV_DECLARE_NONSTD(void) dav_core_register_uris(apr_pool_t *p);
/*
** Standard WebDAV Property Identifiers
**
** A live property provider does not need to use these; they are simply
** provided for convenience.
**
** Property identifiers need to be unique within a given provider, but not
** *across* providers (note: this uniqueness constraint was different in
** older versions of mod_dav).
**
** The identifiers start at 20000 to make it easier for providers to avoid
** conflicts with the standard properties. The properties are arranged
** alphabetically, and may be reordered from time to time (as properties
** are introduced).
**
** NOTE: there is no problem with reordering (e.g. binary compat) since the
** identifiers are only used within a given provider, which would pick up
** the entire set of changes upon a recompile.
*/
enum {
DAV_PROPID_BEGIN = 20000,
/* Standard WebDAV properties (RFC 2518) */
DAV_PROPID_creationdate,
DAV_PROPID_displayname,
DAV_PROPID_getcontentlanguage,
DAV_PROPID_getcontentlength,
DAV_PROPID_getcontenttype,
DAV_PROPID_getetag,
DAV_PROPID_getlastmodified,
DAV_PROPID_lockdiscovery,
DAV_PROPID_resourcetype,
DAV_PROPID_source,
DAV_PROPID_supportedlock,
/* DeltaV properties (from the I-D (#14)) */
DAV_PROPID_activity_checkout_set,
DAV_PROPID_activity_set,
DAV_PROPID_activity_version_set,
DAV_PROPID_auto_merge_set,
DAV_PROPID_auto_version,
DAV_PROPID_baseline_collection,
DAV_PROPID_baseline_controlled_collection,
DAV_PROPID_baseline_controlled_collection_set,
DAV_PROPID_checked_in,
DAV_PROPID_checked_out,
DAV_PROPID_checkin_fork,
DAV_PROPID_checkout_fork,
DAV_PROPID_checkout_set,
DAV_PROPID_comment,
DAV_PROPID_creator_displayname,
DAV_PROPID_current_activity_set,
DAV_PROPID_current_workspace_set,
DAV_PROPID_default_variant,
DAV_PROPID_eclipsed_set,
DAV_PROPID_label_name_set,
DAV_PROPID_merge_set,
DAV_PROPID_precursor_set,
DAV_PROPID_predecessor_set,
DAV_PROPID_root_version,
DAV_PROPID_subactivity_set,
DAV_PROPID_subbaseline_set,
DAV_PROPID_successor_set,
DAV_PROPID_supported_method_set,
DAV_PROPID_supported_live_property_set,
DAV_PROPID_supported_report_set,
DAV_PROPID_unreserved,
DAV_PROPID_variant_set,
DAV_PROPID_version_controlled_binding_set,
DAV_PROPID_version_controlled_configuration,
DAV_PROPID_version_history,
DAV_PROPID_version_name,
DAV_PROPID_workspace,
DAV_PROPID_workspace_checkout_set,
DAV_PROPID_END
};
/*
** Property Identifier Registration
**
** At the moment, mod_dav requires live property providers to ensure that
** each property returned has a unique value. For now, this is done through
** central registration (there are no known providers other than the default,
** so this remains manageable).
**
** WARNING: the TEST ranges should never be "shipped".
*/
#define DAV_PROPID_CORE 10000 /* ..10099. defined by mod_dav */
#define DAV_PROPID_FS 10100 /* ..10299.
mod_dav filesystem provider. */
#define DAV_PROPID_TEST1 10300 /* ..10399 */
#define DAV_PROPID_TEST2 10400 /* ..10499 */
#define DAV_PROPID_TEST3 10500 /* ..10599 */
/* Next: 10600 */
/* --------------------------------------------------------------------
**
** DATABASE FUNCTIONS
*/
typedef struct dav_db dav_db;
typedef struct dav_namespace_map dav_namespace_map;
typedef struct dav_deadprop_rollback dav_deadprop_rollback;
typedef struct {
const char *ns; /* "" signals "no namespace" */
const char *name;
} dav_prop_name;
/* hook functions to enable pluggable databases */
struct dav_hooks_propdb
{
dav_error * (*open)(apr_pool_t *p, const dav_resource *resource, int ro,
dav_db **pdb);
void (*close)(dav_db *db);
/*
** In bulk, define any namespaces that the values and their name
** elements may need.
**
** Note: sometimes mod_dav will defer calling this until output_value
** returns found==1. If the output process needs the dav_xmlns_info
** filled for its work, then it will need to fill it on demand rather
** than depending upon this hook to fill in the structure.
**
** Note: this will *always* be called during an output sequence. Thus,
** the provider may rely solely on using this to fill the xmlns info.
*/
dav_error * (*define_namespaces)(dav_db *db, dav_xmlns_info *xi);
/*
** Output the value from the database (i.e. add an element name and
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -